diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index b1a911a..1b3ea31 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -997,6 +997,7 @@ function template_preprocess_tablesort_indicator(&$variables) {
  * @see https://www.drupal.org/node/1842756
  */
 function template_preprocess_item_list(&$variables) {
+  $variables['wrapper_attributes'] = new Attribute($variables['wrapper_attributes']);
   foreach ($variables['items'] as &$item) {
     $attributes = array();
     // If the item value is an array, then it is a render array.
@@ -1708,7 +1709,7 @@ function drupal_common_theme() {
       'variables' => array('status' => MARK_NEW),
     ),
     'item_list' => array(
-      'variables' => array('items' => array(), 'title' => '', 'list_type' => 'ul', 'attributes' => array(), 'empty' => NULL, 'context' => array()),
+      'variables' => array('items' => array(), 'title' => '', 'list_type' => 'ul', 'wrapper_attributes' => array(), 'attributes' => array(), 'empty' => NULL, 'context' => array()),
     ),
     'feed_icon' => array(
       'variables' => array('url' => NULL, 'title' => NULL),
diff --git a/core/modules/datetime/src/Tests/DateTimeFieldTest.php b/core/modules/datetime/src/Tests/DateTimeFieldTest.php
index 69f3725..3b54a2a 100644
--- a/core/modules/datetime/src/Tests/DateTimeFieldTest.php
+++ b/core/modules/datetime/src/Tests/DateTimeFieldTest.php
@@ -589,14 +589,14 @@ function testDatelistWidget() {
   protected function datelistDataProvider() {
     return [
       // Year only selected, validation error on Month, Day, Hour, Minute.
-      [['year' => 2012, 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], '4 errors have been found:   MonthDayHourMinute'],
+      [['year' => 2012, 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], '4 errors have been found: MonthDayHourMinute'],
       // Year and Month selected, validation error on Day, Hour, Minute.
-      [['year' => 2012, 'month' => '12', 'day' => '', 'hour' => '', 'minute' => ''], '3 errors have been found:   DayHourMinute'],
+      [['year' => 2012, 'month' => '12', 'day' => '', 'hour' => '', 'minute' => ''], '3 errors have been found: DayHourMinute'],
       // Year, Month and Day selected, validation error on Hour, Minute.
-      [['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '', 'minute' => ''], '2 errors have been found:   HourMinute'],
+      [['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '', 'minute' => ''], '2 errors have been found: HourMinute'],
       // Year, Month, Day and Hour selected, validation error on Minute only.
-      [['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => ''], '1 error has been found:   Minute'],
-    ];
+      [['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => ''], '1 error has been found: Minute'],
+     ];
   }
 
   /**
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php b/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php
index cdd56cc..0956896 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php
+++ b/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php
@@ -275,7 +275,7 @@ public function testFieldAdminHandler() {
     $this->drupalPostForm('node/add/' . $this->type, $edit, t('Save'));
 
     // Assert that entity reference autocomplete field is validated.
-    $this->assertText(t('1 error has been found:   Test Entity Reference Field'), 'Node save failed when required entity reference field was not correctly filled.');
+    $this->assertText(t('1 error has been found: Test Entity Reference Field'), 'Node save failed when required entity reference field was not correctly filled.');
     $this->assertText(t('There are no entities matching "@entity"', ['@entity' => 'Test']));
 
     $edit = array(
@@ -286,7 +286,7 @@ public function testFieldAdminHandler() {
 
     // Assert the results multiple times to avoid sorting problem of nodes with
     // the same title.
-    $this->assertText(t('1 error has been found:   Test Entity Reference Field'));
+    $this->assertText(t('1 error has been found: Test Entity Reference Field'));
     $this->assertText(t('Multiple entities match this reference;'));
     $this->assertText(t("@node1", ['@node1' => $node1->getTitle() . ' (' . $node1->id() . ')']));
     $this->assertText(t("@node2", ['@node2' => $node2->getTitle() . ' (' . $node2->id() . ')']));
diff --git a/core/modules/file/src/Tests/FileFieldValidateTest.php b/core/modules/file/src/Tests/FileFieldValidateTest.php
index ab1d2a5..89bac43 100644
--- a/core/modules/file/src/Tests/FileFieldValidateTest.php
+++ b/core/modules/file/src/Tests/FileFieldValidateTest.php
@@ -35,7 +35,7 @@ function testRequired() {
     $edit = array();
     $edit['title[0][value]'] = $this->randomMachineName();
     $this->drupalPostForm('node/add/' . $type_name, $edit, t('Save and publish'));
-    $this->assertText('1 error has been found:   ' . $field->label(), 'Node save failed when required file field was empty.');
+    $this->assertText('1 error has been found: ' . $field->label(), 'Node save failed when required file field was empty.');
     $this->assertIdentical(1, count($this->xpath('//div[contains(concat(" ", normalize-space(@class), " "), :class)]//a', [':class' => ' messages--error '])), 'There is one link in the error message.');
 
     // Create a new node with the uploaded file.
@@ -57,7 +57,7 @@ function testRequired() {
     $edit = array();
     $edit['title[0][value]'] = $this->randomMachineName();
     $this->drupalPostForm('node/add/' . $type_name, $edit, t('Save and publish'));
-    $this->assertText('1 error has been found:   '  . $field->label(), 'Node save failed when required multiple value file field was empty.');
+    $this->assertText('1 error has been found: ' . $field->label(), 'Node save failed when required multiple value file field was empty.');
     $this->assertIdentical(1, count($this->xpath('//div[contains(concat(" ", normalize-space(@class), " "), :class)]//a', [':class' => ' messages--error '])), 'There is one link in the error message.');
 
     // Create a new node with the uploaded file into the multivalue field.
diff --git a/core/modules/system/system.libraries.yml b/core/modules/system/system.libraries.yml
index 96b2f28..e79fc06 100644
--- a/core/modules/system/system.libraries.yml
+++ b/core/modules/system/system.libraries.yml
@@ -11,6 +11,7 @@ base:
       css/components/clearfix.module.css: { weight: -10 }
       css/components/details.module.css: { weight: -10 }
       css/components/hidden.module.css: { weight: -10 }
+      css/components/item-list.module.css: { weight: -10 }
       css/components/js.module.css: { weight: -10 }
       css/components/nowrap.module.css: { weight: -10 }
       css/components/position-container.module.css: { weight: -10 }
@@ -19,6 +20,27 @@ base:
       css/components/resize.module.css: { weight: -10 }
       css/components/sticky-header.module.css: { weight: -10 }
       css/components/tabledrag.module.css: { weight: -10 }
+    theme:
+      css/components/action-links.theme.css: { weight: -10 }
+      css/components/breadcrumb.theme.css: { weight: -10 }
+      css/components/button.theme.css: { weight: -10 }
+      css/components/collapse-processed.theme.css: { weight: -10 }
+      css/components/container-inline.theme.css: { weight: -10 }
+      css/components/details.theme.css: { weight: -10 }
+      css/components/field.theme.css: { weight: -10 }
+      css/components/form.theme.css: { weight: -10 }
+      css/components/icons.theme.css: { weight: -10 }
+      css/components/inline-form.theme.css: { weight: -10 }
+      css/components/link.theme.css: { weight: -10 }
+      css/components/links.theme.css: { weight: -10 }
+      css/components/menu.theme.css: { weight: -10 }
+      css/components/messages.theme.css: { weight: -10 }
+      css/components/progress.theme.css: { weight: -10 }
+      css/components/tableselect.theme.css: { weight: -10 }
+      css/components/tabledrag.theme.css: { weight: -10 }
+      css/components/tablesort.theme.css: { weight: -10 }
+      css/components/tabs.theme.css: { weight: -10 }
+      css/components/textarea.theme.css: { weight: -10 }
       css/components/tree-child.module.css: { weight: -10 }
 
 admin:
diff --git a/core/modules/system/templates/item-list.html.twig b/core/modules/system/templates/item-list.html.twig
index 172799d..1462cf4 100644
--- a/core/modules/system/templates/item-list.html.twig
+++ b/core/modules/system/templates/item-list.html.twig
@@ -9,6 +9,7 @@
  *   - value: The content of the list element.
  * - title: The title of the list.
  * - list_type: The tag for list element ("ul" or "ol").
+ * - wrapper_attributes: HTML attributes to be applied to the list wrapper.
  * - attributes: HTML attributes to be applied to the list.
  * - empty: A message to display when there are no items. Allowed value is a
  *   string or render array.
@@ -21,9 +22,9 @@
  */
 #}
 {% if context.list_style %}
-  {% set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
+  {%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
 {% endif %}
-{%- if items or empty -%}
+{% if items or empty %}
   {%- if title is not empty -%}
     <h3>{{ title }}</h3>
   {%- endif -%}
diff --git a/core/themes/bartik/css/components/item-list.css b/core/themes/bartik/css/components/item-list.css
index 943aef2..51a69c8 100644
--- a/core/themes/bartik/css/components/item-list.css
+++ b/core/themes/bartik/css/components/item-list.css
@@ -25,6 +25,5 @@
 .item-list .item-list__comma-list li,
 [dir="rtl"] .item-list .item-list__comma-list,
 [dir="rtl"] .item-list .item-list__comma-list li {
-  margin: 0;
   padding: 0;
 }
diff --git a/core/themes/classy/classy.libraries.yml b/core/themes/classy/classy.libraries.yml
index 67477a8..70f34b1 100644
--- a/core/themes/classy/classy.libraries.yml
+++ b/core/themes/classy/classy.libraries.yml
@@ -24,6 +24,12 @@ base:
       css/components/tablesort.css: { weight: -10 }
       css/components/tabs.css: { weight: -10 }
       css/components/textarea.css: { weight: -10 }
+    theme:
+      # We can not attach this in the item-list.html.twig template since it is
+      # often used during RendererInterface::renderPlain().
+      css/components/item-list.css: { weight: -10 }
+    layout:
+      css/layout.css: {}
 
 book-navigation:
   version: VERSION
diff --git a/core/themes/classy/templates/dataset/item-list.html.twig b/core/themes/classy/templates/dataset/item-list.html.twig
index 7ba8be4..20541b0 100644
--- a/core/themes/classy/templates/dataset/item-list.html.twig
+++ b/core/themes/classy/templates/dataset/item-list.html.twig
@@ -9,6 +9,7 @@
  *   - value: The content of the list element.
  * - title: The title of the list.
  * - list_type: The tag for list element ("ul" or "ol").
+ * - wrapper_attributes: HTML attributes to be applied to the list wrapper.
  * - attributes: HTML attributes to be applied to the list.
  * - empty: A message to display when there are no items. Allowed value is a
  *   string or render array.
@@ -19,10 +20,11 @@
  */
 #}
 {% if context.list_style %}
-  {% set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
+  {%- set wrapper_attributes = wrapper_attributes.addClass('item-list--' ~ context.list_style) %}
+  {%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
 {% endif %}
-{%- if items or empty -%}
-  <div class="item-list">
+{% if items or empty -%}
+  <div{{ wrapper_attributes.addClass('item-list') }}>
     {%- if title is not empty -%}
       <h3>{{ title }}</h3>
     {%- endif -%}
diff --git a/core/themes/seven/css/components/menus-and-lists.css b/core/themes/seven/css/components/menus-and-lists.css
index 0dc37a6..4a86554 100644
--- a/core/themes/seven/css/components/menus-and-lists.css
+++ b/core/themes/seven/css/components/menus-and-lists.css
@@ -38,7 +38,4 @@ ul.inline li {
 ul.inline li {
   display: inline;
 }
-.item-list .item-list__comma-list,
-[dir="rtl"] .item-list .item-list__comma-list {
-  margin: 0;
-}
+
