diff --git a/includes/webform.theme.inc b/includes/webform.theme.inc
index 806a2962..78ef45a0 100644
--- a/includes/webform.theme.inc
+++ b/includes/webform.theme.inc
@@ -80,6 +80,9 @@ function webform_theme() {
     'webform_submission_information' => [
       'variables' => ['webform_submission' => NULL, 'source_entity' => NULL, 'open' => TRUE],
     ],
+    'webform_submission_data' => [
+      'render element' => 'elements',
+    ],
 
     'webform_element_base_html' => [
       'variables' => ['element' => [], 'value' => NULL, 'webform_submission' => NULL, 'options' => []],
@@ -910,22 +913,22 @@ function webform_theme_suggestions_webform_preview(array $variables) {
 /**
  * Implements hook_theme_suggestions_HOOK().
  */
-function webform_theme_suggestions_webform_submission_navigation(array $variables) {
-  return _webform_theme_suggestions($variables, 'webform_submission_navigation');
+function webform_theme_suggestions_webform_submission(array $variables) {
+  return _webform_theme_suggestions($variables, 'webform_submission');
 }
 
 /**
  * Implements hook_theme_suggestions_HOOK().
  */
-function webform_theme_suggestions_webform_submission(array $variables) {
-  return _webform_theme_suggestions($variables, 'webform_submission');
+function webform_theme_suggestions_webform_submission_form(array $variables) {
+  return _webform_theme_suggestions($variables, 'webform_submission_form');
 }
 
 /**
  * Implements hook_theme_suggestions_HOOK().
  */
-function webform_theme_suggestions_webform_submission_form(array $variables) {
-  return _webform_theme_suggestions($variables, 'webform_submission_form');
+function webform_theme_suggestions_webform_submission_navigation(array $variables) {
+  return _webform_theme_suggestions($variables, 'webform_submission_navigation');
 }
 
 /**
@@ -935,6 +938,13 @@ function webform_theme_suggestions_webform_submission_information(array $variabl
   return _webform_theme_suggestions($variables, 'webform_submission_information');
 }
 
+/**
+ * Implements hook_theme_suggestions_HOOK().
+ */
+function webform_theme_suggestions_webform_submission_data(array $variables) {
+  return _webform_theme_suggestions($variables, 'webform_submission_data');
+}
+
 /**
  * Implements hook_theme_suggestions_HOOK().
  */
diff --git a/includes/webform.theme.template.inc b/includes/webform.theme.template.inc
index b94eb8ed..7a65b0d3 100644
--- a/includes/webform.theme.template.inc
+++ b/includes/webform.theme.template.inc
@@ -294,6 +294,25 @@ function template_preprocess_webform_submission(array &$variables) {
   }
 }
 
+/**
+ * Prepares variables for webform submission data templates.
+ *
+ * Default template: webform-submission-data.html.twig.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - data: An array of elements to display in view mode.
+ *   - webform_submission: The webform submissions object.
+ *   - view_mode: View mode; e.g., 'html', 'text', 'table', 'yaml', etc.
+ */
+function template_preprocess_webform_submission_data(array &$variables) {
+  $variables['view_mode'] = $variables['elements']['#view_mode'];
+  $variables['webform_submission'] = $variables['elements']['#webform_submission'];
+  if ($variables['webform_submission'] instanceof WebformSubmissionInterface) {
+    $variables['webform'] = $variables['webform_submission']->getWebform();
+  }
+}
+
 /**
  * Prepares variables for webform submission information template.
  *
diff --git a/src/WebformSubmissionViewBuilder.php b/src/WebformSubmissionViewBuilder.php
index 6ef69d5c..05071c50 100644
--- a/src/WebformSubmissionViewBuilder.php
+++ b/src/WebformSubmissionViewBuilder.php
@@ -82,11 +82,13 @@ class WebformSubmissionViewBuilder extends EntityViewBuilder implements WebformS
   protected function getBuildDefaults(EntityInterface $entity, $view_mode) {
     $build = parent::getBuildDefaults($entity, $view_mode);
     // The webform submission will be rendered in the wrapped webform submission
-    // template already and thus has no entity template itself.
+    // template already. Instead we are going to wrap the rendered submission
+    // in a webform submission data template.
     // @see \Drupal\contact_storage\ContactMessageViewBuilder
     // @see \Drupal\comment\CommentViewBuilder::getBuildDefaults
     // @see \Drupal\block_content\BlockContentViewBuilder::getBuildDefaults
-    unset($build['#theme']);
+    // @see webform-submission-data.html.twig
+    $build['#theme'] = 'webform_submission_data';
     return $build;
   }
 
diff --git a/templates/webform-submission-data.html.twig b/templates/webform-submission-data.html.twig
new file mode 100644
index 00000000..b94570cd
--- /dev/null
+++ b/templates/webform-submission-data.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Default theme implementation for webform submission data.
+ *
+ * Available variables:
+ * - webform_submission: The webform submission.
+ * - webform: The webform.
+ *
+ * @see template_preprocess_webform_submission_data()
+ *
+ * @ingroup themeable
+ */
+#}
+{%
+set classes = [
+'webform-submission-data',
+'webform-submission-data--webform-' ~ webform.id()|clean_class,
+view_mode ? 'webform-submission-data--view-mode-' ~ view_mode|clean_class,
+]
+%}
+<div{{ attributes.addClass(classes) }}>
+{{ elements }}
+</div>
