diff --git a/includes/webform.editor.inc b/includes/webform.editor.inc
index 7009292..7fc689a 100644
--- a/includes/webform.editor.inc
+++ b/includes/webform.editor.inc
@@ -13,43 +13,32 @@
  * Below functions are copied from editor.module.
  */
 
+use Drupal\webform\Hook\WebformEditorHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform\Hook\WebformEditorHooks;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Component\Utility\Html;
-use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Config\Config;
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\file\FileInterface;
 use Drupal\filter\FilterFormatInterface;
-use Drupal\webform\Element\WebformHtmlEditor;
 use Drupal\webform\WebformInterface;
 
 /**
  * Implements hook_ENTITY_TYPE_access().
  */
+#[LegacyHook]
 function webform_filter_format_access(FilterFormatInterface $filter_format, $operation, AccountInterface $account) {
-  if ($filter_format->id() === WebformHtmlEditor::DEFAULT_FILTER_FORMAT
-    && $operation !== 'use') {
-    return AccessResult::forbidden('This text format can only be managed by the Webform module.');
-  }
-
-  return AccessResult::neutral();
+  return \Drupal::service(WebformEditorHooks1::class)->filterFormatAccess($filter_format, $operation, $account);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_load().
  */
+#[LegacyHook]
 function webform_filter_format_load($entities) {
-  foreach ($entities as $entity) {
-    // Hide the default webform filter format on the filter admin overview page.
-    if ($entity->id() === WebformHtmlEditor::DEFAULT_FILTER_FORMAT
-      && \Drupal::routeMatch()->getRouteName() === 'filter.admin_overview') {
-      // Set status to FALSE which hides the default webform filter format.
-      $entity->set('status', FALSE);
-    }
-  }
+  \Drupal::service(WebformEditorHooks1::class)->filterFormatLoad($entities);
 }
 
 /**
diff --git a/includes/webform.form_alter.inc b/includes/webform.form_alter.inc
index becbc1d..b3f37e5 100644
--- a/includes/webform.form_alter.inc
+++ b/includes/webform.form_alter.inc
@@ -5,11 +5,10 @@
  * Webform module form alter hooks.
  */
 
+use Drupal\webform\Hook\WebformFormAlterHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform\Hook\WebformFormAlterHooks;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Url;
-use Drupal\webform\Element\WebformMessage;
 
 /**
  * Implements hook_form_alter().
@@ -52,39 +51,9 @@ function _webform_form_webform_submission_form_after_build($form, FormStateInter
  * @see https://www.drupal.org/project/webform/issues/2930116
  * @see https://www.drupal.org/project/webform/issues/2920095
  */
+#[LegacyHook]
 function webform_form_update_manager_update_form_alter(&$form, FormStateInterface $form_state) {
-  if (!isset($form['projects']) || !isset($form['projects']['#options']['webform'])) {
-    return;
-  }
-
-  // Display dismissible warning at the top of the page.
-  $t_args = [
-    ':href_manual' => 'https://www.drupal.org/docs/user_guide/en/extend-manual-install.html',
-    ':href_composer' => 'https://www.drupal.org/docs/user_guide/en/install-composer.html',
-  ];
-  $form['webform_update_manager_warning'] = [
-    '#type' => 'webform_message',
-    '#message_type' => 'warning',
-    '#message_message' => t('The Webform module may not update properly using this administrative interface. It is strongly recommended that you update the Webform module <a href=":href_manual">manually</a> or by using <a href=":href_composer">Composer</a>.', $t_args),
-    '#message_close' => TRUE,
-    '#message_storage' => WebformMessage::STORAGE_SESSION,
-    '#weight' => -10,
-  ];
-
-  // Display warning to backup site when webform is checked.
-  $form['projects']['#options']['webform']['title']['data'] = [
-    'title' => $form['projects']['#options']['webform']['title']['data'],
-    'container' => [
-      '#type' => 'container',
-      '#states' => ['visible' => [':input[name="projects[webform]"]' => ['checked' => TRUE]]],
-      '#attributes' => ['class' => ['js-form-wrapper'], 'style' => 'display:none'],
-      'message' => [
-        '#type' => 'webform_message',
-        '#message_type' => 'warning',
-        '#message_message' => t('Please make sure to backup your website before updating the Webform module.'),
-      ],
-    ],
-  ];
+  \Drupal::service(WebformFormAlterHooks1::class)->formUpdateManagerUpdateFormAlter($form, $form_state);
 }
 
 /* ************************************************************************** */
@@ -94,15 +63,9 @@ function webform_form_update_manager_update_form_alter(&$form, FormStateInterfac
 /**
  * Implements hook_form_FORM_ID_alter() for views exposed form.
  */
+#[LegacyHook]
 function webform_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  /** @var \Drupal\views\ViewExecutable $view */
-  $view = $form_state->get('view');
-
-  // Check if this a is webform submission view.
-  // @see \Drupal\webform\WebformSubmissionListBuilder::buildSubmissionViews
-  if (isset($view->webform_submission_view)) {
-    $form['#action'] = Url::fromRoute(\Drupal::routeMatch()->getRouteName(), \Drupal::routeMatch()->getRawParameters()->all())->toString();
-  }
+  \Drupal::service(WebformFormAlterHooks1::class)->formViewsExposedFormAlter($form, $form_state, $form_id);
 }
 
 /* ************************************************************************** */
@@ -112,8 +75,9 @@ function webform_form_views_exposed_form_alter(&$form, FormStateInterface $form_
 /**
  * Implements hook_form_FORM_ID_alter() for SMTP admin settings form.
  */
+#[LegacyHook]
 function webform_form_smtp_admin_settings_alter(&$form, FormStateInterface $form_state) {
-  $form['#submit'][] = '_webform_form_smtp_admin_settings_submit';
+  \Drupal::service(WebformFormAlterHooks1::class)->formSmtpAdminSettingsAlter($form, $form_state);
 }
 
 /**
@@ -133,9 +97,7 @@ function _webform_form_smtp_admin_settings_submit(&$form, FormStateInterface $fo
 /**
  * Implements hook_form_FORM_ID_alter() for config single import form.
  */
+#[LegacyHook]
 function webform_form_config_single_import_form_alter(&$form, FormStateInterface $form_state) {
-  $config_type = \Drupal::request()->query->get('config_type');
-  if ($config_type === 'webform') {
-    $form['config_type']['#default_value'] = 'webform';
-  }
+  \Drupal::service(WebformFormAlterHooks1::class)->formConfigSingleImportFormAlter($form, $form_state);
 }
diff --git a/includes/webform.install.inc b/includes/webform.install.inc
index 048e0bb..1ed73a5 100644
--- a/includes/webform.install.inc
+++ b/includes/webform.install.inc
@@ -5,6 +5,7 @@
  * Webform install helper functions.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Core\Config\FileStorage;
 use Drupal\Core\Render\Element;
@@ -330,7 +331,7 @@ function _webform_update_actions() {
       // Install new action.
       $data = Yaml::decode(file_get_contents($path));
       $action = Action::create($data);
-      $action->trustData()->save();
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $action, fn() => $action->trustData())->save();
     }
   }
 }
diff --git a/includes/webform.install.requirements.inc b/includes/webform.install.requirements.inc
index 72cfbda..aece173 100644
--- a/includes/webform.install.requirements.inc
+++ b/includes/webform.install.requirements.inc
@@ -5,6 +5,8 @@
  * Webform requirements.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Extension\Requirement\RequirementSeverity;
 use Drupal\Component\Render\FormattableMarkup;
 use Drupal\Core\Url;
 use Drupal\webform\Plugin\WebformElement\ManagedFile;
@@ -43,7 +45,7 @@ function webform_requirements($phase) {
           '@module_list' => implode(', ', $deprecated),
           ':url' => 'https://www.drupal.org/project/webform_deprecated',
         ]),
-        'severity' => REQUIREMENT_ERROR,
+        'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Error, fn() => REQUIREMENT_ERROR),
       ];
     }
   }
@@ -74,7 +76,7 @@ function webform_requirements($phase) {
         '%module_list' => implode(', ', $experimental),
         ':url' => 'https://www.drupal.org/core/experimental',
       ]),
-      'severity' => REQUIREMENT_WARNING,
+      'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING),
     ];
   }
 
@@ -95,7 +97,7 @@ function webform_requirements($phase) {
     $requirements['webform_email'] = [
       'title' => t('Webform: HTML email support'),
       'value' => ($mail_module_name) ? t('Provided by the @module module.', $t_args) : t('Provided by the @plugin_id mail plugin.', $t_args),
-      'severity' => REQUIREMENT_OK,
+      'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::OK, fn() => REQUIREMENT_OK),
     ];
     if ($mail_plugin_definition) {
       $requirements['webform_email']['description'] = (!empty($mail_plugin_definition['description']))
@@ -107,7 +109,7 @@ function webform_requirements($phase) {
     $requirements['webform_email'] = [
       'title' => t('Webform: HTML email support'),
       'value' => t('Unable to determine email module and/or provider'),
-      'severity' => REQUIREMENT_ERROR,
+      'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Error, fn() => REQUIREMENT_ERROR),
     ];
   }
 
@@ -127,7 +129,7 @@ function webform_requirements($phase) {
       'title' => t('Webform: Private files'),
       'value' => t('Private file system is not set.'),
       'description' => t('This must be changed in <a href="https://www.drupal.org/documentation/modules/file">settings.php</a>. For more information see: <a href="https://www.drupal.org/psa-2016-003">DRUPAL-PSA-2016-003</a>'),
-      'severity' => REQUIREMENT_WARNING,
+      'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING),
     ];
   }
 
@@ -156,7 +158,7 @@ function webform_requirements($phase) {
         'title' => t('Webform: Clientside validation'),
         'value' => t('Webform Clientside Validation module not installed.'),
         'description' => t('The Webform Clientside Validation module helps support Webform Clientside Validation integration. <a href=":href">Disable Webform Clientside Validation warning</a>', [':href' => Url::fromRoute('webform.config.advanced')->toString()]),
-        'severity' => REQUIREMENT_WARNING,
+        'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING),
       ];
     }
   }
@@ -183,7 +185,7 @@ function webform_requirements($phase) {
       'title' => t('Webform: jQuery UI Datepicker'),
       'value' => t('Webform jQuery UI Datepicker module not installed.'),
       'description' => t('The Webform jQuery UI Datepicker module is required to support datepickers. Disable this datepicker warning by <a href=":href">removing #datepicker property from all webforms</a>.', $t_args),
-      'severity' => REQUIREMENT_WARNING,
+      'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING),
     ];
   }
 
@@ -267,7 +269,7 @@ function webform_requirements($phase) {
         'title' => t('Webform: Spam protection'),
         'value' => t('Webform <a href=":href">Spam protection module</a> missing. Please install one of the below modules.', [':href' => 'https://www.drupal.org/node/206787']),
         'description' => \Drupal::service('renderer')->renderInIsolation($available_projects),
-        'severity' => REQUIREMENT_WARNING,
+        'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING),
       ];
     }
   }
diff --git a/includes/webform.install.update.inc b/includes/webform.install.update.inc
index 753e2c2..930a25b 100644
--- a/includes/webform.install.update.inc
+++ b/includes/webform.install.update.inc
@@ -5,6 +5,7 @@
  * Archived Webform update hooks.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Uuid\Php as Uuid;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\FileStorage;
@@ -117,7 +118,7 @@ function webform_update_8004() {
     if (str_contains($elements, '#autocomplete_options')) {
       $elements = str_replace('#autocomplete_options', '#autocomplete_items', $elements);
       $webform_config->set('elements', $elements);
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -1121,7 +1122,7 @@ function webform_update_8049() {
     if (str_contains($elements, '#display_on')) {
       $elements = str_replace('#display_on: display', '#display_on: view', $elements);
       $webform_config->set('elements', $elements);
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -1790,7 +1791,7 @@ function webform_update_8093() {
     if (str_contains($elements, "'#type': webform_composite")) {
       $elements = str_replace("'#type': webform_composite", "'#type': webform_custom_composite", $elements);
       $config->set('elements', $elements);
-      $config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $config->save(), fn() => $config->save(TRUE));
     }
   }
 }
@@ -1837,7 +1838,7 @@ function webform_update_8096() {
     $likert = str_starts_with($data['id'], 'likert_');
     WebformArrayHelper::insertAfter($data, 'category', 'likert', $likert);
     $config->setData($data);
-    $config->save(TRUE);
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $config->save(), fn() => $config->save(TRUE));
   }
 }
 
@@ -1869,7 +1870,7 @@ function webform_update_8098() {
       // Convert '#output': true to '#output': right.
       $elements = str_replace("'#output': true", "'#output': right", $elements);
       $webform_config->set('elements', $elements);
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -2540,7 +2541,7 @@ function webform_update_8138() {
     if (str_contains($elements, "'#type': webform_location")) {
       $elements = str_replace("'#type': webform_location", "'#type': webform_location_geocomplete", $elements);
       $config->set('elements', $elements);
-      $config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $config->save(), fn() => $config->save(TRUE));
       $has_geocomplete_element = TRUE;
     }
   }
@@ -2606,7 +2607,7 @@ function webform_update_8141() {
   if (\Drupal::moduleHandler()->moduleExists('views') && !View::load('webform_submissions')) {
     $config_path = \Drupal::service('extension.list.module')->getPath('webform') . '/config/optional/views.view.webform_submissions.yml';
     $data = ['uuid' => (new Uuid())->generate()] + WebformYaml::decode(file_get_contents($config_path));
-    \Drupal::configFactory()->getEditable('views.view.webform_submissions')->setData($data)->save(TRUE);
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::configFactory()->getEditable('views.view.webform_submissions')->setData($data)->save(), fn() => \Drupal::configFactory()->getEditable('views.view.webform_submissions')->setData($data)->save(TRUE));
     $message = 'The new webform submissions view has been created.';
   }
   else {
@@ -2752,7 +2753,7 @@ function webform_update_8149() {
       $elements = str_replace("'#add_more'", "'#add_more_items'", $elements);
       $elements = str_replace("'#multiple__add_more'", "'#multiple__add_more_items'", $elements);
       $webform_config->set('elements', $elements);
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -2817,7 +2818,7 @@ function webform_update_8151() {
     }
     if ($has_computed_element) {
       $webform_config->set('elements', WebformYaml::encode($elements));
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -2920,7 +2921,7 @@ function webform_update_8155() {
     }
     if ($has_date_element) {
       $webform_config->set('elements', WebformYaml::encode($elements));
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -3349,7 +3350,7 @@ function webform_update_8179() {
     }
     if ($has_actions_element) {
       $webform_config->set('elements', WebformYaml::encode($elements));
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -3507,7 +3508,7 @@ function webform_update_8186() {
 
     if ($has_numeric_element_property) {
       $webform_config->set('elements', WebformYaml::encode($elements));
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
@@ -3808,7 +3809,7 @@ function webform_update_8198() {
     }
     if ($has_options_property) {
       $webform_config->set('elements', WebformYaml::encode($elements));
-      $webform_config->save(TRUE);
+      DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $webform_config->save(), fn() => $webform_config->save(TRUE));
     }
   }
 }
diff --git a/includes/webform.options.inc b/includes/webform.options.inc
index 953f39d..1eda818 100644
--- a/includes/webform.options.inc
+++ b/includes/webform.options.inc
@@ -5,88 +5,55 @@
  * Options alter hooks.
  */
 
-use Drupal\Core\Datetime\TimeZoneFormHelper;
-use Drupal\Core\Language\LanguageManager;
-use Drupal\webform\Utility\WebformOptionsHelper;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform\Hook\WebformOptionsHooks;
 
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for range options.
  *
  * @see config/install/webform.webform.example_options.yml
  */
+#[LegacyHook]
 function webform_webform_options_range_alter(array &$options, array $element = []) {
-  $element += [
-    '#min' => 1,
-    '#max' => 100,
-    '#step' => 1,
-    '#pad_length' => NULL,
-    '#pad_str' => 0,
-  ];
-
-  $options = WebformOptionsHelper::range(
-    $element['#min'],
-    $element['#max'],
-    $element['#step'],
-    $element['#pad_length'],
-    $element['#pad_str']
-  );
+  \Drupal::service(WebformOptionsHooks::class)->webformOptionsRangeAlter($options, $element);
 }
 
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for time zones options.
  */
+#[LegacyHook]
 function webform_webform_options_time_zones_alter(array &$options, array $element = []) {
-  if (empty($options)) {
-    $options = TimeZoneFormHelper::getOptionsList();
-  }
+  \Drupal::service(WebformOptionsHooks::class)->webformOptionsTimeZonesAlter($options, $element);
 }
 
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for country codes options.
  */
+#[LegacyHook]
 function webform_webform_options_country_codes_alter(array &$options, array $element = []) {
-  if (empty($options)) {
-    /** @var \Drupal\Core\Locale\CountryManagerInterface $country_manager */
-    $country_manager = \Drupal::service('country_manager');
-    $options = $country_manager->getList();
-  }
+  \Drupal::service(WebformOptionsHooks::class)->webformOptionsCountryCodesAlter($options, $element);
 }
 
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for country names options.
  */
+#[LegacyHook]
 function webform_webform_options_country_names_alter(array &$options, array $element = []) {
-  if (empty($options)) {
-    /** @var \Drupal\Core\Locale\CountryManagerInterface $country_manager */
-    $country_manager = \Drupal::service('country_manager');
-    $countries = $country_manager->getList();
-    $options = array_combine($countries, $countries);
-  }
+  \Drupal::service(WebformOptionsHooks::class)->webformOptionsCountryNamesAlter($options, $element);
 }
 
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for languages options.
  */
+#[LegacyHook]
 function webform_webform_options_languages_alter(array &$options, array $element = []) {
-  if (empty($options)) {
-    $languages = LanguageManager::getStandardLanguageList();
-    unset($languages['en-x-simple']);
-    $options = [];
-    foreach ($languages as $language) {
-      $options[$language[0]] = $language[0];
-    }
-  }
+  \Drupal::service(WebformOptionsHooks::class)->webformOptionsLanguagesAlter($options, $element);
 }
 
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for translations options.
  */
+#[LegacyHook]
 function webform_webform_options_translations_alter(array &$options, array $element = []) {
-  if (empty($options)) {
-    $languages = \Drupal::languageManager()->getLanguages();
-    $options = [];
-    foreach ($languages as $language) {
-      $options[$language->getId()] = $language->getName();
-    }
-  }
+  \Drupal::service(WebformOptionsHooks::class)->webformOptionsTranslationsAlter($options, $element);
 }
diff --git a/includes/webform.theme.inc b/includes/webform.theme.inc
index 24947e6..8b9f74a 100644
--- a/includes/webform.theme.inc
+++ b/includes/webform.theme.inc
@@ -5,18 +5,12 @@
  * Theme hooks, preprocessor, and suggestions.
  */
 
+use Drupal\webform\Hook\WebformThemeHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform\Hook\WebformThemeHooks;
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
-use Drupal\Core\Render\Element;
-use Drupal\Core\StringTranslation\ByteSizeMarkup;
 use Drupal\Core\Template\Attribute;
-use Drupal\file\Entity\File;
-use Drupal\webform\Element\WebformSelectOther;
-use Drupal\webform\Plugin\WebformElement\Radios as WebformRadios;
-use Drupal\webform\Plugin\WebformElement\WebformEntityRadios;
-use Drupal\webform\Utility\WebformAccessibilityHelper;
 use Drupal\webform\Utility\WebformElementHelper;
 
 /* ************************************************************************** */
@@ -82,12 +76,9 @@ function webform_preprocess_menu_local_action(&$variables) {
  *
  * @see \Drupal\webform\Plugin\WebformElement\OptionsBase
  */
+#[LegacyHook]
 function webform_preprocess_checkboxes(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  _webform_preprocess_options($variables);
+  \Drupal::service(WebformThemeHooks1::class)->preprocessCheckboxes($variables);
 }
 
 /**
@@ -95,39 +86,17 @@ function webform_preprocess_checkboxes(&$variables) {
  *
  * @see \Drupal\webform\Plugin\WebformElement\OptionsBase
  */
+#[LegacyHook]
 function webform_preprocess_radios(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  _webform_preprocess_options($variables);
+  \Drupal::service(WebformThemeHooks1::class)->preprocessRadios($variables);
 }
 
 /**
  * Implements hook_preprocess_select() for select templates.
  */
+#[LegacyHook]
 function webform_preprocess_select(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  $element = $variables['element'];
-
-  // When options are sorted (viu #sort_options: true) make sure the
-  // select '_other_' options is always last.
-  // @see \Drupal\webform\Element\WebformOtherBase::processWebformOther
-  // @see template_preprocess_select().
-  if (!empty($element['#sort_options']) && !empty($element['#webform_other'])) {
-    $options = &$variables['options'];
-    foreach ($options as $index => $option) {
-      if ($option['value'] === WebformSelectOther::OTHER_OPTION) {
-        unset($options[$index]);
-        $options[] = $option;
-        $options = array_values($options);
-        break;
-      }
-    }
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessSelect($variables);
 }
 
 /**
@@ -146,41 +115,9 @@ function webform_preprocess_status_messages(&$variables) {
 /**
  * Implements hook_preprocess_table() for table templates.
  */
+#[LegacyHook]
 function webform_preprocess_table(&$variables) {
-  // Add links to 'Translate' webform tab.
-  if (\Drupal::routeMatch()->getRouteName() === 'entity.webform.config_translation_overview') {
-    /** @var \Drupal\webform\WebformInterface $webform */
-    $webform = \Drupal::routeMatch()->getParameter('webform');
-    foreach ($variables['rows'] as &$row) {
-      // Check first cell.
-      if (!isset($row['cells'][0]['content'])
-        || !is_array($row['cells'][0]['content'])
-        || !isset($row['cells'][0]['content']['#markup'])) {
-        continue;
-      }
-
-      // Check last cell edit link.
-      if (!isset($row['cells'][1]['content'])
-        || !is_array($row['cells'][1]['content'])
-        || !isset($row['cells'][1]['content']['#links'])
-        || !is_array($row['cells'][1]['content']['#links'])
-        || !isset($row['cells'][1]['content']['#links']['edit'])) {
-        continue;
-      }
-
-      // Get language from edit link.
-      $route_parameters = $row['cells'][1]['content']['#links']['edit']['url']->getRouteParameters();
-      $langcode = $route_parameters['langcode'] ?? NULL;
-      $language = \Drupal::languageManager()->getLanguage($langcode);
-
-      // Convert the first cell in the row to a link.
-      $row['cells'][0]['content'] = [
-        '#type' => 'link',
-        '#url' => $webform->toUrl('canonical', ['language' => $language]),
-        '#title' => $row['cells'][0]['content'],
-      ];
-    }
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessTable($variables);
 }
 
 /* ************************************************************************** */
@@ -190,122 +127,25 @@ function webform_preprocess_table(&$variables) {
 /**
  * Implements hook_preprocess_datetime_form() for datetime form element templates.
  */
+#[LegacyHook]
 function webform_preprocess_datetime_form(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  $element = $variables['element'];
-
-  // Date and time custom placeholder.
-  if (isset($element['#date_date_placeholder']) && isset($variables['content']['date'])) {
-    $variables['content']['date']['#attributes']['placeholder'] = $element['#date_date_placeholder'];
-  }
-  if (isset($element['#date_time_placeholder']) && isset($variables['content']['time'])) {
-    $variables['content']['time']['#attributes']['placeholder'] = $element['#date_time_placeholder'];
-  }
-
-  // Add .container-inline to datetime form wrapper which is missing from the
-  // stable base theme.
-  // @see core/themes/classy/templates/form/datetime-form.html.twig
-  // @see core/themes/stable/templates/form/datetime-form.html.twig
-  $variables['attributes']['class'][] = 'container-inline';
+  \Drupal::service(WebformThemeHooks1::class)->preprocessDatetimeForm($variables);
 }
 
 /**
  * Implements hook_preprocess_details() for details element templates.
  */
+#[LegacyHook]
 function webform_preprocess_details(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  // Setup description, help, and more.
-  _webform_preprocess_element($variables);
-
-  $element = &$variables['element'];
-
-  // Hide details title.
-  if (isset($element['#title_display']) && $element['#title_display'] === 'invisible') {
-    $variables['title'] = WebformAccessibilityHelper::buildVisuallyHidden($variables['title']);
-  }
-
-  // Remove invalid 'required' and 'aria-required' attributes from details.
-  if (isset($element['#webform_key'])) {
-    unset(
-      $variables['attributes']['required'],
-      $variables['attributes']['aria-required']
-    );
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessDetails($variables);
 }
 
 /**
  * Implements hook_preprocess_fieldset() for fieldset templates.
  */
+#[LegacyHook]
 function webform_preprocess_fieldset(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  // Setup description, help, and more.
-  _webform_preprocess_element($variables, ['legend', 'title']);
-
-  $element = &$variables['element'];
-
-  // Apply inline title defined by radios, checkboxes, and buttons.
-  // @see \Drupal\webform\Plugin\WebformElement\OptionsBase::prepare
-  if (isset($element['#_title_display'])) {
-    $variables['attributes']['class'][] = 'webform-fieldset--title-inline';
-  }
-
-  // If the title display is none remove the legend.title and set
-  // display to none.
-  if (isset($element['#title_display']) && $element['#title_display'] === 'none') {
-    $variables['legend'] = ['attributes' => new Attribute(['style' => 'display:none'])];
-  }
-  elseif (isset($element['#title_attributes'])
-    && $variables['legend']['attributes'] instanceof Attribute) {
-    $variables['legend']['attributes']->merge(new Attribute($element['#title_attributes']));
-  }
-
-  // Add .js-webform-form-type-* class to be used JavaScript and #states API.
-  // @see js/webform.states.js
-  if (isset($element['#type'])) {
-    $variables['attributes']['class'][] = 'js-webform-type-' . Html::getClass($element['#type']);
-    $variables['attributes']['class'][] = 'webform-type-' . Html::getClass($element['#type']);
-  }
-
-  // Remove invalid 'required' attributes from fieldset.
-  //
-  // Issue #3174459: W3C Validation: required attribute not allowed on
-  // fieldset tag.
-  // @see https://www.drupal.org/project/drupal/issues/3174459
-  if (isset($element['#webform_key'])) {
-    unset($variables['attributes']['required']);
-  }
-
-  // Add aria-required="true" only on fieldsets containing required
-  // radiobuttons.
-  //
-  // Issue #3240249: Aria-required on fieldset trigger accessibility fails.
-  // @see https://www.drupal.org/project/webform/issues/3240249
-  // @see https://www.drupal.org/project/webform/issues/3277192
-  /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
-  $element_manager = \Drupal::service('plugin.manager.webform.element');
-  $element_plugin = $element_manager->getElementInstance($element);
-  $is_radios = ($element_plugin instanceof WebformRadios || $element_plugin instanceof WebformEntityRadios);
-  if ($is_radios) {
-    $id = $variables['attributes']['id'] . '-legend';
-    $variables['legend']['attributes']['id'] = $id;
-
-    if (isset($variables['attributes']['aria-required'])) {
-      // The aria-required is _not_ necessary on a fieldset of radio elements.
-      unset($variables['attributes']['aria-required']);
-    }
-  }
-  elseif (isset($variables['attributes']['aria-required'])) {
-    unset($variables['attributes']['aria-required']);
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessFieldset($variables);
 }
 
 /* ************************************************************************** */
@@ -315,93 +155,17 @@ function webform_preprocess_fieldset(&$variables) {
 /**
  * Implements hook_preprocess_form_element() for form element templates.
  */
+#[LegacyHook]
 function webform_preprocess_form_element(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  $element = &$variables['element'];
-
-  // Setup description, help, and more.
-  _webform_preprocess_element($variables, ['label', '#title']);
-
-  // Make sure the #description_display is always applied to account for
-  // #more which is placed in the #description.
-  // @see template_preprocess_form_element()
-  if (isset($variables['description'])) {
-    $variables['description_display'] = $element['#description_display'];
-  }
-
-  // Issue #2700439: Description class not added to
-  // form-element.html.twig template.
-  // @see https://www.drupal.org/project/drupal/issues/2700439
-  if (isset($variables['description_display']) && $variables['description_display'] === 'before') {
-    // Add system .description class.
-    if (isset($variables['description'])) {
-      if (empty($variables['description']['attributes'])) {
-        $variables['description']['attributes'] = new Attribute();
-      }
-      $variables['description']['attributes']->addClass('description');
-    }
-  }
-
-  // Add missing classes to the Claro theme's form elements.
-  // @see core/modules/system/templates/form-element.html.twig
-  // @see claro/templates/form-element.html.twig
-  // @todo Once Claro and Oliver are stable determine if this code is needed.
-  static $is_claro_theme;
-  static $is_olivero_theme;
-  if (!isset($is_claro_theme)) {
-    /** @var \Drupal\webform\WebformThemeManagerInterface $theme_manager */
-    $theme_manager = \Drupal::service('webform.theme_manager');
-    $is_claro_theme = $theme_manager->isActiveTheme('claro');
-    $is_olivero_theme = $theme_manager->isActiveTheme('olivero');
-  }
-  if ($is_claro_theme || $is_olivero_theme) {
-    // Add system .form-type-TYPE class.
-    if (!empty($variables['type'])) {
-      $variables['attributes']['class'][] = 'form-type-' . Html::getClass($variables['type']);
-    }
-
-    // Add system .description class.
-    if (isset($variables['description'])) {
-      if (empty($variables['description']['attributes'])) {
-        $variables['description']['attributes'] = new Attribute();
-      }
-      $variables['description']['attributes']->addClass('description');
-    }
-  }
-
-  // Add .js-webform-form-type-* class to be used JavaScript and #states API.
-  // @see js/webform.states.js
-  if (isset($element['#type'])) {
-    $variables['attributes']['class'][] = 'js-webform-type-' . Html::getClass($element['#type']);
-    $variables['attributes']['class'][] = 'webform-type-' . Html::getClass($element['#type']);
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessFormElement($variables);
 }
 
 /**
  * Implements hook_preprocess_form_element_label() for form element label templates.
  */
+#[LegacyHook]
 function webform_preprocess_form_element_label(&$variables) {
-  $element = &$variables['element'];
-
-  // Fix variable title #markup tha contains a render array which is most
-  // likely a Help tooltip.
-  // @see template_preprocess_form_element_label()
-  // @see webform_preprocess_form_element()
-  if (isset($variables['title'])
-    && is_array($variables['title'])
-    && is_array($variables['title']['#markup'])) {
-    $variables['title'] = $variables['title']['#markup'];
-  }
-
-  // Remove label 'for' attribute.
-  if (!empty($element['#attributes']['webform-remove-for-attribute'])) {
-    unset($element['#attributes']['webform-remove-for-attribute']);
-    unset($variables['attributes']['webform-remove-for-attribute']);
-    unset($variables['attributes']['for']);
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessFormElementLabel($variables);
 }
 
 /* ************************************************************************** */
@@ -414,64 +178,9 @@ function webform_preprocess_form_element_label(&$variables) {
  * @see https://stackoverflow.com/questions/21842274/cross-browser-custom-styling-for-file-upload-button
  * @see template_preprocess_file_managed_file()
  */
+#[LegacyHook]
 function webform_preprocess_file_managed_file(&$variables) {
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  $element = &$variables['element'];
-  if (empty($element['#button'])) {
-    return;
-  }
-
-  // Don't alter hidden file upload input.
-  if (!Element::isVisibleElement($element['upload'])) {
-    return;
-  }
-
-  // Create an unique id for the file upload input and label.
-  $button_id = Html::getUniqueId($variables['element']['upload']['#id'] . '-button');
-
-  // Create a label that is styled like an action button.
-  $label = [
-    '#type' => 'html_tag',
-    '#tag' => 'label',
-    '#value' => $element['#button__title'] ?? (empty($element['#multiple']) ? t('Choose file') : t('Choose files')),
-    '#attributes' => $element['#button__attributes'] ?? [],
-  ];
-
-  // Add 'for' attribute.
-  $label['#attributes']['for'] = $button_id;
-
-  // Add default button classes.
-  if (empty($label['#attributes']['class'])) {
-    $label['#attributes']['class'][] = 'button';
-    $label['#attributes']['class'][] = 'button-action';
-  }
-
-  // Add .webform-file-button.
-  $label['#attributes']['class'][] = 'webform-file-button';
-
-  // Make sure the label is first.
-  $element = ['label' => $label] + $element;
-
-  // Set the custom button ID for file upload input.
-  $element['upload']['#attributes']['id'] = $button_id;
-
-  // Hide the file upload.
-  $element['upload']['#attributes']['class'][] = 'webform-file-button-input';
-
-  // Attach library.
-  $element['upload']['#attached']['library'][] = 'webform/webform.element.file.button';
-
-  // Remove #errors to prevent 'aria-invalid' from being added to the
-  // remove file checkbox which is valid.
-  // @see \Drupal\Core\Render\Element\RenderElementBase::setAttributes
-  foreach (Element::children($element) as $child_key) {
-    if (NestedArray::getValue($element, [$child_key, 'selected', '#type']) === 'checkbox') {
-      unset($element[$child_key]['selected']['#errors']);
-    }
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessFileManagedFile($variables);
 }
 
 /**
@@ -479,44 +188,9 @@ function webform_preprocess_file_managed_file(&$variables) {
  *
  * @see \Drupal\webform\Plugin\WebformElement\WebformManagedFileBase::prepare
  */
+#[LegacyHook]
 function webform_preprocess_file_upload_help(&$variables) {
-  // Retrieve upload validators from file upload element variables.
-  $upload_validators = $variables['upload_validators'];
-
-  // Exit early if no 'webform_file_limit' is set.
-  if (!isset($upload_validators['webform_file_limit'])) {
-    return;
-  }
-
-  // Get the webform's overall file size limit and the individual file element's limit.
-  $webform_file_limit = $upload_validators['webform_file_limit'];
-  $element_file_limit = (isset($upload_validators['FileSizeLimit']))
-    ? $upload_validators['FileSizeLimit']['fileLimit']
-    : 0;
-
-  // Prepare translated arguments for the file size descriptions.
-  $t_args = [
-    // Overall size limit for all files.
-    '@webform_file_limit' => ByteSizeMarkup::create($webform_file_limit),
-    // Size limit for individual files.
-    '@element_file_limit' => ByteSizeMarkup::create($element_file_limit),
-  ];
-
-  // Determine the appropriate description based on file size limits.
-  $file_limit_description = ($element_file_limit < $webform_file_limit)
-    // If individual file limit is smaller than the overall limit, include both in the message.
-    ? t('@element_file_limit limit per file. The accumulated size of all files in this form cannot exceed @webform_file_limit.', $t_args)
-    // Otherwise, only mention the overall file size limit.
-    : t('The accumulated size of all files in this form cannot exceed @webform_file_limit.', $t_args);
-
-  // Remove any existing descriptions that match the outdated '@size limit.' message.
-  $descriptions = array_filter(
-    $variables['descriptions'],
-    fn($description) => $description->getUntranslatedString() !== '@size limit.'
-  );
-
-  // Add the updated file limit description to the list of descriptions.
-  $variables['descriptions'] = [...$descriptions, $file_limit_description];
+  \Drupal::service(WebformThemeHooks1::class)->preprocessFileUploadHelp($variables);
 }
 
 /**
@@ -524,22 +198,9 @@ function webform_preprocess_file_upload_help(&$variables) {
  *
  * @see webform_file_access
  */
+#[LegacyHook]
 function webform_preprocess_file_link(&$variables) {
-  /** @var \Drupal\file\FileInterface $file */
-  $file = $variables['file'];
-  $file = ($file instanceof File) ? $file : File::load($file->fid);
-
-  // Remove link to temporary anonymous private file uploads.
-  if ($file->isTemporary() && $file->getOwner() && $file->getOwner()->isAnonymous() && str_starts_with($file->getFileUri(), 'private://webform/')) {
-    $variables['link'] = $file->getFilename();
-  }
-
-  // Add file size variable to Claro theme.
-  if (empty($variables['file_size'])
-    && $file->getSize()
-    && \Drupal::service('webform.theme_manager')->isActiveTheme('claro')) {
-    $variables['file_size'] = ByteSizeMarkup::create($file->getSize(), \Drupal::languageManager()->getCurrentLanguage()->getId());
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessFileLink($variables);
 }
 
 /**
@@ -547,13 +208,9 @@ function webform_preprocess_file_link(&$variables) {
  *
  * Make sure the image src for the 'webform_image_file' src is an absolute URL.
  */
+#[LegacyHook]
 function webform_preprocess_image(&$variables) {
-  global $base_url;
-  if (isset($variables['attributes']['class'])
-    && in_array('webform-image-file', (array) $variables['attributes']['class'])
-    && !preg_match('#^https?://#', $variables['attributes']['src'])) {
-    $variables['attributes']['src'] = $base_url . preg_replace('/^' . preg_quote(base_path(), '/') . '/', '/', $variables['attributes']['src']);
-  }
+  \Drupal::service(WebformThemeHooks1::class)->preprocessImage($variables);
 }
 
 /* ************************************************************************** */
diff --git a/includes/webform.translation.inc b/includes/webform.translation.inc
index d934705..97153e5 100644
--- a/includes/webform.translation.inc
+++ b/includes/webform.translation.inc
@@ -7,51 +7,26 @@
  * @see webform_preprocess_table()
  */
 
+use Drupal\webform\Hook\WebformTranslationHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform\Hook\WebformTranslationHooks;
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Render\Element;
-use Drupal\webform\Utility\WebformYaml;
 
 /**
  * Implements hook_form_FORM_ID_alter() for language content settings form.
  */
+#[LegacyHook]
 function webform_form_language_content_settings_form_alter(array &$form, FormStateInterface $form_state) {
-  // Completely remove webform_submission from Content language admin
-  // settings form, only when there are no previously saved
-  // 'language.content_settings.webform_submission.*' config files.
-  $has_saved_webform_submissions = count(\Drupal::configFactory()->listAll('language.content_settings.webform_submission.')) ? TRUE : FALSE;
-  if (!$has_saved_webform_submissions) {
-    unset($form['#label']['webform_submission']);
-    unset($form['entity_types']['#options']['webform_submission']);
-    unset($form['settings']['webform_submission']);
-  }
+  \Drupal::service(WebformTranslationHooks1::class)->formLanguageContentSettingsFormAlter($form, $form_state);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter() for locale translate edit form.
  */
+#[LegacyHook]
 function webform_form_locale_translate_edit_form_alter(&$form, FormStateInterface $form_state) {
-  // Don't allow YAML to be validated using locale string translation.
-  foreach (Element::children($form['strings']) as $key) {
-    $element = &$form['strings'][$key];
-    if ($element['original']
-      && !empty($element['original']['#plain_text'])
-      && preg_match("/'#[^']+':/", $element['original']['#plain_text'])
-      && WebformYaml::isValid($element['original']['#plain_text'])) {
-      $element['original'] = [
-        '#theme' => 'webform_codemirror',
-        '#code' => $element['original']['#plain_text'],
-        '#type' => 'yaml',
-      ];
-      $element['translations'] = [
-        '#type' => 'webform_message',
-        '#message_type' => 'warning',
-        '#message_message' => t("Webforms can only be translated via the Webform's (Configuration) Translate tab."),
-      ];
-    }
-  }
+  \Drupal::service(WebformTranslationHooks1::class)->formLocaleTranslateEditFormAlter($form, $form_state);
 }
 
 /* ************************************************************************** */
@@ -61,19 +36,17 @@ function webform_form_locale_translate_edit_form_alter(&$form, FormStateInterfac
 /**
  * Implements hook_form_FORM_ID_alter() for config translation add form.
  */
+#[LegacyHook]
 function webform_form_config_translation_add_form_alter(&$form, FormStateInterface $form_state, $is_new = TRUE) {
-  /** @var \Drupal\webform\WebformTranslationConfigManagerInterface $translation_config_manager */
-  $translation_config_manager = \Drupal::service('webform.translation_config_manager');
-  $translation_config_manager->alterForm($form, $form_state);
+  \Drupal::service(WebformTranslationHooks1::class)->formConfigTranslationAddFormAlter($form, $form_state, $is_new);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter() for config translation edit form.
  */
+#[LegacyHook]
 function webform_form_config_translation_edit_form_alter(&$form, FormStateInterface $form_state) {
-  /** @var \Drupal\webform\WebformTranslationConfigManagerInterface $translation_config_manager */
-  $translation_config_manager = \Drupal::service('webform.translation_config_manager');
-  $translation_config_manager->alterForm($form, $form_state);
+  \Drupal::service(WebformTranslationHooks1::class)->formConfigTranslationEditFormAlter($form, $form_state);
 }
 
 /* ************************************************************************** */
diff --git a/modules/webform_access/src/Hook/WebformAccessHooks1.php b/modules/webform_access/src/Hook/WebformAccessHooks1.php
new file mode 100644
index 0000000..26c0aab
--- /dev/null
+++ b/modules/webform_access/src/Hook/WebformAccessHooks1.php
@@ -0,0 +1,138 @@
+<?php
+
+namespace Drupal\webform_access\Hook;
+
+use Drupal\webform_access\Entity\WebformAccessGroup;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\WebformSubmissionInterface;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\webform\WebformInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_access.
+ */
+class WebformAccessHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_ENTITY_TYPE_access() for webform entities.
+   */
+  #[Hook('webform_access')]
+  public static function webformAccess(WebformInterface $webform, $operation, AccountInterface $account) {
+    // Prevent recursion when a webform is being passed as the source entity
+    // via the URL.
+    // @see \Drupal\webform\Plugin\WebformSourceEntity\QueryStringWebformSourceEntity::getSourceEntity
+    if (\Drupal::request()->query->get('source_entity_type') === 'webform') {
+      return AccessResult::neutral();
+    }
+    /** @var \Drupal\webform\WebformRequestInterface $request_handler */
+    $request_handler = \Drupal::service('webform.request');
+    $source_entity = $request_handler->getCurrentSourceEntity([
+          'webform_submission',
+    ]);
+    if (!$source_entity) {
+      return AccessResult::neutral();
+    }
+    /** @var \Drupal\webform_access\WebformAccessGroupStorageInterface $webform_access_group */
+    $webform_access_group_storage = \Drupal::entityTypeManager()->getStorage('webform_access_group');
+    $webform_access_groups = $webform_access_group_storage->loadByEntities($webform, $source_entity, $account);
+    if (empty($webform_access_groups)) {
+      return AccessResult::neutral();
+    }
+    $permission = str_replace('submission_', '', $operation);
+    foreach ($webform_access_groups as $webform_access_group) {
+      $permissions = $webform_access_group->get('permissions');
+      if (in_array('administer', $permissions) || in_array($permission, $permissions)) {
+        return AccessResult::allowed()->cachePerUser()->addCacheableDependency($webform_access_group);
+      }
+    }
+    // No opinion.
+    return AccessResult::neutral();
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_access() for webform_submission entities.
+   */
+  #[Hook('webform_submission_access')]
+  public static function webformSubmissionAccess(WebformSubmissionInterface $webform_submission, $operation, AccountInterface $account) {
+    if (!in_array($operation, [
+          'view',
+          'update',
+          'delete',
+    ])) {
+      return AccessResult::neutral();
+    }
+    $webform = $webform_submission->getWebform();
+    $source_entity = $webform_submission->getSourceEntity();
+    if (!$source_entity) {
+      return AccessResult::neutral();
+    }
+    /** @var \Drupal\webform_access\WebformAccessGroupStorageInterface $webform_access_group */
+    $webform_access_group_storage = \Drupal::entityTypeManager()->getStorage('webform_access_group');
+    $webform_access_groups = $webform_access_group_storage->loadByEntities($webform, $source_entity, $account);
+    if (empty($webform_access_groups)) {
+      return AccessResult::neutral();
+    }
+    foreach ($webform_access_groups as $webform_access_group) {
+      $permissions = $webform_access_group->get('permissions');
+      if (in_array('administer', $permissions) || in_array($operation . '_any', $permissions) || in_array($operation . '_own', $permissions) && $webform_submission->getOwnerId() === $account->id()) {
+        return AccessResult::allowed()->cachePerUser()->addCacheableDependency($webform_access_group);
+      }
+    }
+    // No opinion.
+    return AccessResult::neutral();
+  }
+
+  /**
+   * Implements hook_form_BASE_FORM_ID_alter().
+   */
+  #[Hook('form_node_form_alter')]
+  public static function formNodeFormAlter(&$form, FormStateInterface $form_state, $form_id) {
+    /** @var \Drupal\webform\WebformEntityReferenceManagerInterface $entity_reference_manager */
+    $entity_reference_manager = \Drupal::service('webform.entity_reference_manager');
+    $node = $form_state->getFormObject()->getEntity();
+    $field_names = $entity_reference_manager->getFieldNames($node);
+    if ($field_names) {
+      $form['actions']['submit']['#submit'][] = '_webform_access_form_node_form_submit';
+    }
+  }
+
+  /* ************************************************************************** */
+  // Webform access group users.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for user form.
+   *
+   * Add the webform access group to an individual user's account page.
+   */
+  #[Hook('form_user_form_alter')]
+  public function formUserFormAlter(&$form, FormStateInterface $form_state) {
+    // Make sure some webform access groups exist before displaying
+    // the webform access details widget.
+    if (!WebformAccessGroup::loadMultiple()) {
+      return;
+    }
+    // Only display the webform access detail widget if the current user can
+    // administer webform and users.
+    if (!\Drupal::currentUser()->hasPermission('administer webform') || !\Drupal::currentUser()->hasPermission('administer users')) {
+      return;
+    }
+    $account = $form_state->getFormObject()->getEntity();
+    $default_value = \Drupal::database()->select('webform_access_group_user', 'gu')->fields('gu', [
+          'group_id',
+    ])->condition('uid', $account->id())->execute()->fetchCol();
+    $form['webform_access'] = [
+          '#type' => 'details',
+          '#title' => $this->t('Webform access'),
+          '#open' => TRUE,
+          '#weight' => 5,
+    ];
+    $form['webform_access']['webform_access_group'] = _webform_access_group_build_element($default_value, $form, $form_state);
+    $form['actions']['submit']['#submit'][] = '_webform_access_user_profile_form_submit';
+  }
+
+}
diff --git a/modules/webform_access/tests/src/Functional/WebformAccessSubmissionViewsTest.php b/modules/webform_access/tests/src/Functional/WebformAccessSubmissionViewsTest.php
index eef5f93..eeb5eef 100644
--- a/modules/webform_access/tests/src/Functional/WebformAccessSubmissionViewsTest.php
+++ b/modules/webform_access/tests/src/Functional/WebformAccessSubmissionViewsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 use Drupal\webform\WebformInterface;
@@ -11,6 +13,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform_access
  */
+#[Group('webform_access')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessSubmissionViewsTest extends WebformAccessBrowserTestBase {
 
   /**
diff --git a/modules/webform_access/tests/src/Functional/WebformAccessTest.php b/modules/webform_access/tests/src/Functional/WebformAccessTest.php
index b1d45fa..c07e6f6 100644
--- a/modules/webform_access/tests/src/Functional/WebformAccessTest.php
+++ b/modules/webform_access/tests/src/Functional/WebformAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldConfig;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\field\Entity\FieldConfig;
  *
  * @group webform_access
  */
+#[Group('webform_access')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessTest extends WebformAccessBrowserTestBase {
 
   /**
diff --git a/modules/webform_access/tests/src/Functional/WebformAccessTokensTest.php b/modules/webform_access/tests/src/Functional/WebformAccessTokensTest.php
index beac445..c88198e 100644
--- a/modules/webform_access/tests/src/Functional/WebformAccessTokensTest.php
+++ b/modules/webform_access/tests/src/Functional/WebformAccessTokensTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\WebformSubmission;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_access
  */
+#[Group('webform_access')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessTokensTest extends WebformAccessBrowserTestBase {
 
   /**
diff --git a/modules/webform_access/webform_access.module b/modules/webform_access/webform_access.module
index a5a8a64..ffc6c9d 100644
--- a/modules/webform_access/webform_access.module
+++ b/modules/webform_access/webform_access.module
@@ -5,9 +5,9 @@
  * Provides webform access controls for webform nodes.
  */
 
+use Drupal\webform_access\Hook\WebformAccessHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\Core\Render\BubbleableMetadata;
-use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Database\Query\AlterableInterface;
 use Drupal\Core\Entity\EntityInterface;
@@ -103,85 +103,17 @@ function webform_access_menu_local_tasks_alter(&$data, $route_name) {
 /**
  * Implements hook_ENTITY_TYPE_access() for webform entities.
  */
+#[LegacyHook]
 function webform_access_webform_access(WebformInterface $webform, $operation, AccountInterface $account) {
-  // Prevent recursion when a webform is being passed as the source entity
-  // via the URL.
-  // @see \Drupal\webform\Plugin\WebformSourceEntity\QueryStringWebformSourceEntity::getSourceEntity
-  if (\Drupal::request()->query->get('source_entity_type') === 'webform') {
-    return AccessResult::neutral();
-  }
-
-  /** @var \Drupal\webform\WebformRequestInterface $request_handler */
-  $request_handler = \Drupal::service('webform.request');
-  $source_entity = $request_handler->getCurrentSourceEntity(['webform_submission']);
-  if (!$source_entity) {
-    return AccessResult::neutral();
-  }
-
-  /** @var \Drupal\webform_access\WebformAccessGroupStorageInterface $webform_access_group */
-  $webform_access_group_storage = \Drupal::entityTypeManager()->getStorage('webform_access_group');
-  $webform_access_groups = $webform_access_group_storage->loadByEntities($webform, $source_entity, $account);
-  if (empty($webform_access_groups)) {
-    return AccessResult::neutral();
-  }
-
-  $permission = str_replace('submission_', '', $operation);
-  foreach ($webform_access_groups as $webform_access_group) {
-    $permissions = $webform_access_group->get('permissions');
-    if (
-      // Is admin.
-      in_array('administer', $permissions)
-      // Is operation any.
-      || in_array($permission, $permissions)) {
-      return AccessResult::allowed()
-        ->cachePerUser()
-        ->addCacheableDependency($webform_access_group);
-    }
-  }
-
-  // No opinion.
-  return AccessResult::neutral();
+  return \Drupal::service(WebformAccessHooks1::class)->webformAccess($webform, $operation, $account);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_access() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_access_webform_submission_access(WebformSubmissionInterface $webform_submission, $operation, AccountInterface $account) {
-  if (!in_array($operation, ['view', 'update', 'delete'])) {
-    return AccessResult::neutral();
-  }
-
-  $webform = $webform_submission->getWebform();
-  $source_entity = $webform_submission->getSourceEntity();
-  if (!$source_entity) {
-    return AccessResult::neutral();
-  }
-
-  /** @var \Drupal\webform_access\WebformAccessGroupStorageInterface $webform_access_group */
-  $webform_access_group_storage = \Drupal::entityTypeManager()->getStorage('webform_access_group');
-  $webform_access_groups = $webform_access_group_storage->loadByEntities($webform, $source_entity, $account);
-  if (empty($webform_access_groups)) {
-    return AccessResult::neutral();
-  }
-
-  foreach ($webform_access_groups as $webform_access_group) {
-    $permissions = $webform_access_group->get('permissions');
-    if (
-      // Is admin.
-      (in_array('administer', $permissions)) ||
-      // Is operation any.
-      (in_array($operation . '_any', $permissions)) ||
-      // Is operation own.
-      (in_array($operation . '_own', $permissions) && $webform_submission->getOwnerId() === $account->id())
-    ) {
-      return AccessResult::allowed()
-        ->cachePerUser()
-        ->addCacheableDependency($webform_access_group);
-    }
-  }
-
-  // No opinion.
-  return AccessResult::neutral();
+  return \Drupal::service(WebformAccessHooks1::class)->webformSubmissionAccess($webform_submission, $operation, $account);
 }
 
 /**
@@ -207,14 +139,9 @@ function webform_access_field_widget_single_element_form_alter(&$element, FormSt
 /**
  * Implements hook_form_BASE_FORM_ID_alter().
  */
+#[LegacyHook]
 function webform_access_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  /** @var \Drupal\webform\WebformEntityReferenceManagerInterface $entity_reference_manager */
-  $entity_reference_manager = \Drupal::service('webform.entity_reference_manager');
-  $node = $form_state->getFormObject()->getEntity();
-  $field_names = $entity_reference_manager->getFieldNames($node);
-  if ($field_names) {
-    $form['actions']['submit']['#submit'][] = '_webform_access_form_node_form_submit';
-  }
+  \Drupal::service(WebformAccessHooks1::class)->formNodeFormAlter($form, $form_state, $form_id);
 }
 
 /**
@@ -269,39 +196,9 @@ function _webform_access_form_node_form_submit(&$form, FormStateInterface $form_
  *
  * Add the webform access group to an individual user's account page.
  */
+#[LegacyHook]
 function webform_access_form_user_form_alter(&$form, FormStateInterface $form_state) {
-  // Make sure some webform access groups exist before displaying
-  // the webform access details widget.
-  if (!WebformAccessGroup::loadMultiple()) {
-    return;
-  }
-
-  // Only display the webform access detail widget if the current user can
-  // administer webform and users.
-  if (!\Drupal::currentUser()->hasPermission('administer webform')
-    || !\Drupal::currentUser()->hasPermission('administer users')) {
-    return;
-  }
-
-  $account = $form_state->getFormObject()->getEntity();
-  $default_value = \Drupal::database()->select('webform_access_group_user', 'gu')
-    ->fields('gu', ['group_id'])
-    ->condition('uid', $account->id())
-    ->execute()->fetchCol();
-
-  $form['webform_access'] = [
-    '#type' => 'details',
-    '#title' => t('Webform access'),
-    '#open' => TRUE,
-    '#weight' => 5,
-  ];
-  $form['webform_access']['webform_access_group'] = _webform_access_group_build_element(
-    $default_value,
-    $form,
-    $form_state
-  );
-
-  $form['actions']['submit']['#submit'][] = '_webform_access_user_profile_form_submit';
+  \Drupal::service(WebformAccessHooks1::class)->formUserFormAlter($form, $form_state);
 }
 
 /**
diff --git a/modules/webform_access/webform_access.services.yml b/modules/webform_access/webform_access.services.yml
index 52760ca..efea315 100644
--- a/modules/webform_access/webform_access.services.yml
+++ b/modules/webform_access/webform_access.services.yml
@@ -12,3 +12,7 @@ services:
   Drupal\webform_access\Hook\WebformAccessTokensHooks:
     class: Drupal\webform_access\Hook\WebformAccessTokensHooks
     autowire: true
+
+  Drupal\webform_access\Hook\WebformAccessHooks1:
+    class: Drupal\webform_access\Hook\WebformAccessHooks1
+    autowire: true
diff --git a/modules/webform_attachment/tests/src/Functional/WebformAttachmentTest.php b/modules/webform_attachment/tests/src/Functional/WebformAttachmentTest.php
index 9e10aba..1883fdc 100644
--- a/modules/webform_attachment/tests/src/Functional/WebformAttachmentTest.php
+++ b/modules/webform_attachment/tests/src/Functional/WebformAttachmentTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_attachment\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform_attachment\Element\WebformAttachmentToken;
  *
  * @group webform_attachment
  */
+#[Group('webform_attachment')]
+#[RunTestsInSeparateProcesses]
 class WebformAttachmentTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks.php b/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks.php
index 245b1b5..378ab0a 100644
--- a/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks.php
+++ b/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\webform_bootstrap\Hook;
 
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\bootstrap\Bootstrap;
 use Drupal\Core\Hook\Attribute\Hook;
 
 /**
@@ -25,7 +27,7 @@ class WebformBootstrapHooks {
    * Implements hook_webform_element_alter().
    */
   #[Hook('webform_element_alter')]
-  public function webformElementAlter(array &$element, \Drupal\Core\Form\FormStateInterface $form_state, array $context) {
+  public function webformElementAlter(array &$element, FormStateInterface $form_state, array $context) {
     if (!_webform_bootstrap_is_active_theme()) {
       return;
     }
@@ -34,7 +36,7 @@ class WebformBootstrapHooks {
     // @see \Drupal\bootstrap\Utility\Element::smartDescription
     static $smart_description_enabled;
     if (!isset($smart_description_enabled)) {
-      $theme = \Drupal\bootstrap\Bootstrap::getTheme();
+      $theme = Bootstrap::getTheme();
       $smart_description_enabled = $theme->getSetting('tooltip_enabled') && $theme->getSetting('forms_smart_descriptions');
     }
     // We need to set $element['#smart_description'] to false if the element's
diff --git a/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks1.php b/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks1.php
new file mode 100644
index 0000000..5bf7baa
--- /dev/null
+++ b/modules/webform_bootstrap/src/Hook/WebformBootstrapHooks1.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Drupal\webform_bootstrap\Hook;
+
+use Drupal\webform\Utility\WebformArrayHelper;
+use Drupal\webform\Utility\WebformElementHelper;
+use Drupal\webform_bootstrap\WebformBootstrapRenderCallbacks;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_bootstrap.
+ */
+class WebformBootstrapHooks1 {
+
+  /**
+   * Implements hook_webform_element_ELEMENT_TYPE_alter().
+   */
+  #[Hook('webform_element_webform_terms_of_service_alter')]
+  public static function webformElementWebformTermsOfServiceAlter(array &$element, FormStateInterface $form_state, array $context) {
+    // Terms of service agreement must always be displayed, so disable
+    // smart description.
+    $element['#smart_description'] = FALSE;
+  }
+
+  /**
+   * Implements hook_webform_element_ELEMENT_TYPE_alter().
+   */
+  #[Hook('webform_element_webform_likert_alter')]
+  public static function webformElementWebformLikertAlter(array &$element, FormStateInterface $form_state, array $context) {
+    $element['#pre_render'] = array_merge([
+          [
+              WebformBootstrapRenderCallbacks::class,
+              'webformLikertPreRender',
+          ],
+    ], $element['#pre_render']);
+  }
+
+  /**
+   * Implements hook_preprocess_form_element() for form element templates.
+   */
+  #[Hook('preprocess_form_element')]
+  public static function preprocessFormElement(&$variables) {
+    if (!_webform_bootstrap_is_active_theme()) {
+      return;
+    }
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    // Do not display phone number using inline form.
+    // @see https://www.drupal.org/project/webform/issues/2910776s
+    // @see https://www.drupal.org/project/bootstrap/issues/2829634
+    if (WebformElementHelper::isType($variables['element'], 'tel') && isset($variables['attributes']['class'])) {
+      WebformArrayHelper::removeValue($variables['attributes']['class'], 'form-inline');
+    }
+  }
+
+}
diff --git a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/src/Hook/WebformBootstrapTestModuleHooks2.php b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/src/Hook/WebformBootstrapTestModuleHooks2.php
new file mode 100644
index 0000000..0c075fa
--- /dev/null
+++ b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/src/Hook/WebformBootstrapTestModuleHooks2.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Drupal\webform_bootstrap_test_module\Hook;
+
+use Drupal\Core\Render\Element;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_bootstrap_test_module.
+ */
+class WebformBootstrapTestModuleHooks2 {
+
+  /**
+   * Implements hook_preprocess_webform_actions().
+   *
+   * @see template_preprocess_webform_actions()
+   */
+  #[Hook('preprocess_webform_actions', module: 'webform_bootstrap')]
+  public static function webformBootstrapPreprocessWebformActions(array &$variables) {
+    // Add .btn-lg to all 'submit' button in $variables.
+    foreach (Element::children($variables['element']) as $key) {
+      $variables['element'][$key]['#attributes']['class'][] = 'btn-lg';
+      $variables['element'][$key]['#attributes']['style'] = 'margin: 24px 0 0 0';
+      $variables[$key]['#attributes']['class'][] = 'btn-lg';
+      $variables[$key]['#attributes']['#attributes']['style'] = 'margin: 24px 0 0 0';
+    }
+  }
+
+}
diff --git a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/src/Hook/WebformBootstrapTestModuleHooks3.php b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/src/Hook/WebformBootstrapTestModuleHooks3.php
new file mode 100644
index 0000000..c77347e
--- /dev/null
+++ b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/src/Hook/WebformBootstrapTestModuleHooks3.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Drupal\webform_bootstrap_test_module\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_bootstrap_test_module.
+ */
+class WebformBootstrapTestModuleHooks3 {
+
+  /**
+   * Implements hook_preprocess_page().
+   */
+  #[Hook('preprocess_page')]
+  public static function preprocessPage(&$variables) {
+    if (!_webform_bootstrap_is_active_theme()) {
+      return;
+    }
+    // Remove sidebar second from admin route.
+    if (\Drupal::routeMatch()->getRouteObject()->getOption('_admin_route')) {
+      $variables['page']['sidebar_second'] = NULL;
+    }
+  }
+
+}
diff --git a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.inc b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.inc
index 24d8f06..fcfab98 100644
--- a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.inc
+++ b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.inc
@@ -5,6 +5,7 @@
  * Alter hooks for bootstrap testing.
  */
 
+use Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks2;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks;
 
@@ -14,7 +15,6 @@ use Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks;
  */
 
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Render\Element;
 
 /**
  * Implements hook_webform_submission_form_alter().
@@ -37,13 +37,7 @@ function webform_bootstrap_test_module_webform_element_alter(array &$element, Fo
  *
  * @see template_preprocess_webform_actions()
  */
+#[LegacyHook]
 function webform_bootstrap_preprocess_webform_actions(array &$variables) {
-  // Add .btn-lg to all 'submit' button in $variables.
-  foreach (Element::children($variables['element']) as $key) {
-    $variables['element'][$key]['#attributes']['class'][] = 'btn-lg';
-    $variables['element'][$key]['#attributes']['style'] = 'margin: 24px 0 0 0';
-
-    $variables[$key]['#attributes']['class'][] = 'btn-lg';
-    $variables[$key]['#attributes']['#attributes']['style'] = 'margin: 24px 0 0 0';
-  }
+  \Drupal::service(WebformBootstrapTestModuleHooks2::class)->webformBootstrapPreprocessWebformActions($variables);
 }
diff --git a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.module b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.module
index 7bc0ea6..88b5815 100644
--- a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.module
+++ b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.module
@@ -5,6 +5,7 @@
  * Test module for bootstrap.
  */
 
+use Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks3;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks1;
 
@@ -24,13 +25,7 @@ function webform_bootstrap_test_module_page_attachments(array &$attachments) {
 /**
  * Implements hook_preprocess_page().
  */
+#[LegacyHook]
 function webform_bootstrap_test_module_preprocess_page(&$variables) {
-  if (!_webform_bootstrap_is_active_theme()) {
-    return;
-  }
-
-  // Remove sidebar second from admin route.
-  if (\Drupal::routeMatch()->getRouteObject()->getOption('_admin_route')) {
-    $variables['page']['sidebar_second'] = NULL;
-  }
+  \Drupal::service(WebformBootstrapTestModuleHooks3::class)->preprocessPage($variables);
 }
diff --git a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.services.yml b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.services.yml
index 80236b2..e528b64 100644
--- a/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.services.yml
+++ b/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.services.yml
@@ -7,3 +7,11 @@ services:
   Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks1:
     class: Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks1
     autowire: true
+
+  Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks2:
+    class: Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks2
+    autowire: true
+
+  Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks3:
+    class: Drupal\webform_bootstrap_test_module\Hook\WebformBootstrapTestModuleHooks3
+    autowire: true
diff --git a/modules/webform_bootstrap/webform_bootstrap.install b/modules/webform_bootstrap/webform_bootstrap.install
index 8dc2308..ffd3155 100644
--- a/modules/webform_bootstrap/webform_bootstrap.install
+++ b/modules/webform_bootstrap/webform_bootstrap.install
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Extension\Requirement\RequirementSeverity;
+
 /**
  * @file
  * Installation information for the 'Webform Bootstrap module.
@@ -23,7 +30,7 @@ function webform_bootstrap_requirements() {
       'title' => t('Webform Bootstrap'),
       'value' => t('Bootstrap 3.x missing.'),
       'description' => t('Bootstrap 3.x. must be enabled to install the Webform Bootstrap module.'),
-      'severity' => REQUIREMENT_ERROR,
+      'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Error, fn() => REQUIREMENT_ERROR),
     ];
   }
   return $requirements;
diff --git a/modules/webform_bootstrap/webform_bootstrap.module b/modules/webform_bootstrap/webform_bootstrap.module
index fef9eef..046da84 100644
--- a/modules/webform_bootstrap/webform_bootstrap.module
+++ b/modules/webform_bootstrap/webform_bootstrap.module
@@ -5,13 +5,11 @@
  * Helps support Webform to Bootstrap integration.
  */
 
+use Drupal\webform_bootstrap\Hook\WebformBootstrapHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_bootstrap\Hook\WebformBootstrapHooks;
 use Drupal\bootstrap\Bootstrap;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\webform\Utility\WebformArrayHelper;
-use Drupal\webform\Utility\WebformElementHelper;
-use Drupal\webform_bootstrap\WebformBootstrapRenderCallbacks;
 
 // phpcs:disable Drupal.Classes.FullyQualifiedNamespace.UseStatementMissing
 
@@ -26,17 +24,17 @@ function webform_bootstrap_page_attachments(array &$attachments) {
 /**
  * Implements hook_webform_element_ELEMENT_TYPE_alter().
  */
+#[LegacyHook]
 function webform_bootstrap_webform_element_webform_terms_of_service_alter(array &$element, FormStateInterface $form_state, array $context) {
-  // Terms of service agreement must always be displayed, so disable
-  // smart description.
-  $element['#smart_description'] = FALSE;
+  \Drupal::service(WebformBootstrapHooks1::class)->webformElementWebformTermsOfServiceAlter($element, $form_state, $context);
 }
 
 /**
  * Implements hook_webform_element_ELEMENT_TYPE_alter().
  */
+#[LegacyHook]
 function webform_bootstrap_webform_element_webform_likert_alter(array &$element, FormStateInterface $form_state, array $context) {
-  $element['#pre_render'] = array_merge([[WebformBootstrapRenderCallbacks::class, 'webformLikertPreRender']], $element['#pre_render']);
+  \Drupal::service(WebformBootstrapHooks1::class)->webformElementWebformLikertAlter($element, $form_state, $context);
 }
 
 /**
@@ -86,22 +84,9 @@ function webform_bootstrap_preprocess_input(&$variables) {
 /**
  * Implements hook_preprocess_form_element() for form element templates.
  */
+#[LegacyHook]
 function webform_bootstrap_preprocess_form_element(&$variables) {
-  if (!_webform_bootstrap_is_active_theme()) {
-    return;
-  }
-
-  if (!WebformElementHelper::isWebformElement($variables['element'])) {
-    return;
-  }
-
-  // Do not display phone number using inline form.
-  // @see https://www.drupal.org/project/webform/issues/2910776s
-  // @see https://www.drupal.org/project/bootstrap/issues/2829634
-  if (WebformElementHelper::isType($variables['element'], 'tel')
-    && isset($variables['attributes']['class'])) {
-    WebformArrayHelper::removeValue($variables['attributes']['class'], 'form-inline');
-  }
+  \Drupal::service(WebformBootstrapHooks1::class)->preprocessFormElement($variables);
 }
 
 /**
diff --git a/modules/webform_bootstrap/webform_bootstrap.services.yml b/modules/webform_bootstrap/webform_bootstrap.services.yml
index 0012775..3faede5 100644
--- a/modules/webform_bootstrap/webform_bootstrap.services.yml
+++ b/modules/webform_bootstrap/webform_bootstrap.services.yml
@@ -3,3 +3,7 @@ services:
   Drupal\webform_bootstrap\Hook\WebformBootstrapHooks:
     class: Drupal\webform_bootstrap\Hook\WebformBootstrapHooks
     autowire: true
+
+  Drupal\webform_bootstrap\Hook\WebformBootstrapHooks1:
+    class: Drupal\webform_bootstrap\Hook\WebformBootstrapHooks1
+    autowire: true
diff --git a/modules/webform_cards/src/Hook/WebformCardsHooks1.php b/modules/webform_cards/src/Hook/WebformCardsHooks1.php
new file mode 100644
index 0000000..b57d970
--- /dev/null
+++ b/modules/webform_cards/src/Hook/WebformCardsHooks1.php
@@ -0,0 +1,327 @@
+<?php
+
+namespace Drupal\webform_cards\Hook;
+
+use Drupal\webform\WebformInterface;
+use Drupal\webform\Element\WebformMessage;
+use Drupal\webform\Utility\WebformDialogHelper;
+use Drupal\Core\Url;
+use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\WebformSubmissionInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_cards.
+ */
+class WebformCardsHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_preprocess_menu_local_action().
+   *
+   * @see webform_ui_preprocess_menu_local_action()
+   */
+  #[Hook('preprocess_menu_local_action')]
+  public static function preprocessMenuLocalAction(&$variables) {
+    if (\Drupal::routeMatch()->getRouteName() !== 'entity.webform.edit_form') {
+      return;
+    }
+    if ($variables['link']['#url']->getRouteName() === 'entity.webform_ui.element.add_card') {
+      $variables['link']['#options']['attributes']['class'][] = 'button--secondary';
+    }
+  }
+
+  /* ************************************************************************** */
+  // Entity hook.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_ENTITY_TYPE_presave() for webform_submission entities.
+   */
+  #[Hook('webform_submission_presave')]
+  public static function webformSubmissionPresave(WebformSubmissionInterface $webform_submission) {
+    if (!$webform_submission->isDraft()) {
+      $webform_submission->set('current_card', NULL);
+    }
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform UI and source edit form.
+   *
+   * @see \Drupal\webform_ui\WebformUiEntityElementsForm
+   */
+  #[Hook('form_webform_edit_form_alter')]
+  public function formWebformEditFormAlter(array &$form, FormStateInterface $form_state) {
+    if (!isset($form['webform_ui_elements'])) {
+      return;
+    }
+    /** @var \Drupal\webform_ui\WebformUiEntityElementsForm $form_object */
+    $form_object = $form_state->getFormObject();
+    /** @var \Drupal\webform\WebformInterface $webform */
+    $webform = $form_object->getEntity();
+    $wrapper_format = \Drupal::request()->get(MainContentViewSubscriber::WRAPPER_FORMAT);
+    $is_ajax_request = $wrapper_format === 'drupal_ajax';
+    if ($webform->hasWizardPages() && !$is_ajax_request) {
+      $form['webform_cards_convert'] = [
+            '#type' => 'webform_message',
+            '#message_message' => [
+                'message' => [
+                    '#markup' => $this->t("Do you want to convert this webform's wizard pages to cards?"),
+                ],
+                'link' => [
+                    '#type' => 'link',
+                    '#title' => $this->t('Convert'),
+                    '#url' => Url::fromRoute('entity.webform.cards_convert_form', [
+                        'webform' => $webform->id(),
+                    ]),
+                    '#attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW, [
+                        'button',
+                        'button--small',
+                    ]),
+                    '#prefix' => ' ',
+                ],
+            ],
+            '#message_type' => 'info',
+            '#message_close' => TRUE,
+            '#message_storage' => WebformMessage::STORAGE_SESSION,
+            '#message_id' => 'webform_card_convert_' . $webform->id(),
+            '#weight' => -100,
+      ];
+    }
+    $form['#attached']['library'][] = 'webform_cards/webform_cards.admin';
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform configuration:forms.
+   *
+   * @see \Drupal\webform\Form\AdminConfig\WebformAdminConfigFormsForm
+   * @see /admin/structure/webform/config
+   */
+  #[Hook('form_webform_admin_config_forms_form_alter')]
+  public function formWebformAdminConfigFormsFormAlter(array &$form, FormStateInterface $form_state) {
+    _webform_cards_form_alter_elements($form, [
+          'wizard_settings' => [
+              '#title' => $this->t('Form wizard/cards settings'),
+              'default_wizard_prev_button_label' => [
+                  '#title' => $this->t('Default wizard/cards previous page button label'),
+              ],
+              'default_wizard_next_button_label' => [
+                  '#title' => $this->t('Default wizard/cards next page button label'),
+              ],
+              'default_wizard_start_label' => [
+                  '#title' => $this->t('Default wizard/cards start label'),
+              ],
+              'default_wizard_confirmation_label' => [
+                  '#title' => $this->t('Default wizard/cards end label'),
+              ],
+              'default_wizard_toggle_show_label' => [
+                  '#title' => $this->t('Default wizard/cards show all elements label'),
+              ],
+              'default_wizard_toggle_hide_label' => [
+                  '#title' => $this->t('Default wizard/cards hide all elements label'),
+              ],
+          ],
+    ]);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform configuration:elements.
+   *
+   * @see \Drupal\webform\Form\AdminConfig\WebformAdminConfigElementsForm
+   * @see /admin/structure/webform/config/elements
+   */
+  #[Hook('form_webform_admin_config_elements_form_alter')]
+  public function formWebformAdminConfigElementsFormAlter(array &$form, FormStateInterface $form_state) {
+    _webform_cards_form_alter_elements($form, [
+          'element' => [
+              'default_section_title_tag' => [
+                  '#title' => $this->t('Default section/card title tag'),
+              ],
+          ],
+    ]);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform settings:form.
+   *
+   * @see \Drupal\webform\EntitySettings\WebformEntitySettingsFormForm
+   * @see /admin/structure/webform/manage/{webform}/settings
+   */
+  #[Hook('form_webform_settings_form_alter')]
+  public function formWebformSettingsFormAlter(array &$form, FormStateInterface $form_state) {
+    $has_cards = _webform_cards_form_state_has_cards($form_state);
+    if (!$has_cards) {
+      return;
+    }
+    // Move hide/show from container to jus the progress type.
+    $form['ajax_settings']['ajax_container']['ajax_progress_type']['#states'] = $form['ajax_settings']['ajax_container']['#states'];
+    $form['ajax_settings']['ajax_container']['#states'] = NULL;
+    // Display info message.
+    $form['ajax_settings']['ajax_container']['ajax_progress_type']['#weight'] = -10;
+    $form['ajax_settings']['ajax_container']['ajax_cards_message'] = [
+          '#type' => 'webform_message',
+          '#message_type' => 'info',
+          '#message_close' => TRUE,
+          '#message_storage' => WebformMessage::STORAGE_SESSION,
+          '#message_message' => $this->t('The below Ajax scroll, effect, and speed settings will also be applied to cards.'),
+          '#weight' => -9,
+    ];
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform settings form.
+   *
+   * @see \Drupal\webform\EntitySettings\WebformEntitySettingsGeneralForm
+   * @see /admin/structure/webform/manage/{webform}/settings/form
+   */
+  #[Hook('form_webform_settings_form_form_alter')]
+  public function formWebformSettingsFormFormAlter(array &$form, FormStateInterface $form_state) {
+    $has_cards = _webform_cards_form_state_has_cards($form_state);
+    if ($has_cards) {
+      unset($form['wizard_settings']['#states']);
+    }
+    _webform_cards_form_alter_elements($form, [
+          'wizard_settings' => [
+              '#title' => $this->t('Form wizard/cards settings'),
+              // Progress.
+              'wizard_progress_bar' => [
+                  '#title' => $this->t('Show wizard/cards progress bar'),
+              ],
+              'wizard_progress_link' => [
+                  '#title' => $this->t('Link to previous pages/cards in progress bar'),
+                  '#description' => $this->t('If checked, previous pages/cards will be link in the progress bar.'),
+              ],
+              'wizard_progress_pages' => [
+                  '#title' => $this->t('Show wizard/cards progress pages'),
+              ],
+              'wizard_progress_percentage' => [
+                  '#title' => $this->t('Show wizard/cards progress percentage'),
+              ],
+              'wizard_preview_link' => [
+                  '#title' => $this->t('Link to previous pages/cards in preview'),
+                  '#description' => $this->t("If checked, the preview page/card will include 'Edit' buttons for each previous page/card.") . '<br/><br/>' . '<em>' . $this->t("This setting is only available when 'Enable preview page/card' is enabled.") . '</em>',
+              ],
+              'wizard_progress_states' => [
+                  '#title' => $this->t("Update wizard/cards progress bar's pages based on conditions"),
+                  '#description' => $this->t("If checked, the wizard/cards progress bar's pages will be hidden or shown based on each pages conditional logic."),
+              ],
+              // Navigation.
+              'wizard_navigation_title' => [
+                  '#access' => TRUE,
+              ],
+              'wizard_auto_forward' => [
+                  '#access' => TRUE,
+              ],
+              'wizard_auto_forward_hide_next_button' => [
+                  '#access' => TRUE,
+              ],
+              'wizard_keyboard' => [
+                  '#access' => TRUE,
+              ],
+              // Pages.
+              'wizard_pages_title' => [
+                  '#states' => [],
+              ],
+              'wizard_confirmation' => [
+                  '#title' => $this->t('Include confirmation page/card in progress'),
+                  '#description' => $this->t("If checked, the confirmation page/card will be included in the progress bar."),
+              ],
+              'wizard_toggle' => [
+                  '#title' => $this->t('Display show/hide all wizard/cards pages link'),
+                  '#description' => $this->t('If checked, a hide/show all elements link will be added to this webform when there are wizard/cards pages.'),
+                  '#access' => TRUE,
+              ],
+              // Labels.
+              'wizard_toggle_show_label' => [
+                  '#title' => $this->t('Wizard/cards show all elements label'),
+                  '#access' => TRUE,
+              ],
+              'wizard_toggle_hide_label' => [
+                  '#title' => $this->t('Wizard/card hide all elements label'),
+                  '#access' => TRUE,
+              ],
+              'wizard_start_label' => [
+                  '#title' => $this->t('Wizard/cards start label'),
+                  '#description' => $this->t('The first page label in the progress bar. Subsequent pages are titled by their wizard/card page title.'),
+              ],
+              'wizard_confirmation_label' => [
+                  '#title' => $this->t('Wizard/cards end label'),
+              ],
+              'wizard_prev_button_label' => [
+                  '#title' => $this->t('Wizard/cards previous page button label'),
+                  '#description' => $this->t('This is used for the previous page button within a wizard/cards.'),
+              ],
+              'wizard_next_button_label' => [
+                  '#title' => $this->t('Wizard/cards next page button label'),
+                  '#description' => $this->t('This is used for the next page button within a wizard/cards.'),
+              ],
+              // Tracking.
+              'wizard_track' => [
+                  '#title' => $this->t('Track wizard/cards progress in the URL by'),
+                  '#options' => [
+                      'name' => $this->t("Page/card name (?page=contact)"),
+                      'index' => $this->t("Page/card index (?page=2)"),
+                  ],
+              ],
+          ],
+    ]);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform settings submissions.
+   *
+   * @see \Drupal\webform\EntitySettings\WebformEntitySettingsSubmissionsForm
+   * @see /admin/structure/webform/manage/{webform}/settings/form
+   */
+  #[Hook('form_webform_settings_submissions_form_alter')]
+  public function formWebformSettingsSubmissionsFormAlter(array &$form, FormStateInterface $form_state) {
+    $has_cards = _webform_cards_form_state_has_cards($form_state);
+    if ($has_cards) {
+      $form['draft_settings']['draft_container']['draft_multiple']['#weight'] = -1;
+      $form['draft_settings']['draft_container']['draft_auto_save_message'] = [
+            '#type' => 'webform_message',
+            '#message_message' => $this->t('The automatic saving of drafts only applies to previewing when using cards. Please try using the <a href=":href">Webform autosave module</a>.', [
+                ':href' => 'https://www.drupal.org/project/webformautosave',
+            ]),
+            '#message_type' => 'info',
+            '#message_close' => TRUE,
+            '#message_storage' => WebformMessage::STORAGE_SESSION,
+            '#message_id' => 'webform_card_draft_auto_save',
+            '#weight' => 0,
+      ];
+    }
+  }
+
+  /**
+   * Implements hook_preprocess_webform_confirmation() for webform cards.
+   */
+  #[Hook('preprocess_webform_confirmation')]
+  public static function preprocessWebformConfirmation(array &$variables) {
+    /** @var \Drupal\webform\WebformInterface $webform */
+    $webform = $variables['webform'];
+    /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
+    $webform_submission = $variables['webform_submission'];
+    /** @var \Drupal\webform_cards\WebformCardsManagerInterface $webform_cards_manager */
+    $webform_cards_manager = \Drupal::service('webform_cards.manager');
+    // Check if the webform has cards.
+    $has_cards = $webform_cards_manager->hasCards($webform);
+    if (!$has_cards) {
+      return;
+    }
+    // Set progress.
+    $pages = $webform_cards_manager->buildPages($webform);
+    $settings = $webform->getSettings();
+    if ($pages && $settings['wizard_confirmation'] && ($settings['wizard_progress_bar'] || $settings['wizard_progress_pages'] || $settings['wizard_progress_percentage'])) {
+      $variables['progress'] = [
+            '#theme' => 'webform_progress',
+            '#webform' => $webform,
+            '#webform_submission' => $webform_submission,
+            '#current_page' => WebformInterface::PAGE_CONFIRMATION,
+            '#pages' => $webform_cards_manager->applyConditions($pages, $webform_submission),
+      ];
+    }
+  }
+
+}
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAjaxJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAjaxJavaScriptTest.php
index 2c44bad..1e6a387 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAjaxJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAjaxJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsAjaxJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAutoForwardJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAutoForwardJavaScriptTest.php
index 577f3f2..a8b7178 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAutoForwardJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsAutoForwardJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsAutoForwardJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsDraftJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsDraftJavaScriptTest.php
index 52e979a..1531302 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsDraftJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsDraftJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsDraftJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsProgressJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsProgressJavaScriptTest.php
index 5373aa8..b787e50 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsProgressJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsProgressJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsProgressJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsStatesJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsStatesJavaScriptTest.php
index 1e9e155..d7d8d23 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsStatesJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsStatesJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsStatesJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsToggleJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsToggleJavaScriptTest.php
index f0a3b04..7f1a45e 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsToggleJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsToggleJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsToggleJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsUiJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsUiJavaScriptTest.php
index cdde9b0..b3962e1 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsUiJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsUiJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsUiJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsValidationJavaScriptTest.php b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsValidationJavaScriptTest.php
index a5e17c8..e080276 100644
--- a/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsValidationJavaScriptTest.php
+++ b/modules/webform_cards/tests/src/FunctionalJavascript/WebformCardsValidationJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_cards\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_cards
  */
+#[Group('webform_cards')]
+#[RunTestsInSeparateProcesses]
 class WebformCardsValidationJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_cards/webform_cards.module b/modules/webform_cards/webform_cards.module
index 5adb196..3e5d46f 100644
--- a/modules/webform_cards/webform_cards.module
+++ b/modules/webform_cards/webform_cards.module
@@ -5,19 +5,15 @@
  * Provides a 'Card' container element for clientside multistep form pagination.
  */
 
+use Drupal\webform_cards\Hook\WebformCardsHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_cards\Hook\WebformCardsHooks;
 use Drupal\Core\Entity\EntityTypeInterface;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\RenderElementBase;
 use Drupal\Core\Template\Attribute;
-use Drupal\Core\Url;
-use Drupal\webform\Element\WebformMessage;
-use Drupal\webform\Utility\WebformDialogHelper;
 use Drupal\webform\Utility\WebformElementHelper;
-use Drupal\webform\WebformInterface;
 use Drupal\webform\WebformSubmissionInterface;
 
 /**
@@ -45,14 +41,9 @@ function webform_cards_menu_local_actions_alter(&$local_actions) {
  *
  * @see webform_ui_preprocess_menu_local_action()
  */
+#[LegacyHook]
 function webform_cards_preprocess_menu_local_action(&$variables) {
-  if (\Drupal::routeMatch()->getRouteName() !== 'entity.webform.edit_form') {
-    return;
-  }
-
-  if ($variables['link']['#url']->getRouteName() === 'entity.webform_ui.element.add_card') {
-    $variables['link']['#options']['attributes']['class'][] = 'button--secondary';
-  }
+  \Drupal::service(WebformCardsHooks1::class)->preprocessMenuLocalAction($variables);
 }
 
 /* ************************************************************************** */
@@ -62,10 +53,9 @@ function webform_cards_preprocess_menu_local_action(&$variables) {
 /**
  * Implements hook_ENTITY_TYPE_presave() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_cards_webform_submission_presave(WebformSubmissionInterface $webform_submission) {
-  if (!$webform_submission->isDraft()) {
-    $webform_submission->set('current_card', NULL);
-  }
+  \Drupal::service(WebformCardsHooks1::class)->webformSubmissionPresave($webform_submission);
 }
 
 /* ************************************************************************** */
@@ -92,40 +82,9 @@ function webform_cards_webform_submission_builder($entity_type, WebformSubmissio
  *
  * @see \Drupal\webform_ui\WebformUiEntityElementsForm
  */
+#[LegacyHook]
 function webform_cards_form_webform_edit_form_alter(array &$form, FormStateInterface $form_state) {
-  if (!isset($form['webform_ui_elements'])) {
-    return;
-  }
-
-  /** @var \Drupal\webform_ui\WebformUiEntityElementsForm $form_object */
-  $form_object = $form_state->getFormObject();
-
-  /** @var \Drupal\webform\WebformInterface $webform */
-  $webform = $form_object->getEntity();
-  $wrapper_format = \Drupal::request()->get(MainContentViewSubscriber::WRAPPER_FORMAT);
-  $is_ajax_request = ($wrapper_format === 'drupal_ajax');
-  if ($webform->hasWizardPages() && !$is_ajax_request) {
-    $form['webform_cards_convert'] = [
-      '#type' => 'webform_message',
-      '#message_message' => [
-        'message' => ['#markup' => t("Do you want to convert this webform's wizard pages to cards?")],
-        'link' => [
-          '#type' => 'link',
-          '#title' => t('Convert'),
-          '#url' => Url::fromRoute('entity.webform.cards_convert_form', ['webform' => $webform->id()]),
-          '#attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW, ['button', 'button--small']),
-          '#prefix' => ' ',
-        ],
-      ],
-      '#message_type' => 'info',
-      '#message_close' => TRUE,
-      '#message_storage' => WebformMessage::STORAGE_SESSION,
-      '#message_id' => 'webform_card_convert_' . $webform->id(),
-      '#weight' => -100,
-    ];
-  }
-
-  $form['#attached']['library'][] = 'webform_cards/webform_cards.admin';
+  \Drupal::service(WebformCardsHooks1::class)->formWebformEditFormAlter($form, $form_state);
 }
 
 /**
@@ -134,30 +93,9 @@ function webform_cards_form_webform_edit_form_alter(array &$form, FormStateInter
  * @see \Drupal\webform\Form\AdminConfig\WebformAdminConfigFormsForm
  * @see /admin/structure/webform/config
  */
+#[LegacyHook]
 function webform_cards_form_webform_admin_config_forms_form_alter(array &$form, FormStateInterface $form_state) {
-  _webform_cards_form_alter_elements($form, [
-    'wizard_settings' => [
-      '#title' => t('Form wizard/cards settings'),
-      'default_wizard_prev_button_label' => [
-        '#title' => t('Default wizard/cards previous page button label'),
-      ],
-      'default_wizard_next_button_label' => [
-        '#title' => t('Default wizard/cards next page button label'),
-      ],
-      'default_wizard_start_label' => [
-        '#title' => t('Default wizard/cards start label'),
-      ],
-      'default_wizard_confirmation_label' => [
-        '#title' => t('Default wizard/cards end label'),
-      ],
-      'default_wizard_toggle_show_label' => [
-        '#title' => t('Default wizard/cards show all elements label'),
-      ],
-      'default_wizard_toggle_hide_label' => [
-        '#title' => t('Default wizard/cards hide all elements label'),
-      ],
-    ],
-  ]);
+  \Drupal::service(WebformCardsHooks1::class)->formWebformAdminConfigFormsFormAlter($form, $form_state);
 }
 
 /**
@@ -166,14 +104,9 @@ function webform_cards_form_webform_admin_config_forms_form_alter(array &$form,
  * @see \Drupal\webform\Form\AdminConfig\WebformAdminConfigElementsForm
  * @see /admin/structure/webform/config/elements
  */
+#[LegacyHook]
 function webform_cards_form_webform_admin_config_elements_form_alter(array &$form, FormStateInterface $form_state) {
-  _webform_cards_form_alter_elements($form, [
-    'element' => [
-      'default_section_title_tag' => [
-        '#title' => t('Default section/card title tag'),
-      ],
-    ],
-  ]);
+  \Drupal::service(WebformCardsHooks1::class)->formWebformAdminConfigElementsFormAlter($form, $form_state);
 }
 
 /**
@@ -182,26 +115,9 @@ function webform_cards_form_webform_admin_config_elements_form_alter(array &$for
  * @see \Drupal\webform\EntitySettings\WebformEntitySettingsFormForm
  * @see /admin/structure/webform/manage/{webform}/settings
  */
+#[LegacyHook]
 function webform_cards_form_webform_settings_form_alter(array &$form, FormStateInterface $form_state) {
-  $has_cards = _webform_cards_form_state_has_cards($form_state);
-  if (!$has_cards) {
-    return;
-  }
-
-  // Move hide/show from container to jus the progress type.
-  $form['ajax_settings']['ajax_container']['ajax_progress_type']['#states'] = $form['ajax_settings']['ajax_container']['#states'];
-  $form['ajax_settings']['ajax_container']['#states'] = NULL;
-
-  // Display info message.
-  $form['ajax_settings']['ajax_container']['ajax_progress_type']['#weight'] = -10;
-  $form['ajax_settings']['ajax_container']['ajax_cards_message'] = [
-    '#type' => 'webform_message',
-    '#message_type' => 'info',
-    '#message_close' => TRUE,
-    '#message_storage' => WebformMessage::STORAGE_SESSION,
-    '#message_message' => t('The below Ajax scroll, effect, and speed settings will also be applied to cards.'),
-    '#weight' => -9,
-  ];
+  \Drupal::service(WebformCardsHooks1::class)->formWebformSettingsFormAlter($form, $form_state);
 }
 
 /**
@@ -210,98 +126,9 @@ function webform_cards_form_webform_settings_form_alter(array &$form, FormStateI
  * @see \Drupal\webform\EntitySettings\WebformEntitySettingsGeneralForm
  * @see /admin/structure/webform/manage/{webform}/settings/form
  */
+#[LegacyHook]
 function webform_cards_form_webform_settings_form_form_alter(array &$form, FormStateInterface $form_state) {
-  $has_cards = _webform_cards_form_state_has_cards($form_state);
-  if ($has_cards) {
-    unset($form['wizard_settings']['#states']);
-  }
-
-  _webform_cards_form_alter_elements($form, [
-    'wizard_settings' => [
-      '#title' => t('Form wizard/cards settings'),
-      // Progress.
-      'wizard_progress_bar' => [
-        '#title' => t('Show wizard/cards progress bar'),
-      ],
-      'wizard_progress_link' => [
-        '#title' => t('Link to previous pages/cards in progress bar'),
-        '#description' => t('If checked, previous pages/cards will be link in the progress bar.'),
-      ],
-      'wizard_progress_pages' => [
-        '#title' => t('Show wizard/cards progress pages'),
-      ],
-      'wizard_progress_percentage' => [
-        '#title' => t('Show wizard/cards progress percentage'),
-      ],
-      'wizard_preview_link' => [
-        '#title' => t('Link to previous pages/cards in preview'),
-        '#description' => t("If checked, the preview page/card will include 'Edit' buttons for each previous page/card.") . '<br/><br/>' .
-        '<em>' . t("This setting is only available when 'Enable preview page/card' is enabled.") . '</em>',
-      ],
-      'wizard_progress_states' => [
-        '#title' => t("Update wizard/cards progress bar's pages based on conditions"),
-        '#description' => t("If checked, the wizard/cards progress bar's pages will be hidden or shown based on each pages conditional logic."),
-      ],
-      // Navigation.
-      'wizard_navigation_title' => [
-        '#access' => TRUE,
-      ],
-      'wizard_auto_forward' => [
-        '#access' => TRUE,
-      ],
-      'wizard_auto_forward_hide_next_button' => [
-        '#access' => TRUE,
-      ],
-      'wizard_keyboard' => [
-        '#access' => TRUE,
-      ],
-      // Pages.
-      'wizard_pages_title' => [
-        '#states' => [],
-      ],
-      'wizard_confirmation' => [
-        '#title' => t('Include confirmation page/card in progress'),
-        '#description' => t("If checked, the confirmation page/card will be included in the progress bar."),
-      ],
-      'wizard_toggle' => [
-        '#title' => t('Display show/hide all wizard/cards pages link'),
-        '#description' => t('If checked, a hide/show all elements link will be added to this webform when there are wizard/cards pages.'),
-        '#access' => TRUE,
-      ],
-      // Labels.
-      'wizard_toggle_show_label' => [
-        '#title' => t('Wizard/cards show all elements label'),
-        '#access' => TRUE,
-      ],
-      'wizard_toggle_hide_label' => [
-        '#title' => t('Wizard/card hide all elements label'),
-        '#access' => TRUE,
-      ],
-      'wizard_start_label' => [
-        '#title' => t('Wizard/cards start label'),
-        '#description' => t('The first page label in the progress bar. Subsequent pages are titled by their wizard/card page title.'),
-      ],
-      'wizard_confirmation_label' => [
-        '#title' => t('Wizard/cards end label'),
-      ],
-      'wizard_prev_button_label' => [
-        '#title' => t('Wizard/cards previous page button label'),
-        '#description' => t('This is used for the previous page button within a wizard/cards.'),
-      ],
-      'wizard_next_button_label' => [
-        '#title' => t('Wizard/cards next page button label'),
-        '#description' => t('This is used for the next page button within a wizard/cards.'),
-      ],
-      // Tracking.
-      'wizard_track' => [
-        '#title' => t('Track wizard/cards progress in the URL by'),
-        '#options' => [
-          'name' => t("Page/card name (?page=contact)"),
-          'index' => t("Page/card index (?page=2)"),
-        ],
-      ],
-    ],
-  ]);
+  \Drupal::service(WebformCardsHooks1::class)->formWebformSettingsFormFormAlter($form, $form_state);
 }
 
 /**
@@ -310,20 +137,9 @@ function webform_cards_form_webform_settings_form_form_alter(array &$form, FormS
  * @see \Drupal\webform\EntitySettings\WebformEntitySettingsSubmissionsForm
  * @see /admin/structure/webform/manage/{webform}/settings/form
  */
+#[LegacyHook]
 function webform_cards_form_webform_settings_submissions_form_alter(array &$form, FormStateInterface $form_state) {
-  $has_cards = _webform_cards_form_state_has_cards($form_state);
-  if ($has_cards) {
-    $form['draft_settings']['draft_container']['draft_multiple']['#weight'] = -1;
-    $form['draft_settings']['draft_container']['draft_auto_save_message'] = [
-      '#type' => 'webform_message',
-      '#message_message' => t('The automatic saving of drafts only applies to previewing when using cards. Please try using the <a href=":href">Webform autosave module</a>.', [':href' => 'https://www.drupal.org/project/webformautosave']),
-      '#message_type' => 'info',
-      '#message_close' => TRUE,
-      '#message_storage' => WebformMessage::STORAGE_SESSION,
-      '#message_id' => 'webform_card_draft_auto_save',
-      '#weight' => 0,
-    ];
-  }
+  \Drupal::service(WebformCardsHooks1::class)->formWebformSettingsSubmissionsFormAlter($form, $form_state);
 }
 
 /**
@@ -439,31 +255,7 @@ function template_preprocess_webform_card(array &$variables) {
 /**
  * Implements hook_preprocess_webform_confirmation() for webform cards.
  */
+#[LegacyHook]
 function webform_cards_preprocess_webform_confirmation(array &$variables) {
-  /** @var \Drupal\webform\WebformInterface $webform */
-  $webform = $variables['webform'];
-  /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
-  $webform_submission = $variables['webform_submission'];
-
-  /** @var \Drupal\webform_cards\WebformCardsManagerInterface $webform_cards_manager */
-  $webform_cards_manager = \Drupal::service('webform_cards.manager');
-
-  // Check if the webform has cards.
-  $has_cards = $webform_cards_manager->hasCards($webform);
-  if (!$has_cards) {
-    return;
-  }
-
-  // Set progress.
-  $pages = $webform_cards_manager->buildPages($webform);
-  $settings = $webform->getSettings();
-  if ($pages && $settings['wizard_confirmation'] && ($settings['wizard_progress_bar'] || $settings['wizard_progress_pages'] || $settings['wizard_progress_percentage'])) {
-    $variables['progress'] = [
-      '#theme' => 'webform_progress',
-      '#webform' => $webform,
-      '#webform_submission' => $webform_submission,
-      '#current_page' => WebformInterface::PAGE_CONFIRMATION,
-      '#pages' => $webform_cards_manager->applyConditions($pages, $webform_submission),
-    ];
-  }
+  \Drupal::service(WebformCardsHooks1::class)->preprocessWebformConfirmation($variables);
 }
diff --git a/modules/webform_cards/webform_cards.services.yml b/modules/webform_cards/webform_cards.services.yml
index 393badb..1f24c91 100644
--- a/modules/webform_cards/webform_cards.services.yml
+++ b/modules/webform_cards/webform_cards.services.yml
@@ -11,3 +11,7 @@ services:
   Drupal\webform_cards\Hook\WebformCardsHooks:
     class: Drupal\webform_cards\Hook\WebformCardsHooks
     autowire: true
+
+  Drupal\webform_cards\Hook\WebformCardsHooks1:
+    class: Drupal\webform_cards\Hook\WebformCardsHooks1
+    autowire: true
diff --git a/modules/webform_clientside_validation/tests/src/FunctionalJavascript/Validation/WebformClientSideValidationJavaScriptTest.php b/modules/webform_clientside_validation/tests/src/FunctionalJavascript/Validation/WebformClientSideValidationJavaScriptTest.php
index be0dd5c..3d0229c 100644
--- a/modules/webform_clientside_validation/tests/src/FunctionalJavascript/Validation/WebformClientSideValidationJavaScriptTest.php
+++ b/modules/webform_clientside_validation/tests/src/FunctionalJavascript/Validation/WebformClientSideValidationJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_clientside_validation\FunctionalJavascript\Validation;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformClientSideValidationJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_demo/webform_demo_application_evaluation/src/Hook/WebformDemoApplicationEvaluationHooks.php b/modules/webform_demo/webform_demo_application_evaluation/src/Hook/WebformDemoApplicationEvaluationHooks.php
new file mode 100644
index 0000000..ff3e181
--- /dev/null
+++ b/modules/webform_demo/webform_demo_application_evaluation/src/Hook/WebformDemoApplicationEvaluationHooks.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\webform_demo_application_evaluation\Hook;
+
+use Drupal\webform\WebformSubmissionInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_demo_application_evaluation.
+ */
+class WebformDemoApplicationEvaluationHooks {
+
+  /**
+   * Implements hook_ENTITY_TYPE_presave() for webform_submission entities.
+   */
+  #[Hook('webform_submission_presave')]
+  public static function webformSubmissionPresave(WebformSubmissionInterface $webform_submission) {
+    if ($webform_submission->getWebform()->id() !== 'demo_application') {
+      return;
+    }
+    // Get original data (with default state) and current data.
+    $original_data = $webform_submission->getOriginalData() + [
+          'state' => NULL,
+    ];
+    $current_data = $webform_submission->getData();
+    // If submission is completed and state is not set then set state to completed.
+    if ($webform_submission->isCompleted() && empty($current_data['state'])) {
+      $current_data['state'] = 'completed';
+    }
+    // If the current state has changed then update the related element's
+    // datetime. For example, if the current state is 'completed' the related
+    // datetime element is called 'completed_date'.
+    // @see /admin/structure/webform/manage/demo_application
+    if ($original_data['state'] !== $current_data['state']) {
+      /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */
+      $date_formatter = \Drupal::service('date.formatter');
+      $current_data[$current_data['state'] . '_date'] = $date_formatter->format(time(), 'html_datetime');
+      $webform_submission->setData($current_data);
+    }
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_insert() for webform_submission entities.
+   */
+  #[Hook('webform_submission_insert')]
+  public static function webformSubmissionInsert(WebformSubmissionInterface $webform_submission) {
+    _webform_demo_application_evaluation_calculate_evaluation_rating($webform_submission);
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_update() for webform_submission entities.
+   */
+  #[Hook('webform_submission_update')]
+  public static function webformSubmissionUpdate(WebformSubmissionInterface $webform_submission) {
+    _webform_demo_application_evaluation_calculate_evaluation_rating($webform_submission);
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_delete() for webform_submission entities.
+   */
+  #[Hook('webform_submission_delete')]
+  public static function webformSubmissionDelete(WebformSubmissionInterface $webform_submission) {
+    _webform_demo_application_evaluation_calculate_evaluation_rating($webform_submission);
+  }
+
+}
diff --git a/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.module b/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.module
index 7b39f8e..386b598 100644
--- a/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.module
+++ b/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.module
@@ -5,57 +5,40 @@
  * Demonstrate how to use the Webform module to build an application/evaluation system.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform_demo_application_evaluation\Hook\WebformDemoApplicationEvaluationHooks;
 use Drupal\webform\WebformSubmissionInterface;
 
 /**
  * Implements hook_ENTITY_TYPE_presave() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_demo_application_evaluation_webform_submission_presave(WebformSubmissionInterface $webform_submission) {
-  if ($webform_submission->getWebform()->id() !== 'demo_application') {
-    return;
-  }
-
-  // Get original data (with default state) and current data.
-  $original_data = $webform_submission->getOriginalData() + ['state' => NULL];
-  $current_data = $webform_submission->getData();
-
-  // If submission is completed and state is not set then set state to completed.
-  if ($webform_submission->isCompleted() && empty($current_data['state'])) {
-    $current_data['state'] = 'completed';
-  }
-
-  // If the current state has changed then update the related element's
-  // datetime. For example, if the current state is 'completed' the related
-  // datetime element is called 'completed_date'.
-  // @see /admin/structure/webform/manage/demo_application
-  if ($original_data['state'] !== $current_data['state']) {
-    /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */
-    $date_formatter = \Drupal::service('date.formatter');
-    $current_data[$current_data['state'] . '_date'] = $date_formatter->format(time(), 'html_datetime');
-
-    $webform_submission->setData($current_data);
-  }
+  \Drupal::service(WebformDemoApplicationEvaluationHooks::class)->webformSubmissionPresave($webform_submission);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_insert() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_demo_application_evaluation_webform_submission_insert(WebformSubmissionInterface $webform_submission) {
-  _webform_demo_application_evaluation_calculate_evaluation_rating($webform_submission);
+  \Drupal::service(WebformDemoApplicationEvaluationHooks::class)->webformSubmissionInsert($webform_submission);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_update() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_demo_application_evaluation_webform_submission_update(WebformSubmissionInterface $webform_submission) {
-  _webform_demo_application_evaluation_calculate_evaluation_rating($webform_submission);
+  \Drupal::service(WebformDemoApplicationEvaluationHooks::class)->webformSubmissionUpdate($webform_submission);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_delete() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_demo_application_evaluation_webform_submission_delete(WebformSubmissionInterface $webform_submission) {
-  _webform_demo_application_evaluation_calculate_evaluation_rating($webform_submission);
+  \Drupal::service(WebformDemoApplicationEvaluationHooks::class)->webformSubmissionDelete($webform_submission);
 }
 
 /**
diff --git a/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.services.yml b/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.services.yml
new file mode 100644
index 0000000..14f0c06
--- /dev/null
+++ b/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\webform_demo_application_evaluation\Hook\WebformDemoApplicationEvaluationHooks:
+    class: Drupal\webform_demo_application_evaluation\Hook\WebformDemoApplicationEvaluationHooks
+    autowire: true
diff --git a/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.install b/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.install
index 77b7c7e..a161322 100644
--- a/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.install
+++ b/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.install
@@ -5,6 +5,8 @@
  * Install, update and uninstall functions for the webform demo event registration module.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\filter\FilterFormatRepositoryInterface;
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -29,7 +31,7 @@ function webform_demo_event_registration_install() {
     $webform_node->webform->open = '';
     $webform_node->webform->close = '';
     $webform_node->body->value = '<p>' . t('This is example of event with a registration form that sends an email confirmation and an email reminder 1 day before the event.') . '</p>';
-    $webform_node->body->format = filter_default_format();
+    $webform_node->body->format = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getDefaultFormat()->id(), fn() => filter_default_format());
     $webform_node->field_webform_demo_event_date->value = WebformDateHelper::formatStorage(DrupalDateTime::createFromTimestamp(strtotime('+1 months')));
     $webform_node->save();
   }
diff --git a/modules/webform_devel/src/Hook/WebformDevelHooks1.php b/modules/webform_devel/src/Hook/WebformDevelHooks1.php
new file mode 100644
index 0000000..aca7fa6
--- /dev/null
+++ b/modules/webform_devel/src/Hook/WebformDevelHooks1.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Drupal\webform_devel\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_devel.
+ */
+class WebformDevelHooks1 {
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for config single export form.
+   */
+  #[Hook('form_config_single_export_form_alter')]
+  public static function formConfigSingleExportFormAlter(&$form, FormStateInterface $form_state) {
+    $form['export']['#type'] = 'webform_codemirror';
+    $form['export']['#mode'] = 'yaml';
+    $form['config_name']['#ajax']['callback'] = '_webform_devel_form_config_single_export_form_update_export';
+  }
+
+}
diff --git a/modules/webform_devel/webform_devel.module b/modules/webform_devel/webform_devel.module
index 5683787..d191a7a 100644
--- a/modules/webform_devel/webform_devel.module
+++ b/modules/webform_devel/webform_devel.module
@@ -5,6 +5,7 @@
  * Provides development tools Webform module.
  */
 
+use Drupal\webform_devel\Hook\WebformDevelHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_devel\Hook\WebformDevelHooks;
 use Drupal\Component\Serialization\Yaml;
@@ -30,11 +31,9 @@ function webform_devel_entity_type_alter(array &$entity_types) {
 /**
  * Implements hook_form_FORM_ID_alter() for config single export form.
  */
+#[LegacyHook]
 function webform_devel_form_config_single_export_form_alter(&$form, FormStateInterface $form_state) {
-  $form['export']['#type'] = 'webform_codemirror';
-  $form['export']['#mode'] = 'yaml';
-
-  $form['config_name']['#ajax']['callback'] = '_webform_devel_form_config_single_export_form_update_export';
+  \Drupal::service(WebformDevelHooks1::class)->formConfigSingleExportFormAlter($form, $form_state);
 }
 
 /**
diff --git a/modules/webform_devel/webform_devel.services.yml b/modules/webform_devel/webform_devel.services.yml
index 943232f..26bd059 100644
--- a/modules/webform_devel/webform_devel.services.yml
+++ b/modules/webform_devel/webform_devel.services.yml
@@ -7,3 +7,7 @@ services:
   Drupal\webform_devel\Hook\WebformDevelHooks:
     class: Drupal\webform_devel\Hook\WebformDevelHooks
     autowire: true
+
+  Drupal\webform_devel\Hook\WebformDevelHooks1:
+    class: Drupal\webform_devel\Hook\WebformDevelHooks1
+    autowire: true
diff --git a/modules/webform_entity_print/src/Hook/WebformEntityPrintHooks1.php b/modules/webform_entity_print/src/Hook/WebformEntityPrintHooks1.php
new file mode 100644
index 0000000..88d0f89
--- /dev/null
+++ b/modules/webform_entity_print/src/Hook/WebformEntityPrintHooks1.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Drupal\webform_entity_print\Hook;
+
+use Drupal\Component\Utility\UrlHelper;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Render\Markup;
+use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_entity_print.
+ */
+class WebformEntityPrintHooks1 {
+
+  /**
+   * Implements hook_ENTITY_TYPE_view_alter() for webform_submission entities.
+   *
+   * @see entity_print_entity_view_alter();
+   */
+  #[Hook('webform_submission_view_alter')]
+  public static function webformSubmissionViewAlter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
+    $route_name = \Drupal::routeMatch()->getRouteName();
+    $is_entity_print = in_array($route_name, [
+          'entity_print.view.debug',
+          'entity_print.view',
+    ]) || \Drupal::request()->request->get('_webform_entity_print');
+    if ($is_entity_print) {
+      // Add template header and footer.
+      _webform_entity_print_webform_submission_template($build, $entity, $display);
+    }
+    elseif (in_array($display->getMode(), [
+          'html',
+          'table',
+    ])) {
+      // Add print links to HTML and Table mode.
+      _webform_entity_print_webform_submission_links($build, $entity, $display);
+    }
+  }
+
+  /**
+   * Implements hook_preprocess_entity_print().
+   */
+  #[Hook('preprocess_entity_print')]
+  public static function preprocessEntityPrint(array &$variables) {
+    $webform_submission = _webform_entity_print_preprocess_entity_print_get_webform_submission($variables['content']);
+    if (!$webform_submission) {
+      return;
+    }
+    // Add webform submission to variables.
+    $variables['webform_submission'] = $webform_submission;
+    $webform = $webform_submission->getWebform();
+    $css = [];
+    // Add webform CSS.
+    $assets = $webform->getAssets();
+    if ($assets['css']) {
+      $css[] = $assets['css'];
+    }
+    // Add webform entity print CSS.
+    /** @var \Drupal\webform\WebformThirdPartySettingsManagerInterface $third_party_settings_manager */
+    $third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager');
+    // Append default print template CSS.
+    $default_template = $third_party_settings_manager->getThirdPartySetting('webform_entity_print', 'template') ?: [];
+    if (!empty($default_template['css'])) {
+      $css[] = $default_template['css'];
+    }
+    // Append webform print template CSS.
+    $webform_template = $webform->getThirdPartySetting('webform_entity_print', 'template') ?: [];
+    if (!empty($webform_template['css'])) {
+      $css[] = $webform_template['css'];
+    }
+    // Append a style tag to entity print CSS link tags.
+    $variables['entity_print_css'] = Markup::create($variables['entity_print_css'] . PHP_EOL . '<style type="text/css" media="all">' . PHP_EOL . implode(PHP_EOL, $css) . PHP_EOL . '</style>' . PHP_EOL);
+    // Append webform entity print image token to all files in the rendered
+    // webform submission data.
+    // NOTE: We are always rendering the webform submission data so that
+    // value is consistent.
+    // @see webform_entity_print_webform_submission_access();
+    $content =& NestedArray::getValue($variables, [
+          'content',
+          0,
+          0,
+    ]);
+    if (!$content) {
+      $content =& NestedArray::getValue($variables, [
+            'content',
+            0,
+      ]);
+    }
+    // Make absolute sure we are rendering and altering
+    // the webform submission data.
+    if (!$content || !is_array($content) || !isset($content['#theme']) || $content['#theme'] !== 'webform_submission_data') {
+      return;
+    }
+    $webform_id = $webform->id();
+    $sid = $webform_submission->id();
+    // Render the webform submission data.
+    $html = (string) \Drupal::service('renderer')->render($content);
+    // Only matching <img src=""/webform/sid/*>.
+    if (preg_match_all('#(src\s*=\s*")([^"]+(?:/private|/system/files)/webform/' . $webform_id . '/' . $sid . '/[^"]+)#', $html, $matches)) {
+      foreach ($matches[2] as $index => $found_uri) {
+        $token_query = [
+              WEBFORM_ENTITY_PRINT_IMAGE_TOKEN => _webform_entity_print_token_generate($found_uri),
+        ];
+        $replace_uri = $found_uri . (str_contains($found_uri, '?') ? '&' : '?') . UrlHelper::buildQuery($token_query);
+        $html = str_replace($matches[0][$index], $matches[1][$index] . $replace_uri, $html);
+      }
+    }
+    // Only matching <img src=""/webform/signature_element_key/>.
+    $elements = $webform->getElementsDecodedAndFlattened();
+    $signature_elements = [];
+    foreach ($elements as $element_key => $element) {
+      if (isset($element['#type']) && $element['#type'] === 'webform_signature') {
+        $signature_elements[] = $element_key;
+      }
+    }
+    if ($signature_elements && preg_match_all('#(src\s*=\s*")([^"]+(?:/private|/system/files)/webform/' . $webform_id . '/(?:' . implode('|', $signature_elements) . ')/[^"]+)#', $html, $matches)) {
+      foreach ($matches[2] as $index => $found_uri) {
+        $token_query = [
+              WEBFORM_ENTITY_PRINT_IMAGE_TOKEN => _webform_entity_print_token_generate($found_uri),
+        ];
+        $replace_uri = $found_uri . (str_contains($found_uri, '?') ? '&' : '?') . UrlHelper::buildQuery($token_query);
+        $html = str_replace($matches[0][$index], $matches[1][$index] . $replace_uri, $html);
+      }
+    }
+    // The HTML markup is safe because it has already been rendered.
+    $content = [
+          '#markup' => Markup::create($html),
+    ];
+  }
+
+}
diff --git a/modules/webform_entity_print/tests/src/Functional/WebformEntityPrintFunctionalTest.php b/modules/webform_entity_print/tests/src/Functional/WebformEntityPrintFunctionalTest.php
index f741b64..fa0c4a5 100644
--- a/modules/webform_entity_print/tests/src/Functional/WebformEntityPrintFunctionalTest.php
+++ b/modules/webform_entity_print/tests/src/Functional/WebformEntityPrintFunctionalTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_entity_print\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\UrlHelper;
 use Drupal\Core\Session\AccountInterface;
@@ -14,6 +16,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityPrintFunctionalTest extends WebformEntityPrintFunctionalTestBase {
 
   /**
diff --git a/modules/webform_entity_print/webform_entity_print.install b/modules/webform_entity_print/webform_entity_print.install
index 76517f0..89ff858 100644
--- a/modules/webform_entity_print/webform_entity_print.install
+++ b/modules/webform_entity_print/webform_entity_print.install
@@ -5,6 +5,7 @@
  * Installation information for the 'Webform Entity Print' module.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\system\Entity\Action;
 
@@ -63,7 +64,7 @@ function webform_entity_print_update_8001() {
   // Add new 'Download PDF' action.
   $data = Yaml::decode(file_get_contents(__DIR__ . '/config/install/system.action.webform_submission_print_download_action.yml'));
   $action = Action::create($data);
-  $action->trustData()->save();
+  DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $action, fn() => $action->trustData())->save();
 
   // Add new 'Download PDF' submission action.
   _webform_entity_print_update_add_new_download_pdf_submission_action();
diff --git a/modules/webform_entity_print/webform_entity_print.module b/modules/webform_entity_print/webform_entity_print.module
index e99ee40..2f51c98 100644
--- a/modules/webform_entity_print/webform_entity_print.module
+++ b/modules/webform_entity_print/webform_entity_print.module
@@ -5,15 +5,13 @@
  * Provides Entity Print (PDF) integration.
  */
 
+use Drupal\webform_entity_print\Hook\WebformEntityPrintHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_entity_print\Hook\WebformEntityPrintHooks;
 use Drupal\Component\Utility\Crypt;
 use Drupal\Component\Utility\Html;
-use Drupal\Component\Utility\NestedArray;
-use Drupal\Component\Utility\UrlHelper;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\Render\Markup;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Site\Settings;
 use Drupal\Core\Url;
@@ -45,19 +43,9 @@ function webform_entity_print_file_download($uri) {
  *
  * @see entity_print_entity_view_alter();
  */
+#[LegacyHook]
 function webform_entity_print_webform_submission_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
-  $route_name = \Drupal::routeMatch()->getRouteName();
-  $is_entity_print = in_array($route_name, ['entity_print.view.debug', 'entity_print.view'])
-   || \Drupal::request()->request->get('_webform_entity_print');
-
-  if ($is_entity_print) {
-    // Add template header and footer.
-    _webform_entity_print_webform_submission_template($build, $entity, $display);
-  }
-  elseif (in_array($display->getMode(), ['html', 'table'])) {
-    // Add print links to HTML and Table mode.
-    _webform_entity_print_webform_submission_links($build, $entity, $display);
-  }
+  \Drupal::service(WebformEntityPrintHooks1::class)->webformSubmissionViewAlter($build, $entity, $display);
 }
 
 /**
@@ -207,102 +195,9 @@ function _webform_entity_print_webform_submission_links(array &$build, EntityInt
 /**
  * Implements hook_preprocess_entity_print().
  */
+#[LegacyHook]
 function webform_entity_print_preprocess_entity_print(array &$variables) {
-  $webform_submission = _webform_entity_print_preprocess_entity_print_get_webform_submission($variables['content']);
-  if (!$webform_submission) {
-    return;
-  }
-
-  // Add webform submission to variables.
-  $variables['webform_submission'] = $webform_submission;
-
-  $webform = $webform_submission->getWebform();
-
-  $css = [];
-
-  // Add webform CSS.
-  $assets = $webform->getAssets();
-  if ($assets['css']) {
-    $css[] = $assets['css'];
-  }
-
-  // Add webform entity print CSS.
-  /** @var \Drupal\webform\WebformThirdPartySettingsManagerInterface $third_party_settings_manager */
-  $third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager');
-  // Append default print template CSS.
-  $default_template = $third_party_settings_manager->getThirdPartySetting('webform_entity_print', 'template') ?: [];
-  if (!empty($default_template['css'])) {
-    $css[] = $default_template['css'];
-  }
-
-  // Append webform print template CSS.
-  $webform_template = $webform->getThirdPartySetting('webform_entity_print', 'template') ?: [];
-  if (!empty($webform_template['css'])) {
-    $css[] = $webform_template['css'];
-  }
-
-  // Append a style tag to entity print CSS link tags.
-  $variables['entity_print_css'] = Markup::create(
-    $variables['entity_print_css'] . PHP_EOL .
-    '<style type="text/css" media="all">' . PHP_EOL .
-    implode(PHP_EOL, $css) . PHP_EOL .
-    '</style>' . PHP_EOL
-  );
-
-  // Append webform entity print image token to all files in the rendered
-  // webform submission data.
-  // NOTE: We are always rendering the webform submission data so that
-  // value is consistent.
-  // @see webform_entity_print_webform_submission_access();
-  $content =& NestedArray::getValue($variables, ['content', 0, 0]);
-  if (!$content) {
-    $content =& NestedArray::getValue($variables, ['content', 0]);
-  }
-
-  // Make absolute sure we are rendering and altering
-  // the webform submission data.
-  if (!$content
-    || !is_array($content)
-    || !isset($content['#theme'])
-    || $content['#theme'] !== 'webform_submission_data') {
-    return;
-  }
-
-  $webform_id = $webform->id();
-  $sid = $webform_submission->id();
-
-  // Render the webform submission data.
-  $html = (string) \Drupal::service('renderer')->render($content);
-
-  // Only matching <img src=""/webform/sid/*>.
-  if (preg_match_all('#(src\s*=\s*")([^"]+(?:/private|/system/files)/webform/' . $webform_id . '/' . $sid . '/[^"]+)#', $html, $matches)) {
-    foreach ($matches[2] as $index => $found_uri) {
-      $token_query = [WEBFORM_ENTITY_PRINT_IMAGE_TOKEN => _webform_entity_print_token_generate($found_uri)];
-      $replace_uri = $found_uri . (str_contains($found_uri, '?') ? '&' : '?') . UrlHelper::buildQuery($token_query);
-      $html = str_replace($matches[0][$index], $matches[1][$index] . $replace_uri, $html);
-    }
-  }
-
-  // Only matching <img src=""/webform/signature_element_key/>.
-  $elements = $webform->getElementsDecodedAndFlattened();
-  $signature_elements = [];
-  foreach ($elements as $element_key => $element) {
-    if (isset($element['#type']) && $element['#type'] === 'webform_signature') {
-      $signature_elements[] = $element_key;
-    }
-  }
-  if ($signature_elements && preg_match_all('#(src\s*=\s*")([^"]+(?:/private|/system/files)/webform/' . $webform_id . '/(?:' . implode('|', $signature_elements) . ')/[^"]+)#', $html, $matches)) {
-    foreach ($matches[2] as $index => $found_uri) {
-      $token_query = [WEBFORM_ENTITY_PRINT_IMAGE_TOKEN => _webform_entity_print_token_generate($found_uri)];
-      $replace_uri = $found_uri . (str_contains($found_uri, '?') ? '&' : '?') . UrlHelper::buildQuery($token_query);
-      $html = str_replace($matches[0][$index], $matches[1][$index] . $replace_uri, $html);
-    }
-  }
-
-  // The HTML markup is safe because it has already been rendered.
-  $content = [
-    '#markup' => Markup::create($html),
-  ];
+  \Drupal::service(WebformEntityPrintHooks1::class)->preprocessEntityPrint($variables);
 }
 
 /**
diff --git a/modules/webform_entity_print/webform_entity_print.services.yml b/modules/webform_entity_print/webform_entity_print.services.yml
index a8c7755..8645bbd 100644
--- a/modules/webform_entity_print/webform_entity_print.services.yml
+++ b/modules/webform_entity_print/webform_entity_print.services.yml
@@ -16,3 +16,7 @@ services:
   Drupal\webform_entity_print\Hook\WebformEntityPrintWebformHooks:
     class: Drupal\webform_entity_print\Hook\WebformEntityPrintWebformHooks
     autowire: true
+
+  Drupal\webform_entity_print\Hook\WebformEntityPrintHooks1:
+    class: Drupal\webform_entity_print\Hook\WebformEntityPrintHooks1
+    autowire: true
diff --git a/modules/webform_entity_print_attachment/tests/src/Functional/WebformEntityPrintAttachmentFunctionalTest.php b/modules/webform_entity_print_attachment/tests/src/Functional/WebformEntityPrintAttachmentFunctionalTest.php
index dcc6501..aaa23a9 100644
--- a/modules/webform_entity_print_attachment/tests/src/Functional/WebformEntityPrintAttachmentFunctionalTest.php
+++ b/modules/webform_entity_print_attachment/tests/src/Functional/WebformEntityPrintAttachmentFunctionalTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_entity_print_attachment\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_entity_print\Functional\WebformEntityPrintFunctionalTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityPrintAttachmentFunctionalTest extends WebformEntityPrintFunctionalTestBase {
 
   /**
diff --git a/modules/webform_example_composite/tests/src/Functional/WebformExampleCompositeTest.php b/modules/webform_example_composite/tests/src/Functional/WebformExampleCompositeTest.php
index d5ae028..8dcd83c 100644
--- a/modules/webform_example_composite/tests/src/Functional/WebformExampleCompositeTest.php
+++ b/modules/webform_example_composite/tests/src/Functional/WebformExampleCompositeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_example_composite\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_example_composite
  */
+#[Group('webform_example_composite')]
+#[RunTestsInSeparateProcesses]
 class WebformExampleCompositeTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php b/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php
index 613a414..4b22227 100644
--- a/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php
+++ b/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_example_element\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_example_element
  */
+#[Group('webform_example_element')]
+#[RunTestsInSeparateProcesses]
 class WebformExampleElementTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_example_element_properties/tests/src/Functional/WebformExampleElementPropertiesTest.php b/modules/webform_example_element_properties/tests/src/Functional/WebformExampleElementPropertiesTest.php
index 4eb2ce4..c0416f4 100644
--- a/modules/webform_example_element_properties/tests/src/Functional/WebformExampleElementPropertiesTest.php
+++ b/modules/webform_example_element_properties/tests/src/Functional/WebformExampleElementPropertiesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_example_element_properties\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform_example_element_properties
  */
+#[Group('webform_example_element_properties')]
+#[RunTestsInSeparateProcesses]
 class WebformExampleElementPropertiesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_image_select/tests/modules/webform_image_select_test/src/Hook/WebformImageSelectTestHooks1.php b/modules/webform_image_select/tests/modules/webform_image_select_test/src/Hook/WebformImageSelectTestHooks1.php
new file mode 100644
index 0000000..6ddd353
--- /dev/null
+++ b/modules/webform_image_select/tests/modules/webform_image_select_test/src/Hook/WebformImageSelectTestHooks1.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Drupal\webform_image_select_test\Hook;
+
+use Drupal\webform_image_select\Entity\WebformImageSelectImages;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_image_select_test.
+ */
+class WebformImageSelectTestHooks1 {
+
+  /**
+   * Implements hook_webform_image_select_images_WEBFORM_IMAGE_SELECT_IMAGES_ID_alter().
+   */
+  #[Hook('webform_image_select_images_animals_alter')]
+  public static function webformImageSelectImagesAnimalsAlter(array &$images, array &$element) {
+    if ($dogs = WebformImageSelectImages::load('dogs')) {
+      $images += $dogs->getImages();
+    }
+  }
+
+}
diff --git a/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.module b/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.module
index 6e5eb3b..32e397a 100644
--- a/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.module
+++ b/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.module
@@ -5,17 +5,16 @@
  * Support module for webform that provides image select element working examples.
  */
 
+use Drupal\webform_image_select_test\Hook\WebformImageSelectTestHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_image_select_test\Hook\WebformImageSelectTestHooks;
-use Drupal\webform_image_select\Entity\WebformImageSelectImages;
 
 /**
  * Implements hook_webform_image_select_images_WEBFORM_IMAGE_SELECT_IMAGES_ID_alter().
  */
+#[LegacyHook]
 function webform_image_select_test_webform_image_select_images_animals_alter(array &$images, array &$element) {
-  if ($dogs = WebformImageSelectImages::load('dogs')) {
-    $images += $dogs->getImages();
-  }
+  \Drupal::service(WebformImageSelectTestHooks1::class)->webformImageSelectImagesAnimalsAlter($images, $element);
 }
 
 /**
diff --git a/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.services.yml b/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.services.yml
index 4183e99..ec66a69 100644
--- a/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.services.yml
+++ b/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.services.yml
@@ -3,3 +3,7 @@ services:
   Drupal\webform_image_select_test\Hook\WebformImageSelectTestHooks:
     class: Drupal\webform_image_select_test\Hook\WebformImageSelectTestHooks
     autowire: true
+
+  Drupal\webform_image_select_test\Hook\WebformImageSelectTestHooks1:
+    class: Drupal\webform_image_select_test\Hook\WebformImageSelectTestHooks1
+    autowire: true
diff --git a/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementImagesTest.php b/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementImagesTest.php
index 90e1428..6efab74 100644
--- a/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementImagesTest.php
+++ b/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementImagesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_image_select\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
  *
  * @group webform_image_select
  */
+#[Group('webform_image_select')]
+#[RunTestsInSeparateProcesses]
 class WebformImageSelectElementImagesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementTest.php b/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementTest.php
index c998d83..4fcb29e 100644
--- a/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementTest.php
+++ b/modules/webform_image_select/tests/src/Functional/WebformImageSelectElementTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_image_select\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_image_select
  */
+#[Group('webform_image_select')]
+#[RunTestsInSeparateProcesses]
 class WebformImageSelectElementTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/modules/webform_image_select/tests/src/Functional/WebformImageSelectImagesTest.php b/modules/webform_image_select/tests/src/Functional/WebformImageSelectImagesTest.php
index 53ad524..8499669 100644
--- a/modules/webform_image_select/tests/src/Functional/WebformImageSelectImagesTest.php
+++ b/modules/webform_image_select/tests/src/Functional/WebformImageSelectImagesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_image_select\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
 use Drupal\webform\WebformInterface;
@@ -12,6 +14,8 @@ use Drupal\webform_image_select\Entity\WebformImageSelectImages;
  *
  * @group webform_image_select
  */
+#[Group('webform_image_select')]
+#[RunTestsInSeparateProcesses]
 class WebformImageSelectImagesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/modules/webform_jqueryui_buttons/tests/src/Functional/WebformElementButtonsTest.php b/modules/webform_jqueryui_buttons/tests/src/Functional/WebformElementButtonsTest.php
index 36a6f82..c8a6c9e 100644
--- a/modules/webform_jqueryui_buttons/tests/src/Functional/WebformElementButtonsTest.php
+++ b/modules/webform_jqueryui_buttons/tests/src/Functional/WebformElementButtonsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_jqueryui_buttons\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
  *
  * @group webform_jqueryui_buttons
  */
+#[Group('webform_jqueryui_buttons')]
+#[RunTestsInSeparateProcesses]
 class WebformElementButtonsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/modules/webform_jqueryui_datepicker/tests/src/Functional/WebformJqueryUiDatepickerTest.php b/modules/webform_jqueryui_datepicker/tests/src/Functional/WebformJqueryUiDatepickerTest.php
index 209813c..5f834bc 100644
--- a/modules/webform_jqueryui_datepicker/tests/src/Functional/WebformJqueryUiDatepickerTest.php
+++ b/modules/webform_jqueryui_datepicker/tests/src/Functional/WebformJqueryUiDatepickerTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_jqueryui_datepicker\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\Element\WebformElementBrowserTestBase;
  *
  * @group webform_jqueryui_datepicker
  */
+#[Group('webform_jqueryui_datepicker')]
+#[RunTestsInSeparateProcesses]
 class WebformJqueryUiDatepickerTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/src/Hook/WebformNodeHooks1.php b/modules/webform_node/src/Hook/WebformNodeHooks1.php
new file mode 100644
index 0000000..36f7ecf
--- /dev/null
+++ b/modules/webform_node/src/Hook/WebformNodeHooks1.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace Drupal\webform_node\Hook;
+
+use Drupal\node\Entity\Node;
+use Drupal\Core\Url;
+use Drupal\webform\Element\WebformMessage;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_node.
+ */
+class WebformNodeHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_field_widget_single_element_WIDGET_TYPE_form_alter().
+   */
+  #[Hook('field_widget_single_element_webform_entity_reference_autocomplete_form_alter')]
+  public function fieldWidgetSingleElementWebformEntityReferenceAutocompleteFormAlter(&$element, FormStateInterface $form_state, $context) {
+    static $once;
+    if (!empty($once)) {
+      return;
+    }
+    $once = TRUE;
+    // Make sure the 'target_id' is included.
+    if (!isset($element['target_id'])) {
+      return;
+    }
+    // Display a warning message if webform query string parameter is missing.
+    if (empty($element['target_id']['#default_value'])) {
+      $element['target_id']['#attributes']['class'][] = 'js-target-id-webform-node-references';
+      $element['webform_node_references'] = [
+            '#type' => 'webform_message',
+            '#message_type' => 'info',
+            '#message_close' => TRUE,
+            '#message_id' => 'webform_node.references',
+            '#message_storage' => WebformMessage::STORAGE_USER,
+            '#message_message' => $this->t('Webforms must first be <a href=":href">created</a> before referencing them.', [
+                ':href' => Url::fromRoute('entity.webform.collection')->toString(),
+            ]),
+            '#cache' => [
+                'max-age' => 0,
+            ],
+            '#weight' => -10,
+            '#states' => [
+                'visible' => [
+                    '.js-target-id-webform-node-references' => [
+                        'value' => '',
+                    ],
+                ],
+            ],
+      ];
+    }
+  }
+
+  /**
+   * Implements hook_field_widget_single_element_WIDGET_TYPE_form_alter().
+   */
+  #[Hook('field_widget_single_element_webform_entity_reference_select_form_alter')]
+  public static function fieldWidgetSingleElementWebformEntityReferenceSelectFormAlter(&$element, FormStateInterface $form_state, $context) {
+    webform_node_field_widget_single_element_webform_entity_reference_autocomplete_form_alter($element, $form_state, $context);
+  }
+
+  /**
+   * Implements hook_preprocess_HOOK() for page title templates.
+   */
+  #[Hook('preprocess_page_title')]
+  public static function preprocessPageTitle(&$variables) {
+    $node = \Drupal::routeMatch()->getParameter('node');
+    if ($node && is_string($node)) {
+      $node = Node::load($node);
+    }
+    if (!$node) {
+      return;
+    }
+    /** @var \Drupal\webform\WebformEntityReferenceManagerInterface $entity_reference_manager */
+    $entity_reference_manager = \Drupal::service('webform.entity_reference_manager');
+    // Only allow user to change webform for specific routes.
+    if (!$entity_reference_manager->isUserWebformRoute($node)) {
+      return;
+    }
+    $webforms = $entity_reference_manager->getWebforms($node);
+    if (count($webforms) > 1) {
+      $route_options = [
+            'query' => \Drupal::destination()->getAsArray(),
+      ];
+      $operations = [];
+      // Add current webform first.
+      $current_webform = $entity_reference_manager->getWebform($node);
+      $operations[$current_webform->id()] = [
+            'title' => $current_webform->label(),
+            'url' => Url::fromRoute('entity.node.webform.entity_reference.set', [
+                'node' => $node->id(),
+                'webform' => $current_webform->id(),
+            ], $route_options),
+      ];
+      // Add remaining webforms.
+      foreach ($webforms as $webform) {
+        $operations[$webform->id()] = [
+              'title' => $webform->label(),
+              'url' => Url::fromRoute('entity.node.webform.entity_reference.set', [
+                  'node' => $node->id(),
+                  'webform' => $webform->id(),
+              ], $route_options),
+        ];
+      }
+      $variables['title_prefix']['webform_node'] = [
+            '#type' => 'operations',
+            '#links' => $operations,
+            '#prefix' => '<div class="webform-dropbutton webform-node-entity-references">',
+            '#suffix' => '</div>',
+            '#attached' => [
+                'library' => [
+                    'webform_node/webform_node.entity_references',
+                ],
+            ],
+      ];
+    }
+  }
+
+}
diff --git a/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessClosedTest.php b/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessClosedTest.php
index 4b867e4..83d5a69 100644
--- a/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessClosedTest.php
+++ b/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessClosedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeAccessClosedTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessPermissionsTest.php b/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessPermissionsTest.php
index 9e81d31..6454bfe 100644
--- a/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessPermissionsTest.php
+++ b/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessPermissionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeAccessPermissionsTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessRulesTest.php b/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessRulesTest.php
index cebe00a..9c20d5d 100644
--- a/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessRulesTest.php
+++ b/modules/webform_node/tests/src/Functional/Access/WebformNodeAccessRulesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeAccessRulesTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeBrowserTestBaseTest.php b/modules/webform_node/tests/src/Functional/WebformNodeBrowserTestBaseTest.php
index 3854678..60d5633 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeBrowserTestBaseTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeBrowserTestBaseTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Test the webform node test base class.
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeBrowserTestBaseTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeEntityReferenceTest.php b/modules/webform_node/tests/src/Functional/WebformNodeEntityReferenceTest.php
index 08df38c..ceb5ecc 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeEntityReferenceTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeEntityReferenceTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\node\Entity\Node;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeEntityReferenceTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeReferencesTest.php b/modules/webform_node/tests/src/Functional/WebformNodeReferencesTest.php
index cf8ba90..64284bc 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeReferencesTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeReferencesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\paragraphs\Entity\Paragraph;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\paragraphs\Entity\Paragraph;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeReferencesTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php b/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php
index a564f36..255f2d5 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Url;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeResultsTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeTest.php b/modules/webform_node/tests/src/Functional/WebformNodeTest.php
index 1ee2e01..abe7cb6 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Entity\Entity\EntityViewDisplay;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeTranslationTest.php b/modules/webform_node/tests/src/Functional/WebformNodeTranslationTest.php
index 19cab1d..111f495 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeTranslationTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeTranslationTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform node translation.
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeTranslationTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Functional/WebformNodeVariantTest.php b/modules/webform_node/tests/src/Functional/WebformNodeVariantTest.php
index 123a037..15c62b1 100644
--- a/modules/webform_node/tests/src/Functional/WebformNodeVariantTest.php
+++ b/modules/webform_node/tests/src/Functional/WebformNodeVariantTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\WebformSubmission;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeVariantTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Kernel/WebformNodeUninstallTest.php b/modules/webform_node/tests/src/Kernel/WebformNodeUninstallTest.php
index c88f890..aab6568 100644
--- a/modules/webform_node/tests/src/Kernel/WebformNodeUninstallTest.php
+++ b/modules/webform_node/tests/src/Kernel/WebformNodeUninstallTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_node\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\node\Entity\Node;
 use Drupal\node\Entity\NodeType;
@@ -14,6 +16,8 @@ use Drupal\node\Entity\NodeType;
  *
  * @group webform_node
  */
+#[Group('webform_node')]
+#[RunTestsInSeparateProcesses]
 class WebformNodeUninstallTest extends KernelTestBase {
 
   /**
diff --git a/modules/webform_node/tests/src/Unit/WebformNodeUninstallValidatorTest.php b/modules/webform_node/tests/src/Unit/WebformNodeUninstallValidatorTest.php
index bba3fc2..183fe30 100644
--- a/modules/webform_node/tests/src/Unit/WebformNodeUninstallValidatorTest.php
+++ b/modules/webform_node/tests/src/Unit/WebformNodeUninstallValidatorTest.php
@@ -2,12 +2,14 @@
 
 namespace Drupal\Tests\webform_node\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Tests\UnitTestCase;
 
 /**
  * @coversDefaultClass \Drupal\webform_node\WebformNodeUninstallValidator
  * @group webform_node
  */
+#[Group('webform_node')]
 class WebformNodeUninstallValidatorTest extends UnitTestCase {
 
   /**
diff --git a/modules/webform_node/webform_node.install b/modules/webform_node/webform_node.install
index c8a144b..28c8cc3 100644
--- a/modules/webform_node/webform_node.install
+++ b/modules/webform_node/webform_node.install
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Extension\Requirement\RequirementSeverity;
+
 /**
  * @file
  * Install, update and uninstall functions for the webform node module.
@@ -20,7 +27,7 @@ function webform_node_requirements($phase) {
         'title' => t('Webform Node'),
         'value' => t('%title content type already exists', ['%title' => $node_type->label()]),
         'description' => t('%title content type already exists, please delete the %title content type before installing the Webform node module.', ['%title' => $node_type->label()]),
-        'severity' => REQUIREMENT_ERROR,
+        'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Error, fn() => REQUIREMENT_ERROR),
       ];
     }
 
diff --git a/modules/webform_node/webform_node.module b/modules/webform_node/webform_node.module
index facbf86..29fc70c 100644
--- a/modules/webform_node/webform_node.module
+++ b/modules/webform_node/webform_node.module
@@ -5,16 +5,14 @@
  * Provides a webform content type which allows webforms to be integrated into a website as nodes.
  */
 
+use Drupal\webform_node\Hook\WebformNodeHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\Core\Render\BubbleableMetadata;
 use Drupal\Core\Database\Query\AlterableInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\Url;
-use Drupal\node\Entity\Node;
 use Drupal\node\NodeInterface;
-use Drupal\webform\Element\WebformMessage;
 use Drupal\webform_node\Hook\WebformNodeHooks;
 use Drupal\webform_node\Hook\WebformNodeTokensHooks;
 
@@ -91,98 +89,23 @@ function webform_node_node_delete(NodeInterface $node) {
 /**
  * Implements hook_field_widget_single_element_WIDGET_TYPE_form_alter().
  */
+#[LegacyHook]
 function webform_node_field_widget_single_element_webform_entity_reference_autocomplete_form_alter(&$element, FormStateInterface $form_state, $context) {
-  static $once;
-  if (!empty($once)) {
-    return;
-  }
-  $once = TRUE;
-
-  // Make sure the 'target_id' is included.
-  if (!isset($element['target_id'])) {
-    return;
-  }
-
-  // Display a warning message if webform query string parameter is missing.
-  if (empty($element['target_id']['#default_value'])) {
-    $element['target_id']['#attributes']['class'][] = 'js-target-id-webform-node-references';
-    $element['webform_node_references'] = [
-      '#type' => 'webform_message',
-      '#message_type' => 'info',
-      '#message_close' => TRUE,
-      '#message_id' => 'webform_node.references',
-      '#message_storage' => WebformMessage::STORAGE_USER,
-      '#message_message' => t('Webforms must first be <a href=":href">created</a> before referencing them.', [':href' => Url::fromRoute('entity.webform.collection')->toString()]),
-      '#cache' => ['max-age' => 0],
-      '#weight' => -10,
-      '#states' => [
-        'visible' => [
-          '.js-target-id-webform-node-references' => ['value' => ''],
-        ],
-      ],
-    ];
-  }
+  \Drupal::service(WebformNodeHooks1::class)->fieldWidgetSingleElementWebformEntityReferenceAutocompleteFormAlter($element, $form_state, $context);
 }
 
 /**
  * Implements hook_field_widget_single_element_WIDGET_TYPE_form_alter().
  */
+#[LegacyHook]
 function webform_node_field_widget_single_element_webform_entity_reference_select_form_alter(&$element, FormStateInterface $form_state, $context) {
-  webform_node_field_widget_single_element_webform_entity_reference_autocomplete_form_alter($element, $form_state, $context);
+  \Drupal::service(WebformNodeHooks1::class)->fieldWidgetSingleElementWebformEntityReferenceSelectFormAlter($element, $form_state, $context);
 }
 
 /**
  * Implements hook_preprocess_HOOK() for page title templates.
  */
+#[LegacyHook]
 function webform_node_preprocess_page_title(&$variables) {
-  $node = \Drupal::routeMatch()->getParameter('node');
-  if ($node && is_string($node)) {
-    $node = Node::load($node);
-  }
-
-  if (!$node) {
-    return;
-  }
-
-  /** @var \Drupal\webform\WebformEntityReferenceManagerInterface $entity_reference_manager */
-  $entity_reference_manager = \Drupal::service('webform.entity_reference_manager');
-
-  // Only allow user to change webform for specific routes.
-  if (!$entity_reference_manager->isUserWebformRoute($node)) {
-    return;
-  }
-
-  $webforms = $entity_reference_manager->getWebforms($node);
-  if (count($webforms) > 1) {
-    $route_options = ['query' => \Drupal::destination()->getAsArray()];
-
-    $operations = [];
-
-    // Add current webform first.
-    $current_webform = $entity_reference_manager->getWebform($node);
-    $operations[$current_webform->id()] = [
-      'title' => $current_webform->label(),
-      'url' => Url::fromRoute('entity.node.webform.entity_reference.set', ['node' => $node->id(), 'webform' => $current_webform->id()], $route_options),
-    ];
-
-    // Add remaining webforms.
-    foreach ($webforms as $webform) {
-      $operations[$webform->id()] = [
-        'title' => $webform->label(),
-        'url' => Url::fromRoute('entity.node.webform.entity_reference.set', ['node' => $node->id(), 'webform' => $webform->id()], $route_options),
-      ];
-    }
-
-    $variables['title_prefix']['webform_node'] = [
-      '#type' => 'operations',
-      '#links' => $operations,
-      '#prefix' => '<div class="webform-dropbutton webform-node-entity-references">',
-      '#suffix' => '</div>',
-      '#attached' => [
-        'library' => [
-          'webform_node/webform_node.entity_references',
-        ],
-      ],
-    ];
-  }
+  \Drupal::service(WebformNodeHooks1::class)->preprocessPageTitle($variables);
 }
diff --git a/modules/webform_node/webform_node.services.yml b/modules/webform_node/webform_node.services.yml
index 5885324..24996f0 100644
--- a/modules/webform_node/webform_node.services.yml
+++ b/modules/webform_node/webform_node.services.yml
@@ -13,3 +13,7 @@ services:
   Drupal\webform_node\Hook\WebformNodeTokensHooks:
     class: Drupal\webform_node\Hook\WebformNodeTokensHooks
     autowire: true
+
+  Drupal\webform_node\Hook\WebformNodeHooks1:
+    class: Drupal\webform_node\Hook\WebformNodeHooks1
+    autowire: true
diff --git a/modules/webform_options_custom/tests/modules/webform_options_custom_test/src/Hook/WebformOptionsCustomTestHooks.php b/modules/webform_options_custom/tests/modules/webform_options_custom_test/src/Hook/WebformOptionsCustomTestHooks.php
new file mode 100644
index 0000000..8d373ce
--- /dev/null
+++ b/modules/webform_options_custom/tests/modules/webform_options_custom_test/src/Hook/WebformOptionsCustomTestHooks.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\webform_options_custom_test\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_options_custom_test.
+ */
+class WebformOptionsCustomTestHooks {
+  /**
+   * @file
+   * Support module for webform that provides custom options element working examples.
+   */
+
+  /**
+   * Implements hook_ENTITY_TYPE_load() for webform entities.
+   */
+  #[Hook('webform_load')]
+  public static function webformLoad(array $entities) {
+    if (!isset($entities['test_element_options_custom'])) {
+      return;
+    }
+    global $base_url;
+    /** @var \Drupal\webform\WebformInterface $webform */
+    $webform = $entities['test_element_options_custom'];
+    $elements = $webform->getElementsDecodedAndFlattened();
+    foreach ($elements as $element_key => $element) {
+      if (isset($element['#url']) && !str_contains($element['#url'], '/')) {
+        $element['#url'] = $base_url . '/' . \Drupal::service('extension.list.module')->getPath('webform_options_custom_test') . '/images/' . $element['#url'];
+      }
+      $webform->setElementProperties($element_key, $element);
+    }
+  }
+
+}
diff --git a/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.module b/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.module
index 0f667c8..ea8e51f 100644
--- a/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.module
+++ b/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.module
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform_options_custom_test\Hook\WebformOptionsCustomTestHooks;
+
 /**
  * @file
  * Support module for webform that provides custom options element working examples.
@@ -8,19 +15,7 @@
 /**
  * Implements hook_ENTITY_TYPE_load() for webform entities.
  */
+#[LegacyHook]
 function webform_options_custom_test_webform_load(array $entities) {
-  if (!isset($entities['test_element_options_custom'])) {
-    return;
-  }
-  global $base_url;
-
-  /** @var \Drupal\webform\WebformInterface $webform */
-  $webform = $entities['test_element_options_custom'];
-  $elements = $webform->getElementsDecodedAndFlattened();
-  foreach ($elements as $element_key => $element) {
-    if (isset($element['#url']) && !str_contains($element['#url'], '/')) {
-      $element['#url'] = $base_url . '/' . \Drupal::service('extension.list.module')->getPath('webform_options_custom_test') . '/images/' . $element['#url'];
-    }
-    $webform->setElementProperties($element_key, $element);
-  }
+  \Drupal::service(WebformOptionsCustomTestHooks::class)->webformLoad($entities);
 }
diff --git a/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.services.yml b/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.services.yml
new file mode 100644
index 0000000..884508b
--- /dev/null
+++ b/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\webform_options_custom_test\Hook\WebformOptionsCustomTestHooks:
+    class: Drupal\webform_options_custom_test\Hook\WebformOptionsCustomTestHooks
+    autowire: true
diff --git a/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomEntityTest.php b/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomEntityTest.php
index b5447c6..1e576b4 100644
--- a/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomEntityTest.php
+++ b/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_custom\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\node\Entity\Node;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_custom
  */
+#[Group('webform_options_custom')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsCustomEntityTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomTest.php b/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomTest.php
index fb97d99..ebe8df4 100644
--- a/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomTest.php
+++ b/modules/webform_options_custom/tests/src/Functional/WebformOptionsCustomTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_custom\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform_options_custom\Entity\WebformOptionsCustom;
@@ -11,6 +13,8 @@ use Drupal\webform_options_custom\Entity\WebformOptionsCustom;
  *
  * @group webform_options_custom
  */
+#[Group('webform_options_custom')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsCustomTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitAccessTest.php b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitAccessTest.php
index 7a3b3f7..2eb6f5f 100644
--- a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitAccessTest.php
+++ b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_limit\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_limit
  */
+#[Group('webform_options_limit')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsLimitAccessTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitBooleanTest.php b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitBooleanTest.php
index b1deec9..e986ce3 100644
--- a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitBooleanTest.php
+++ b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitBooleanTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_limit\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_limit
  */
+#[Group('webform_options_limit')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsLimitBooleanTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitEntityReferenceTest.php b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitEntityReferenceTest.php
index c0ca498..1022623 100644
--- a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitEntityReferenceTest.php
+++ b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitEntityReferenceTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_limit\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_limit
  */
+#[Group('webform_options_limit')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsLimitEntityReferenceTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitSourceEntityTest.php b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitSourceEntityTest.php
index ab62cba..1973019 100644
--- a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitSourceEntityTest.php
+++ b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitSourceEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_limit\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_limit
  */
+#[Group('webform_options_limit')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsLimitSourceEntityTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitTest.php b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitTest.php
index dd10630..4c592e4 100644
--- a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitTest.php
+++ b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_limit\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_limit
  */
+#[Group('webform_options_limit')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsLimitTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitUserTest.php b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitUserTest.php
index d374ac9..29a37cd 100644
--- a/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitUserTest.php
+++ b/modules/webform_options_limit/tests/src/Functional/WebformOptionsLimitUserTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_options_limit\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_options_limit
  */
+#[Group('webform_options_limit')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsLimitUserTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_scheduled_email/src/Hook/WebformScheduledEmailHooks1.php b/modules/webform_scheduled_email/src/Hook/WebformScheduledEmailHooks1.php
new file mode 100644
index 0000000..92b94ce
--- /dev/null
+++ b/modules/webform_scheduled_email/src/Hook/WebformScheduledEmailHooks1.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\webform_scheduled_email\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\WebformSubmissionInterface;
+use Drupal\webform\WebformInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_scheduled_email.
+ */
+class WebformScheduledEmailHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_ENTITY_TYPE_delete() for webform entities.
+   */
+  #[Hook('webform_delete')]
+  public static function webformDelete(WebformInterface $webform) {
+    /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
+    $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
+    $webform_scheduled_email_manager->delete($webform);
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_delete() for webform_submission entities.
+   */
+  #[Hook('webform_submission_delete')]
+  public static function webformSubmissionDelete(WebformSubmissionInterface $webform_submission) {
+    /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
+    $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
+    $webform_scheduled_email_manager->delete($webform_submission);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform admin config handlers form.
+   */
+  #[Hook('form_webform_admin_config_handlers_form_alter')]
+  public function formWebformAdminConfigHandlersFormAlter(&$form, FormStateInterface $form_state) {
+    $form['webform_scheduled_email'] = [
+          '#type' => 'details',
+          '#title' => $this->t('Scheduled email settings'),
+          '#open' => TRUE,
+          '#tree' => TRUE,
+    ];
+    $form['webform_scheduled_email']['schedule_type'] = [
+          '#type' => 'select',
+          '#title' => $this->t('Date type'),
+          '#description' => $this->t('Scheduled emails are queued and sent via hourly <a href="@href">cron tasks</a>. To schedule an email for a specific time, site administrators must increase the cron task execution frequency.', [
+              '@href' => 'https://www.drupal.org/docs/8/cron-automated-tasks/cron-automated-tasks-overview',
+          ]),
+          '#options' => [
+              'date' => $this->t('Date (@format)', [
+                  '@format' => 'YYYY-MM-DD',
+              ]),
+              'datetime' => $this->t('Date/time (@format)', [
+                  '@format' => 'YYYY-MM-DD HH:MM:SS',
+              ]),
+          ],
+          '#required' => TRUE,
+          '#default_value' => \Drupal::config('webform_scheduled_email.settings')->get('schedule_type'),
+    ];
+    $form['#submit'][] = '_webform_scheduled_email_form_webform_admin_config_handlers_form_submit';
+  }
+
+}
diff --git a/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailExceptionTest.php b/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailExceptionTest.php
index a17bee7..b692e2f 100644
--- a/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailExceptionTest.php
+++ b/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailExceptionTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_scheduled_email\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Logger\RfcLogLevel;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -18,6 +20,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_scheduled_email
  */
+#[Group('webform_scheduled_email')]
+#[RunTestsInSeparateProcesses]
 class WebformScheduledEmailExceptionTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTest.php b/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTest.php
index b48a93b..58762c5 100644
--- a/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTest.php
+++ b/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_scheduled_email\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_scheduled_email
  */
+#[Group('webform_scheduled_email')]
+#[RunTestsInSeparateProcesses]
 class WebformScheduledEmailTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTranslationTest.php b/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTranslationTest.php
index 1bc656e..8a4f218 100644
--- a/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTranslationTest.php
+++ b/modules/webform_scheduled_email/tests/src/Functional/WebformScheduledEmailTranslationTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_scheduled_email\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_scheduled_email
  */
+#[Group('webform_scheduled_email')]
+#[RunTestsInSeparateProcesses]
 class WebformScheduledEmailTranslationTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_scheduled_email/webform_scheduled_email.module b/modules/webform_scheduled_email/webform_scheduled_email.module
index 00ee4e3..14c4fc4 100644
--- a/modules/webform_scheduled_email/webform_scheduled_email.module
+++ b/modules/webform_scheduled_email/webform_scheduled_email.module
@@ -5,6 +5,7 @@
  * Allows webform emails to be scheduled.
  */
 
+use Drupal\webform_scheduled_email\Hook\WebformScheduledEmailHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_scheduled_email\Hook\WebformScheduledEmailHooks;
 use Drupal\Core\Entity\EntityInterface;
@@ -39,19 +40,17 @@ function webform_scheduled_email_entity_predelete(EntityInterface $entity) {
 /**
  * Implements hook_ENTITY_TYPE_delete() for webform entities.
  */
+#[LegacyHook]
 function webform_scheduled_email_webform_delete(WebformInterface $webform) {
-  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
-  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
-  $webform_scheduled_email_manager->delete($webform);
+  \Drupal::service(WebformScheduledEmailHooks1::class)->webformDelete($webform);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_delete() for webform_submission entities.
  */
+#[LegacyHook]
 function webform_scheduled_email_webform_submission_delete(WebformSubmissionInterface $webform_submission) {
-  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
-  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
-  $webform_scheduled_email_manager->delete($webform_submission);
+  \Drupal::service(WebformScheduledEmailHooks1::class)->webformSubmissionDelete($webform_submission);
 }
 
 /**
@@ -73,26 +72,9 @@ function webform_scheduled_email_theme() {
 /**
  * Implements hook_form_FORM_ID_alter() for webform admin config handlers form.
  */
+#[LegacyHook]
 function webform_scheduled_email_form_webform_admin_config_handlers_form_alter(&$form, FormStateInterface $form_state) {
-  $form['webform_scheduled_email'] = [
-    '#type' => 'details',
-    '#title' => t('Scheduled email settings'),
-    '#open' => TRUE,
-    '#tree' => TRUE,
-  ];
-  $form['webform_scheduled_email']['schedule_type'] = [
-    '#type' => 'select',
-    '#title' => t('Date type'),
-    '#description' => t('Scheduled emails are queued and sent via hourly <a href="@href">cron tasks</a>. To schedule an email for a specific time, site administrators must increase the cron task execution frequency.', ['@href' => 'https://www.drupal.org/docs/8/cron-automated-tasks/cron-automated-tasks-overview']),
-    '#options' => [
-      'date' => t('Date (@format)', ['@format' => 'YYYY-MM-DD']),
-      'datetime' => t('Date/time (@format)', ['@format' => 'YYYY-MM-DD HH:MM:SS']),
-    ],
-    '#required' => TRUE,
-    '#default_value' => \Drupal::config('webform_scheduled_email.settings')->get('schedule_type'),
-  ];
-
-  $form['#submit'][] = '_webform_scheduled_email_form_webform_admin_config_handlers_form_submit';
+  \Drupal::service(WebformScheduledEmailHooks1::class)->formWebformAdminConfigHandlersFormAlter($form, $form_state);
 }
 
 /**
diff --git a/modules/webform_scheduled_email/webform_scheduled_email.services.yml b/modules/webform_scheduled_email/webform_scheduled_email.services.yml
index 716cfd3..02637c2 100644
--- a/modules/webform_scheduled_email/webform_scheduled_email.services.yml
+++ b/modules/webform_scheduled_email/webform_scheduled_email.services.yml
@@ -10,3 +10,7 @@ services:
   Drupal\webform_scheduled_email\Hook\WebformScheduledEmailDrushHooks:
     class: Drupal\webform_scheduled_email\Hook\WebformScheduledEmailDrushHooks
     autowire: true
+
+  Drupal\webform_scheduled_email\Hook\WebformScheduledEmailHooks1:
+    class: Drupal\webform_scheduled_email\Hook\WebformScheduledEmailHooks1
+    autowire: true
diff --git a/modules/webform_schema/tests/src/Functional/WebformSchemaTest.php b/modules/webform_schema/tests/src/Functional/WebformSchemaTest.php
index 2069ab6..f7c4912 100644
--- a/modules/webform_schema/tests/src/Functional/WebformSchemaTest.php
+++ b/modules/webform_schema/tests/src/Functional/WebformSchemaTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_schema\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform_schema
  */
+#[Group('webform_schema')]
+#[RunTestsInSeparateProcesses]
 class WebformSchemaTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_share/src/Hook/WebformShareHooks1.php b/modules/webform_share/src/Hook/WebformShareHooks1.php
new file mode 100644
index 0000000..cdad32d
--- /dev/null
+++ b/modules/webform_share/src/Hook/WebformShareHooks1.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Drupal\webform_share\Hook;
+
+use Drupal\webform_share\WebformShareHelper;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_share.
+ */
+class WebformShareHooks1 {
+
+  /**
+   * Implements hook_preprocess_HOOK() for page title templates.
+   */
+  #[Hook('preprocess_page_title')]
+  public static function preprocessPageTitle(&$variables) {
+    if (!WebformShareHelper::isPage()) {
+      return;
+    }
+    // Remove shortcut widget from page title.
+    // @see shortcut_preprocess_page_title()
+    if (isset($variables['title_suffix'])) {
+      unset($variables['title_suffix']['add_or_remove_shortcut']);
+    }
+  }
+
+}
diff --git a/modules/webform_share/tests/src/Functional/WebformShareNodeTest.php b/modules/webform_share/tests/src/Functional/WebformShareNodeTest.php
index d4745b8..d0a2e1a 100644
--- a/modules/webform_share/tests/src/Functional/WebformShareNodeTest.php
+++ b/modules/webform_share/tests/src/Functional/WebformShareNodeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_share\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_share
  */
+#[Group('webform_share')]
+#[RunTestsInSeparateProcesses]
 class WebformShareNodeTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/modules/webform_share/tests/src/Functional/WebformShareTest.php b/modules/webform_share/tests/src/Functional/WebformShareTest.php
index 607a8b6..d8e84a2 100644
--- a/modules/webform_share/tests/src/Functional/WebformShareTest.php
+++ b/modules/webform_share/tests/src/Functional/WebformShareTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_share\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform_share\Element\WebformShareIframe;
@@ -11,6 +13,8 @@ use Drupal\webform_share\Element\WebformShareIframe;
  *
  * @group webform_share
  */
+#[Group('webform_share')]
+#[RunTestsInSeparateProcesses]
 class WebformShareTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_share/tests/src/Functional/WebformShareVariantTest.php b/modules/webform_share/tests/src/Functional/WebformShareVariantTest.php
index b4619c3..b260386 100644
--- a/modules/webform_share/tests/src/Functional/WebformShareVariantTest.php
+++ b/modules/webform_share/tests/src/Functional/WebformShareVariantTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_share\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform_share\Element\WebformShareIframe;
 
@@ -10,6 +12,8 @@ use Drupal\webform_share\Element\WebformShareIframe;
  *
  * @group webform_share
  */
+#[Group('webform_share')]
+#[RunTestsInSeparateProcesses]
 class WebformShareVariantTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_share/webform_share.module b/modules/webform_share/webform_share.module
index 3818fc9..bd78097 100644
--- a/modules/webform_share/webform_share.module
+++ b/modules/webform_share/webform_share.module
@@ -5,13 +5,14 @@
  * Allows webforms to be shared on other websites using an iframe.
  */
 
+use Drupal\webform_share\Hook\WebformShareHooks1;
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_share\Hook\WebformShareHooks;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\RefinableCacheableDependencyInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Render\Markup;
-use Drupal\webform_share\WebformShareHelper;
 
 /**
  * Implements hook_webform_help_info().
@@ -104,7 +105,11 @@ function template_preprocess_html__webform_share(&$variables) {
   // Make sure the variables are preprocessed.
   // @see template_preprocess_page()
   if (!isset($variables['page'])) {
-    template_preprocess_html($variables);
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', function () use (&$variables) {
+        \Drupal::service('Drupal\Core\Theme\ThemePreprocess')->preprocessHtml($variables);
+    }, function () use (&$variables) {
+        template_preprocess_html($variables);
+    });
   }
 
   /** @var \Drupal\webform\WebformInterface $webform */
@@ -150,23 +155,20 @@ function template_preprocess_page__webform_share(&$variables) {
   // Make sure the variables are preprocessed.
   // @see template_preprocess_page()
   if (!isset($variables['base_path'])) {
-    template_preprocess_page($variables);
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', function () use (&$variables) {
+        \Drupal::service('Drupal\Core\Theme\ThemePreprocess')->preprocessPage($variables);
+    }, function () use (&$variables) {
+        template_preprocess_page($variables);
+    });
   }
 }
 
 /**
  * Implements hook_preprocess_HOOK() for page title templates.
  */
+#[LegacyHook]
 function webform_share_preprocess_page_title(&$variables) {
-  if (!WebformShareHelper::isPage()) {
-    return;
-  }
-
-  // Remove shortcut widget from page title.
-  // @see shortcut_preprocess_page_title()
-  if (isset($variables['title_suffix'])) {
-    unset($variables['title_suffix']['add_or_remove_shortcut']);
-  }
+  \Drupal::service(WebformShareHooks1::class)->preprocessPageTitle($variables);
 }
 
 /**
diff --git a/modules/webform_share/webform_share.services.yml b/modules/webform_share/webform_share.services.yml
index bf4871e..e62b19d 100644
--- a/modules/webform_share/webform_share.services.yml
+++ b/modules/webform_share/webform_share.services.yml
@@ -23,3 +23,7 @@ services:
   Drupal\webform_share\Hook\WebformShareHooks:
     class: Drupal\webform_share\Hook\WebformShareHooks
     autowire: true
+
+  Drupal\webform_share\Hook\WebformShareHooks1:
+    class: Drupal\webform_share\Hook\WebformShareHooks1
+    autowire: true
diff --git a/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/src/Hook/WebformSubmissionExportImportTestHooks.php b/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/src/Hook/WebformSubmissionExportImportTestHooks.php
new file mode 100644
index 0000000..3ee9153
--- /dev/null
+++ b/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/src/Hook/WebformSubmissionExportImportTestHooks.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace Drupal\webform_submission_export_import_test\Hook;
+
+use Drupal\user\Entity\User;
+use Drupal\Core\File\FileExists;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_submission_export_import_test.
+ */
+class WebformSubmissionExportImportTestHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for webform submission export import upload form.
+   *
+   * Make testing the CSV import a little easier by using and prepopulating
+   * external Google Sheet CSV.
+   */
+  #[Hook('form_webform_submission_export_import_upload_form_alter')]
+  public function formWebformSubmissionExportImportUploadFormAlter(&$form, FormStateInterface $form_state) {
+    $webform_id = \Drupal::routeMatch()->getRawParameter('webform');
+    if ($webform_id === 'test_submission_export_import' && isset($form['import']['import_url'])) {
+      global $base_url;
+      /** @var \Drupal\Core\File\FileSystemInterface $file_system */
+      $file_system = \Drupal::service('file_system');
+      $webform_path = \Drupal::service('extension.list.module')->getPath('webform');
+      $files_path = \Drupal::service('extension.list.module')->getPath('webform_submission_export_import_test') . '/files';
+      $file_names = [
+            // @see https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=646036902&single=true&output=csv
+            'webform',
+            // @see https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=173244372&single=true&output=csv
+            'external',
+      ];
+      $t_args = [];
+      foreach ($file_names as $file_name) {
+        // Set the test CSV URI.
+        $csv_uri = "public://test_submission_export_import-{$file_name}.csv";
+        // Set file URL href as href.
+        $t_args[":href_{$file_name}"] = \Drupal::service('file_url_generator')->generateAbsoluteString($csv_uri);
+        // Skip generate test CSV if it exists.
+        if (file_exists($csv_uri)) {
+          continue;
+        }
+        // Copy CSV file from module to public:// uri.
+        $csv_file_path = "{$files_path}/test_submission_export_import-{$file_name}.csv";
+        $destination = 'public://' . basename($csv_file_path);
+        $file_system->copy($csv_file_path, $destination, FileExists::Replace);
+        $contents = file_get_contents($csv_uri);
+        // Replace GitHub URLs with location URLs.
+        $github_base_url = 'https://raw.githubusercontent.com/drupalprojects/webform/8.x-5.x/';
+        $contents = str_replace($github_base_url, "{$base_url}/{$webform_path}/", $contents);
+        // Replace user entity reference properties.
+        $account = User::load(1);
+        $contents = str_replace('user_id', $account->id(), $contents);
+        $contents = str_replace('user_name', $account->getAccountName(), $contents);
+        $contents = str_replace('user_mail', $account->getEmail(), $contents);
+        $contents = str_replace('user_uuid', $account->uuid(), $contents);
+        file_put_contents($csv_uri, $contents);
+      }
+      // Set the default type and URL to the webform.csv.
+      $form['import']['import_type']['#default_value'] = 'url';
+      $form['import']['import_url']['#default_value'] = $t_args[':href_webform'];
+      // Display clickable description that populates the import URL and
+      // submits the form.
+      // @see Drupal.behaviors.webformSubmissionExportImportTest
+      $form['import']['import_url']['#description'] = $this->t('Test <a href=":href_webform">webform</a> or <a href=":href_external">external</a>', $t_args);
+      $form['import']['import_url']['#help'] = FALSE;
+      $form['#attached']['library'][] = 'webform_submission_export_import_test/webform_submission_export_import_test';
+    }
+        // phpcs:disable
+        /*
+        // Get webform.csv and external.csv from Google Sheets.
+        file_put_contents(
+           "$files_path/test_submission_export_import-webform.csv",
+          file_get_contents('https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=646036902&single=true&output=csv')
+        );
+        file_put_contents(
+           "$files_path/test_submission_export_import-external.csv",
+          file_get_contents('https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=173244372&single=true&output=csv')
+        );
+        */
+        // phpcs:enable
+  }
+
+}
diff --git a/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.module b/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.module
index 6a5f10c..d7b517a 100644
--- a/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.module
+++ b/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.module
@@ -5,9 +5,9 @@
  * Support module for webform submission export/import.
  */
 
-use Drupal\Core\File\FileExists;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform_submission_export_import_test\Hook\WebformSubmissionExportImportTestHooks;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\user\Entity\User;
 
 /**
  * Implements hook_form_FORM_ID_alter() for webform submission export import upload form.
@@ -15,79 +15,7 @@ use Drupal\user\Entity\User;
  * Make testing the CSV import a little easier by using and prepopulating
  * external Google Sheet CSV.
  */
+#[LegacyHook]
 function webform_submission_export_import_test_form_webform_submission_export_import_upload_form_alter(&$form, FormStateInterface $form_state) {
-  $webform_id = \Drupal::routeMatch()->getRawParameter('webform');
-  if ($webform_id === 'test_submission_export_import' && isset($form['import']['import_url'])) {
-    global $base_url;
-
-    /** @var \Drupal\Core\File\FileSystemInterface $file_system */
-    $file_system = \Drupal::service('file_system');
-
-    $webform_path = \Drupal::service('extension.list.module')->getPath('webform');
-    $files_path = \Drupal::service('extension.list.module')->getPath('webform_submission_export_import_test') . '/files';
-    $file_names = [
-      // @see https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=646036902&single=true&output=csv
-      'webform',
-      // @see https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=173244372&single=true&output=csv
-      'external',
-    ];
-
-    $t_args = [];
-    foreach ($file_names as $file_name) {
-      // Set the test CSV URI.
-      $csv_uri = "public://test_submission_export_import-$file_name.csv";
-
-      // Set file URL href as href.
-      $t_args[":href_$file_name"] = \Drupal::service('file_url_generator')->generateAbsoluteString($csv_uri);
-
-      // Skip generate test CSV if it exists.
-      if (file_exists($csv_uri)) {
-        continue;
-      }
-
-      // Copy CSV file from module to public:// uri.
-      $csv_file_path = "$files_path/test_submission_export_import-$file_name.csv";
-      $destination = 'public://' . basename($csv_file_path);
-      $file_system->copy($csv_file_path, $destination, FileExists::Replace);
-
-      $contents = file_get_contents($csv_uri);
-
-      // Replace GitHub URLs with location URLs.
-      $github_base_url = 'https://raw.githubusercontent.com/drupalprojects/webform/8.x-5.x/';
-      $contents = str_replace($github_base_url, "$base_url/$webform_path/", $contents);
-
-      // Replace user entity reference properties.
-      $account = User::load(1);
-      $contents = str_replace('user_id', $account->id(), $contents);
-      $contents = str_replace('user_name', $account->getAccountName(), $contents);
-      $contents = str_replace('user_mail', $account->getEmail(), $contents);
-      $contents = str_replace('user_uuid', $account->uuid(), $contents);
-
-      file_put_contents($csv_uri, $contents);
-    }
-
-    // Set the default type and URL to the webform.csv.
-    $form['import']['import_type']['#default_value'] = 'url';
-    $form['import']['import_url']['#default_value'] = $t_args[':href_webform'];
-
-    // Display clickable description that populates the import URL and
-    // submits the form.
-    // @see Drupal.behaviors.webformSubmissionExportImportTest
-    $form['import']['import_url']['#description'] = t('Test <a href=":href_webform">webform</a> or <a href=":href_external">external</a>', $t_args);
-    $form['import']['import_url']['#help'] = FALSE;
-    $form['#attached']['library'][] = 'webform_submission_export_import_test/webform_submission_export_import_test';
-  }
-  // phpcs:disable
-  /*
-  // Get webform.csv and external.csv from Google Sheets.
-  file_put_contents(
-     "$files_path/test_submission_export_import-webform.csv",
-    file_get_contents('https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=646036902&single=true&output=csv')
-  );
-  file_put_contents(
-     "$files_path/test_submission_export_import-external.csv",
-    file_get_contents('https://docs.google.com/spreadsheets/d/e/2PACX-1vTYImRfGbGGCtKq7hrYGkm5jJo_P0fwNrLOBpcSapBkEUPlBToShXcSJAdDAF5hjVupbGFAm1anUtip/pub?gid=173244372&single=true&output=csv')
-  );
-  */
-  // phpcs:enable
+  \Drupal::service(WebformSubmissionExportImportTestHooks::class)->formWebformSubmissionExportImportUploadFormAlter($form, $form_state);
 }
diff --git a/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.services.yml b/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.services.yml
new file mode 100644
index 0000000..43995fe
--- /dev/null
+++ b/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\webform_submission_export_import_test\Hook\WebformSubmissionExportImportTestHooks:
+    class: Drupal\webform_submission_export_import_test\Hook\WebformSubmissionExportImportTestHooks
+    autowire: true
diff --git a/modules/webform_submission_export_import/tests/src/Functional/WebformSubmissionImportExportFunctionalTest.php b/modules/webform_submission_export_import/tests/src/Functional/WebformSubmissionImportExportFunctionalTest.php
index 477e994..49ab5f2 100644
--- a/modules/webform_submission_export_import/tests/src/Functional/WebformSubmissionImportExportFunctionalTest.php
+++ b/modules/webform_submission_export_import/tests/src/Functional/WebformSubmissionImportExportFunctionalTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_submission_export_import\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -13,6 +15,8 @@ use Drupal\webform\Utility\WebformElementHelper;
  *
  * @group webform_submission_import_export
  */
+#[Group('webform_submission_import_export')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionImportExportFunctionalTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogNodeTest.php b/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogNodeTest.php
index 7b7fea0..0f1a08b 100644
--- a/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogNodeTest.php
+++ b/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogNodeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_submission_log\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\Tests\webform_submission_log\Traits\WebformSubmissionLogTrait;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_submission_log
  */
+#[Group('webform_submission_log')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionLogNodeTest extends WebformNodeBrowserTestBase {
 
   use WebformSubmissionLogTrait;
diff --git a/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogTest.php b/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogTest.php
index 1df6bb4..7c37acc 100644
--- a/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogTest.php
+++ b/modules/webform_submission_log/tests/src/Functional/WebformSubmissionLogTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_submission_log\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\Tests\webform_submission_log\Traits\WebformSubmissionLogTrait;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform_submission_log
  */
+#[Group('webform_submission_log')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionLogTest extends WebformBrowserTestBase {
 
   use WebformSubmissionLogTrait;
diff --git a/modules/webform_templates/tests/src/Functional/WebformTemplatesTest.php b/modules/webform_templates/tests/src/Functional/WebformTemplatesTest.php
index 61a9996..2974eac 100644
--- a/modules/webform_templates/tests/src/Functional/WebformTemplatesTest.php
+++ b/modules/webform_templates/tests/src/Functional/WebformTemplatesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_templates\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\WebformInterface;
@@ -11,6 +13,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform_templates
  */
+#[Group('webform_templates')]
+#[RunTestsInSeparateProcesses]
 class WebformTemplatesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_ui/src/Hook/WebformUiHooks1.php b/modules/webform_ui/src/Hook/WebformUiHooks1.php
new file mode 100644
index 0000000..e01aa13
--- /dev/null
+++ b/modules/webform_ui/src/Hook/WebformUiHooks1.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\webform_ui\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_ui.
+ */
+class WebformUiHooks1 {
+
+  /**
+   * Implements hook_preprocess_menu_local_action().
+   *
+   * Add .button--secondary to add page and layout actions.
+   *
+   * @see Drupal.behaviors.webformUiElementsActionsSecondary
+   */
+  #[Hook('preprocess_menu_local_action')]
+  public static function preprocessMenuLocalAction(&$variables) {
+    if (\Drupal::routeMatch()->getRouteName() !== 'entity.webform.edit_form') {
+      return;
+    }
+    if (in_array($variables['link']['#url']->getRouteName(), [
+          'entity.webform_ui.element.add_page',
+          'entity.webform_ui.element.add_layout',
+    ])) {
+      $variables['link']['#options']['attributes']['class'][] = 'button--secondary';
+    }
+  }
+
+}
diff --git a/modules/webform_ui/tests/src/Functional/WebformUiElementActionsTest.php b/modules/webform_ui/tests/src/Functional/WebformUiElementActionsTest.php
index 45d58be..ca4efcd 100644
--- a/modules/webform_ui/tests/src/Functional/WebformUiElementActionsTest.php
+++ b/modules/webform_ui/tests/src/Functional/WebformUiElementActionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_ui\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform_ui
  */
+#[Group('webform_ui')]
+#[RunTestsInSeparateProcesses]
 class WebformUiElementActionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_ui/tests/src/Functional/WebformUiElementDefaultValueTest.php b/modules/webform_ui/tests/src/Functional/WebformUiElementDefaultValueTest.php
index 6ff66b2..adc28e6 100644
--- a/modules/webform_ui/tests/src/Functional/WebformUiElementDefaultValueTest.php
+++ b/modules/webform_ui/tests/src/Functional/WebformUiElementDefaultValueTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_ui\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform_ui
  */
+#[Group('webform_ui')]
+#[RunTestsInSeparateProcesses]
 class WebformUiElementDefaultValueTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_ui/tests/src/Functional/WebformUiElementPropertiesTest.php b/modules/webform_ui/tests/src/Functional/WebformUiElementPropertiesTest.php
index 2438f20..edc5bd9 100644
--- a/modules/webform_ui/tests/src/Functional/WebformUiElementPropertiesTest.php
+++ b/modules/webform_ui/tests/src/Functional/WebformUiElementPropertiesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_ui\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_ui
  */
+#[Group('webform_ui')]
+#[RunTestsInSeparateProcesses]
 class WebformUiElementPropertiesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php b/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php
index 38e0ee4..8134572 100644
--- a/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php
+++ b/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_ui\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_ui
  */
+#[Group('webform_ui')]
+#[RunTestsInSeparateProcesses]
 class WebformUiElementTest extends WebformBrowserTestBase {
 
   /**
diff --git a/modules/webform_ui/tests/src/FunctionalJavascript/WebformUiElementJavaScriptTest.php b/modules/webform_ui/tests/src/FunctionalJavascript/WebformUiElementJavaScriptTest.php
index de17496..6e9306c 100644
--- a/modules/webform_ui/tests/src/FunctionalJavascript/WebformUiElementJavaScriptTest.php
+++ b/modules/webform_ui/tests/src/FunctionalJavascript/WebformUiElementJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform_ui\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_ui
  */
+#[Group('webform_ui')]
+#[RunTestsInSeparateProcesses]
 class WebformUiElementJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/modules/webform_ui/tests/src/Unit/WebformUiPathProcessorTest.php b/modules/webform_ui/tests/src/Unit/WebformUiPathProcessorTest.php
index 2b99ec2..b2d2c8c 100644
--- a/modules/webform_ui/tests/src/Unit/WebformUiPathProcessorTest.php
+++ b/modules/webform_ui/tests/src/Unit/WebformUiPathProcessorTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform_ui\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform_ui\PathProcessor\WebformUiPathProcessor;
 use Symfony\Component\HttpFoundation\Request;
@@ -10,6 +11,7 @@ use Symfony\Component\HttpFoundation\Request;
  * @coversDefaultClass \Drupal\webform_ui\PathProcessor\WebformUiPathProcessor
  * @group webform_ui
  */
+#[Group('webform_ui')]
 class WebformUiPathProcessorTest extends UnitTestCase {
 
   /**
diff --git a/modules/webform_ui/webform_ui.module b/modules/webform_ui/webform_ui.module
index 98a0c25..2b9af99 100644
--- a/modules/webform_ui/webform_ui.module
+++ b/modules/webform_ui/webform_ui.module
@@ -5,6 +5,7 @@
  * Provides the webform ui.
  */
 
+use Drupal\webform_ui\Hook\WebformUiHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_ui\Hook\WebformUiHooks;
 
@@ -30,12 +31,7 @@ function webform_ui_entity_type_alter(array &$entity_types) {
  *
  * @see Drupal.behaviors.webformUiElementsActionsSecondary
  */
+#[LegacyHook]
 function webform_ui_preprocess_menu_local_action(&$variables) {
-  if (\Drupal::routeMatch()->getRouteName() !== 'entity.webform.edit_form') {
-    return;
-  }
-
-  if (in_array($variables['link']['#url']->getRouteName(), ['entity.webform_ui.element.add_page', 'entity.webform_ui.element.add_layout'])) {
-    $variables['link']['#options']['attributes']['class'][] = 'button--secondary';
-  }
+  \Drupal::service(WebformUiHooks1::class)->preprocessMenuLocalAction($variables);
 }
diff --git a/modules/webform_ui/webform_ui.services.yml b/modules/webform_ui/webform_ui.services.yml
index 4d08907..bda4d15 100644
--- a/modules/webform_ui/webform_ui.services.yml
+++ b/modules/webform_ui/webform_ui.services.yml
@@ -7,3 +7,7 @@ services:
   Drupal\webform_ui\Hook\WebformUiHooks:
     class: Drupal\webform_ui\Hook\WebformUiHooks
     autowire: true
+
+  Drupal\webform_ui\Hook\WebformUiHooks1:
+    class: Drupal\webform_ui\Hook\WebformUiHooks1
+    autowire: true
diff --git a/src/Form/AdminConfig/WebformAdminConfigElementsForm.php b/src/Form/AdminConfig/WebformAdminConfigElementsForm.php
index 89ff0fb..179d637 100644
--- a/src/Form/AdminConfig/WebformAdminConfigElementsForm.php
+++ b/src/Form/AdminConfig/WebformAdminConfigElementsForm.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Form\AdminConfig;
 
+use Drupal\filter\FilterFormatRepositoryInterface;
 use Drupal\Component\Utility\Bytes;
 use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Utility\Environment;
@@ -196,7 +197,7 @@ class WebformAdminConfigElementsForm extends WebformAdminConfigBaseForm {
     ];
     $format_options = [];
     $format_options[WebformHtmlEditor::DEFAULT_FILTER_FORMAT] = $this->t('- Default -');
-    $filters = filter_formats();
+    $filters = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getAllFormats(), fn() => filter_formats());
     unset($filters[WebformHtmlEditor::DEFAULT_FILTER_FORMAT]);
     foreach ($filters as $filter) {
       $format_options[$filter->id()] = $filter->label();
diff --git a/src/Hook/WebformEditorHooks.php b/src/Hook/WebformEditorHooks.php
index 71a87b6..1cac96d 100644
--- a/src/Hook/WebformEditorHooks.php
+++ b/src/Hook/WebformEditorHooks.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Hook;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\webform\Element\WebformHtmlEditor;
 use Drupal\webform\WebformInterface;
 use Drupal\Core\Hook\Attribute\Hook;
@@ -41,7 +42,7 @@ class WebformEditorHooks {
    */
   #[Hook('webform_update')]
   public function webformUpdate(WebformInterface $webform) {
-    $original_uuids = _webform_get_config_entity_file_uuids($webform->original);
+    $original_uuids = _webform_get_config_entity_file_uuids(DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $webform->getOriginal(), fn() => $webform->original));
     $uuids = _webform_get_config_entity_file_uuids($webform);
     // Detect file usages that should be incremented.
     $added_files = array_diff($uuids, $original_uuids);
diff --git a/src/Hook/WebformEditorHooks1.php b/src/Hook/WebformEditorHooks1.php
new file mode 100644
index 0000000..6ddbb5d
--- /dev/null
+++ b/src/Hook/WebformEditorHooks1.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\webform\Hook;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\webform\Element\WebformHtmlEditor;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\filter\FilterFormatInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform.
+ */
+class WebformEditorHooks1 {
+
+  /**
+   * Implements hook_ENTITY_TYPE_access().
+   */
+  #[Hook('filter_format_access')]
+  public static function filterFormatAccess(FilterFormatInterface $filter_format, $operation, AccountInterface $account) {
+    if ($filter_format->id() === WebformHtmlEditor::DEFAULT_FILTER_FORMAT && $operation !== 'use') {
+      return AccessResult::forbidden('This text format can only be managed by the Webform module.');
+    }
+    return AccessResult::neutral();
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_load().
+   */
+  #[Hook('filter_format_load')]
+  public static function filterFormatLoad($entities) {
+    foreach ($entities as $entity) {
+      // Hide the default webform filter format on the filter admin overview page.
+      if ($entity->id() === WebformHtmlEditor::DEFAULT_FILTER_FORMAT && \Drupal::routeMatch()->getRouteName() === 'filter.admin_overview') {
+        // Set status to FALSE which hides the default webform filter format.
+        $entity->set('status', FALSE);
+      }
+    }
+  }
+
+}
diff --git a/src/Hook/WebformFormAlterHooks1.php b/src/Hook/WebformFormAlterHooks1.php
new file mode 100644
index 0000000..1ce306e
--- /dev/null
+++ b/src/Hook/WebformFormAlterHooks1.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Drupal\webform\Hook;
+
+use Drupal\Core\Url;
+use Drupal\webform\Element\WebformMessage;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform.
+ */
+class WebformFormAlterHooks1 {
+  use StringTranslationTrait;
+  /* ************************************************************************** */
+  // Update manager.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for update manager update form.
+   *
+   * Add warnings when attempting to update the Webform module using
+   * the 'Update manager'.
+   *
+   * @see https://www.drupal.org/project/webform/issues/2930116
+   * @see https://www.drupal.org/project/webform/issues/2920095
+   */
+  #[Hook('form_update_manager_update_form_alter')]
+  public function formUpdateManagerUpdateFormAlter(&$form, FormStateInterface $form_state) {
+    if (!isset($form['projects']) || !isset($form['projects']['#options']['webform'])) {
+      return;
+    }
+    // Display dismissible warning at the top of the page.
+    $t_args = [
+          ':href_manual' => 'https://www.drupal.org/docs/user_guide/en/extend-manual-install.html',
+          ':href_composer' => 'https://www.drupal.org/docs/user_guide/en/install-composer.html',
+    ];
+    $form['webform_update_manager_warning'] = [
+          '#type' => 'webform_message',
+          '#message_type' => 'warning',
+          '#message_message' => $this->t('The Webform module may not update properly using this administrative interface. It is strongly recommended that you update the Webform module <a href=":href_manual">manually</a> or by using <a href=":href_composer">Composer</a>.', $t_args),
+          '#message_close' => TRUE,
+          '#message_storage' => WebformMessage::STORAGE_SESSION,
+          '#weight' => -10,
+    ];
+    // Display warning to backup site when webform is checked.
+    $form['projects']['#options']['webform']['title']['data'] = [
+          'title' => $form['projects']['#options']['webform']['title']['data'],
+          'container' => [
+              '#type' => 'container',
+              '#states' => [
+                  'visible' => [
+                      ':input[name="projects[webform]"]' => [
+                          'checked' => TRUE,
+                      ],
+                  ],
+              ],
+              '#attributes' => [
+                  'class' => [
+                      'js-form-wrapper',
+                  ],
+                  'style' => 'display:none',
+              ],
+              'message' => [
+                  '#type' => 'webform_message',
+                  '#message_type' => 'warning',
+                  '#message_message' => $this->t('Please make sure to backup your website before updating the Webform module.'),
+              ],
+          ],
+    ];
+  }
+
+  /* ************************************************************************** */
+  // Views.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for views exposed form.
+   */
+  #[Hook('form_views_exposed_form_alter')]
+  public static function formViewsExposedFormAlter(&$form, FormStateInterface $form_state, $form_id) {
+    /** @var \Drupal\views\ViewExecutable $view */
+    $view = $form_state->get('view');
+    // Check if this a is webform submission view.
+    // @see \Drupal\webform\WebformSubmissionListBuilder::buildSubmissionViews
+    if (isset($view->webform_submission_view)) {
+      $form['#action'] = Url::fromRoute(\Drupal::routeMatch()->getRouteName(), \Drupal::routeMatch()->getRawParameters()->all())->toString();
+    }
+  }
+
+  /* ************************************************************************** */
+  // SMTP.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for SMTP admin settings form.
+   */
+  #[Hook('form_smtp_admin_settings_alter')]
+  public static function formSmtpAdminSettingsAlter(&$form, FormStateInterface $form_state) {
+    $form['#submit'][] = '_webform_form_smtp_admin_settings_submit';
+  }
+
+  /* ************************************************************************** */
+  // Configuration management.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for config single import form.
+   */
+  #[Hook('form_config_single_import_form_alter')]
+  public static function formConfigSingleImportFormAlter(&$form, FormStateInterface $form_state) {
+    $config_type = \Drupal::request()->query->get('config_type');
+    if ($config_type === 'webform') {
+      $form['config_type']['#default_value'] = 'webform';
+    }
+  }
+
+}
diff --git a/src/Hook/WebformOptionsHooks.php b/src/Hook/WebformOptionsHooks.php
new file mode 100644
index 0000000..2ef36c0
--- /dev/null
+++ b/src/Hook/WebformOptionsHooks.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Drupal\webform\Hook;
+
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Datetime\TimeZoneFormHelper;
+use Drupal\webform\Utility\WebformOptionsHelper;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform.
+ */
+class WebformOptionsHooks {
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for range options.
+   *
+   * @see config/install/webform.webform.example_options.yml
+   */
+  #[Hook('webform_options_range_alter')]
+  public static function webformOptionsRangeAlter(
+    array &$options,
+    array $element = [],
+  ) {
+    $element += [
+          '#min' => 1,
+          '#max' => 100,
+          '#step' => 1,
+          '#pad_length' => NULL,
+          '#pad_str' => 0,
+    ];
+    $options = WebformOptionsHelper::range($element['#min'], $element['#max'], $element['#step'], $element['#pad_length'], $element['#pad_str']);
+  }
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for time zones options.
+   */
+  #[Hook('webform_options_time_zones_alter')]
+  public static function webformOptionsTimeZonesAlter(
+    array &$options,
+    array $element = [],
+  ) {
+    if (empty($options)) {
+      $options = TimeZoneFormHelper::getOptionsList();
+    }
+  }
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for country codes options.
+   */
+  #[Hook('webform_options_country_codes_alter')]
+  public static function webformOptionsCountryCodesAlter(
+    array &$options,
+    array $element = [],
+  ) {
+    if (empty($options)) {
+      /** @var \Drupal\Core\Locale\CountryManagerInterface $country_manager */
+      $country_manager = \Drupal::service('country_manager');
+      $options = $country_manager->getList();
+    }
+  }
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for country names options.
+   */
+  #[Hook('webform_options_country_names_alter')]
+  public static function webformOptionsCountryNamesAlter(
+    array &$options,
+    array $element = [],
+  ) {
+    if (empty($options)) {
+      /** @var \Drupal\Core\Locale\CountryManagerInterface $country_manager */
+      $country_manager = \Drupal::service('country_manager');
+      $countries = $country_manager->getList();
+      $options = array_combine($countries, $countries);
+    }
+  }
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for languages options.
+   */
+  #[Hook('webform_options_languages_alter')]
+  public static function webformOptionsLanguagesAlter(
+    array &$options,
+    array $element = [],
+  ) {
+    if (empty($options)) {
+      $languages = LanguageManager::getStandardLanguageList();
+      unset($languages['en-x-simple']);
+      $options = [];
+      foreach ($languages as $language) {
+        $options[$language[0]] = $language[0];
+      }
+    }
+  }
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for translations options.
+   */
+  #[Hook('webform_options_translations_alter')]
+  public static function webformOptionsTranslationsAlter(
+    array &$options,
+    array $element = [],
+  ) {
+    if (empty($options)) {
+      $languages = \Drupal::languageManager()->getLanguages();
+      $options = [];
+      foreach ($languages as $language) {
+        $options[$language->getId()] = $language->getName();
+      }
+    }
+  }
+
+}
diff --git a/src/Hook/WebformThemeHooks1.php b/src/Hook/WebformThemeHooks1.php
new file mode 100644
index 0000000..6f794ae
--- /dev/null
+++ b/src/Hook/WebformThemeHooks1.php
@@ -0,0 +1,453 @@
+<?php
+
+namespace Drupal\webform\Hook;
+
+use Drupal\file\Entity\File;
+use Drupal\Core\StringTranslation\ByteSizeMarkup;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Render\Element;
+use Drupal\webform\Plugin\WebformElement\WebformEntityRadios;
+use Drupal\webform\Plugin\WebformElement\Radios;
+use Drupal\Component\Utility\Html;
+use Drupal\Core\Template\Attribute;
+use Drupal\webform\Utility\WebformAccessibilityHelper;
+use Drupal\webform\Element\WebformSelectOther;
+use Drupal\webform\Utility\WebformElementHelper;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform.
+ */
+class WebformThemeHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_preprocess_checkboxes() for checkboxes templates.
+   *
+   * @see \Drupal\webform\Plugin\WebformElement\OptionsBase
+   */
+  #[Hook('preprocess_checkboxes')]
+  public static function preprocessCheckboxes(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    _webform_preprocess_options($variables);
+  }
+
+  /**
+   * Implements hook_preprocess_radios() for radios templates.
+   *
+   * @see \Drupal\webform\Plugin\WebformElement\OptionsBase
+   */
+  #[Hook('preprocess_radios')]
+  public static function preprocessRadios(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    _webform_preprocess_options($variables);
+  }
+
+  /**
+   * Implements hook_preprocess_select() for select templates.
+   */
+  #[Hook('preprocess_select')]
+  public static function preprocessSelect(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    $element = $variables['element'];
+    // When options are sorted (viu #sort_options: true) make sure the
+    // select '_other_' options is always last.
+    // @see \Drupal\webform\Element\WebformOtherBase::processWebformOther
+    // @see template_preprocess_select().
+    if (!empty($element['#sort_options']) && !empty($element['#webform_other'])) {
+      $options =& $variables['options'];
+      foreach ($options as $index => $option) {
+        if ($option['value'] === WebformSelectOther::OTHER_OPTION) {
+          unset($options[$index]);
+          $options[] = $option;
+          $options = array_values($options);
+          break;
+        }
+      }
+    }
+  }
+
+  /* ************************************************************************** */
+  // Preprocess tables.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_preprocess_table() for table templates.
+   */
+  #[Hook('preprocess_table')]
+  public static function preprocessTable(&$variables) {
+    // Add links to 'Translate' webform tab.
+    if (\Drupal::routeMatch()->getRouteName() === 'entity.webform.config_translation_overview') {
+      /** @var \Drupal\webform\WebformInterface $webform */
+      $webform = \Drupal::routeMatch()->getParameter('webform');
+      foreach ($variables['rows'] as &$row) {
+        // Check first cell.
+        if (!isset($row['cells'][0]['content']) || !is_array($row['cells'][0]['content']) || !isset($row['cells'][0]['content']['#markup'])) {
+          continue;
+        }
+        // Check last cell edit link.
+        if (!isset($row['cells'][1]['content']) || !is_array($row['cells'][1]['content']) || !isset($row['cells'][1]['content']['#links']) || !is_array($row['cells'][1]['content']['#links']) || !isset($row['cells'][1]['content']['#links']['edit'])) {
+          continue;
+        }
+        // Get language from edit link.
+        $route_parameters = $row['cells'][1]['content']['#links']['edit']['url']->getRouteParameters();
+        $langcode = $route_parameters['langcode'] ?? NULL;
+        $language = \Drupal::languageManager()->getLanguage($langcode);
+        // Convert the first cell in the row to a link.
+        $row['cells'][0]['content'] = [
+              '#type' => 'link',
+              '#url' => $webform->toUrl('canonical', [
+                  'language' => $language,
+              ]),
+              '#title' => $row['cells'][0]['content'],
+        ];
+      }
+    }
+  }
+
+  /* ************************************************************************** */
+  // Preprocess containers.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_preprocess_datetime_form() for datetime form element templates.
+   */
+  #[Hook('preprocess_datetime_form')]
+  public static function preprocessDatetimeForm(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    $element = $variables['element'];
+    // Date and time custom placeholder.
+    if (isset($element['#date_date_placeholder']) && isset($variables['content']['date'])) {
+      $variables['content']['date']['#attributes']['placeholder'] = $element['#date_date_placeholder'];
+    }
+    if (isset($element['#date_time_placeholder']) && isset($variables['content']['time'])) {
+      $variables['content']['time']['#attributes']['placeholder'] = $element['#date_time_placeholder'];
+    }
+    // Add .container-inline to datetime form wrapper which is missing from the
+    // stable base theme.
+    // @see core/themes/classy/templates/form/datetime-form.html.twig
+    // @see core/themes/stable/templates/form/datetime-form.html.twig
+    $variables['attributes']['class'][] = 'container-inline';
+  }
+
+  /**
+   * Implements hook_preprocess_details() for details element templates.
+   */
+  #[Hook('preprocess_details')]
+  public static function preprocessDetails(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    // Setup description, help, and more.
+    _webform_preprocess_element($variables);
+    $element =& $variables['element'];
+    // Hide details title.
+    if (isset($element['#title_display']) && $element['#title_display'] === 'invisible') {
+      $variables['title'] = WebformAccessibilityHelper::buildVisuallyHidden($variables['title']);
+    }
+    // Remove invalid 'required' and 'aria-required' attributes from details.
+    if (isset($element['#webform_key'])) {
+      unset($variables['attributes']['required'], $variables['attributes']['aria-required']);
+    }
+  }
+
+  /**
+   * Implements hook_preprocess_fieldset() for fieldset templates.
+   */
+  #[Hook('preprocess_fieldset')]
+  public static function preprocessFieldset(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    // Setup description, help, and more.
+    _webform_preprocess_element($variables, [
+          'legend',
+          'title',
+    ]);
+    $element =& $variables['element'];
+    // Apply inline title defined by radios, checkboxes, and buttons.
+    // @see \Drupal\webform\Plugin\WebformElement\OptionsBase::prepare
+    if (isset($element['#_title_display'])) {
+      $variables['attributes']['class'][] = 'webform-fieldset--title-inline';
+    }
+    // If the title display is none remove the legend.title and set
+    // display to none.
+    if (isset($element['#title_display']) && $element['#title_display'] === 'none') {
+      $variables['legend'] = [
+            'attributes' => new Attribute([
+                'style' => 'display:none',
+            ]),
+      ];
+    }
+    elseif (isset($element['#title_attributes']) && $variables['legend']['attributes'] instanceof Attribute) {
+      $variables['legend']['attributes']->merge(new Attribute($element['#title_attributes']));
+    }
+    // Add .js-webform-form-type-* class to be used JavaScript and #states API.
+    // @see js/webform.states.js
+    if (isset($element['#type'])) {
+      $variables['attributes']['class'][] = 'js-webform-type-' . Html::getClass($element['#type']);
+      $variables['attributes']['class'][] = 'webform-type-' . Html::getClass($element['#type']);
+    }
+    // Remove invalid 'required' attributes from fieldset.
+    //
+    // Issue #3174459: W3C Validation: required attribute not allowed on
+    // fieldset tag.
+    // @see https://www.drupal.org/project/drupal/issues/3174459
+    if (isset($element['#webform_key'])) {
+      unset($variables['attributes']['required']);
+    }
+    // Add aria-required="true" only on fieldsets containing required
+    // radiobuttons.
+    //
+    // Issue #3240249: Aria-required on fieldset trigger accessibility fails.
+    // @see https://www.drupal.org/project/webform/issues/3240249
+    // @see https://www.drupal.org/project/webform/issues/3277192
+    /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
+    $element_manager = \Drupal::service('plugin.manager.webform.element');
+    $element_plugin = $element_manager->getElementInstance($element);
+    $is_radios = $element_plugin instanceof Radios || $element_plugin instanceof WebformEntityRadios;
+    if ($is_radios) {
+      $id = $variables['attributes']['id'] . '-legend';
+      $variables['legend']['attributes']['id'] = $id;
+      if (isset($variables['attributes']['aria-required'])) {
+        // The aria-required is _not_ necessary on a fieldset of radio elements.
+        unset($variables['attributes']['aria-required']);
+      }
+    }
+    elseif (isset($variables['attributes']['aria-required'])) {
+      unset($variables['attributes']['aria-required']);
+    }
+  }
+
+  /* ************************************************************************** */
+  // Preprocess form element.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_preprocess_form_element() for form element templates.
+   */
+  #[Hook('preprocess_form_element')]
+  public static function preprocessFormElement(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    $element =& $variables['element'];
+    // Setup description, help, and more.
+    _webform_preprocess_element($variables, [
+          'label',
+          '#title',
+    ]);
+    // Make sure the #description_display is always applied to account for
+    // #more which is placed in the #description.
+    // @see template_preprocess_form_element()
+    if (isset($variables['description'])) {
+      $variables['description_display'] = $element['#description_display'];
+    }
+    // Issue #2700439: Description class not added to
+    // form-element.html.twig template.
+    // @see https://www.drupal.org/project/drupal/issues/2700439
+    if (isset($variables['description_display']) && $variables['description_display'] === 'before') {
+      // Add system .description class.
+      if (isset($variables['description'])) {
+        if (empty($variables['description']['attributes'])) {
+          $variables['description']['attributes'] = new Attribute();
+        }
+        $variables['description']['attributes']->addClass('description');
+      }
+    }
+    // Add missing classes to the Claro theme's form elements.
+    // @see core/modules/system/templates/form-element.html.twig
+    // @see claro/templates/form-element.html.twig
+    // @todo Once Claro and Oliver are stable determine if this code is needed.
+    static $is_claro_theme;
+    static $is_olivero_theme;
+    if (!isset($is_claro_theme)) {
+      /** @var \Drupal\webform\WebformThemeManagerInterface $theme_manager */
+      $theme_manager = \Drupal::service('webform.theme_manager');
+      $is_claro_theme = $theme_manager->isActiveTheme('claro');
+      $is_olivero_theme = $theme_manager->isActiveTheme('olivero');
+    }
+    if ($is_claro_theme || $is_olivero_theme) {
+      // Add system .form-type-TYPE class.
+      if (!empty($variables['type'])) {
+        $variables['attributes']['class'][] = 'form-type-' . Html::getClass($variables['type']);
+      }
+      // Add system .description class.
+      if (isset($variables['description'])) {
+        if (empty($variables['description']['attributes'])) {
+          $variables['description']['attributes'] = new Attribute();
+        }
+        $variables['description']['attributes']->addClass('description');
+      }
+    }
+    // Add .js-webform-form-type-* class to be used JavaScript and #states API.
+    // @see js/webform.states.js
+    if (isset($element['#type'])) {
+      $variables['attributes']['class'][] = 'js-webform-type-' . Html::getClass($element['#type']);
+      $variables['attributes']['class'][] = 'webform-type-' . Html::getClass($element['#type']);
+    }
+  }
+
+  /**
+   * Implements hook_preprocess_form_element_label() for form element label templates.
+   */
+  #[Hook('preprocess_form_element_label')]
+  public static function preprocessFormElementLabel(&$variables) {
+    $element =& $variables['element'];
+    // Fix variable title #markup tha contains a render array which is most
+    // likely a Help tooltip.
+    // @see template_preprocess_form_element_label()
+    // @see webform_preprocess_form_element()
+    if (isset($variables['title']) && is_array($variables['title']) && is_array($variables['title']['#markup'])) {
+      $variables['title'] = $variables['title']['#markup'];
+    }
+    // Remove label 'for' attribute.
+    if (!empty($element['#attributes']['webform-remove-for-attribute'])) {
+      unset($element['#attributes']['webform-remove-for-attribute']);
+      unset($variables['attributes']['webform-remove-for-attribute']);
+      unset($variables['attributes']['for']);
+    }
+  }
+
+  /* ************************************************************************** */
+  // Preprocess file/image elements.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_preprocess_file_managed_file() for file managed file templates.
+   *
+   * @see https://stackoverflow.com/questions/21842274/cross-browser-custom-styling-for-file-upload-button
+   * @see template_preprocess_file_managed_file()
+   */
+  #[Hook('preprocess_file_managed_file')]
+  public function preprocessFileManagedFile(&$variables) {
+    if (!WebformElementHelper::isWebformElement($variables['element'])) {
+      return;
+    }
+    $element =& $variables['element'];
+    if (empty($element['#button'])) {
+      return;
+    }
+    // Don't alter hidden file upload input.
+    if (!Element::isVisibleElement($element['upload'])) {
+      return;
+    }
+    // Create an unique id for the file upload input and label.
+    $button_id = Html::getUniqueId($variables['element']['upload']['#id'] . '-button');
+    // Create a label that is styled like an action button.
+    $label = [
+          '#type' => 'html_tag',
+          '#tag' => 'label',
+          '#value' => $element['#button__title'] ?? (empty($element['#multiple']) ? $this->t('Choose file') : $this->t('Choose files')),
+          '#attributes' => $element['#button__attributes'] ?? [],
+    ];
+    // Add 'for' attribute.
+    $label['#attributes']['for'] = $button_id;
+    // Add default button classes.
+    if (empty($label['#attributes']['class'])) {
+      $label['#attributes']['class'][] = 'button';
+      $label['#attributes']['class'][] = 'button-action';
+    }
+    // Add .webform-file-button.
+    $label['#attributes']['class'][] = 'webform-file-button';
+    // Make sure the label is first.
+    $element = [
+          'label' => $label,
+    ] + $element;
+    // Set the custom button ID for file upload input.
+    $element['upload']['#attributes']['id'] = $button_id;
+    // Hide the file upload.
+    $element['upload']['#attributes']['class'][] = 'webform-file-button-input';
+    // Attach library.
+    $element['upload']['#attached']['library'][] = 'webform/webform.element.file.button';
+    // Remove #errors to prevent 'aria-invalid' from being added to the
+    // remove file checkbox which is valid.
+    // @see \Drupal\Core\Render\Element\RenderElementBase::setAttributes
+    foreach (Element::children($element) as $child_key) {
+      if (NestedArray::getValue($element, [
+            $child_key,
+            'selected',
+            '#type',
+      ]) === 'checkbox') {
+        unset($element[$child_key]['selected']['#errors']);
+      }
+    }
+  }
+
+  /**
+   * Implements hook_preprocess_file_upload_help() for file upload help text templates.
+   *
+   * @see \Drupal\webform\Plugin\WebformElement\WebformManagedFileBase::prepare
+   */
+  #[Hook('preprocess_file_upload_help')]
+  public function preprocessFileUploadHelp(&$variables) {
+    // Retrieve upload validators from file upload element variables.
+    $upload_validators = $variables['upload_validators'];
+    // Exit early if no 'webform_file_limit' is set.
+    if (!isset($upload_validators['webform_file_limit'])) {
+      return;
+    }
+    // Get the webform's overall file size limit and the individual file element's limit.
+    $webform_file_limit = $upload_validators['webform_file_limit'];
+    $element_file_limit = isset($upload_validators['FileSizeLimit']) ? $upload_validators['FileSizeLimit']['fileLimit'] : 0;
+    // Prepare translated arguments for the file size descriptions.
+    $t_args = [
+          // Overall size limit for all files.
+          '@webform_file_limit' => ByteSizeMarkup::create($webform_file_limit),
+          // Size limit for individual files.
+          '@element_file_limit' => ByteSizeMarkup::create($element_file_limit),
+    ];
+    // Determine the appropriate description based on file size limits.
+    $file_limit_description = $element_file_limit < $webform_file_limit ? $this->t('@element_file_limit limit per file. The accumulated size of all files in this form cannot exceed @webform_file_limit.', $t_args) : $this->t('The accumulated size of all files in this form cannot exceed @webform_file_limit.', $t_args);
+    // Remove any existing descriptions that match the outdated '@size limit.' message.
+    $descriptions = array_filter($variables['descriptions'], fn($description) => $description->getUntranslatedString() !== '@size limit.');
+    // Add the updated file limit description to the list of descriptions.
+    $variables['descriptions'] = [
+          ...$descriptions,
+          $file_limit_description,
+    ];
+  }
+
+  /**
+   * Implements hook_preprocess_file_link() for file link templates.
+   *
+   * @see webform_file_access
+   */
+  #[Hook('preprocess_file_link')]
+  public static function preprocessFileLink(&$variables) {
+    /** @var \Drupal\file\FileInterface $file */
+    $file = $variables['file'];
+    $file = $file instanceof File ? $file : File::load($file->fid);
+    // Remove link to temporary anonymous private file uploads.
+    if ($file->isTemporary() && $file->getOwner() && $file->getOwner()->isAnonymous() && str_starts_with($file->getFileUri(), 'private://webform/')) {
+      $variables['link'] = $file->getFilename();
+    }
+    // Add file size variable to Claro theme.
+    if (empty($variables['file_size']) && $file->getSize() && \Drupal::service('webform.theme_manager')->isActiveTheme('claro')) {
+      $variables['file_size'] = ByteSizeMarkup::create($file->getSize(), \Drupal::languageManager()->getCurrentLanguage()->getId());
+    }
+  }
+
+  /**
+   * Implements hook_preprocess_image() for image templates.
+   *
+   * Make sure the image src for the 'webform_image_file' src is an absolute URL.
+   */
+  #[Hook('preprocess_image')]
+  public static function preprocessImage(&$variables) {
+    global $base_url;
+    if (isset($variables['attributes']['class']) && in_array('webform-image-file', (array) $variables['attributes']['class']) && !preg_match('#^https?://#', $variables['attributes']['src'])) {
+      $variables['attributes']['src'] = $base_url . preg_replace('/^' . preg_quote(base_path(), '/') . '/', '/', $variables['attributes']['src']);
+    }
+  }
+
+}
diff --git a/src/Hook/WebformTranslationHooks1.php b/src/Hook/WebformTranslationHooks1.php
new file mode 100644
index 0000000..470b5e4
--- /dev/null
+++ b/src/Hook/WebformTranslationHooks1.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Drupal\webform\Hook;
+
+use Drupal\webform\Utility\WebformYaml;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform.
+ */
+class WebformTranslationHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for language content settings form.
+   */
+  #[Hook('form_language_content_settings_form_alter')]
+  public static function formLanguageContentSettingsFormAlter(array &$form, FormStateInterface $form_state) {
+    // Completely remove webform_submission from Content language admin
+    // settings form, only when there are no previously saved
+    // 'language.content_settings.webform_submission.*' config files.
+    $has_saved_webform_submissions = count(\Drupal::configFactory()->listAll('language.content_settings.webform_submission.')) ? TRUE : FALSE;
+    if (!$has_saved_webform_submissions) {
+      unset($form['#label']['webform_submission']);
+      unset($form['entity_types']['#options']['webform_submission']);
+      unset($form['settings']['webform_submission']);
+    }
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for locale translate edit form.
+   */
+  #[Hook('form_locale_translate_edit_form_alter')]
+  public function formLocaleTranslateEditFormAlter(&$form, FormStateInterface $form_state) {
+    // Don't allow YAML to be validated using locale string translation.
+    foreach (Element::children($form['strings']) as $key) {
+      $element =& $form['strings'][$key];
+      if ($element['original'] && !empty($element['original']['#plain_text']) && preg_match("/'#[^']+':/", $element['original']['#plain_text']) && WebformYaml::isValid($element['original']['#plain_text'])) {
+        $element['original'] = [
+              '#theme' => 'webform_codemirror',
+              '#code' => $element['original']['#plain_text'],
+              '#type' => 'yaml',
+        ];
+        $element['translations'] = [
+              '#type' => 'webform_message',
+              '#message_type' => 'warning',
+              '#message_message' => $this->t("Webforms can only be translated via the Webform's (Configuration) Translate tab."),
+        ];
+      }
+    }
+  }
+
+  /* ************************************************************************** */
+  // Configuration translation.
+  /* ************************************************************************** */
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for config translation add form.
+   */
+  #[Hook('form_config_translation_add_form_alter')]
+  public static function formConfigTranslationAddFormAlter(&$form, FormStateInterface $form_state, $is_new = TRUE) {
+    /** @var \Drupal\webform\WebformTranslationConfigManagerInterface $translation_config_manager */
+    $translation_config_manager = \Drupal::service('webform.translation_config_manager');
+    $translation_config_manager->alterForm($form, $form_state);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for config translation edit form.
+   */
+  #[Hook('form_config_translation_edit_form_alter')]
+  public static function formConfigTranslationEditFormAlter(&$form, FormStateInterface $form_state) {
+    /** @var \Drupal\webform\WebformTranslationConfigManagerInterface $translation_config_manager */
+    $translation_config_manager = \Drupal::service('webform.translation_config_manager');
+    $translation_config_manager->alterForm($form, $form_state);
+  }
+
+}
diff --git a/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php b/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php
index caf84b7..17750a4 100644
--- a/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php
+++ b/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Plugin\Field\FieldWidget;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -146,7 +147,16 @@ trait WebformEntityReferenceWidgetTrait {
       '#default_value' => $items[$delta]->status,
     ];
 
-    $element['settings']['scheduled'] = [
+    $element['settings']['scheduled'] = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => [
+      '#type' => 'fieldset',
+      '#title' => $element['target_id']['#title'],
+      '#title_display' => 'invisible',
+      '#states' => [
+        'visible' => [
+          'input[name="' . $field_input_name . '[settings][status]"]' => ['value' => WebformInterface::STATUS_SCHEDULED],
+        ],
+      ],
+    ], fn() => [
       '#type' => 'fieldgroup',
       '#title' => $element['target_id']['#title'],
       '#title_display' => 'invisible',
@@ -155,7 +165,7 @@ trait WebformEntityReferenceWidgetTrait {
           'input[name="' . $field_input_name . '[settings][status]"]' => ['value' => WebformInterface::STATUS_SCHEDULED],
         ],
       ],
-    ];
+    ]);
     $element['settings']['scheduled']['open'] = [
       '#type' => 'datetime',
       '#title' => $this->t('Open'),
diff --git a/src/Plugin/WebformElement/ProcessedText.php b/src/Plugin/WebformElement/ProcessedText.php
index 16b301b..5ae004b 100644
--- a/src/Plugin/WebformElement/ProcessedText.php
+++ b/src/Plugin/WebformElement/ProcessedText.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\webform\Plugin\WebformElement;
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\filter\FilterFormatRepositoryInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Mail\MailFormatHelper;
 use Drupal\webform\WebformSubmissionInterface;
@@ -45,9 +47,9 @@ class ProcessedText extends WebformMarkupBase {
       // Works around filter_default_format() throwing fatal error when
       // user is not allowed to use any filter formats.
       // @see filter_default_format.
-      $formats = filter_formats($this->currentUser);
+      $formats = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getFormatsForAccount($this->currentUser), fn() => filter_formats($this->currentUser));
       $format = reset($formats);
-      $default_format = $format ? $format->id() : filter_fallback_format();
+      $default_format = $format ? $format->id() : DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getFallbackFormatId(), fn() => filter_fallback_format());
     }
     else {
       $default_format = '';
diff --git a/src/Plugin/WebformElement/TextFormat.php b/src/Plugin/WebformElement/TextFormat.php
index a1f9281..297c273 100644
--- a/src/Plugin/WebformElement/TextFormat.php
+++ b/src/Plugin/WebformElement/TextFormat.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\webform\Plugin\WebformElement;
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\filter\FilterFormatRepositoryInterface;
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Mail\MailFormatHelper;
@@ -72,7 +74,7 @@ class TextFormat extends WebformElementBase {
     // @see \Drupal\filter\Element\TextFormat::processFormat
     if (isset($element['#allowed_formats'])) {
       $formats = array_intersect_key(
-        filter_formats($this->currentUser),
+        DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getFormatsForAccount($this->currentUser), fn() => filter_formats($this->currentUser)),
         array_flip($element['#allowed_formats'])
       );
       if (empty($formats)) {
@@ -248,11 +250,11 @@ class TextFormat extends WebformElementBase {
         return $value;
 
       case 'value':
-        $default_format = filter_default_format(User::load($webform_submission->getOwnerId()));
-        return check_markup($value, $default_format);
+        $default_format = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getDefaultFormat(User::load($webform_submission->getOwnerId()))->id(), fn() => filter_default_format(User::load($webform_submission->getOwnerId())));
+        return ['#type' => 'processed_text', '#text' => $value, '#format' => $default_format];
 
       default:
-        return check_markup($value, $format);
+        return ['#type' => 'processed_text', '#text' => $value, '#format' => $format];
     }
   }
 
diff --git a/src/Plugin/WebformElement/WebformCompositeBase.php b/src/Plugin/WebformElement/WebformCompositeBase.php
index f8dbb82..da606ab 100644
--- a/src/Plugin/WebformElement/WebformCompositeBase.php
+++ b/src/Plugin/WebformElement/WebformCompositeBase.php
@@ -5,7 +5,6 @@ namespace Drupal\webform\Plugin\WebformElement;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\OptGroup;
 use Drupal\Core\Render\Element as RenderElement;
-use Drupal\Core\Render\Element;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\WebformOptions;
@@ -204,7 +203,7 @@ abstract class WebformCompositeBase extends WebformElementBase implements Webfor
       // @see \Drupal\webform\Element\WebformMultiple::processWebformMultiple
       $element['#element'] = [];
       $composite_elements = $this->getCompositeElements();
-      foreach (Element::children($composite_elements) as $composite_key) {
+      foreach (RenderElement::children($composite_elements) as $composite_key) {
         $composite_element = $composite_elements[$composite_key];
         // Transfer '#{composite_key}_{property}' from main element to composite
         // element.
@@ -298,7 +297,7 @@ abstract class WebformCompositeBase extends WebformElementBase implements Webfor
     $selectors = [];
     $composite_elements = $this->getInitializedCompositeElement($element);
     foreach ($composite_elements as $composite_key => $composite_element) {
-      if (Element::isVisibleElement($composite_elements) && isset($composite_element['#type'])) {
+      if (RenderElement::isVisibleElement($composite_elements) && isset($composite_element['#type'])) {
         $element_plugin = $this->elementManager->getElementInstance($composite_element);
         $composite_element['#webform_key'] = "{$name}[{$composite_key}]";
         $selectors += OptGroup::flattenOptions($element_plugin->getElementSelectorOptions($composite_element));
@@ -320,7 +319,7 @@ abstract class WebformCompositeBase extends WebformElementBase implements Webfor
     $source_values = [];
     $composite_elements = $this->getInitializedCompositeElement($element);
     foreach ($composite_elements as $composite_key => $composite_element) {
-      if (Element::isVisibleElement($composite_elements) && isset($composite_element['#type'])) {
+      if (RenderElement::isVisibleElement($composite_elements) && isset($composite_element['#type'])) {
         $element_plugin = $this->elementManager->getElementInstance($composite_element);
         $composite_element['#webform_key'] = "{$name}[{$composite_key}]";
         $source_values += $element_plugin->getElementSelectorSourceValues($composite_element);
@@ -440,7 +439,7 @@ abstract class WebformCompositeBase extends WebformElementBase implements Webfor
     // Get header.
     $header = [];
     foreach (RenderElement::children($composite_elements) as $composite_key) {
-      if (!Element::isVisibleElement($composite_elements[$composite_key])) {
+      if (!RenderElement::isVisibleElement($composite_elements[$composite_key])) {
         unset($composite_elements[$composite_key]);
         continue;
       }
@@ -764,7 +763,7 @@ abstract class WebformCompositeBase extends WebformElementBase implements Webfor
     $header = [];
     foreach (RenderElement::children($composite_elements) as $composite_key) {
       $composite_element = $composite_elements[$composite_key];
-      if (!Element::isVisibleElement($composite_element)) {
+      if (!RenderElement::isVisibleElement($composite_element)) {
         continue;
       }
 
@@ -795,7 +794,7 @@ abstract class WebformCompositeBase extends WebformElementBase implements Webfor
     $composite_elements = $this->getInitializedCompositeElement($element);
     foreach (RenderElement::children($composite_elements) as $composite_key) {
       $composite_element = $composite_elements[$composite_key];
-      if (!Element::isVisibleElement($composite_element)) {
+      if (!RenderElement::isVisibleElement($composite_element)) {
         continue;
       }
 
diff --git a/src/Plugin/WebformElement/WebformImageFile.php b/src/Plugin/WebformElement/WebformImageFile.php
index 9c07f95..3dc7a31 100644
--- a/src/Plugin/WebformElement/WebformImageFile.php
+++ b/src/Plugin/WebformElement/WebformImageFile.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Plugin\WebformElement;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\webform\WebformSubmissionInterface;
 
@@ -143,7 +144,7 @@ class WebformImageFile extends WebformManagedFileBase {
     if ($this->moduleHandler->moduleExists('image')) {
       $form['image']['attachment_image_style'] = [
         '#type' => 'select',
-        '#options' => image_style_options(),
+        '#options' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\image\ImageDerivativeUtilities')->styleOptions(), fn() => image_style_options()),
         '#title' => $this->t('Attachment image style'),
         '#description' => $this->t('Use this to send image with image style when sending files as attachment in an email handler.'),
       ];
diff --git a/src/Plugin/WebformElement/WebformManagedFileBase.php b/src/Plugin/WebformElement/WebformManagedFileBase.php
index 19650a9..3332c3b 100644
--- a/src/Plugin/WebformElement/WebformManagedFileBase.php
+++ b/src/Plugin/WebformElement/WebformManagedFileBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Plugin\WebformElement;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Utility\Bytes;
 use Drupal\Component\Utility\Environment;
 use Drupal\Component\Utility\Html;
@@ -1380,7 +1381,7 @@ abstract class WebformManagedFileBase extends WebformElementBase implements Webf
     $access = static::accessFile($file);
     if ($access === TRUE) {
       // Return file content headers.
-      $headers = file_get_content_headers($file);
+      $headers = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $file->getDownloadHeaders(), fn() => file_get_content_headers($file));
 
       $filename = \basename($uri);
       // Fallback name in case file name contains none ASCII characters.
diff --git a/src/WebformEntityStorage.php b/src/WebformEntityStorage.php
index ad5bce9..5159526 100644
--- a/src/WebformEntityStorage.php
+++ b/src/WebformEntityStorage.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityStorage;
 use Drupal\Core\Entity\EntityInterface;
@@ -98,7 +99,7 @@ class WebformEntityStorage extends ConfigEntityStorage implements WebformEntityS
    * {@inheritdoc}
    */
   protected function doPostSave(EntityInterface $entity, $update) {
-    if ($update && $entity->getAccessRules() !== $entity->original->getAccessRules()) {
+    if ($update && $entity->getAccessRules() !== DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->getOriginal(), fn() => $entity->original)->getAccessRules()) {
       // Invalidate webform_submission listing cache tags because due to the
       // change in access rules of this webform, some listings might have
       // changed for users.
diff --git a/src/WebformLibrariesManager.php b/src/WebformLibrariesManager.php
index 7484fc5..1d05b2c 100644
--- a/src/WebformLibrariesManager.php
+++ b/src/WebformLibrariesManager.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\webform;
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Extension\Requirement\RequirementSeverity;
 use Drupal\Core\Asset\LibraryDiscoveryInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
@@ -97,7 +99,7 @@ class WebformLibrariesManager implements WebformLibrariesManagerInterface {
     }
 
     // Track stats.
-    $severity = REQUIREMENT_OK;
+    $severity = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::OK, fn() => REQUIREMENT_OK);
     $stats = [
       '@total' => count($libraries),
       '@installed' => 0,
@@ -150,7 +152,7 @@ class WebformLibrariesManager implements WebformLibrariesManagerInterface {
         $stats['@missing']++;
         $title = $this->t('<span class="color-warning"><strong>@title @version</strong> (CDN).</span>', $t_args);
         $description = $this->t('The <a href=":homepage_href">@title</a> library is not installed in <b>@path</b>.', $t_args);
-        $severity = REQUIREMENT_WARNING;
+        $severity = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING);
       }
       else {
         // CDN.
@@ -190,7 +192,7 @@ class WebformLibrariesManager implements WebformLibrariesManagerInterface {
 
     // Description.
     $description = [];
-    if (!$cli && $severity === REQUIREMENT_WARNING) {
+    if (!$cli && $severity === DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING)) {
       $t_args = [':href' => ($this->moduleHandler->moduleExists('help')) ? Url::fromRoute('help.page', ['name' => 'webform'], ['fragment' => 'libraries'])->toString() : 'https://www.drupal.org/docs/8/modules/webform/webform-libraries'];
       $description['download'] = [
         '#markup' => '<hr/>' .
diff --git a/src/WebformSubmissionStorage.php b/src/WebformSubmissionStorage.php
index 4fafc86..5bca523 100644
--- a/src/WebformSubmissionStorage.php
+++ b/src/WebformSubmissionStorage.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Core\Database\Database;
 use Drupal\Core\Entity\EntityInterface;
@@ -1581,13 +1582,19 @@ class WebformSubmissionStorage extends SqlContentEntityStorage implements Webfor
 
     // Cleanup sids because drafts could have been purged or the webform
     // submission could have been deleted.
-    $_SESSION['webform_submissions'] = $this->getQuery()
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::request()->getSession()->set('webform_submissions', $this->getQuery()
       // Disable access check because user having 'sid' in their $_SESSION already
       // implies they have access to it.
       ->accessCheck(FALSE)
       ->condition('sid', $_SESSION['webform_submissions'], 'IN')
       ->sort('sid')
-      ->execute();
+      ->execute()), fn() => $_SESSION['webform_submissions'] = $this->getQuery()
+      // Disable access check because user having 'sid' in their $_SESSION already
+      // implies they have access to it.
+      ->accessCheck(FALSE)
+      ->condition('sid', $_SESSION['webform_submissions'], 'IN')
+      ->sort('sid')
+      ->execute());
     if (empty($_SESSION['webform_submissions'])) {
       unset($_SESSION['webform_submissions']);
       return NULL;
diff --git a/tests/modules/webform_test/src/Hook/WebformTestHooks1.php b/tests/modules/webform_test/src/Hook/WebformTestHooks1.php
new file mode 100644
index 0000000..84a07a9
--- /dev/null
+++ b/tests/modules/webform_test/src/Hook/WebformTestHooks1.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\webform_test\Hook;
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform_test\Hook\WebformTestHooks;
+use Drupal\Core\Url;
+use Drupal\webform\Utility\WebformElementHelper;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+/**
+ * Hook implementations for webform_test.
+ */
+class WebformTestHooks1
+{
+    use StringTranslationTrait;
+    /* ************************************************************************** */
+    // Generate elements.
+    /* ************************************************************************** */
+    /**
+     * Implements hook_preprocess_HOOK().
+     */
+    #[Hook('preprocess_page')]
+    public function preprocessPage(&$variables)
+    {
+        // phpcs:ignore
+        if (!isset($_GET['generate']) && in_array(\Drupal::routeMatch()->getRouteName(), [
+            'entity.webform.canonical',
+            'entity.webform.edit_form',
+            'entity.webform.source_form',
+        ]) && _webform_test_load_include(\Drupal::routeMatch()->getRawParameter('webform'))) {
+            $t_args = [
+                ':href' => \Drupal\Core\Url::fromRouteMatch(\Drupal::routeMatch())->toString() . '?generate',
+            ];
+            \Drupal::messenger()->addWarning($this->t('The below webform\'s elements are automatically generated and exported. You can regenerate the below elements by appending <a href=":href">?generate</a> to this page\'s URL.', $t_args));
+        }
+    }
+    /**
+     * Implements hook_preprocess_webform_confirmation().
+     */
+    #[Hook('preprocess_webform_confirmation')]
+    public static function preprocessWebformConfirmation(array &$variables)
+    {
+        /** @var \Drupal\webform\WebformInterface $webform */
+        $webform = $variables['webform'];
+        switch ($webform->id()) {
+            case 'test_states_to_text':
+                /** @var \Drupal\webform\WebformEntityConditionsManagerInterface $conditions_manager */
+                $conditions_manager = \Drupal::service('webform.conditions_manager');
+                $build = [
+                ];
+                $elements = $webform->getElementsInitializedAndFlattened();
+                foreach ($elements as $element_key => $element) {
+                    if (isset($element['#states'])) {
+                        $build[$element_key] = [
+                            '#type' => 'item',
+                            '#title' => $element['#admin_title'],
+                            'text' => $conditions_manager->toText($webform, $element['#states']),
+                        ];
+                    }
+                }
+                $variables['message'] = $build;
+                return;
+        }
+    }
+}
diff --git a/tests/modules/webform_test/webform_test.module b/tests/modules/webform_test/webform_test.module
index 1d3ee58..2e9e18d 100644
--- a/tests/modules/webform_test/webform_test.module
+++ b/tests/modules/webform_test/webform_test.module
@@ -5,9 +5,9 @@
  * Support module for webform related testing.
  */
 
+use Drupal\webform_test\Hook\WebformTestHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_test\Hook\WebformTestHooks;
-use Drupal\Core\Url;
 use Drupal\webform\Utility\WebformElementHelper;
 
 /**
@@ -36,43 +36,17 @@ function webform_test_ignored_element_callback($element = NULL) {
 /**
  * Implements hook_preprocess_HOOK().
  */
+#[LegacyHook]
 function webform_test_preprocess_page(&$variables) {
-  // phpcs:ignore
-  if (!isset($_GET['generate'])
-    && in_array(\Drupal::routeMatch()->getRouteName(), ['entity.webform.canonical', 'entity.webform.edit_form', 'entity.webform.source_form'])
-    && _webform_test_load_include(\Drupal::routeMatch()->getRawParameter('webform'))
-  ) {
-    $t_args = [':href' => Url::fromRouteMatch(\Drupal::routeMatch())->toString() . '?generate'];
-    \Drupal::messenger()->addWarning(t('The below webform\'s elements are automatically generated and exported. You can regenerate the below elements by appending <a href=":href">?generate</a> to this page\'s URL.', $t_args));
-  }
+  \Drupal::service(WebformTestHooks1::class)->preprocessPage($variables);
 }
 
 /**
  * Implements hook_preprocess_webform_confirmation().
  */
+#[LegacyHook]
 function webform_test_preprocess_webform_confirmation(array &$variables) {
-  /** @var \Drupal\webform\WebformInterface $webform */
-  $webform = $variables['webform'];
-  switch ($webform->id()) {
-    case 'test_states_to_text':
-      /** @var \Drupal\webform\WebformEntityConditionsManagerInterface $conditions_manager */
-      $conditions_manager = \Drupal::service('webform.conditions_manager');
-
-      $build = [];
-      $elements = $webform->getElementsInitializedAndFlattened();
-      foreach ($elements as $element_key => $element) {
-        if (isset($element['#states'])) {
-          $build[$element_key] = [
-            '#type' => 'item',
-            '#title' => $element['#admin_title'],
-            'text' => $conditions_manager->toText($webform, $element['#states']),
-          ];
-        }
-      }
-      $variables['message'] = $build;
-      return;
-
-  }
+  \Drupal::service(WebformTestHooks1::class)->preprocessWebformConfirmation($variables);
 }
 
 /**
diff --git a/tests/modules/webform_test/webform_test.services.yml b/tests/modules/webform_test/webform_test.services.yml
index 72687c9..e1cf07c 100644
--- a/tests/modules/webform_test/webform_test.services.yml
+++ b/tests/modules/webform_test/webform_test.services.yml
@@ -3,3 +3,7 @@ services:
   Drupal\webform_test\Hook\WebformTestHooks:
     class: Drupal\webform_test\Hook\WebformTestHooks
     autowire: true
+
+  Drupal\webform_test\Hook\WebformTestHooks1:
+    class: Drupal\webform_test\Hook\WebformTestHooks1
+    autowire: true
diff --git a/tests/modules/webform_test_alter_hooks/src/Hook/WebformTestAlterHooksHooks1.php b/tests/modules/webform_test_alter_hooks/src/Hook/WebformTestAlterHooksHooks1.php
new file mode 100644
index 0000000..8a6a0bb
--- /dev/null
+++ b/tests/modules/webform_test_alter_hooks/src/Hook/WebformTestAlterHooksHooks1.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Drupal\webform_test_alter_hooks\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_test_alter_hooks.
+ */
+class WebformTestAlterHooksHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_form_webform_submission_BASE_FORM_ID_form_alter().
+   *
+   * @see webform_form_alter()
+   * @see \Drupal\webform\WebformSubmissionForm::getBaseFormId
+   * @see \Drupal\Core\Form\FormBuilder::prepareForm
+   */
+  #[Hook('form_webform_submission_contact_form_alter')]
+  public function formWebformSubmissionContactFormAlter(array $form, FormStateInterface $form_state, $form_id) {
+    \Drupal::messenger()->addStatus($this->t("@hook: '@form_id' executed.", [
+          '@hook' => 'hook_form_webform_submission_BASE_FORM_ID_form_alter()',
+          '@form_id' => $form_id,
+    ]), TRUE);
+  }
+
+  /**
+   * Implements hook_form_webform_submission_FORM_ID_form_alter().
+   *
+   * @see webform_form_alter()
+   * @see \Drupal\webform\WebformSubmissionForm::getFormId
+   * @see \Drupal\Core\Form\FormBuilder::prepareForm
+   */
+  #[Hook('form_webform_submission_contact_add_form_alter')]
+  public function formWebformSubmissionContactAddFormAlter(array $form, FormStateInterface $form_state, $form_id) {
+    \Drupal::messenger()->addStatus($this->t("@hook: '@form_id' executed.", [
+          '@hook' => 'hook_form_webform_submission_FORM_ID_form_alter()',
+          '@form_id' => $form_id,
+    ]), TRUE);
+  }
+
+  /**
+   * Implements hook_form_webform_submission_FORM_ID_form_alter().
+   *
+   * @see webform_form_alter()
+   * @see \Drupal\webform\WebformSubmissionForm::getFormId
+   * @see \Drupal\Core\Form\FormBuilder::prepareForm
+   */
+  #[Hook('form_webform_submission_contact_node_1_add_form_alter')]
+  public function formWebformSubmissionContactNode1AddFormAlter(array $form, FormStateInterface $form_state, $form_id) {
+    \Drupal::messenger()->addStatus($this->t("@hook: '@form_id' executed.", [
+          '@hook' => 'hook_form_webform_submission_FORM_ID_form_alter()',
+          '@form_id' => $form_id,
+    ]), TRUE);
+  }
+
+  /**
+   * Implements hook_webform_element_ELEMENT_TYPE_alter().
+   *
+   * @see webform.api.php
+   * @see \Drupal\webform\WebformSubmissionForm::prepareElements
+   */
+  #[Hook('webform_element_email_alter')]
+  public function webformElementEmailAlter(array &$element, FormStateInterface $form_state, array $context) {
+    \Drupal::messenger()->addStatus($this->t("@hook: '@webform_key' executed.", [
+          '@hook' => 'hook_webform_element_ELEMENT_TYPE_alter()',
+          '@webform_key' => $element['#webform_key'],
+    ]), TRUE);
+  }
+
+}
diff --git a/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.module b/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.module
index 7302a87..1cf3370 100644
--- a/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.module
+++ b/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.module
@@ -5,6 +5,7 @@
  * Support module for webform that tests form and element alter hooks.
  */
 
+use Drupal\webform_test_alter_hooks\Hook\WebformTestAlterHooksHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_test_alter_hooks\Hook\WebformTestAlterHooksHooks;
 use Drupal\Core\Form\FormStateInterface;
@@ -36,8 +37,9 @@ function webform_test_alter_hooks_form_webform_submission_form_alter(array $form
  * @see \Drupal\webform\WebformSubmissionForm::getBaseFormId
  * @see \Drupal\Core\Form\FormBuilder::prepareForm
  */
+#[LegacyHook]
 function webform_test_alter_hooks_form_webform_submission_contact_form_alter(array $form, FormStateInterface $form_state, $form_id) {
-  \Drupal::messenger()->addStatus(t("@hook: '@form_id' executed.", ['@hook' => 'hook_form_webform_submission_BASE_FORM_ID_form_alter()', '@form_id' => $form_id]), TRUE);
+  \Drupal::service(WebformTestAlterHooksHooks1::class)->formWebformSubmissionContactFormAlter($form, $form_state, $form_id);
 }
 
 /**
@@ -47,8 +49,9 @@ function webform_test_alter_hooks_form_webform_submission_contact_form_alter(arr
  * @see \Drupal\webform\WebformSubmissionForm::getFormId
  * @see \Drupal\Core\Form\FormBuilder::prepareForm
  */
+#[LegacyHook]
 function webform_test_alter_hooks_form_webform_submission_contact_add_form_alter(array $form, FormStateInterface $form_state, $form_id) {
-  \Drupal::messenger()->addStatus(t("@hook: '@form_id' executed.", ['@hook' => 'hook_form_webform_submission_FORM_ID_form_alter()', '@form_id' => $form_id]), TRUE);
+  \Drupal::service(WebformTestAlterHooksHooks1::class)->formWebformSubmissionContactAddFormAlter($form, $form_state, $form_id);
 }
 
 /**
@@ -58,8 +61,9 @@ function webform_test_alter_hooks_form_webform_submission_contact_add_form_alter
  * @see \Drupal\webform\WebformSubmissionForm::getFormId
  * @see \Drupal\Core\Form\FormBuilder::prepareForm
  */
+#[LegacyHook]
 function webform_test_alter_hooks_form_webform_submission_contact_node_1_add_form_alter(array $form, FormStateInterface $form_state, $form_id) {
-  \Drupal::messenger()->addStatus(t("@hook: '@form_id' executed.", ['@hook' => 'hook_form_webform_submission_FORM_ID_form_alter()', '@form_id' => $form_id]), TRUE);
+  \Drupal::service(WebformTestAlterHooksHooks1::class)->formWebformSubmissionContactNode1AddFormAlter($form, $form_state, $form_id);
 }
 
 /**
@@ -94,6 +98,7 @@ function webform_test_alter_hooks_webform_element_alter(array &$element, FormSta
  * @see webform.api.php
  * @see \Drupal\webform\WebformSubmissionForm::prepareElements
  */
+#[LegacyHook]
 function webform_test_alter_hooks_webform_element_email_alter(array &$element, FormStateInterface $form_state, array $context) {
-  \Drupal::messenger()->addStatus(t("@hook: '@webform_key' executed.", ['@hook' => 'hook_webform_element_ELEMENT_TYPE_alter()', '@webform_key' => $element['#webform_key']]), TRUE);
+  \Drupal::service(WebformTestAlterHooksHooks1::class)->webformElementEmailAlter($element, $form_state, $context);
 }
diff --git a/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.services.yml b/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.services.yml
index 45ece86..276e167 100644
--- a/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.services.yml
+++ b/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.services.yml
@@ -3,3 +3,7 @@ services:
   Drupal\webform_test_alter_hooks\Hook\WebformTestAlterHooksHooks:
     class: Drupal\webform_test_alter_hooks\Hook\WebformTestAlterHooksHooks
     autowire: true
+
+  Drupal\webform_test_alter_hooks\Hook\WebformTestAlterHooksHooks1:
+    class: Drupal\webform_test_alter_hooks\Hook\WebformTestAlterHooksHooks1
+    autowire: true
diff --git a/tests/modules/webform_test_handler_invoke_alter/src/Hook/WebformTestHandlerInvokeAlterHooks1.php b/tests/modules/webform_test_handler_invoke_alter/src/Hook/WebformTestHandlerInvokeAlterHooks1.php
new file mode 100644
index 0000000..135394a
--- /dev/null
+++ b/tests/modules/webform_test_handler_invoke_alter/src/Hook/WebformTestHandlerInvokeAlterHooks1.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\webform_test_handler_invoke_alter\Hook;
+
+use Drupal\webform\Plugin\WebformHandlerInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_test_handler_invoke_alter.
+ */
+class WebformTestHandlerInvokeAlterHooks1 {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_webform_handler_invoke_METHOD_NAME_alter().
+   */
+  #[Hook('webform_handler_invoke_pre_create_alter')]
+  public function webformHandlerInvokePreCreateAlter(WebformHandlerInterface $handler, array $args) {
+    $t_args = [
+          '@webform_id' => $handler->getWebform()->id(),
+          '@handler_id' => $handler->getHandlerId(),
+    ];
+    \Drupal::messenger()->addStatus($this->t('Invoking hook_webform_handler_invoke_pre_create_alter() for "@webform_id:@handler_id"', $t_args), TRUE);
+  }
+
+}
diff --git a/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.module b/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.module
index 3d6a34b..102cb44 100644
--- a/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.module
+++ b/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.module
@@ -5,6 +5,7 @@
  * Support module for webform that provides handler invoke alter tests.
  */
 
+use Drupal\webform_test_handler_invoke_alter\Hook\WebformTestHandlerInvokeAlterHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_test_handler_invoke_alter\Hook\WebformTestHandlerInvokeAlterHooks;
 use Drupal\webform\Plugin\WebformHandlerInterface;
@@ -20,10 +21,7 @@ function webform_test_handler_invoke_alter_webform_handler_invoke_alter(WebformH
 /**
  * Implements hook_webform_handler_invoke_METHOD_NAME_alter().
  */
+#[LegacyHook]
 function webform_test_handler_invoke_alter_webform_handler_invoke_pre_create_alter(WebformHandlerInterface $handler, array $args) {
-  $t_args = [
-    '@webform_id' => $handler->getWebform()->id(),
-    '@handler_id' => $handler->getHandlerId(),
-  ];
-  \Drupal::messenger()->addStatus(t('Invoking hook_webform_handler_invoke_pre_create_alter() for "@webform_id:@handler_id"', $t_args), TRUE);
+  \Drupal::service(WebformTestHandlerInvokeAlterHooks1::class)->webformHandlerInvokePreCreateAlter($handler, $args);
 }
diff --git a/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.services.yml b/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.services.yml
index 8ba5598..56db209 100644
--- a/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.services.yml
+++ b/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.services.yml
@@ -3,3 +3,7 @@ services:
   Drupal\webform_test_handler_invoke_alter\Hook\WebformTestHandlerInvokeAlterHooks:
     class: Drupal\webform_test_handler_invoke_alter\Hook\WebformTestHandlerInvokeAlterHooks
     autowire: true
+
+  Drupal\webform_test_handler_invoke_alter\Hook\WebformTestHandlerInvokeAlterHooks1:
+    class: Drupal\webform_test_handler_invoke_alter\Hook\WebformTestHandlerInvokeAlterHooks1
+    autowire: true
diff --git a/tests/modules/webform_test_markup/src/Hook/WebformTestMarkupHooks.php b/tests/modules/webform_test_markup/src/Hook/WebformTestMarkupHooks.php
new file mode 100644
index 0000000..cde2c7d
--- /dev/null
+++ b/tests/modules/webform_test_markup/src/Hook/WebformTestMarkupHooks.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Drupal\webform_test_markup\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_test_markup.
+ */
+class WebformTestMarkupHooks {
+  /**
+   * @file
+   * Support module for markup tests.
+   */
+
+  /**
+   * Implements hook_preprocess_webform_html_editor_markup() for Webform HTML Editor markup templates.
+   *
+   * @see webform.webform.test_element_markup.yml
+   */
+  #[Hook('preprocess_webform_html_editor_markup')]
+  public static function preprocessWebformHtmlEditorMarkup(array &$variables) {
+    if ((string) $variables['content']['#markup'] === '<p>Alter this markup.</p>') {
+      $variables['content']['#markup'] = '<p><em>Alter this markup.</em> <strong>This markup was altered.</strong></p>';
+    }
+  }
+
+}
diff --git a/tests/modules/webform_test_markup/webform_test_markup.module b/tests/modules/webform_test_markup/webform_test_markup.module
index 8e7aa7b..0636ea0 100644
--- a/tests/modules/webform_test_markup/webform_test_markup.module
+++ b/tests/modules/webform_test_markup/webform_test_markup.module
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform_test_markup\Hook\WebformTestMarkupHooks;
+
 /**
  * @file
  * Support module for markup tests.
@@ -10,8 +17,7 @@
  *
  * @see webform.webform.test_element_markup.yml
  */
+#[LegacyHook]
 function webform_test_markup_preprocess_webform_html_editor_markup(array &$variables) {
-  if ((string) $variables['content']['#markup'] === '<p>Alter this markup.</p>') {
-    $variables['content']['#markup'] = '<p><em>Alter this markup.</em> <strong>This markup was altered.</strong></p>';
-  }
+  \Drupal::service(WebformTestMarkupHooks::class)->preprocessWebformHtmlEditorMarkup($variables);
 }
diff --git a/tests/modules/webform_test_markup/webform_test_markup.services.yml b/tests/modules/webform_test_markup/webform_test_markup.services.yml
new file mode 100644
index 0000000..7ebca3c
--- /dev/null
+++ b/tests/modules/webform_test_markup/webform_test_markup.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\webform_test_markup\Hook\WebformTestMarkupHooks:
+    class: Drupal\webform_test_markup\Hook\WebformTestMarkupHooks
+    autowire: true
diff --git a/tests/modules/webform_test_options/src/Hook/WebformTestOptionsHooks1.php b/tests/modules/webform_test_options/src/Hook/WebformTestOptionsHooks1.php
new file mode 100644
index 0000000..1cc8f73
--- /dev/null
+++ b/tests/modules/webform_test_options/src/Hook/WebformTestOptionsHooks1.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Drupal\webform_test_options\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for webform_test_options.
+ */
+class WebformTestOptionsHooks1 {
+  use StringTranslationTrait;
+  /**
+   * @file
+   * Support module for webform that provides form alter hook for wizard cause tests.
+   */
+
+  /**
+   * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for webform options test.
+   */
+  #[Hook('webform_options_test_alter')]
+  public function webformOptionsTestAlter(array &$options, array &$element) {
+    $options += [
+          'four' => $this->t('Four'),
+          'five' => $this->t('Five'),
+          'six' => $this->t('Six'),
+    ];
+  }
+
+}
diff --git a/tests/modules/webform_test_options/webform_test_options.module b/tests/modules/webform_test_options/webform_test_options.module
index f203452..d2f6c13 100644
--- a/tests/modules/webform_test_options/webform_test_options.module
+++ b/tests/modules/webform_test_options/webform_test_options.module
@@ -5,6 +5,7 @@
  * Test module for webform options.
  */
 
+use Drupal\webform_test_options\Hook\WebformTestOptionsHooks1;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\webform_test_options\Hook\WebformTestOptionsHooks;
 
@@ -16,12 +17,9 @@ use Drupal\webform_test_options\Hook\WebformTestOptionsHooks;
 /**
  * Implements hook_webform_options_WEBFORM_OPTIONS_ID_alter() for webform options test.
  */
+#[LegacyHook]
 function webform_test_options_webform_options_test_alter(array &$options, array &$element) {
-  $options += [
-    'four' => t('Four'),
-    'five' => t('Five'),
-    'six' => t('Six'),
-  ];
+  \Drupal::service(WebformTestOptionsHooks1::class)->webformOptionsTestAlter($options, $element);
 }
 
 /**
diff --git a/tests/modules/webform_test_options/webform_test_options.services.yml b/tests/modules/webform_test_options/webform_test_options.services.yml
index b6eb06e..8d75116 100644
--- a/tests/modules/webform_test_options/webform_test_options.services.yml
+++ b/tests/modules/webform_test_options/webform_test_options.services.yml
@@ -3,3 +3,7 @@ services:
   Drupal\webform_test_options\Hook\WebformTestOptionsHooks:
     class: Drupal\webform_test_options\Hook\WebformTestOptionsHooks
     autowire: true
+
+  Drupal\webform_test_options\Hook\WebformTestOptionsHooks1:
+    class: Drupal\webform_test_options\Hook\WebformTestOptionsHooks1
+    autowire: true
diff --git a/tests/modules/webform_test_states/src/Hook/WebformTestStatesHooks.php b/tests/modules/webform_test_states/src/Hook/WebformTestStatesHooks.php
new file mode 100644
index 0000000..c0d4250
--- /dev/null
+++ b/tests/modules/webform_test_states/src/Hook/WebformTestStatesHooks.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Drupal\webform_test_states\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for webform_test_states.
+ */
+class WebformTestStatesHooks {
+  /**
+   * @file
+   * Support module for webform #states API testing.
+   */
+
+  /**
+   * Implements hook_preprocess_webform_confirmation().
+   */
+  #[Hook('preprocess_webform_confirmation')]
+  public static function preprocessWebformConfirmation(array &$variables) {
+    /** @var \Drupal\webform\WebformInterface $webform */
+    $webform = $variables['webform'];
+    switch ($webform->id()) {
+      case 'test_states_to_text':
+        /** @var \Drupal\webform\WebformEntityConditionsManagerInterface $conditions_manager */
+        $conditions_manager = \Drupal::service('webform.conditions_manager');
+        $build = [];
+        $elements = $webform->getElementsInitializedAndFlattened();
+        foreach ($elements as $element_key => $element) {
+          if (isset($element['#states'])) {
+            $build[$element_key] = [
+                  '#type' => 'item',
+                  '#title' => $element['#admin_title'],
+                  'text' => $conditions_manager->toText($webform, $element['#states']),
+            ];
+          }
+        }
+        $variables['message'] = $build;
+        return;
+    }
+  }
+
+}
diff --git a/tests/modules/webform_test_states/webform_test_states.module b/tests/modules/webform_test_states/webform_test_states.module
index 0d4dc58..88e28c8 100644
--- a/tests/modules/webform_test_states/webform_test_states.module
+++ b/tests/modules/webform_test_states/webform_test_states.module
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\webform_test_states\Hook\WebformTestStatesHooks;
+
 /**
  * @file
  * Support module for webform #states API testing.
@@ -8,26 +15,7 @@
 /**
  * Implements hook_preprocess_webform_confirmation().
  */
+#[LegacyHook]
 function webform_test_states_preprocess_webform_confirmation(array &$variables) {
-  /** @var \Drupal\webform\WebformInterface $webform */
-  $webform = $variables['webform'];
-  switch ($webform->id()) {
-    case 'test_states_to_text':
-      /** @var \Drupal\webform\WebformEntityConditionsManagerInterface $conditions_manager */
-      $conditions_manager = \Drupal::service('webform.conditions_manager');
-
-      $build = [];
-      $elements = $webform->getElementsInitializedAndFlattened();
-      foreach ($elements as $element_key => $element) {
-        if (isset($element['#states'])) {
-          $build[$element_key] = [
-            '#type' => 'item',
-            '#title' => $element['#admin_title'],
-            'text' => $conditions_manager->toText($webform, $element['#states']),
-          ];
-        }
-      }
-      $variables['message'] = $build;
-      return;
-  }
+  \Drupal::service(WebformTestStatesHooks::class)->preprocessWebformConfirmation($variables);
 }
diff --git a/tests/modules/webform_test_states/webform_test_states.services.yml b/tests/modules/webform_test_states/webform_test_states.services.yml
new file mode 100644
index 0000000..f8213f9
--- /dev/null
+++ b/tests/modules/webform_test_states/webform_test_states.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\webform_test_states\Hook\WebformTestStatesHooks:
+    class: Drupal\webform_test_states\Hook\WebformTestStatesHooks
+    autowire: true
diff --git a/tests/modules/webform_test_submissions/webform_test_submissions.install b/tests/modules/webform_test_submissions/webform_test_submissions.install
index 9fda322..8ad5d82 100644
--- a/tests/modules/webform_test_submissions/webform_test_submissions.install
+++ b/tests/modules/webform_test_submissions/webform_test_submissions.install
@@ -5,6 +5,8 @@
  * Install, update and uninstall functions for the Webform Test Exporter module.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\filter\FilterFormatRepositoryInterface;
 use Drupal\node\Entity\Node;
 use Drupal\node\Entity\NodeType;
 use Drupal\node\NodeInterface;
@@ -30,7 +32,7 @@ function webform_test_submissions_install() {
       'body' => [
         [
           'value' => '{Body}',
-          'format' => filter_default_format(),
+          'format' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(FilterFormatRepositoryInterface::class)->getDefaultFormat()->id(), fn() => filter_default_format()),
         ],
       ],
       'title' => 'Node ' . $i,
diff --git a/tests/src/Functional/Access/WebformAccessEntityJsonApiTest.php b/tests/src/Functional/Access/WebformAccessEntityJsonApiTest.php
index 794fd34..414c0e7 100644
--- a/tests/src/Functional/Access/WebformAccessEntityJsonApiTest.php
+++ b/tests/src/Functional/Access/WebformAccessEntityJsonApiTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessEntityJsonApiTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Access/WebformAccessEntityPermissionsTest.php b/tests/src/Functional/Access/WebformAccessEntityPermissionsTest.php
index 5ab5134..9931265 100644
--- a/tests/src/Functional/Access/WebformAccessEntityPermissionsTest.php
+++ b/tests/src/Functional/Access/WebformAccessEntityPermissionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessEntityPermissionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Access/WebformAccessEntityRestTest.php b/tests/src/Functional/Access/WebformAccessEntityRestTest.php
index 9c2c504..6c4edc7 100644
--- a/tests/src/Functional/Access/WebformAccessEntityRestTest.php
+++ b/tests/src/Functional/Access/WebformAccessEntityRestTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessEntityRestTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Access/WebformAccessEntityRulesTest.php b/tests/src/Functional/Access/WebformAccessEntityRulesTest.php
index 9843cd0..d30af93 100644
--- a/tests/src/Functional/Access/WebformAccessEntityRulesTest.php
+++ b/tests/src/Functional/Access/WebformAccessEntityRulesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessEntityRulesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Access/WebformAccessFilterFormatTest.php b/tests/src/Functional/Access/WebformAccessFilterFormatTest.php
index 3a47991..6998fbc 100644
--- a/tests/src/Functional/Access/WebformAccessFilterFormatTest.php
+++ b/tests/src/Functional/Access/WebformAccessFilterFormatTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\filter\Entity\FilterFormat;
 use Drupal\webform\Element\WebformHtmlEditor;
@@ -11,6 +13,8 @@ use Drupal\webform\Element\WebformHtmlEditor;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessFilterFormatTest extends WebformBrowserTestBase {
 
   /**
@@ -123,7 +127,7 @@ class WebformAccessFilterFormatTest extends WebformBrowserTestBase {
 
     // Check webform default format is NOT accessible via check_markup().
     // @see \Drupal\webform\Element\WebformHtmlEditor::preRenderText
-    $this->assertEquals('', check_markup('<script></script>Test', WebformHtmlEditor::DEFAULT_FILTER_FORMAT));
+    $this->assertEquals('', ['#type' => 'processed_text', '#text' => '<script></script>Test', '#format' => WebformHtmlEditor::DEFAULT_FILTER_FORMAT]);
 
     /* ********************************************************************** */
     // Check Text format access.
diff --git a/tests/src/Functional/Access/WebformAccessSubmissionPermissionsTest.php b/tests/src/Functional/Access/WebformAccessSubmissionPermissionsTest.php
index 5165223..b572283 100644
--- a/tests/src/Functional/Access/WebformAccessSubmissionPermissionsTest.php
+++ b/tests/src/Functional/Access/WebformAccessSubmissionPermissionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Access;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\user\Entity\Role;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAccessSubmissionPermissionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Block/WebformBlockContextTest.php b/tests/src/Functional/Block/WebformBlockContextTest.php
index fc1da17..37c8879 100644
--- a/tests/src/Functional/Block/WebformBlockContextTest.php
+++ b/tests/src/Functional/Block/WebformBlockContextTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Block;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformBlockContextTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Block/WebformBlockTest.php b/tests/src/Functional/Block/WebformBlockTest.php
index 073399d..193e42a 100644
--- a/tests/src/Functional/Block/WebformBlockTest.php
+++ b/tests/src/Functional/Block/WebformBlockTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Block;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformBlockTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Cache/WebformCacheTest.php b/tests/src/Functional/Cache/WebformCacheTest.php
index 7e1df24..ad1ab92 100644
--- a/tests/src/Functional/Cache/WebformCacheTest.php
+++ b/tests/src/Functional/Cache/WebformCacheTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Cache;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCacheTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Composite/WebformCompositeCustomFileTest.php b/tests/src/Functional/Composite/WebformCompositeCustomFileTest.php
index b87cbe9..8c29e6b 100644
--- a/tests/src/Functional/Composite/WebformCompositeCustomFileTest.php
+++ b/tests/src/Functional/Composite/WebformCompositeCustomFileTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Composite;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\Element\WebformElementManagedFileTestBase;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCompositeCustomFileTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Composite/WebformCompositeCustomTest.php b/tests/src/Functional/Composite/WebformCompositeCustomTest.php
index 2bdbb4d..b78da7e 100644
--- a/tests/src/Functional/Composite/WebformCompositeCustomTest.php
+++ b/tests/src/Functional/Composite/WebformCompositeCustomTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Composite;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCompositeCustomTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Composite/WebformCompositeFormatTest.php b/tests/src/Functional/Composite/WebformCompositeFormatTest.php
index 5698009..349bd15 100644
--- a/tests/src/Functional/Composite/WebformCompositeFormatTest.php
+++ b/tests/src/Functional/Composite/WebformCompositeFormatTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Composite;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Render\FormattableMarkup;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -13,6 +15,8 @@ use Drupal\webform\WebformSubmissionInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCompositeFormatTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Composite/WebformCompositePluginFileTest.php b/tests/src/Functional/Composite/WebformCompositePluginFileTest.php
index 8a201ed..e021b72 100644
--- a/tests/src/Functional/Composite/WebformCompositePluginFileTest.php
+++ b/tests/src/Functional/Composite/WebformCompositePluginFileTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Composite;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\Element\WebformElementManagedFileTestBase;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCompositePluginFileTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Composite/WebformCompositePluginTest.php b/tests/src/Functional/Composite/WebformCompositePluginTest.php
index 2e0e19e..4838391 100644
--- a/tests/src/Functional/Composite/WebformCompositePluginTest.php
+++ b/tests/src/Functional/Composite/WebformCompositePluginTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Composite;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCompositePluginTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Composite/WebformCompositeTest.php b/tests/src/Functional/Composite/WebformCompositeTest.php
index 726ab50..5e29d25 100644
--- a/tests/src/Functional/Composite/WebformCompositeTest.php
+++ b/tests/src/Functional/Composite/WebformCompositeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Composite;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformCompositeTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementAccessTest.php b/tests/src/Functional/Element/WebformElementAccessTest.php
index 052e4d4..e84202f 100644
--- a/tests/src/Functional/Element/WebformElementAccessTest.php
+++ b/tests/src/Functional/Element/WebformElementAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementAccessTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementActionsTest.php b/tests/src/Functional/Element/WebformElementActionsTest.php
index e71ca44..993ddfb 100644
--- a/tests/src/Functional/Element/WebformElementActionsTest.php
+++ b/tests/src/Functional/Element/WebformElementActionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementActionsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementAddressTest.php b/tests/src/Functional/Element/WebformElementAddressTest.php
index 84d272f..538148b 100644
--- a/tests/src/Functional/Element/WebformElementAddressTest.php
+++ b/tests/src/Functional/Element/WebformElementAddressTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementAddressTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementAllowsTagsTest.php b/tests/src/Functional/Element/WebformElementAllowsTagsTest.php
index fde9755..ed20dab 100644
--- a/tests/src/Functional/Element/WebformElementAllowsTagsTest.php
+++ b/tests/src/Functional/Element/WebformElementAllowsTagsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for element allowed tags.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementAllowsTagsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementAttributesTest.php b/tests/src/Functional/Element/WebformElementAttributesTest.php
index 8e5b470..f515ca6 100644
--- a/tests/src/Functional/Element/WebformElementAttributesTest.php
+++ b/tests/src/Functional/Element/WebformElementAttributesTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element attributes.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementAttributesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementAutocompleteTest.php b/tests/src/Functional/Element/WebformElementAutocompleteTest.php
index 4f535e2..8b125ef 100644
--- a/tests/src/Functional/Element/WebformElementAutocompleteTest.php
+++ b/tests/src/Functional/Element/WebformElementAutocompleteTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform autocomplete element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementAutocompleteTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCaptchaTest.php b/tests/src/Functional/Element/WebformElementCaptchaTest.php
index c0c9ed2..91a9e0f 100644
--- a/tests/src/Functional/Element/WebformElementCaptchaTest.php
+++ b/tests/src/Functional/Element/WebformElementCaptchaTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for CAPTCHA element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCaptchaTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCheckboxTest.php b/tests/src/Functional/Element/WebformElementCheckboxTest.php
index 4eb89b9..80d9183 100644
--- a/tests/src/Functional/Element/WebformElementCheckboxTest.php
+++ b/tests/src/Functional/Element/WebformElementCheckboxTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCheckboxTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCheckboxValueTest.php b/tests/src/Functional/Element/WebformElementCheckboxValueTest.php
index 7db5012..af4f7a9 100644
--- a/tests/src/Functional/Element/WebformElementCheckboxValueTest.php
+++ b/tests/src/Functional/Element/WebformElementCheckboxValueTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCheckboxValueTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCheckboxesTest.php b/tests/src/Functional/Element/WebformElementCheckboxesTest.php
index 62762c7..e88f71f 100644
--- a/tests/src/Functional/Element/WebformElementCheckboxesTest.php
+++ b/tests/src/Functional/Element/WebformElementCheckboxesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCheckboxesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCodeMirrorTest.php b/tests/src/Functional/Element/WebformElementCodeMirrorTest.php
index 77c8e7d..0a9aa6e 100644
--- a/tests/src/Functional/Element/WebformElementCodeMirrorTest.php
+++ b/tests/src/Functional/Element/WebformElementCodeMirrorTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform CodeMirror element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCodeMirrorTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCompositeTest.php b/tests/src/Functional/Element/WebformElementCompositeTest.php
index f715461..e33f7ee 100644
--- a/tests/src/Functional/Element/WebformElementCompositeTest.php
+++ b/tests/src/Functional/Element/WebformElementCompositeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCompositeTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementComputedTest.php b/tests/src/Functional/Element/WebformElementComputedTest.php
index e2467d6..a0a56d4 100644
--- a/tests/src/Functional/Element/WebformElementComputedTest.php
+++ b/tests/src/Functional/Element/WebformElementComputedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementComputedTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementCounterTest.php b/tests/src/Functional/Element/WebformElementCounterTest.php
index 69f9bdd..74a4d8a 100644
--- a/tests/src/Functional/Element/WebformElementCounterTest.php
+++ b/tests/src/Functional/Element/WebformElementCounterTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform (text) counter.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCounterTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementDateListTest.php b/tests/src/Functional/Element/WebformElementDateListTest.php
index 9e34b24..ab729fa 100644
--- a/tests/src/Functional/Element/WebformElementDateListTest.php
+++ b/tests/src/Functional/Element/WebformElementDateListTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementDateListTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementDateTest.php b/tests/src/Functional/Element/WebformElementDateTest.php
index 594b868..1449c0f 100644
--- a/tests/src/Functional/Element/WebformElementDateTest.php
+++ b/tests/src/Functional/Element/WebformElementDateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementDateTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementDateTimeTest.php b/tests/src/Functional/Element/WebformElementDateTimeTest.php
index 0eaf95e..9714ed6 100644
--- a/tests/src/Functional/Element/WebformElementDateTimeTest.php
+++ b/tests/src/Functional/Element/WebformElementDateTimeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementDateTimeTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementDescriptionTest.php b/tests/src/Functional/Element/WebformElementDescriptionTest.php
index cbe0ac1..c525415 100644
--- a/tests/src/Functional/Element/WebformElementDescriptionTest.php
+++ b/tests/src/Functional/Element/WebformElementDescriptionTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element description.
  *
  * @group Webform
  */
+#[Group('Webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementDescriptionTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementDetailsTest.php b/tests/src/Functional/Element/WebformElementDetailsTest.php
index d31849a..05ca093 100644
--- a/tests/src/Functional/Element/WebformElementDetailsTest.php
+++ b/tests/src/Functional/Element/WebformElementDetailsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for details element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementDetailsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementEmailConfirmTest.php b/tests/src/Functional/Element/WebformElementEmailConfirmTest.php
index 7508bf5..92b37bb 100644
--- a/tests/src/Functional/Element/WebformElementEmailConfirmTest.php
+++ b/tests/src/Functional/Element/WebformElementEmailConfirmTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for email_confirm element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementEmailConfirmTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementEmailMultipleTest.php b/tests/src/Functional/Element/WebformElementEmailMultipleTest.php
index 322d883..9233a28 100644
--- a/tests/src/Functional/Element/WebformElementEmailMultipleTest.php
+++ b/tests/src/Functional/Element/WebformElementEmailMultipleTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for email_multiple element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementEmailMultipleTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php b/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php
index 6e75769..6de00be 100644
--- a/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php
+++ b/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\Entity\Vocabulary;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementEntityAutocompleteTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementEntityReferenceTest.php b/tests/src/Functional/Element/WebformElementEntityReferenceTest.php
index 1440f29..ce59e76 100644
--- a/tests/src/Functional/Element/WebformElementEntityReferenceTest.php
+++ b/tests/src/Functional/Element/WebformElementEntityReferenceTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementEntityReferenceTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementExcludedColumnsTest.php b/tests/src/Functional/Element/WebformElementExcludedColumnsTest.php
index e38fa9f..583175e 100644
--- a/tests/src/Functional/Element/WebformElementExcludedColumnsTest.php
+++ b/tests/src/Functional/Element/WebformElementExcludedColumnsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for excluded columns element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementExcludedColumnsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementExcludedElementsTest.php b/tests/src/Functional/Element/WebformElementExcludedElementsTest.php
index dcdd827..79f6149 100644
--- a/tests/src/Functional/Element/WebformElementExcludedElementsTest.php
+++ b/tests/src/Functional/Element/WebformElementExcludedElementsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for excluded elements element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementExcludedElementsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementFieldsetTest.php b/tests/src/Functional/Element/WebformElementFieldsetTest.php
index ddd8757..8a7426e 100644
--- a/tests/src/Functional/Element/WebformElementFieldsetTest.php
+++ b/tests/src/Functional/Element/WebformElementFieldsetTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for fieldset element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementFieldsetTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementFormatCustomTest.php b/tests/src/Functional/Element/WebformElementFormatCustomTest.php
index 8b956ec..3e84c0b 100644
--- a/tests/src/Functional/Element/WebformElementFormatCustomTest.php
+++ b/tests/src/Functional/Element/WebformElementFormatCustomTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\TestFileCreationTrait;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementFormatCustomTest extends WebformElementBrowserTestBase {
 
   use TestFileCreationTrait;
diff --git a/tests/src/Functional/Element/WebformElementFormatTest.php b/tests/src/Functional/Element/WebformElementFormatTest.php
index 01f66ef..05033fa 100644
--- a/tests/src/Functional/Element/WebformElementFormatTest.php
+++ b/tests/src/Functional/Element/WebformElementFormatTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Render\FormattableMarkup;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -13,6 +15,8 @@ use Drupal\webform\WebformSubmissionInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementFormatTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementHeightTest.php b/tests/src/Functional/Element/WebformElementHeightTest.php
index 95d860e..21c0daf 100644
--- a/tests/src/Functional/Element/WebformElementHeightTest.php
+++ b/tests/src/Functional/Element/WebformElementHeightTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementHeightTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementHelpTest.php b/tests/src/Functional/Element/WebformElementHelpTest.php
index 0374a3a..bd657bd 100644
--- a/tests/src/Functional/Element/WebformElementHelpTest.php
+++ b/tests/src/Functional/Element/WebformElementHelpTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for element help.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementHelpTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementHorizontalRuleTest.php b/tests/src/Functional/Element/WebformElementHorizontalRuleTest.php
index c38169c..b9becc2 100644
--- a/tests/src/Functional/Element/WebformElementHorizontalRuleTest.php
+++ b/tests/src/Functional/Element/WebformElementHorizontalRuleTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for horizontal rule element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementHorizontalRuleTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementHtmlEditorTest.php b/tests/src/Functional/Element/WebformElementHtmlEditorTest.php
index 598c2db..c9abbd9 100644
--- a/tests/src/Functional/Element/WebformElementHtmlEditorTest.php
+++ b/tests/src/Functional/Element/WebformElementHtmlEditorTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Element\WebformHtmlEditor;
 use Drupal\webform\Entity\Webform;
 
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  * @see \Drupal\Tests\webform\Functional\Access\WebformAccessFilterFormatTest
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementHtmlEditorTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementIgnoredPropertiesTest.php b/tests/src/Functional/Element/WebformElementIgnoredPropertiesTest.php
index 02a67db..bd6d283 100644
--- a/tests/src/Functional/Element/WebformElementIgnoredPropertiesTest.php
+++ b/tests/src/Functional/Element/WebformElementIgnoredPropertiesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Utility\WebformElementHelper;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Utility\WebformElementHelper;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementIgnoredPropertiesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementImageResolutionTest.php b/tests/src/Functional/Element/WebformElementImageResolutionTest.php
index 74fca68..ca1ad4d 100644
--- a/tests/src/Functional/Element/WebformElementImageResolutionTest.php
+++ b/tests/src/Functional/Element/WebformElementImageResolutionTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform image resolution element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementImageResolutionTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementInputMaskTest.php b/tests/src/Functional/Element/WebformElementInputMaskTest.php
index 3089bfe..89d4702 100644
--- a/tests/src/Functional/Element/WebformElementInputMaskTest.php
+++ b/tests/src/Functional/Element/WebformElementInputMaskTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementInputMaskTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementLabelTest.php b/tests/src/Functional/Element/WebformElementLabelTest.php
index b0c7db1..15e4097 100644
--- a/tests/src/Functional/Element/WebformElementLabelTest.php
+++ b/tests/src/Functional/Element/WebformElementLabelTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for label element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementLabelTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementLikertTest.php b/tests/src/Functional/Element/WebformElementLikertTest.php
index e1ff389..cff2c95 100644
--- a/tests/src/Functional/Element/WebformElementLikertTest.php
+++ b/tests/src/Functional/Element/WebformElementLikertTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for likert element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementLikertTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementManagedFileImageTest.php b/tests/src/Functional/Element/WebformElementManagedFileImageTest.php
index 3816690..5484fa3 100644
--- a/tests/src/Functional/Element/WebformElementManagedFileImageTest.php
+++ b/tests/src/Functional/Element/WebformElementManagedFileImageTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\TestFileCreationTrait;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementManagedFileImageTest extends WebformElementManagedFileTestBase {
 
   use TestFileCreationTrait;
diff --git a/tests/src/Functional/Element/WebformElementManagedFileLimitTest.php b/tests/src/Functional/Element/WebformElementManagedFileLimitTest.php
index 40aceb6..7c92c07 100644
--- a/tests/src/Functional/Element/WebformElementManagedFileLimitTest.php
+++ b/tests/src/Functional/Element/WebformElementManagedFileLimitTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\StringTranslation\ByteSizeMarkup;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementManagedFileLimitTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php b/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php
index 66620ee..18e3e41 100644
--- a/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php
+++ b/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Test for webform element managed file preview.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementManagedFilePreviewTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php b/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php
index 56212a0..277df6b 100644
--- a/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php
+++ b/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementManagedFilePrivateTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementManagedFilePublicTest.php b/tests/src/Functional/Element/WebformElementManagedFilePublicTest.php
index fa90f05..f46447e 100644
--- a/tests/src/Functional/Element/WebformElementManagedFilePublicTest.php
+++ b/tests/src/Functional/Element/WebformElementManagedFilePublicTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Test for webform element managed public file handling (DRUPAL-PSA-2016-003).
  *
@@ -9,6 +12,8 @@ namespace Drupal\Tests\webform\Functional\Element;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementManagedFilePublicTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementManagedFileTest.php b/tests/src/Functional/Element/WebformElementManagedFileTest.php
index 0c1d5d3..958e4cd 100644
--- a/tests/src/Functional/Element/WebformElementManagedFileTest.php
+++ b/tests/src/Functional/Element/WebformElementManagedFileTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementManagedFileTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMappingTest.php b/tests/src/Functional/Element/WebformElementMappingTest.php
index aeee76b..54bd1a4 100644
--- a/tests/src/Functional/Element/WebformElementMappingTest.php
+++ b/tests/src/Functional/Element/WebformElementMappingTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for mapping element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMappingTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMarkupTest.php b/tests/src/Functional/Element/WebformElementMarkupTest.php
index 00d1089..247a288 100644
--- a/tests/src/Functional/Element/WebformElementMarkupTest.php
+++ b/tests/src/Functional/Element/WebformElementMarkupTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for markup element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMarkupTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMediaFileTest.php b/tests/src/Functional/Element/WebformElementMediaFileTest.php
index 3e05340..17d7c5d 100644
--- a/tests/src/Functional/Element/WebformElementMediaFileTest.php
+++ b/tests/src/Functional/Element/WebformElementMediaFileTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMediaFileTest extends WebformElementManagedFileTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMessageTest.php b/tests/src/Functional/Element/WebformElementMessageTest.php
index af92b8f..ce98c37 100644
--- a/tests/src/Functional/Element/WebformElementMessageTest.php
+++ b/tests/src/Functional/Element/WebformElementMessageTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMessageTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMoreTest.php b/tests/src/Functional/Element/WebformElementMoreTest.php
index 1c9221c..6aa1f70 100644
--- a/tests/src/Functional/Element/WebformElementMoreTest.php
+++ b/tests/src/Functional/Element/WebformElementMoreTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for element more.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMoreTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMultiplePropertyTest.php b/tests/src/Functional/Element/WebformElementMultiplePropertyTest.php
index 62c3e12..3e6f434 100644
--- a/tests/src/Functional/Element/WebformElementMultiplePropertyTest.php
+++ b/tests/src/Functional/Element/WebformElementMultiplePropertyTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element multiple property.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMultiplePropertyTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementMultipleTest.php b/tests/src/Functional/Element/WebformElementMultipleTest.php
index 898cd3c..a7a99e9 100644
--- a/tests/src/Functional/Element/WebformElementMultipleTest.php
+++ b/tests/src/Functional/Element/WebformElementMultipleTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementMultipleTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementOptionsTest.php b/tests/src/Functional/Element/WebformElementOptionsTest.php
index 1fa1aad..ddf5b7b 100644
--- a/tests/src/Functional/Element/WebformElementOptionsTest.php
+++ b/tests/src/Functional/Element/WebformElementOptionsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element options.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementOptionsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementOtherTest.php b/tests/src/Functional/Element/WebformElementOtherTest.php
index 517a6e2..8162dfa 100644
--- a/tests/src/Functional/Element/WebformElementOtherTest.php
+++ b/tests/src/Functional/Element/WebformElementOtherTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementOtherTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php b/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php
index 14ee9e4..765cc38 100644
--- a/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php
+++ b/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\webform\Utility\WebformElementHelper;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Utility\WebformElementHelper;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementPluginDefinitionsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php b/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php
index 10f2853..6c3ecce 100644
--- a/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php
+++ b/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\webform\Utility\WebformElementHelper;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Utility\WebformElementHelper;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementPluginPropertiesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementPluginTest.php b/tests/src/Functional/Element/WebformElementPluginTest.php
index f1e6566..3ce8443 100644
--- a/tests/src/Functional/Element/WebformElementPluginTest.php
+++ b/tests/src/Functional/Element/WebformElementPluginTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementPluginTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementPrepopulateTest.php b/tests/src/Functional/Element/WebformElementPrepopulateTest.php
index 0dd3edf..560725e 100644
--- a/tests/src/Functional/Element/WebformElementPrepopulateTest.php
+++ b/tests/src/Functional/Element/WebformElementPrepopulateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\TestFileCreationTrait;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementPrepopulateTest extends WebformElementBrowserTestBase {
 
   use TestFileCreationTrait;
diff --git a/tests/src/Functional/Element/WebformElementPrivateTest.php b/tests/src/Functional/Element/WebformElementPrivateTest.php
index 692d8f7..1ff9645 100644
--- a/tests/src/Functional/Element/WebformElementPrivateTest.php
+++ b/tests/src/Functional/Element/WebformElementPrivateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementPrivateTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementRadiosTest.php b/tests/src/Functional/Element/WebformElementRadiosTest.php
index 4a43736..8a696cd 100644
--- a/tests/src/Functional/Element/WebformElementRadiosTest.php
+++ b/tests/src/Functional/Element/WebformElementRadiosTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element radios.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementRadiosTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementRangeTest.php b/tests/src/Functional/Element/WebformElementRangeTest.php
index e786d5a..4977bdc 100644
--- a/tests/src/Functional/Element/WebformElementRangeTest.php
+++ b/tests/src/Functional/Element/WebformElementRangeTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for range element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementRangeTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementRatingTest.php b/tests/src/Functional/Element/WebformElementRatingTest.php
index 944df6f..6fc6163 100644
--- a/tests/src/Functional/Element/WebformElementRatingTest.php
+++ b/tests/src/Functional/Element/WebformElementRatingTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for rating element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementRatingTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementReadonlyTest.php b/tests/src/Functional/Element/WebformElementReadonlyTest.php
index b63f202..abb331e 100644
--- a/tests/src/Functional/Element/WebformElementReadonlyTest.php
+++ b/tests/src/Functional/Element/WebformElementReadonlyTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element readonly attribute.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementReadonlyTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSameTest.php b/tests/src/Functional/Element/WebformElementSameTest.php
index 16a0c4e..406915f 100644
--- a/tests/src/Functional/Element/WebformElementSameTest.php
+++ b/tests/src/Functional/Element/WebformElementSameTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSameTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementScaleTest.php b/tests/src/Functional/Element/WebformElementScaleTest.php
index bb75d29..9e914ba 100644
--- a/tests/src/Functional/Element/WebformElementScaleTest.php
+++ b/tests/src/Functional/Element/WebformElementScaleTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for scale element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementScaleTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSectionTest.php b/tests/src/Functional/Element/WebformElementSectionTest.php
index dddfcda..48e75eb 100644
--- a/tests/src/Functional/Element/WebformElementSectionTest.php
+++ b/tests/src/Functional/Element/WebformElementSectionTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for element section.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSectionTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSelectTest.php b/tests/src/Functional/Element/WebformElementSelectTest.php
index 038660d..c6cdcef 100644
--- a/tests/src/Functional/Element/WebformElementSelectTest.php
+++ b/tests/src/Functional/Element/WebformElementSelectTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for select element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSelectTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSignatureTest.php b/tests/src/Functional/Element/WebformElementSignatureTest.php
index 82556f5..448f599 100644
--- a/tests/src/Functional/Element/WebformElementSignatureTest.php
+++ b/tests/src/Functional/Element/WebformElementSignatureTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSignatureTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementStatesSelectorsTest.php b/tests/src/Functional/Element/WebformElementStatesSelectorsTest.php
index 6f45d3e..57a3eed 100644
--- a/tests/src/Functional/Element/WebformElementStatesSelectorsTest.php
+++ b/tests/src/Functional/Element/WebformElementStatesSelectorsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Form\OptGroup;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\WebformInterface;
@@ -11,6 +13,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementStatesSelectorsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementStatesTest.php b/tests/src/Functional/Element/WebformElementStatesTest.php
index 7f743fd..5c8077d 100644
--- a/tests/src/Functional/Element/WebformElementStatesTest.php
+++ b/tests/src/Functional/Element/WebformElementStatesTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element #states.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementStatesTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSubmissionViewsReplaceTest.php b/tests/src/Functional/Element/WebformElementSubmissionViewsReplaceTest.php
index d10cba1..03565f1 100644
--- a/tests/src/Functional/Element/WebformElementSubmissionViewsReplaceTest.php
+++ b/tests/src/Functional/Element/WebformElementSubmissionViewsReplaceTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform submission views replace element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSubmissionViewsReplaceTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSubmissionViewsTest.php b/tests/src/Functional/Element/WebformElementSubmissionViewsTest.php
index 2a96499..217bebf 100644
--- a/tests/src/Functional/Element/WebformElementSubmissionViewsTest.php
+++ b/tests/src/Functional/Element/WebformElementSubmissionViewsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform submission views element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSubmissionViewsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementSubmittedValueTest.php b/tests/src/Functional/Element/WebformElementSubmittedValueTest.php
index 88045d1..3db7820 100644
--- a/tests/src/Functional/Element/WebformElementSubmittedValueTest.php
+++ b/tests/src/Functional/Element/WebformElementSubmittedValueTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSubmittedValueTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementTableSelectSortTest.php b/tests/src/Functional/Element/WebformElementTableSelectSortTest.php
index 270e04d..9f0a71a 100644
--- a/tests/src/Functional/Element/WebformElementTableSelectSortTest.php
+++ b/tests/src/Functional/Element/WebformElementTableSelectSortTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTableSelectSortTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementTableTest.php b/tests/src/Functional/Element/WebformElementTableTest.php
index f5a4349..a748555 100644
--- a/tests/src/Functional/Element/WebformElementTableTest.php
+++ b/tests/src/Functional/Element/WebformElementTableTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTableTest extends WebformElementBrowserTestBase {
 
 
diff --git a/tests/src/Functional/Element/WebformElementTelephoneTest.php b/tests/src/Functional/Element/WebformElementTelephoneTest.php
index e1a2121..10cb511 100644
--- a/tests/src/Functional/Element/WebformElementTelephoneTest.php
+++ b/tests/src/Functional/Element/WebformElementTelephoneTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for telephone element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTelephoneTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementTermReferenceTest.php b/tests/src/Functional/Element/WebformElementTermReferenceTest.php
index f6112da..13f48bb 100644
--- a/tests/src/Functional/Element/WebformElementTermReferenceTest.php
+++ b/tests/src/Functional/Element/WebformElementTermReferenceTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTermReferenceTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php b/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php
index 8bcc372..105591f 100644
--- a/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php
+++ b/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform terms of service element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTermsOfServiceTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementTest.php b/tests/src/Functional/Element/WebformElementTest.php
index e44a6e7..b98b10b 100644
--- a/tests/src/Functional/Element/WebformElementTest.php
+++ b/tests/src/Functional/Element/WebformElementTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\WebformInterface;
 
@@ -10,6 +12,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementTextFormatTest.php b/tests/src/Functional/Element/WebformElementTextFormatTest.php
index da58f29..66c4419 100644
--- a/tests/src/Functional/Element/WebformElementTextFormatTest.php
+++ b/tests/src/Functional/Element/WebformElementTextFormatTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\TestFileCreationTrait;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTextFormatTest extends WebformElementBrowserTestBase {
 
   use TestFileCreationTrait;
diff --git a/tests/src/Functional/Element/WebformElementTimeTest.php b/tests/src/Functional/Element/WebformElementTimeTest.php
index 34c17ea..a8e66aa 100644
--- a/tests/src/Functional/Element/WebformElementTimeTest.php
+++ b/tests/src/Functional/Element/WebformElementTimeTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform time element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementTimeTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementValidateMinlengthTest.php b/tests/src/Functional/Element/WebformElementValidateMinlengthTest.php
index 07c39e0..03972b8 100644
--- a/tests/src/Functional/Element/WebformElementValidateMinlengthTest.php
+++ b/tests/src/Functional/Element/WebformElementValidateMinlengthTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementValidateMinlengthTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementValidateMultipleTest.php b/tests/src/Functional/Element/WebformElementValidateMultipleTest.php
index d477c6b..9395128 100644
--- a/tests/src/Functional/Element/WebformElementValidateMultipleTest.php
+++ b/tests/src/Functional/Element/WebformElementValidateMultipleTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform validate multiple.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementValidateMultipleTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementValidatePatternTest.php b/tests/src/Functional/Element/WebformElementValidatePatternTest.php
index 1d37bc6..b4cc371 100644
--- a/tests/src/Functional/Element/WebformElementValidatePatternTest.php
+++ b/tests/src/Functional/Element/WebformElementValidatePatternTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform pattern validation.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementValidatePatternTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementValidateRequiredTest.php b/tests/src/Functional/Element/WebformElementValidateRequiredTest.php
index 717c7a4..6c4ffd1 100644
--- a/tests/src/Functional/Element/WebformElementValidateRequiredTest.php
+++ b/tests/src/Functional/Element/WebformElementValidateRequiredTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform required validation.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementValidateRequiredTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementValidateUniqueTest.php b/tests/src/Functional/Element/WebformElementValidateUniqueTest.php
index d2fe4f4..ce0482d 100644
--- a/tests/src/Functional/Element/WebformElementValidateUniqueTest.php
+++ b/tests/src/Functional/Element/WebformElementValidateUniqueTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementValidateUniqueTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementVerticalTabsTest.php b/tests/src/Functional/Element/WebformElementVerticalTabsTest.php
index 80dce6a..73d2fd4 100644
--- a/tests/src/Functional/Element/WebformElementVerticalTabsTest.php
+++ b/tests/src/Functional/Element/WebformElementVerticalTabsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for vertical tabs element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementVerticalTabsTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementViewTest.php b/tests/src/Functional/Element/WebformElementViewTest.php
index f140931..cd61205 100644
--- a/tests/src/Functional/Element/WebformElementViewTest.php
+++ b/tests/src/Functional/Element/WebformElementViewTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for view element.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementViewTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Element/WebformElementXssTest.php b/tests/src/Functional/Element/WebformElementXssTest.php
index 62e7c0f..80eb983 100644
--- a/tests/src/Functional/Element/WebformElementXssTest.php
+++ b/tests/src/Functional/Element/WebformElementXssTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform element XSS.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformElementXssTest extends WebformElementBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Exporter/WebformExporterExcludedTest.php b/tests/src/Functional/Exporter/WebformExporterExcludedTest.php
index dd820fa..06a1e96 100644
--- a/tests/src/Functional/Exporter/WebformExporterExcludedTest.php
+++ b/tests/src/Functional/Exporter/WebformExporterExcludedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Exporter;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformExporterExcludedTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Exporter/WebformExporterOptionsTest.php b/tests/src/Functional/Exporter/WebformExporterOptionsTest.php
index 93a219c..52e315c 100644
--- a/tests/src/Functional/Exporter/WebformExporterOptionsTest.php
+++ b/tests/src/Functional/Exporter/WebformExporterOptionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Exporter;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformExporterOptionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Field/WebformFieldTest.php b/tests/src/Functional/Field/WebformFieldTest.php
index 54080fb..04c0ab9 100644
--- a/tests/src/Functional/Field/WebformFieldTest.php
+++ b/tests/src/Functional/Field/WebformFieldTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Field;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformFieldTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Form/WebformFormPropertiesTest.php b/tests/src/Functional/Form/WebformFormPropertiesTest.php
index cfdfae7..e3b6100 100644
--- a/tests/src/Functional/Form/WebformFormPropertiesTest.php
+++ b/tests/src/Functional/Form/WebformFormPropertiesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Form;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformFormPropertiesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Form/WebformFormValidateTest.php b/tests/src/Functional/Form/WebformFormValidateTest.php
index 785e50b..d494717 100644
--- a/tests/src/Functional/Form/WebformFormValidateTest.php
+++ b/tests/src/Functional/Form/WebformFormValidateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Form;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformFormValidateTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Form/WebformSubmissionDeleteTest.php b/tests/src/Functional/Form/WebformSubmissionDeleteTest.php
index 73dacbc..4e4a95d 100644
--- a/tests/src/Functional/Form/WebformSubmissionDeleteTest.php
+++ b/tests/src/Functional/Form/WebformSubmissionDeleteTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Form;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionDeleteTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerActionTest.php b/tests/src/Functional/Handler/WebformHandlerActionTest.php
index e22ccca..412b330 100644
--- a/tests/src/Functional/Handler/WebformHandlerActionTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerActionTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformSubmissionInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerActionTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerConditionsTest.php b/tests/src/Functional/Handler/WebformHandlerConditionsTest.php
index 7ddd98f..770e7ec 100644
--- a/tests/src/Functional/Handler/WebformHandlerConditionsTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerConditionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerConditionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailAdvancedTest.php b/tests/src/Functional/Handler/WebformHandlerEmailAdvancedTest.php
index ffe60b0..c6cbb60 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailAdvancedTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailAdvancedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailAdvancedTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailBasicTest.php b/tests/src/Functional/Handler/WebformHandlerEmailBasicTest.php
index 8b896b9..5082868 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailBasicTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailBasicTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Element\WebformSelectOther;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailBasicTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailMappingTest.php b/tests/src/Functional/Handler/WebformHandlerEmailMappingTest.php
index ea5a04d..08501a8 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailMappingTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailMappingTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailMappingTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailRenderingTest.php b/tests/src/Functional/Handler/WebformHandlerEmailRenderingTest.php
index befb078..ee2c2ce 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailRenderingTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailRenderingTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Test\AssertMailTrait;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailRenderingTest extends WebformBrowserTestBase {
 
   use AssertMailTrait;
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailRolesTest.php b/tests/src/Functional/Handler/WebformHandlerEmailRolesTest.php
index cbadeec..8a6f8d0 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailRolesTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailRolesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailRolesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailStatesTest.php b/tests/src/Functional/Handler/WebformHandlerEmailStatesTest.php
index 783fe3d..edbd721 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailStatesTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailStatesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailStatesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailTwigTest.php b/tests/src/Functional/Handler/WebformHandlerEmailTwigTest.php
index 88acdce..96f1a9b 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailTwigTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailTwigTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailTwigTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerEmailValidationTest.php b/tests/src/Functional/Handler/WebformHandlerEmailValidationTest.php
index 0b70fe6..81ee882 100644
--- a/tests/src/Functional/Handler/WebformHandlerEmailValidationTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerEmailValidationTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerEmailValidationTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerExcludedTest.php b/tests/src/Functional/Handler/WebformHandlerExcludedTest.php
index 5543f7b..783ad7d 100644
--- a/tests/src/Functional/Handler/WebformHandlerExcludedTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerExcludedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerExcludedTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerInvokeAlterHookTest.php b/tests/src/Functional/Handler/WebformHandlerInvokeAlterHookTest.php
index bd2c33d..806a6a3 100644
--- a/tests/src/Functional/Handler/WebformHandlerInvokeAlterHookTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerInvokeAlterHookTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerInvokeAlterHookTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerPluginTest.php b/tests/src/Functional/Handler/WebformHandlerPluginTest.php
index 34e4fdb..26d21fc 100644
--- a/tests/src/Functional/Handler/WebformHandlerPluginTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerPluginTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerPluginTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php b/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php
index 5feb926..4b67666 100644
--- a/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerRemotePostTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerSettingsTest.php b/tests/src/Functional/Handler/WebformHandlerSettingsTest.php
index 6dee640..87e401e 100644
--- a/tests/src/Functional/Handler/WebformHandlerSettingsTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerSettingsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerSettingsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Handler/WebformHandlerTest.php b/tests/src/Functional/Handler/WebformHandlerTest.php
index e240582..7425f77 100644
--- a/tests/src/Functional/Handler/WebformHandlerTest.php
+++ b/tests/src/Functional/Handler/WebformHandlerTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Handler;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHandlerTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Paragraphs/WebformParagraphsDraftsTest.php b/tests/src/Functional/Paragraphs/WebformParagraphsDraftsTest.php
index b527c62..5b03bff 100644
--- a/tests/src/Functional/Paragraphs/WebformParagraphsDraftsTest.php
+++ b/tests/src/Functional/Paragraphs/WebformParagraphsDraftsTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Paragraphs;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform paragraphs drafts.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformParagraphsDraftsTest extends WebformParagraphsTestBase {
 
   /**
diff --git a/tests/src/Functional/Paragraphs/WebformParagraphsTest.php b/tests/src/Functional/Paragraphs/WebformParagraphsTest.php
index 2d92bc3..282b069 100644
--- a/tests/src/Functional/Paragraphs/WebformParagraphsTest.php
+++ b/tests/src/Functional/Paragraphs/WebformParagraphsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Paragraphs;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformParagraphsTest extends WebformParagraphsTestBase {
 
   /**
diff --git a/tests/src/Functional/Paragraphs/WebformParagraphsTestBase.php b/tests/src/Functional/Paragraphs/WebformParagraphsTestBase.php
index 7a0aa90..710cbeb 100644
--- a/tests/src/Functional/Paragraphs/WebformParagraphsTestBase.php
+++ b/tests/src/Functional/Paragraphs/WebformParagraphsTestBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Functional\Paragraphs;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +10,7 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
 abstract class WebformParagraphsTestBase extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Paragraphs/WebformParagraphsTokenTest.php b/tests/src/Functional/Paragraphs/WebformParagraphsTokenTest.php
index 1a92f31..da675b7 100644
--- a/tests/src/Functional/Paragraphs/WebformParagraphsTokenTest.php
+++ b/tests/src/Functional/Paragraphs/WebformParagraphsTokenTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Paragraphs;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform paragraphs token.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformParagraphsTokenTest extends WebformParagraphsTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php b/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php
index 512f460..5099070 100644
--- a/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsAccessDeniedTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsAdminTest.php b/tests/src/Functional/Settings/WebformSettingsAdminTest.php
index 600e2e8..bcf24d9 100644
--- a/tests/src/Functional/Settings/WebformSettingsAdminTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsAdminTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Utility\WebformYaml;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Utility\WebformYaml;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsAdminTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsAjaxTest.php b/tests/src/Functional/Settings/WebformSettingsAjaxTest.php
index 7959a6c..8b0d730 100644
--- a/tests/src/Functional/Settings/WebformSettingsAjaxTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsAjaxTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\Tests\webform_node\Traits\WebformNodeBrowserTestTrait;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsAjaxTest extends WebformBrowserTestBase {
 
   use WebformNodeBrowserTestTrait;
diff --git a/tests/src/Functional/Settings/WebformSettingsArchivedTest.php b/tests/src/Functional/Settings/WebformSettingsArchivedTest.php
index bfeeba0..d5b7474 100644
--- a/tests/src/Functional/Settings/WebformSettingsArchivedTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsArchivedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsArchivedTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsAssetsTest.php b/tests/src/Functional/Settings/WebformSettingsAssetsTest.php
index ef7f2e3..b42ac33 100644
--- a/tests/src/Functional/Settings/WebformSettingsAssetsTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsAssetsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsAssetsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsAutofillTest.php b/tests/src/Functional/Settings/WebformSettingsAutofillTest.php
index 2b12855..a318a04 100644
--- a/tests/src/Functional/Settings/WebformSettingsAutofillTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsAutofillTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsAutofillTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php b/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php
index 5cb923d..99bddf7 100644
--- a/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsBehaviorsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsConfidentialTest.php b/tests/src/Functional/Settings/WebformSettingsConfidentialTest.php
index 674e188..74143c4 100644
--- a/tests/src/Functional/Settings/WebformSettingsConfidentialTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsConfidentialTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\user\Entity\Role;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsConfidentialTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php b/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php
index 9cdc5c1..26f0697 100644
--- a/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsConfirmationTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsDraftTest.php b/tests/src/Functional/Settings/WebformSettingsDraftTest.php
index 7a34dd9..05e1b12 100644
--- a/tests/src/Functional/Settings/WebformSettingsDraftTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsDraftTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Utility\Html;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\user\Entity\User;
@@ -13,6 +15,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsDraftTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsFormTitleTest.php b/tests/src/Functional/Settings/WebformSettingsFormTitleTest.php
index a86f738..621d1a6 100644
--- a/tests/src/Functional/Settings/WebformSettingsFormTitleTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsFormTitleTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsFormTitleTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsLimitUniqueTest.php b/tests/src/Functional/Settings/WebformSettingsLimitUniqueTest.php
index c2bed94..6bb0318 100644
--- a/tests/src/Functional/Settings/WebformSettingsLimitUniqueTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsLimitUniqueTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsLimitUniqueTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsLimitsTest.php b/tests/src/Functional/Settings/WebformSettingsLimitsTest.php
index 624e943..ab0eb6f 100644
--- a/tests/src/Functional/Settings/WebformSettingsLimitsTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsLimitsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\user\Entity\Role;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsLimitsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsPathTest.php b/tests/src/Functional/Settings/WebformSettingsPathTest.php
index 1a7a014..d541cef 100644
--- a/tests/src/Functional/Settings/WebformSettingsPathTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsPathTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsPathTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsPrepopulateTest.php b/tests/src/Functional/Settings/WebformSettingsPrepopulateTest.php
index 42ef4df..9a2a440 100644
--- a/tests/src/Functional/Settings/WebformSettingsPrepopulateTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsPrepopulateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsPrepopulateTest extends WebformBrowserTestBase {
 
 
diff --git a/tests/src/Functional/Settings/WebformSettingsPreviewTest.php b/tests/src/Functional/Settings/WebformSettingsPreviewTest.php
index 0e88bb7..8eb3aad 100644
--- a/tests/src/Functional/Settings/WebformSettingsPreviewTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsPreviewTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsPreviewTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsPreviousTest.php b/tests/src/Functional/Settings/WebformSettingsPreviousTest.php
index 6990843..818f5c8 100644
--- a/tests/src/Functional/Settings/WebformSettingsPreviousTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsPreviousTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsPreviousTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsRemoteAddrTest.php b/tests/src/Functional/Settings/WebformSettingsRemoteAddrTest.php
index 26a1087..1985d89 100644
--- a/tests/src/Functional/Settings/WebformSettingsRemoteAddrTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsRemoteAddrTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformSubmissionForm;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsRemoteAddrTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsScheduleTest.php b/tests/src/Functional/Settings/WebformSettingsScheduleTest.php
index 49761fd..9170d61 100644
--- a/tests/src/Functional/Settings/WebformSettingsScheduleTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsScheduleTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\WebformInterface;
@@ -11,6 +13,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsScheduleTest extends WebformBrowserTestBase {
 
 
diff --git a/tests/src/Functional/Settings/WebformSettingsSerialTest.php b/tests/src/Functional/Settings/WebformSettingsSerialTest.php
index 64b12d0..620ffec 100644
--- a/tests/src/Functional/Settings/WebformSettingsSerialTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsSerialTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsSerialTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Settings/WebformSettingsStatusTest.php b/tests/src/Functional/Settings/WebformSettingsStatusTest.php
index cc9b943..d8d3daa 100644
--- a/tests/src/Functional/Settings/WebformSettingsStatusTest.php
+++ b/tests/src/Functional/Settings/WebformSettingsStatusTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\WebformInterface;
 
@@ -10,6 +12,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsStatusTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/States/WebformStatesHiddenTest.php b/tests/src/Functional/States/WebformStatesHiddenTest.php
index be8c16e..53a7fc3 100644
--- a/tests/src/Functional/States/WebformStatesHiddenTest.php
+++ b/tests/src/Functional/States/WebformStatesHiddenTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesHiddenTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/States/WebformStatesManagerTest.php b/tests/src/Functional/States/WebformStatesManagerTest.php
index b7f432c..72f5c1a 100644
--- a/tests/src/Functional/States/WebformStatesManagerTest.php
+++ b/tests/src/Functional/States/WebformStatesManagerTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesManagerTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/States/WebformStatesPreviewTest.php b/tests/src/Functional/States/WebformStatesPreviewTest.php
index 45dacd6..fb33211 100644
--- a/tests/src/Functional/States/WebformStatesPreviewTest.php
+++ b/tests/src/Functional/States/WebformStatesPreviewTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesPreviewTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/States/WebformStatesServerTest.php b/tests/src/Functional/States/WebformStatesServerTest.php
index e899632..f6783a1 100644
--- a/tests/src/Functional/States/WebformStatesServerTest.php
+++ b/tests/src/Functional/States/WebformStatesServerTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Utility\Crypt;
 use Drupal\Tests\TestFileCreationTrait;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
@@ -13,6 +15,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesServerTest extends WebformBrowserTestBase {
 
   use TestFileCreationTrait;
diff --git a/tests/src/Functional/States/WebformStatesWizardTest.php b/tests/src/Functional/States/WebformStatesWizardTest.php
index 925f51b..f33845d 100644
--- a/tests/src/Functional/States/WebformStatesWizardTest.php
+++ b/tests/src/Functional/States/WebformStatesWizardTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesWizardTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php b/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php
index 4bd57f3..9570c95 100644
--- a/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php
+++ b/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Token;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformTokenSubmissionValueTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Token/WebformTokenSuffixesTest.php b/tests/src/Functional/Token/WebformTokenSuffixesTest.php
index 5d9719d..c6fd991 100644
--- a/tests/src/Functional/Token/WebformTokenSuffixesTest.php
+++ b/tests/src/Functional/Token/WebformTokenSuffixesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Token;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformTokenSuffixesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Token/WebformTokenValidateTest.php b/tests/src/Functional/Token/WebformTokenValidateTest.php
index 4d23ecc..f59bd49 100644
--- a/tests/src/Functional/Token/WebformTokenValidateTest.php
+++ b/tests/src/Functional/Token/WebformTokenValidateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Token;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformTokenValidateTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantApplyTest.php b/tests/src/Functional/Variant/WebformVariantApplyTest.php
index 8edc364..707ef83 100644
--- a/tests/src/Functional/Variant/WebformVariantApplyTest.php
+++ b/tests/src/Functional/Variant/WebformVariantApplyTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantApplyTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantElementTest.php b/tests/src/Functional/Variant/WebformVariantElementTest.php
index 502810a..c9133b1 100644
--- a/tests/src/Functional/Variant/WebformVariantElementTest.php
+++ b/tests/src/Functional/Variant/WebformVariantElementTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantElementTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantExcludedTest.php b/tests/src/Functional/Variant/WebformVariantExcludedTest.php
index cf289ea..2c351d6 100644
--- a/tests/src/Functional/Variant/WebformVariantExcludedTest.php
+++ b/tests/src/Functional/Variant/WebformVariantExcludedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantExcludedTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantOperationsTest.php b/tests/src/Functional/Variant/WebformVariantOperationsTest.php
index bfcef42..1bbd080 100644
--- a/tests/src/Functional/Variant/WebformVariantOperationsTest.php
+++ b/tests/src/Functional/Variant/WebformVariantOperationsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantOperationsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantOverrideTest.php b/tests/src/Functional/Variant/WebformVariantOverrideTest.php
index 1d9d69f..140af1b 100644
--- a/tests/src/Functional/Variant/WebformVariantOverrideTest.php
+++ b/tests/src/Functional/Variant/WebformVariantOverrideTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantOverrideTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantPluginTest.php b/tests/src/Functional/Variant/WebformVariantPluginTest.php
index c9b8d7b..acafb1a 100644
--- a/tests/src/Functional/Variant/WebformVariantPluginTest.php
+++ b/tests/src/Functional/Variant/WebformVariantPluginTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantPluginTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Variant/WebformVariantTest.php b/tests/src/Functional/Variant/WebformVariantTest.php
index a3c8b0a..245de94 100644
--- a/tests/src/Functional/Variant/WebformVariantTest.php
+++ b/tests/src/Functional/Variant/WebformVariantTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Views/WebformViewsBulkFormTest.php b/tests/src/Functional/Views/WebformViewsBulkFormTest.php
index c3acd47..c6a8a27 100644
--- a/tests/src/Functional/Views/WebformViewsBulkFormTest.php
+++ b/tests/src/Functional/Views/WebformViewsBulkFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Views;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\Webform;
  * @group webform
  * @see \Drupal\webform\Plugin\views\field\WebformSubmissionBulkForm
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformViewsBulkFormTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformAlterHooksTest.php b/tests/src/Functional/WebformAlterHooksTest.php
index 3398570..631260c 100644
--- a/tests/src/Functional/WebformAlterHooksTest.php
+++ b/tests/src/Functional/WebformAlterHooksTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform_node\Functional\WebformNodeBrowserTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformAlterHooksTest extends WebformNodeBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformBlockCacheTest.php b/tests/src/Functional/WebformBlockCacheTest.php
index 27f8255..ca53162 100644
--- a/tests/src/Functional/WebformBlockCacheTest.php
+++ b/tests/src/Functional/WebformBlockCacheTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 use Drupal\webform\Entity\Webform;
 
@@ -14,6 +16,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformBlockCacheTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformBrowserTestBaseTest.php b/tests/src/Functional/WebformBrowserTestBaseTest.php
index 629511d..2b0b9a4 100644
--- a/tests/src/Functional/WebformBrowserTestBaseTest.php
+++ b/tests/src/Functional/WebformBrowserTestBaseTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformBrowserTestBaseTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEditorTest.php b/tests/src/Functional/WebformEditorTest.php
index 774198b..2545e7f 100644
--- a/tests/src/Functional/WebformEditorTest.php
+++ b/tests/src/Functional/WebformEditorTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\TestFileCreationTrait;
 use Drupal\file\Entity\File;
 
@@ -10,6 +12,8 @@ use Drupal\file\Entity\File;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEditorTest extends WebformBrowserTestBase {
 
   use TestFileCreationTrait;
diff --git a/tests/src/Functional/WebformEmailProviderTest.php b/tests/src/Functional/WebformEmailProviderTest.php
index 3054bd8..5178d8a 100644
--- a/tests/src/Functional/WebformEmailProviderTest.php
+++ b/tests/src/Functional/WebformEmailProviderTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform email provider.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEmailProviderTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEntityElementsValidationTest.php b/tests/src/Functional/WebformEntityElementsValidationTest.php
index ff829eb..9cfe255 100644
--- a/tests/src/Functional/WebformEntityElementsValidationTest.php
+++ b/tests/src/Functional/WebformEntityElementsValidationTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityElementsValidationTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEntityReferenceItemNormalizerTest.php b/tests/src/Functional/WebformEntityReferenceItemNormalizerTest.php
index ab47603..c4758d7 100644
--- a/tests/src/Functional/WebformEntityReferenceItemNormalizerTest.php
+++ b/tests/src/Functional/WebformEntityReferenceItemNormalizerTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\node\Entity\Node;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityReferenceItemNormalizerTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEntityStorageTest.php b/tests/src/Functional/WebformEntityStorageTest.php
index 9b30141..62de67d 100644
--- a/tests/src/Functional/WebformEntityStorageTest.php
+++ b/tests/src/Functional/WebformEntityStorageTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform storage tests.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityStorageTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEntityTest.php b/tests/src/Functional/WebformEntityTest.php
index f64af80..a5675a0 100644
--- a/tests/src/Functional/WebformEntityTest.php
+++ b/tests/src/Functional/WebformEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEntityTranslationApiTest.php b/tests/src/Functional/WebformEntityTranslationApiTest.php
index b25a7d4..2a56d45 100644
--- a/tests/src/Functional/WebformEntityTranslationApiTest.php
+++ b/tests/src/Functional/WebformEntityTranslationApiTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityTranslationApiTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformEntityTranslationTest.php b/tests/src/Functional/WebformEntityTranslationTest.php
index 5bd5710..45c3f0b 100644
--- a/tests/src/Functional/WebformEntityTranslationTest.php
+++ b/tests/src/Functional/WebformEntityTranslationTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Component\Utility\Html;
 use Drupal\language\Entity\ConfigurableLanguage;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityTranslationTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformExampleFunctionalTest.php b/tests/src/Functional/WebformExampleFunctionalTest.php
index 6e68a71..17e40f2 100644
--- a/tests/src/Functional/WebformExampleFunctionalTest.php
+++ b/tests/src/Functional/WebformExampleFunctionalTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Example of webform browser test.
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformExampleFunctionalTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformHelpTest.php b/tests/src/Functional/WebformHelpTest.php
index 2b2ef8a..c41f39d 100644
--- a/tests/src/Functional/WebformHelpTest.php
+++ b/tests/src/Functional/WebformHelpTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform help.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformHelpTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformLibrariesTest.php b/tests/src/Functional/WebformLibrariesTest.php
index 2458b1b..0505451 100644
--- a/tests/src/Functional/WebformLibrariesTest.php
+++ b/tests/src/Functional/WebformLibrariesTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform libraries.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformLibrariesTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformListBuilderTest.php b/tests/src/Functional/WebformListBuilderTest.php
index 5b4b26d..cecd746 100644
--- a/tests/src/Functional/WebformListBuilderTest.php
+++ b/tests/src/Functional/WebformListBuilderTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform list builder.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformListBuilderTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformMailTest.php b/tests/src/Functional/WebformMailTest.php
index b4afb4b..5133c11 100644
--- a/tests/src/Functional/WebformMailTest.php
+++ b/tests/src/Functional/WebformMailTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Performs tests on the pluggable mailing framework.
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformMailTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformOptionsTest.php b/tests/src/Functional/WebformOptionsTest.php
index 26e7c84..17d4c66 100644
--- a/tests/src/Functional/WebformOptionsTest.php
+++ b/tests/src/Functional/WebformOptionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\webform\Entity\WebformOptions;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformOptions;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformRenderingTest.php b/tests/src/Functional/WebformRenderingTest.php
index 0cdf17b..1fb48e0 100644
--- a/tests/src/Functional/WebformRenderingTest.php
+++ b/tests/src/Functional/WebformRenderingTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Test\AssertMailTrait;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformRenderingTest extends WebformBrowserTestBase {
 
   use AssertMailTrait;
diff --git a/tests/src/Functional/WebformResultsDisabledTest.php b/tests/src/Functional/WebformResultsDisabledTest.php
index b37c461..c9eacce 100644
--- a/tests/src/Functional/WebformResultsDisabledTest.php
+++ b/tests/src/Functional/WebformResultsDisabledTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformResultsDisabledTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformResultsExportDownloadTest.php b/tests/src/Functional/WebformResultsExportDownloadTest.php
index 7e6f3ea..16d897c 100644
--- a/tests/src/Functional/WebformResultsExportDownloadTest.php
+++ b/tests/src/Functional/WebformResultsExportDownloadTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformResultsExportDownloadTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformResultsExportOptionsTest.php b/tests/src/Functional/WebformResultsExportOptionsTest.php
index ffa52d5..a0881a9 100644
--- a/tests/src/Functional/WebformResultsExportOptionsTest.php
+++ b/tests/src/Functional/WebformResultsExportOptionsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformResultsExportOptionsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionApiTest.php b/tests/src/Functional/WebformSubmissionApiTest.php
index 5c590b7..5548880 100644
--- a/tests/src/Functional/WebformSubmissionApiTest.php
+++ b/tests/src/Functional/WebformSubmissionApiTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\WebformSubmissionForm;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformSubmissionInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionApiTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionGenerateTest.php b/tests/src/Functional/WebformSubmissionGenerateTest.php
index de4706d..82c8aa3 100644
--- a/tests/src/Functional/WebformSubmissionGenerateTest.php
+++ b/tests/src/Functional/WebformSubmissionGenerateTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionGenerateTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionListBuilderBulkOperationsTest.php b/tests/src/Functional/WebformSubmissionListBuilderBulkOperationsTest.php
index 9dc2b7d..af4dcb8 100644
--- a/tests/src/Functional/WebformSubmissionListBuilderBulkOperationsTest.php
+++ b/tests/src/Functional/WebformSubmissionListBuilderBulkOperationsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionListBuilderBulkOperationsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionListBuilderCustomizeTest.php b/tests/src/Functional/WebformSubmissionListBuilderCustomizeTest.php
index b4bcc9c..fc1bec2 100644
--- a/tests/src/Functional/WebformSubmissionListBuilderCustomizeTest.php
+++ b/tests/src/Functional/WebformSubmissionListBuilderCustomizeTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionListBuilderCustomizeTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionListBuilderTest.php b/tests/src/Functional/WebformSubmissionListBuilderTest.php
index e1ea351..bb2cf77 100644
--- a/tests/src/Functional/WebformSubmissionListBuilderTest.php
+++ b/tests/src/Functional/WebformSubmissionListBuilderTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionListBuilderTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionStorageTest.php b/tests/src/Functional/WebformSubmissionStorageTest.php
index fecfd34..ae6fe47 100644
--- a/tests/src/Functional/WebformSubmissionStorageTest.php
+++ b/tests/src/Functional/WebformSubmissionStorageTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionStorageTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionTest.php b/tests/src/Functional/WebformSubmissionTest.php
index b8b369a..9f38bb6 100644
--- a/tests/src/Functional/WebformSubmissionTest.php
+++ b/tests/src/Functional/WebformSubmissionTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionTokenOperationsTest.php b/tests/src/Functional/WebformSubmissionTokenOperationsTest.php
index 69cbe73..a033cfb 100644
--- a/tests/src/Functional/WebformSubmissionTokenOperationsTest.php
+++ b/tests/src/Functional/WebformSubmissionTokenOperationsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionTokenOperationsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionUserLimitTest.php b/tests/src/Functional/WebformSubmissionUserLimitTest.php
index e205d39..192841b 100644
--- a/tests/src/Functional/WebformSubmissionUserLimitTest.php
+++ b/tests/src/Functional/WebformSubmissionUserLimitTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests per-user submission limit caching behavior.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionUserLimitTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionViewTest.php b/tests/src/Functional/WebformSubmissionViewTest.php
index 4f3513d..7dbb4f0 100644
--- a/tests/src/Functional/WebformSubmissionViewTest.php
+++ b/tests/src/Functional/WebformSubmissionViewTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\user\Entity\User;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionViewTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformSubmissionViewsAccessTest.php b/tests/src/Functional/WebformSubmissionViewsAccessTest.php
index 0eaf7bc..caca017 100644
--- a/tests/src/Functional/WebformSubmissionViewsAccessTest.php
+++ b/tests/src/Functional/WebformSubmissionViewsAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\Traits\WebformSubmissionViewAccessTrait;
 use Drupal\user\Entity\User;
 use Drupal\webform\Entity\Webform;
@@ -13,6 +15,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform_browser
  */
+#[Group('webform_browser')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionViewsAccessTest extends WebformBrowserTestBase {
 
   use WebformSubmissionViewAccessTrait;
diff --git a/tests/src/Functional/WebformSubmissionViewsTest.php b/tests/src/Functional/WebformSubmissionViewsTest.php
index 7818ff1..18d8d61 100644
--- a/tests/src/Functional/WebformSubmissionViewsTest.php
+++ b/tests/src/Functional/WebformSubmissionViewsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionViewsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/WebformThirdPartySettingsTest.php b/tests/src/Functional/WebformThirdPartySettingsTest.php
index 866b671..a6bc76f 100644
--- a/tests/src/Functional/WebformThirdPartySettingsTest.php
+++ b/tests/src/Functional/WebformThirdPartySettingsTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformThirdPartySettingsTest extends WebformBrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardAccessTest.php b/tests/src/Functional/Wizard/WebformWizardAccessTest.php
index 76a5364..1bdd6be 100644
--- a/tests/src/Functional/Wizard/WebformWizardAccessTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardAccessTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php b/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php
index c50af40..29aac15 100644
--- a/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\WebformInterface;
@@ -11,6 +13,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardAdvancedTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardBasicTest.php b/tests/src/Functional/Wizard/WebformWizardBasicTest.php
index 3d85613..0c8fd29 100644
--- a/tests/src/Functional/Wizard/WebformWizardBasicTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardBasicTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardBasicTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardConditionalTest.php b/tests/src/Functional/Wizard/WebformWizardConditionalTest.php
index 7aea0be..716bc75 100644
--- a/tests/src/Functional/Wizard/WebformWizardConditionalTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardConditionalTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\WebformInterface;
 
@@ -10,6 +12,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardConditionalTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardCustomTest.php b/tests/src/Functional/Wizard/WebformWizardCustomTest.php
index 91d676e..ab65a43 100644
--- a/tests/src/Functional/Wizard/WebformWizardCustomTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardCustomTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform custom wizard.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardCustomTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardLinksTest.php b/tests/src/Functional/Wizard/WebformWizardLinksTest.php
index fc80a1f..a0393e4 100644
--- a/tests/src/Functional/Wizard/WebformWizardLinksTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardLinksTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardLinksTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/Functional/Wizard/WebformWizardValidateTest.php b/tests/src/Functional/Wizard/WebformWizardValidateTest.php
index 02ac221..75803af 100644
--- a/tests/src/Functional/Wizard/WebformWizardValidateTest.php
+++ b/tests/src/Functional/Wizard/WebformWizardValidateTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\Functional\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests for webform wizard validation.
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardValidateTest extends WebformWizardTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php b/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php
index 3c03f27..e3644aa 100644
--- a/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformElementCheckboxesJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/Element/WebformElementComputedJavaScriptTest.php b/tests/src/FunctionalJavascript/Element/WebformElementComputedJavaScriptTest.php
index 96bbaf4..7178948 100644
--- a/tests/src/FunctionalJavascript/Element/WebformElementComputedJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/Element/WebformElementComputedJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformElementComputedJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/Element/WebformElementSignatureJavaScriptTest.php b/tests/src/FunctionalJavascript/Element/WebformElementSignatureJavaScriptTest.php
index 60a8627..e4a768a 100644
--- a/tests/src/FunctionalJavascript/Element/WebformElementSignatureJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/Element/WebformElementSignatureJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\Element;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformElementSignatureJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/Settings/WebformSettingsAjaxJavaScriptTest.php b/tests/src/FunctionalJavascript/Settings/WebformSettingsAjaxJavaScriptTest.php
index c86bfe6..1b3bdee 100644
--- a/tests/src/FunctionalJavascript/Settings/WebformSettingsAjaxJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/Settings/WebformSettingsAjaxJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\Settings;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformSettingsAjaxJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php b/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php
index 694dd00..d49bf69 100644
--- a/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesCustomJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php b/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php
index 4622b45..bf998e5 100644
--- a/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\States;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformStatesRequiredJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php b/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php
index 11c8704..a066bc0 100644
--- a/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\Variant;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformVariantRandomizeJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/WebformFilterJavaScriptTest.php b/tests/src/FunctionalJavascript/WebformFilterJavaScriptTest.php
index adb002c..e63f167 100644
--- a/tests/src/FunctionalJavascript/WebformFilterJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/WebformFilterJavaScriptTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests webform filter javascript.
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformFilterJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/WebformSubmissionListBuilderJavaScriptTest.php b/tests/src/FunctionalJavascript/WebformSubmissionListBuilderJavaScriptTest.php
index 7299855..11ea371 100644
--- a/tests/src/FunctionalJavascript/WebformSubmissionListBuilderJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/WebformSubmissionListBuilderJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformInterface;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionListBuilderJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/Wizard/WebformWizardBasicJavaScriptTest.php b/tests/src/FunctionalJavascript/Wizard/WebformWizardBasicJavaScriptTest.php
index f2a8342..48d7ebe 100644
--- a/tests/src/FunctionalJavascript/Wizard/WebformWizardBasicJavaScriptTest.php
+++ b/tests/src/FunctionalJavascript/Wizard/WebformWizardBasicJavaScriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\FunctionalJavascript\Wizard;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
 use Drupal\webform\Entity\Webform;
 
@@ -10,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  *
  * @group webform_javascript
  */
+#[Group('webform_javascript')]
+#[RunTestsInSeparateProcesses]
 class WebformWizardBasicJavaScriptTest extends WebformWebDriverTestBase {
 
   /**
diff --git a/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php b/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php
index 00e48cc..5021c5d 100644
--- a/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php
+++ b/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel\Breadcrumb;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -21,6 +23,7 @@ use Symfony\Component\DependencyInjection\Container;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformBreadcrumbBuilderTest extends UnitTestCase {
 
   /**
@@ -139,7 +142,6 @@ class WebformBreadcrumbBuilderTest extends UnitTestCase {
     // Add a translation manager for t().
     $translation_manager = $this->getStringTranslationStub();
     $property = new \ReflectionProperty('Drupal\webform\Breadcrumb\WebformBreadcrumbBuilder', 'stringTranslation');
-    $property->setAccessible(TRUE);
     $property->setValue($this->breadcrumbBuilder, $translation_manager);
 
     // Setup mock cache context container.
@@ -165,6 +167,7 @@ class WebformBreadcrumbBuilderTest extends UnitTestCase {
    * @dataProvider providerTestApplies
    * @covers ::applies
    */
+  #[DataProvider('providerTestApplies')]
   public function testApplies(bool $expected, ?string $route_name = NULL, array $parameter_map = []): void {
     foreach ($parameter_map as &$parameter_map_item) {
       foreach ($parameter_map_item as $index => $parameter_name) {
@@ -224,6 +227,7 @@ class WebformBreadcrumbBuilderTest extends UnitTestCase {
    * @dataProvider providerTestType
    * @covers ::applies
    */
+  #[DataProvider('providerTestType')]
   public function testType(?string $expected, ?string $route_name = NULL, array $parameter_map = []): void {
     foreach ($parameter_map as &$parameter_map_item) {
       foreach ($parameter_map_item as $index => $parameter_name) {
diff --git a/tests/src/Kernel/Entity/WebformEntityTest.php b/tests/src/Kernel/Entity/WebformEntityTest.php
index 3830e56..1a730aa 100644
--- a/tests/src/Kernel/Entity/WebformEntityTest.php
+++ b/tests/src/Kernel/Entity/WebformEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel\Entity;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Utility\WebformYaml;
@@ -14,6 +16,8 @@ use Drupal\webform\WebformInterface;
  * @group webform
  * @see \Drupal\webform\Entity\Webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/Entity/WebformOptionsEntityTest.php b/tests/src/Kernel/Entity/WebformOptionsEntityTest.php
index 534cbfb..446cd7a 100644
--- a/tests/src/Kernel/Entity/WebformOptionsEntityTest.php
+++ b/tests/src/Kernel/Entity/WebformOptionsEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel\Entity;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Entity\WebformOptions;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformOptions;
  * @group webform
  * @see \Drupal\webform\Entity\WebformOptions
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformOptionsEntityTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/Entity/WebformSubmissionEntityTest.php b/tests/src/Kernel/Entity/WebformSubmissionEntityTest.php
index 6b6711d..e310313 100644
--- a/tests/src/Kernel/Entity/WebformSubmissionEntityTest.php
+++ b/tests/src/Kernel/Entity/WebformSubmissionEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel\Entity;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  * @group webform
  * @see \Drupal\webform\Entity\WebformSubmission
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionEntityTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/Utility/WebformDialogHelperTest.php b/tests/src/Kernel/Utility/WebformDialogHelperTest.php
index 8c8ee16..12a0cd6 100644
--- a/tests/src/Kernel/Utility/WebformDialogHelperTest.php
+++ b/tests/src/Kernel/Utility/WebformDialogHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Utility\WebformDialogHelper;
 
@@ -12,6 +14,8 @@ use Drupal\webform\Utility\WebformDialogHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformDialogHelper
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformDialogHelperTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/WebformConditionTest.php b/tests/src/Kernel/WebformConditionTest.php
index f9b36d2..ca6d44a 100644
--- a/tests/src/Kernel/WebformConditionTest.php
+++ b/tests/src/Kernel/WebformConditionTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -11,6 +13,8 @@ use Drupal\webform\Entity\WebformSubmission;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformConditionTest extends EntityKernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/WebformEntityElementsValidationTest.php b/tests/src/Kernel/WebformEntityElementsValidationTest.php
index 3005b8f..035462b 100644
--- a/tests/src/Kernel/WebformEntityElementsValidationTest.php
+++ b/tests/src/Kernel/WebformEntityElementsValidationTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\KernelTests\KernelTestBase;
 
@@ -10,6 +12,8 @@ use Drupal\KernelTests\KernelTestBase;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformEntityElementsValidationTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/WebformSubmissionBatchExportTest.php b/tests/src/Kernel/WebformSubmissionBatchExportTest.php
index 78fe2f9..66d56e0 100644
--- a/tests/src/Kernel/WebformSubmissionBatchExportTest.php
+++ b/tests/src/Kernel/WebformSubmissionBatchExportTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Controller\WebformResultsExportController;
 use Drupal\webform\Entity\Webform;
@@ -13,6 +15,8 @@ use Drupal\webform\Entity\WebformSubmission;
  * @group webform
  * @coversDefaultClass \Drupal\webform\Controller\WebformResultsExportController
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionBatchExportTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/WebformSubmissionPurgeApiTest.php b/tests/src/Kernel/WebformSubmissionPurgeApiTest.php
index bfe44fa..b730da3 100644
--- a/tests/src/Kernel/WebformSubmissionPurgeApiTest.php
+++ b/tests/src/Kernel/WebformSubmissionPurgeApiTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +14,8 @@ use Drupal\webform\WebformSubmissionStorageInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionPurgeApiTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/WebformSubmissionStorageTest.php b/tests/src/Kernel/WebformSubmissionStorageTest.php
index 446e897..465d663 100644
--- a/tests/src/Kernel/WebformSubmissionStorageTest.php
+++ b/tests/src/Kernel/WebformSubmissionStorageTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\webform\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
@@ -12,6 +15,8 @@ use Drupal\webform\WebformSubmissionStorageInterface;
  *
  * @group webform
  */
+#[Group('webform')]
+#[RunTestsInSeparateProcesses]
 class WebformSubmissionStorageTest extends KernelTestBase {
 
   /**
@@ -56,6 +61,7 @@ class WebformSubmissionStorageTest extends KernelTestBase {
    *
    * @dataProvider providerPurge
    */
+  #[DataProvider('providerPurge')]
   public function testPurge($webform_purging, $webform_submissions_definition, $purged): void {
     $request_time = \Drupal::time()->getRequestTime();
     $days_to_seconds = 60 * 60 * 24;
diff --git a/tests/src/Unit/Access/WebformAccountAccessTest.php b/tests/src/Unit/Access/WebformAccountAccessTest.php
index bf7516b..654c3fe 100644
--- a/tests/src/Unit/Access/WebformAccountAccessTest.php
+++ b/tests/src/Unit/Access/WebformAccountAccessTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Unit\Access;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Access\AccessResult;
 use Drupal\webform\Access\WebformAccountAccess;
 
@@ -10,6 +11,7 @@ use Drupal\webform\Access\WebformAccountAccess;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformAccountAccessTest extends WebformAccessTestBase {
 
   /**
diff --git a/tests/src/Unit/Access/WebformSourceEntityAccessTest.php b/tests/src/Unit/Access/WebformSourceEntityAccessTest.php
index 2568185..d14b04b 100644
--- a/tests/src/Unit/Access/WebformSourceEntityAccessTest.php
+++ b/tests/src/Unit/Access/WebformSourceEntityAccessTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Unit\Access;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Access\AccessResult;
 use Drupal\webform\Access\WebformSourceEntityAccess;
 
@@ -10,6 +11,7 @@ use Drupal\webform\Access\WebformSourceEntityAccess;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformSourceEntityAccessTest extends WebformAccessTestBase {
 
   /**
diff --git a/tests/src/Unit/Access/WebformSubmissionAccessTest.php b/tests/src/Unit/Access/WebformSubmissionAccessTest.php
index 0a7ac47..50f123f 100644
--- a/tests/src/Unit/Access/WebformSubmissionAccessTest.php
+++ b/tests/src/Unit/Access/WebformSubmissionAccessTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Unit\Access;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\webform\Access\WebformSubmissionAccess;
@@ -11,6 +12,7 @@ use Drupal\webform\Access\WebformSubmissionAccess;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformSubmissionAccessTest extends WebformAccessTestBase {
 
   /**
diff --git a/tests/src/Unit/Cache/WebformBubbleableMetadataTest.php b/tests/src/Unit/Cache/WebformBubbleableMetadataTest.php
index 9e9b9ad..bd891ec 100644
--- a/tests/src/Unit/Cache/WebformBubbleableMetadataTest.php
+++ b/tests/src/Unit/Cache/WebformBubbleableMetadataTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Cache;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\Cache\Cache;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Cache\WebformBubbleableMetadata;
@@ -13,6 +15,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  * @coversDefaultClass \Drupal\webform\Cache\WebformBubbleableMetadata
  * @group Cache
  */
+#[Group('Cache')]
 class WebformBubbleableMetadataTest extends UnitTestCase {
 
   /**
@@ -29,6 +32,7 @@ class WebformBubbleableMetadataTest extends UnitTestCase {
    * @dataProvider providerTestAppendTo
    * @see \Drupal\Tests\Core\Cache\CacheableMetadataTest
    */
+  #[DataProvider('providerTestAppendTo')]
   public function testAppendTo(WebformBubbleableMetadata $bubbleable_metadata, array $build, array $expected): void {
     // Mock CacheContextsManager::assertValidTokens.
     // @see \Drupal\Core\Cache\Cache::mergeContexts
diff --git a/tests/src/Unit/Plugin/Block/WebformBlockTest.php b/tests/src/Unit/Plugin/Block/WebformBlockTest.php
index 54b96d6..65cdc0b 100644
--- a/tests/src/Unit/Plugin/Block/WebformBlockTest.php
+++ b/tests/src/Unit/Plugin/Block/WebformBlockTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Unit\Plugin\Block;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Cache\Context\CacheContextsManager;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
@@ -22,6 +23,7 @@ use Symfony\Component\HttpFoundation\RequestStack;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformBlockTest extends UnitTestCase {
 
   /**
diff --git a/tests/src/Unit/Plugin/WebformSourceEntity/QueryStringWebformSourceEntityTest.php b/tests/src/Unit/Plugin/WebformSourceEntity/QueryStringWebformSourceEntityTest.php
index 80940cc..069dfd7 100644
--- a/tests/src/Unit/Plugin/WebformSourceEntity/QueryStringWebformSourceEntityTest.php
+++ b/tests/src/Unit/Plugin/WebformSourceEntity/QueryStringWebformSourceEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Plugin\WebformSourceEntity;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
@@ -23,6 +25,7 @@ use Symfony\Component\HttpFoundation\RequestStack;
  *
  * @coversDefaultClass \Drupal\webform\Plugin\WebformSourceEntity\QueryStringWebformSourceEntity
  */
+#[Group('webform')]
 class QueryStringWebformSourceEntityTest extends UnitTestCase {
 
   /**
@@ -39,6 +42,7 @@ class QueryStringWebformSourceEntityTest extends UnitTestCase {
    *
    * @dataProvider providerGetCurrentSourceEntity
    */
+  #[DataProvider('providerGetCurrentSourceEntity')]
   public function testGetCurrentSourceEntity(array $options, $expect_source_entity, $assert_message = ''): void {
     $options += [
       // Value for the setting 'form_prepopulate_source_entity' of the webform.
diff --git a/tests/src/Unit/Plugin/WebformSourceEntity/RouteParametersWebformSourceEntityTest.php b/tests/src/Unit/Plugin/WebformSourceEntity/RouteParametersWebformSourceEntityTest.php
index a612749..85a6243 100644
--- a/tests/src/Unit/Plugin/WebformSourceEntity/RouteParametersWebformSourceEntityTest.php
+++ b/tests/src/Unit/Plugin/WebformSourceEntity/RouteParametersWebformSourceEntityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Plugin\WebformSourceEntity;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -16,6 +18,7 @@ use Symfony\Component\HttpFoundation\ParameterBag;
  *
  * @coversDefaultClass \Drupal\webform\Plugin\WebformSourceEntity\RouteParametersWebformSourceEntity
  */
+#[Group('webform')]
 class RouteParametersWebformSourceEntityTest extends UnitTestCase {
 
   /**
@@ -38,6 +41,7 @@ class RouteParametersWebformSourceEntityTest extends UnitTestCase {
    *
    * @dataProvider providerGetCurrentSourceEntity
    */
+  #[DataProvider('providerGetCurrentSourceEntity')]
   public function testGetCurrentSourceEntity(array $route_parameters, array $ignored_types, $expect_source_entity, $assert_message = ''): void {
     $route_match = $this->createMock(RouteMatchInterface::class);
 
diff --git a/tests/src/Unit/Plugin/views/field/WebformSubmissionBulkFormTest.php b/tests/src/Unit/Plugin/views/field/WebformSubmissionBulkFormTest.php
index 63d0e81..27b2d66 100644
--- a/tests/src/Unit/Plugin/views/field/WebformSubmissionBulkFormTest.php
+++ b/tests/src/Unit/Plugin/views/field/WebformSubmissionBulkFormTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Unit\Plugin\views\field;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -17,6 +18,7 @@ use Drupal\webform\Plugin\views\field\WebformSubmissionBulkForm;
  * @coversDefaultClass \Drupal\webform\Plugin\views\field\WebformSubmissionBulkForm
  * @group webform
  */
+#[Group('webform')]
 class WebformSubmissionBulkFormTest extends UnitTestCase {
 
   /**
diff --git a/tests/src/Unit/Utility/WebformArrayHelperTest.php b/tests/src/Unit/Utility/WebformArrayHelperTest.php
index 47ad1d4..fb9cec7 100644
--- a/tests/src/Unit/Utility/WebformArrayHelperTest.php
+++ b/tests/src/Unit/Utility/WebformArrayHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformArrayHelper;
 
@@ -12,6 +14,7 @@ use Drupal\webform\Utility\WebformArrayHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformArrayHelper
  */
+#[Group('webform')]
 class WebformArrayHelperTest extends UnitTestCase {
 
   /**
@@ -28,6 +31,7 @@ class WebformArrayHelperTest extends UnitTestCase {
    *
    * @dataProvider providerToString
    */
+  #[DataProvider('providerToString')]
   public function testToString(array $array, $conjunction, $expected): void {
     $result = WebformArrayHelper::toString($array, $conjunction);
     $this->assertEquals($expected, $result);
@@ -59,6 +63,7 @@ class WebformArrayHelperTest extends UnitTestCase {
    *
    * @dataProvider providerIsAssociative
    */
+  #[DataProvider('providerIsAssociative')]
   public function testIsAssociative(array $array, $expected): void {
     $result = WebformArrayHelper::IsAssociative($array);
     $this->assertEquals($expected, $result);
@@ -94,6 +99,7 @@ class WebformArrayHelperTest extends UnitTestCase {
    *
    * @dataProvider providerInArray
    */
+  #[DataProvider('providerInArray')]
   public function testInArray(array $needles, array $haystack, $expected): void {
     $result = WebformArrayHelper::InArray($needles, $haystack);
     $this->assertEquals($expected, $result);
@@ -173,6 +179,7 @@ class WebformArrayHelperTest extends UnitTestCase {
    *
    * @dataProvider providerEqual
    */
+  #[DataProvider('providerEqual')]
   public function testEqual(array $a, array $b, $expected): void {
     $result = WebformArrayHelper::equal($a, $b);
     $this->assertEquals($expected, $result);
diff --git a/tests/src/Unit/Utility/WebformElementHelperTest.php b/tests/src/Unit/Utility/WebformElementHelperTest.php
index 053490b..3d9865b 100644
--- a/tests/src/Unit/Utility/WebformElementHelperTest.php
+++ b/tests/src/Unit/Utility/WebformElementHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\Render\Markup;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformElementHelper;
@@ -13,6 +15,7 @@ use Drupal\webform\Utility\WebformElementHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformElementHelper
  */
+#[Group('webform')]
 class WebformElementHelperTest extends UnitTestCase {
 
   /**
@@ -27,6 +30,7 @@ class WebformElementHelperTest extends UnitTestCase {
    *
    * @dataProvider providerIsTitleDisplayed
    */
+  #[DataProvider('providerIsTitleDisplayed')]
   public function testIsTitleDisplayed(array $element, $expected): void {
     $result = WebformElementHelper::IsTitleDisplayed($element);
     $this->assertEquals($expected, $result, serialize($element));
@@ -59,6 +63,7 @@ class WebformElementHelperTest extends UnitTestCase {
    *
    * @dataProvider providerGetIgnoredProperties
    */
+  #[DataProvider('providerGetIgnoredProperties')]
   public function testGetIgnoredProperties(array $element, $expected): void {
     $result = WebformElementHelper::getIgnoredProperties($element);
     $this->assertEquals($expected, $result);
@@ -106,6 +111,7 @@ class WebformElementHelperTest extends UnitTestCase {
    *
    * @dataProvider providerRemoveIgnoredProperties
    */
+  #[DataProvider('providerRemoveIgnoredProperties')]
   public function testRemoveIgnoredProperties(array $element, $expected): void {
     $result = WebformElementHelper::removeIgnoredProperties($element);
     $this->assertEquals($expected, $result);
@@ -186,6 +192,7 @@ class WebformElementHelperTest extends UnitTestCase {
    *
    * @dataProvider providerConvertRenderMarkupToStrings
    */
+  #[DataProvider('providerConvertRenderMarkupToStrings')]
   public function testConvertRenderMarkupToStrings(array $elements, $expected): void {
     WebformElementHelper::convertRenderMarkupToStrings($elements);
     $this->assertEquals($expected, $elements);
@@ -221,6 +228,7 @@ class WebformElementHelperTest extends UnitTestCase {
    *
    * @dataProvider providerHasProperty
    */
+  #[DataProvider('providerHasProperty')]
   public function testHasProperty(array $arguments, $expected): void {
     $result = WebformElementHelper::hasProperty($arguments[0], $arguments[1], $arguments[2]);
     $this->assertEquals($expected, $result);
diff --git a/tests/src/Unit/Utility/WebformFormHelperTest.php b/tests/src/Unit/Utility/WebformFormHelperTest.php
index a941937..4932bd1 100644
--- a/tests/src/Unit/Utility/WebformFormHelperTest.php
+++ b/tests/src/Unit/Utility/WebformFormHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformFormHelper;
 
@@ -12,6 +14,7 @@ use Drupal\webform\Utility\WebformFormHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformFormHelper
  */
+#[Group('webform')]
 class WebformFormHelperTest extends UnitTestCase {
 
   /**
@@ -28,6 +31,7 @@ class WebformFormHelperTest extends UnitTestCase {
    *
    * @dataProvider providerCleanupFormStateValues
    */
+  #[DataProvider('providerCleanupFormStateValues')]
   public function testCleanupFormStateValues(array $values, array $keys, $expected): void {
     $result = WebformFormHelper::cleanupFormStateValues($values, $keys);
     $this->assertEquals($expected, $result);
diff --git a/tests/src/Unit/Utility/WebformHtmlHelperTest.php b/tests/src/Unit/Utility/WebformHtmlHelperTest.php
index 031e49b..5cb04c5 100644
--- a/tests/src/Unit/Utility/WebformHtmlHelperTest.php
+++ b/tests/src/Unit/Utility/WebformHtmlHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformHtmlHelper;
@@ -13,6 +15,7 @@ use Drupal\webform\Utility\WebformHtmlHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformHtmlHelper
  */
+#[Group('webform')]
 class WebformHtmlHelperTest extends UnitTestCase {
 
   /**
@@ -27,6 +30,7 @@ class WebformHtmlHelperTest extends UnitTestCase {
    *
    * @dataProvider providerToPlainText
    */
+  #[DataProvider('providerToPlainText')]
   public function testToPlainText($text, $expected): void {
     $config_factory = $this->getConfigFactoryStub([
       'webform.settings' => ['element' => ['allowed_tags' => 'b']],
@@ -67,6 +71,7 @@ class WebformHtmlHelperTest extends UnitTestCase {
    *
    * @dataProvider providerToHtmlMarkup
    */
+  #[DataProvider('providerToHtmlMarkup')]
   public function testToHtmlMarkup($text, $expected): void {
     $config_factory = $this->getConfigFactoryStub([
       'webform.settings' => ['element' => ['allowed_tags' => 'b']],
@@ -107,6 +112,7 @@ class WebformHtmlHelperTest extends UnitTestCase {
    *
    * @dataProvider providerContainsHtml
    */
+  #[DataProvider('providerContainsHtml')]
   public function testContainsHtml($text, $expected): void {
     $result = WebformHtmlHelper::containsHtml($text);
     $this->assertEquals($expected, $result, $text);
@@ -136,6 +142,7 @@ class WebformHtmlHelperTest extends UnitTestCase {
    *
    * @dataProvider providerHasBlockTags
    */
+  #[DataProvider('providerHasBlockTags')]
   public function testHasBlockTags($text, $expected): void {
     $result = WebformHtmlHelper::hasBlockTags($text);
     $this->assertEquals($expected, $result, $text);
diff --git a/tests/src/Unit/Utility/WebformObjectHelperTest.php b/tests/src/Unit/Utility/WebformObjectHelperTest.php
index 704b227..82d582a 100644
--- a/tests/src/Unit/Utility/WebformObjectHelperTest.php
+++ b/tests/src/Unit/Utility/WebformObjectHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformObjectHelper;
 
@@ -12,6 +14,7 @@ use Drupal\webform\Utility\WebformObjectHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformObjectHelper
  */
+#[Group('webform')]
 class WebformObjectHelperTest extends UnitTestCase {
 
   /**
@@ -26,6 +29,7 @@ class WebformObjectHelperTest extends UnitTestCase {
    *
    * @dataProvider providerSortByProperty
    */
+  #[DataProvider('providerSortByProperty')]
   public function testSortByProperty($object, array $expected): void {
     $result = (array) WebformObjectHelper::sortByProperty($object);
     $this->assertEquals(
diff --git a/tests/src/Unit/Utility/WebformOptionsHelperTest.php b/tests/src/Unit/Utility/WebformOptionsHelperTest.php
index 8900fba..60609aa 100644
--- a/tests/src/Unit/Utility/WebformOptionsHelperTest.php
+++ b/tests/src/Unit/Utility/WebformOptionsHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformOptionsHelper;
 
@@ -12,6 +14,7 @@ use Drupal\webform\Utility\WebformOptionsHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformOptionsHelper
  */
+#[Group('webform')]
 class WebformOptionsHelperTest extends UnitTestCase {
 
   /**
@@ -28,6 +31,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerHasOption
    */
+  #[DataProvider('providerHasOption')]
   public function testHasOption($value, array $options, $expected): void {
     $result = WebformOptionsHelper::hasOption($value, $options);
     $this->assertEquals($expected, $result);
@@ -63,6 +67,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerGetOptionText
    */
+  #[DataProvider('providerGetOptionText')]
   public function testGetOptionText($value, array $options, $options_description, $expected): void {
     $result = WebformOptionsHelper::getOptionText($value, $options, $options_description);
     $this->assertEquals($expected, $result);
@@ -149,6 +154,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerGetOptionsText
    */
+  #[DataProvider('providerGetOptionsText')]
   public function testGetOptionsText(array $values, array $options, $expected): void {
     $result = WebformOptionsHelper::getOptionsText($values, $options);
     $this->assertEquals($expected, $result);
@@ -178,6 +184,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerConvertOptionsToString
    */
+  #[DataProvider('providerConvertOptionsToString')]
   public function testConvertOptionsToString(array $options, $expected): void {
     $result = WebformOptionsHelper::convertOptionsToString($options);
     $this->assertEquals($expected, $result);
@@ -206,6 +213,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerRange
    */
+  #[DataProvider('providerRange')]
   public function testRange(array $element, $expected): void {
     $element += [
       '#min' => 1,
@@ -251,6 +259,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerEncodeConfig
    */
+  #[DataProvider('providerEncodeConfig')]
   public function testEncodeConfig(array $options, $expected): void {
     $result = WebformOptionsHelper::encodeConfig($options);
     $this->assertEquals($expected, $result);
@@ -285,6 +294,7 @@ class WebformOptionsHelperTest extends UnitTestCase {
    *
    * @dataProvider providerDecodeConfig
    */
+  #[DataProvider('providerDecodeConfig')]
   public function testDecodeConfig(array $options, $expected): void {
     $result = WebformOptionsHelper::decodeConfig($options);
     $this->assertEquals($expected, $result);
diff --git a/tests/src/Unit/Utility/WebformReflectionHelperTest.php b/tests/src/Unit/Utility/WebformReflectionHelperTest.php
index 7ef3c17..9c72122 100644
--- a/tests/src/Unit/Utility/WebformReflectionHelperTest.php
+++ b/tests/src/Unit/Utility/WebformReflectionHelperTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformReflectionHelper;
 
@@ -12,6 +14,7 @@ use Drupal\webform\Utility\WebformReflectionHelper;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformReflectionHelper
  */
+#[Group('webform')]
 class WebformReflectionHelperTest extends UnitTestCase {
 
   /**
@@ -29,6 +32,7 @@ class WebformReflectionHelperTest extends UnitTestCase {
    *
    * @dataProvider providerGetParentClasses
    */
+  #[DataProvider('providerGetParentClasses')]
   public function testGetParentClasses($object, $base_class_name, $expected): void {
     $result = WebformReflectionHelper::getParentClasses($object, $base_class_name);
     $this->assertEquals($expected, $result);
diff --git a/tests/src/Unit/Utility/WebformYamlTest.php b/tests/src/Unit/Utility/WebformYamlTest.php
index 7447ee7..f2339af 100644
--- a/tests/src/Unit/Utility/WebformYamlTest.php
+++ b/tests/src/Unit/Utility/WebformYamlTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Tests\UnitTestCase;
 use Drupal\webform\Utility\WebformYaml;
@@ -13,6 +15,7 @@ use Drupal\webform\Utility\WebformYaml;
  *
  * @coversDefaultClass \Drupal\webform\Utility\WebformYaml
  */
+#[Group('webform')]
 class WebformYamlTest extends UnitTestCase {
 
   /**
@@ -27,6 +30,7 @@ class WebformYamlTest extends UnitTestCase {
    *
    * @dataProvider providerTidy
    */
+  #[DataProvider('providerTidy')]
   public function testTidy(array $data, $expected): void {
     $result = WebformYaml::tidy(Yaml::encode($data));
     $this->assertEquals($expected, $result);
@@ -77,6 +81,7 @@ class WebformYamlTest extends UnitTestCase {
    *
    * @dataProvider providerDecode
    */
+  #[DataProvider('providerDecode')]
   public function testDecode($yaml, $expected): void {
     $result = WebformYaml::decode($yaml);
     $this->assertEquals($expected, $result);
@@ -139,6 +144,7 @@ class WebformYamlTest extends UnitTestCase {
    *
    * @dataProvider providerEncode
    */
+  #[DataProvider('providerEncode')]
   public function testEncode($yaml, $expected): void {
     $result = WebformYaml::encode($yaml);
     $this->assertEquals($expected, $result);
diff --git a/tests/src/Unit/WebformEntityAccessControlHandlerTest.php b/tests/src/Unit/WebformEntityAccessControlHandlerTest.php
index 9fd93d4..256e98d 100644
--- a/tests/src/Unit/WebformEntityAccessControlHandlerTest.php
+++ b/tests/src/Unit/WebformEntityAccessControlHandlerTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityType;
@@ -26,6 +28,7 @@ use Symfony\Component\HttpFoundation\RequestStack;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformEntityAccessControlHandlerTest extends UnitTestCase {
 
   use StringTranslationTrait;
@@ -70,6 +73,7 @@ class WebformEntityAccessControlHandlerTest extends UnitTestCase {
    *
    * @dataProvider providerCheckAccess
    */
+  #[DataProvider('providerCheckAccess')]
   public function testCheckAccess($operation, array $options, array $expected, $assert_message = ''): void {
     // Set $options default value.
     $options += [
diff --git a/tests/src/Unit/WebformMessageManagerTest.php b/tests/src/Unit/WebformMessageManagerTest.php
index 0cedfa7..df9b3c8 100644
--- a/tests/src/Unit/WebformMessageManagerTest.php
+++ b/tests/src/Unit/WebformMessageManagerTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Messenger\MessengerInterface;
@@ -21,6 +22,7 @@ use Psr\Log\LoggerInterface;
  *
  * @group webform
  */
+#[Group('webform')]
 class WebformMessageManagerTest extends UnitTestCase {
 
   /**
diff --git a/webform.module b/webform.module
index e210817..f299e2e 100644
--- a/webform.module
+++ b/webform.module
@@ -5,6 +5,7 @@
  * Enables the creation of webforms and questionnaires.
  */
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Hook\Attribute\LegacyHook;
 use Drupal\Core\Hook\Attribute\LegacyModuleImplementsAlter;
 use Drupal\webform\Hook\WebformHooks;
@@ -187,8 +188,8 @@ function webform_entity_delete(EntityInterface $entity) {
 function _webform_clear_webform_submission_list_cache_tag(EntityInterface $entity) {
   if ($entity->getEntityTypeId() === 'user') {
     $original_target_ids = [];
-    if ($entity->original) {
-      foreach ($entity->original->roles as $item) {
+    if (DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->getOriginal(), fn() => $entity->original)) {
+      foreach (DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->getOriginal(), fn() => $entity->original)->roles as $item) {
         $original_target_ids[$item->target_id] = $item->target_id;
       }
     }
diff --git a/webform.services.yml b/webform.services.yml
index ea248e5..e7a4d82 100644
--- a/webform.services.yml
+++ b/webform.services.yml
@@ -215,3 +215,23 @@ services:
   Drupal\webform\Hook\WebformHooks:
     class: Drupal\webform\Hook\WebformHooks
     autowire: true
+
+  Drupal\webform\Hook\WebformEditorHooks1:
+    class: Drupal\webform\Hook\WebformEditorHooks1
+    autowire: true
+
+  Drupal\webform\Hook\WebformFormAlterHooks1:
+    class: Drupal\webform\Hook\WebformFormAlterHooks1
+    autowire: true
+
+  Drupal\webform\Hook\WebformOptionsHooks:
+    class: Drupal\webform\Hook\WebformOptionsHooks
+    autowire: true
+
+  Drupal\webform\Hook\WebformThemeHooks1:
+    class: Drupal\webform\Hook\WebformThemeHooks1
+    autowire: true
+
+  Drupal\webform\Hook\WebformTranslationHooks1:
+    class: Drupal\webform\Hook\WebformTranslationHooks1
+    autowire: true
