diff --git a/core/lib/Drupal/Core/Render/Element/RenderElement.php b/core/lib/Drupal/Core/Render/Element/RenderElement.php
index 243a9af767..460f154bd0 100644
--- a/core/lib/Drupal/Core/Render/Element/RenderElement.php
+++ b/core/lib/Drupal/Core/Render/Element/RenderElement.php
@@ -204,6 +204,11 @@ public static function preRenderGroup($element) {
       }
     }
 
+    // Set attributes to indicate that there is a child with an error.
+    if (!empty($element['#children_errors'])) {
+      $element['#attributes']['class'][] = 'error';
+    }
+
     return $element;
   }
 
diff --git a/core/misc/vertical-tabs.js b/core/misc/vertical-tabs.js
index c7ad2fd2b4..94821e3e84 100644
--- a/core/misc/vertical-tabs.js
+++ b/core/misc/vertical-tabs.js
@@ -60,7 +60,8 @@
           var $that = $(this);
           var vertical_tab = new Drupal.verticalTab({
             title: $that.find('> summary').text(),
-            details: $that
+            details: $that,
+            children_errors: $that.hasClass('error')
           });
           tab_list.append(vertical_tab.item);
           $that
@@ -246,6 +247,11 @@
         .append(tab.summary = $('<span class="vertical-tabs__menu-item-summary"></span>')
         )
       );
+
+    if (settings.children_errors) {
+      tab.item.addClass('error');
+    }
+
     return tab;
   };
 
diff --git a/core/themes/classy/css/components/form.css b/core/themes/classy/css/components/form.css
index 15b8ec23c2..80d088fa09 100644
--- a/core/themes/classy/css/components/form.css
+++ b/core/themes/classy/css/components/form.css
@@ -88,12 +88,15 @@ abbr.ajax-changed {
 }
 .form-item input.error,
 .form-item textarea.error,
-.form-item select.error {
+.form-item select.error,
+.entity-meta details.error,
+.entity-meta details[open].error {
   border: 2px solid red;
 }
 
 /* Inline error messages. */
-.form-item--error-message:before {
+.form-item--error-message:before,
+details.error summary:after {
   content: '';
   display: inline-block;
   height: 14px;
@@ -102,3 +105,6 @@ abbr.ajax-changed {
   background: url(../../../../misc/icons/e32700/error.svg) no-repeat;
   background-size: contain;
 }
+details.error summary:after {
+  float: right;
+}
