diff --git a/core/includes/common.inc b/core/includes/common.inc
index 4a789c8..b4b3423 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -458,12 +458,12 @@ function format_xml_elements($array) {
  *
  * For example:
  * @code
- *   $output = format_plural($node->comment_count, '1 comment', '@count comments');
+ *   $output = \Drupal::translation()->formatPlural($node->comment_count, '1 comment', '@count comments');
  * @endcode
  *
  * Example with additional replacements:
  * @code
- *   $output = format_plural($update_count,
+ *   $output = \Drupal::translation()->formatPlural($update_count,
  *     'Changed the content type of 1 post from %old-type to %new-type.',
  *     'Changed the content type of @count posts from %old-type to %new-type.',
  *     array('%old-type' => $info->old_type, '%new-type' => $info->new_type));
@@ -516,7 +516,7 @@ function format_plural($count, $singular, $plural, array $args = array(), array
  */
 function format_size($size, $langcode = NULL) {
   if ($size < Bytes::KILOBYTE) {
-    return format_plural($size, '1 byte', '@count bytes', array(), array('langcode' => $langcode));
+    return \Drupal::translation()->formatPlural($size, '1 byte', '@count bytes', array(), array('langcode' => $langcode));
   }
   else {
     $size = $size / Bytes::KILOBYTE; // Convert bytes to kilobytes.
diff --git a/core/includes/form.inc b/core/includes/form.inc
index 5aafe81..37a1c54 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -773,7 +773,7 @@ function template_preprocess_form_element_label(&$variables) {
  *   // The 'success' parameter means no fatal PHP errors were detected. All
  *   // other error management should be handled using 'results'.
  *   if ($success) {
- *     $message = format_plural(count($results), 'One post processed.', '@count posts processed.');
+ *     $message = \Drupal::translation()->formatPlural(count($results), 'One post processed.', '@count posts processed.');
  *   }
  *   else {
  *     $message = t('Finished with an error.');
diff --git a/core/lib/Drupal/Core/Extension/InfoParser.php b/core/lib/Drupal/Core/Extension/InfoParser.php
index de1b24a..be57c40 100644
--- a/core/lib/Drupal/Core/Extension/InfoParser.php
+++ b/core/lib/Drupal/Core/Extension/InfoParser.php
@@ -41,7 +41,7 @@ public function parse($filename) {
         }
         $missing_keys = array_diff($this->getRequiredKeys(), array_keys(static::$parsedInfos[$filename]));
         if (!empty($missing_keys)) {
-          $message = format_plural(count($missing_keys), 'Missing required key (!missing_keys) in !file.', 'Missing required keys (!missing_keys) in !file.', array('!missing_keys' => implode(', ', $missing_keys), '!file' => $filename));
+          $message = \Drupal::translation()->formatPlural(count($missing_keys), 'Missing required key (!missing_keys) in !file.', 'Missing required keys (!missing_keys) in !file.', array('!missing_keys' => implode(', ', $missing_keys), '!file' => $filename));
           throw new InfoParserException($message);
         }
         if (isset(static::$parsedInfos[$filename]['version']) && static::$parsedInfos[$filename]['version'] === 'VERSION') {
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/NumericFormatterBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/NumericFormatterBase.php
index d261ded..abad1c2 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/NumericFormatterBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/NumericFormatterBase.php
@@ -77,8 +77,8 @@ public function viewElements(FieldItemListInterface $items) {
       if ($this->getSetting('prefix_suffix')) {
         $prefixes = isset($settings['prefix']) ? array_map(array($this, 'fieldFilterXss'), explode('|', $settings['prefix'])) : array('');
         $suffixes = isset($settings['suffix']) ? array_map(array($this, 'fieldFilterXss'), explode('|', $settings['suffix'])) : array('');
-        $prefix = (count($prefixes) > 1) ? format_plural($item->value, $prefixes[0], $prefixes[1]) : $prefixes[0];
-        $suffix = (count($suffixes) > 1) ? format_plural($item->value, $suffixes[0], $suffixes[1]) : $suffixes[0];
+        $prefix = (count($prefixes) > 1) ? \Drupal::translation()->formatPlural($item->value, $prefixes[0], $prefixes[1]) : $prefixes[0];
+        $suffix = (count($suffixes) > 1) ? \Drupal::translation()->formatPlural($item->value, $suffixes[0], $suffixes[1]) : $suffixes[0];
         $output = $prefix . $output . $suffix;
       }
       // Output the raw value in a content attribute if the text of the HTML
diff --git a/core/lib/Drupal/Core/StringTranslation/StringTranslationTrait.php b/core/lib/Drupal/Core/StringTranslation/StringTranslationTrait.php
index efb6030..85a6e3f 100644
--- a/core/lib/Drupal/Core/StringTranslation/StringTranslationTrait.php
+++ b/core/lib/Drupal/Core/StringTranslation/StringTranslationTrait.php
@@ -12,8 +12,8 @@
  *
  * Using this trait will add t() and formatPlural() methods to the class. These
  * must be used for every translatable string, similar to how procedural code
- * must use the global functions t() and format_plural(). This allows string
- * extractor tools to find translatable strings.
+ * must use the global functions t() and \Drupal::translation()->formatPlural().
+ * This allows string extractor tools to find translatable strings.
  *
  * If the class is capable of injecting services from the container, it should
  * inject the 'string_translation' service and assign it to
diff --git a/core/lib/Drupal/Core/Validation/DrupalTranslator.php b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
index 01302ce..096d067 100644
--- a/core/lib/Drupal/Core/Validation/DrupalTranslator.php
+++ b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
@@ -41,7 +41,7 @@ public function transChoice($id, $number, array $parameters = array(), $domain =
     if (!isset($ids[1])) {
       throw new \InvalidArgumentException(sprintf('The message "%s" cannot be pluralized, because it is missing a plural (e.g. "There is one apple|There are @count apples").', $id));
     }
-    return format_plural($number, $ids[0], $ids[1], $this->processParameters($parameters), $this->getOptions($domain, $locale));
+    return \Drupal::translation()->formatPlural($number, $ids[0], $ids[1], $this->processParameters($parameters), $this->getOptions($domain, $locale));
   }
 
   /**
diff --git a/core/misc/drupal.js b/core/misc/drupal.js
index ce13994..37a2df0 100644
--- a/core/misc/drupal.js
+++ b/core/misc/drupal.js
@@ -336,8 +336,8 @@ if (window.jQuery) {
    * Drupal.t() is called by this function, make sure not to pass
    * already-localized strings to it.
    *
-   * See the documentation of the server-side format_plural() function for
-   * further details.
+   * See the documentation of the server-side \Drupal::translation()->formatPlural()
+   * function for further details.
    *
    * @param {Number} count
    *   The item count to display.
diff --git a/core/modules/aggregator/src/Plugin/aggregator/processor/DefaultProcessor.php b/core/modules/aggregator/src/Plugin/aggregator/processor/DefaultProcessor.php
index fdc10dc..8a1d92b 100644
--- a/core/modules/aggregator/src/Plugin/aggregator/processor/DefaultProcessor.php
+++ b/core/modules/aggregator/src/Plugin/aggregator/processor/DefaultProcessor.php
@@ -149,7 +149,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
 
     $lengths = array(0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000);
     $options = array_map(function($length) {
-      return ($length == 0) ? t('Unlimited') : format_plural($length, '1 character', '@count characters');
+      return ($length == 0) ? t('Unlimited') : \Drupal::translation()->formatPlural($length, '1 character', '@count characters');
     }, array_combine($lengths, $lengths));
 
     $form['processors'][$info['id']]['aggregator_teaser_length'] = array(
diff --git a/core/modules/block_content/src/Form/BlockContentDeleteForm.php b/core/modules/block_content/src/Form/BlockContentDeleteForm.php
index 1d7724d..43b2659 100644
--- a/core/modules/block_content/src/Form/BlockContentDeleteForm.php
+++ b/core/modules/block_content/src/Form/BlockContentDeleteForm.php
@@ -44,7 +44,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $instances = $this->entity->getInstances();
 
     $form['message'] = array(
-      '#markup' => format_plural(count($instances), 'This will also remove 1 placed block instance.', 'This will also remove @count placed block instances.'),
+      '#markup' => \Drupal::translation()->formatPlural(count($instances), 'This will also remove 1 placed block instance.', 'This will also remove @count placed block instances.'),
       '#access' => !empty($instances),
     );
 
diff --git a/core/modules/block_content/src/Form/BlockContentTypeDeleteForm.php b/core/modules/block_content/src/Form/BlockContentTypeDeleteForm.php
index 65fe352..a4541d6 100644
--- a/core/modules/block_content/src/Form/BlockContentTypeDeleteForm.php
+++ b/core/modules/block_content/src/Form/BlockContentTypeDeleteForm.php
@@ -71,7 +71,7 @@ public function getConfirmText() {
   public function buildForm(array $form, FormStateInterface $form_state) {
     $blocks = $this->queryFactory->get('block_content')->condition('type', $this->entity->id())->execute();
     if (!empty($blocks)) {
-      $caption = '<p>' . format_plural(count($blocks), '%label is used by 1 custom block on your site. You can not remove this block type until you have removed all of the %label blocks.', '%label is used by @count custom blocks on your site. You may not remove %label until you have removed all of the %label custom blocks.', array('%label' => $this->entity->label())) . '</p>';
+      $caption = '<p>' . \Drupal::translation()->formatPlural(count($blocks), '%label is used by 1 custom block on your site. You can not remove this block type until you have removed all of the %label blocks.', '%label is used by @count custom blocks on your site. You may not remove %label until you have removed all of the %label custom blocks.', array('%label' => $this->entity->label())) . '</p>';
       $form['description'] = array('#markup' => $caption);
       return $form;
     }
diff --git a/core/modules/block_content/src/Tests/BlockContentCreationTest.php b/core/modules/block_content/src/Tests/BlockContentCreationTest.php
index 7956d1d..c10a2ac 100644
--- a/core/modules/block_content/src/Tests/BlockContentCreationTest.php
+++ b/core/modules/block_content/src/Tests/BlockContentCreationTest.php
@@ -183,7 +183,7 @@ public function testBlockDelete() {
 
     // Delete the block.
     $this->drupalGet('block/1/delete');
-    $this->assertText(format_plural(1, 'This will also remove 1 placed block instance.', 'This will also remove @count placed block instance.'));
+    $this->assertText(\Drupal::translation()->formatPlural(1, 'This will also remove 1 placed block instance.', 'This will also remove @count placed block instance.'));
 
     $this->drupalPostForm(NULL, array(), 'Delete');
     $this->assertRaw(t('Custom block %name has been deleted.', array('%name' => $edit['info[0][value]'])));
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 08cfb36..ac0a49c 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -533,7 +533,7 @@ function comment_node_search_result(EntityInterface $node) {
   // Do not make a string if there are no comment fields, or no comments exist
   // or all comment fields are hidden.
   if ($comments > 0 || $open) {
-    return array('comment' => format_plural($comments, '1 comment', '@count comments'));
+    return array('comment' => \Drupal::translation()->formatPlural($comments, '1 comment', '@count comments'));
   }
 }
 
diff --git a/core/modules/comment/config/install/views.view.comments_recent.yml b/core/modules/comment/config/install/views.view.comments_recent.yml
index 7a4b559..98b0ce1 100644
--- a/core/modules/comment/config/install/views.view.comments_recent.yml
+++ b/core/modules/comment/config/install/views.view.comments_recent.yml
@@ -45,7 +45,6 @@ display:
           row_class: ''
           default_row_class: true
           type: ul
-          wrapper_class: item-list
           class: ''
         provider: views
       row:
diff --git a/core/modules/comment/src/Form/ConfirmDeleteMultiple.php b/core/modules/comment/src/Form/ConfirmDeleteMultiple.php
index f6c8a6e..adbb4ad 100644
--- a/core/modules/comment/src/Form/ConfirmDeleteMultiple.php
+++ b/core/modules/comment/src/Form/ConfirmDeleteMultiple.php
@@ -122,7 +122,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       $this->commentStorage->delete($this->comments);
       $count = count($form_state->getValue('comments'));
       $this->logger('content')->notice('Deleted @count comments.', array('@count' => $count));
-      drupal_set_message(format_plural($count, 'Deleted 1 comment.', 'Deleted @count comments.'));
+      drupal_set_message(\Drupal::translation()->formatPlural($count, 'Deleted 1 comment.', 'Deleted @count comments.'));
     }
     $form_state->setRedirectUrl($this->getCancelUrl());
   }
diff --git a/core/modules/comment/src/Tests/CommentNonNodeTest.php b/core/modules/comment/src/Tests/CommentNonNodeTest.php
index 15eb7b7..59e5598 100644
--- a/core/modules/comment/src/Tests/CommentNonNodeTest.php
+++ b/core/modules/comment/src/Tests/CommentNonNodeTest.php
@@ -205,7 +205,7 @@ function performCommentOperation($comment, $operation, $approval = FALSE) {
 
     if ($operation == 'delete') {
       $this->drupalPostForm(NULL, array(), t('Delete comments'));
-      $this->assertRaw(format_plural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation "@operation" was performed on comment.', array('@operation' => $operation)));
+      $this->assertRaw(\Drupal::translation()->formatPlural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation "@operation" was performed on comment.', array('@operation' => $operation)));
     }
     else {
       $this->assertText(t('The update has been performed.'), format_string('Operation "@operation" was performed on comment.', array('@operation' => $operation)));
diff --git a/core/modules/comment/src/Tests/CommentTestBase.php b/core/modules/comment/src/Tests/CommentTestBase.php
index d86e3d4..26e1720 100644
--- a/core/modules/comment/src/Tests/CommentTestBase.php
+++ b/core/modules/comment/src/Tests/CommentTestBase.php
@@ -345,7 +345,7 @@ function performCommentOperation(CommentInterface $comment, $operation, $approva
 
     if ($operation == 'delete') {
       $this->drupalPostForm(NULL, array(), t('Delete comments'));
-      $this->assertRaw(format_plural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation "@operation" was performed on comment.', array('@operation' => $operation)));
+      $this->assertRaw(\Drupal::translation()->formatPlural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation "@operation" was performed on comment.', array('@operation' => $operation)));
     }
     else {
       $this->assertText(t('The update has been performed.'), format_string('Operation "@operation" was performed on comment.', array('@operation' => $operation)));
diff --git a/core/modules/config/src/Form/ConfigSync.php b/core/modules/config/src/Form/ConfigSync.php
index f73de96..f9aba22 100644
--- a/core/modules/config/src/Form/ConfigSync.php
+++ b/core/modules/config/src/Form/ConfigSync.php
@@ -238,19 +238,19 @@ public function buildForm(array $form, FormStateInterface $form_state) {
         );
         switch ($config_change_type) {
           case 'create':
-            $form[$collection][$config_change_type]['heading']['#value'] = format_plural(count($config_names), '@count new', '@count new');
+            $form[$collection][$config_change_type]['heading']['#value'] = \Drupal::translation()->formatPlural(count($config_names), '@count new', '@count new');
             break;
 
           case 'update':
-            $form[$collection][$config_change_type]['heading']['#value'] = format_plural(count($config_names), '@count changed', '@count changed');
+            $form[$collection][$config_change_type]['heading']['#value'] = \Drupal::translation()->formatPlural(count($config_names), '@count changed', '@count changed');
             break;
 
           case 'delete':
-            $form[$collection][$config_change_type]['heading']['#value'] = format_plural(count($config_names), '@count removed', '@count removed');
+            $form[$collection][$config_change_type]['heading']['#value'] = \Drupal::translation()->formatPlural(count($config_names), '@count removed', '@count removed');
             break;
 
           case 'rename':
-            $form[$collection][$config_change_type]['heading']['#value'] = format_plural(count($config_names), '@count renamed', '@count renamed');
+            $form[$collection][$config_change_type]['heading']['#value'] = \Drupal::translation()->formatPlural(count($config_names), '@count renamed', '@count renamed');
             break;
         }
         $form[$collection][$config_change_type]['list'] = array(
diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc
index 3e88433..57c402e 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -175,7 +175,7 @@ function template_preprocess_file_upload_help(&$variables) {
       $descriptions[] = t('Unlimited number of files can be uploaded to this field.');
     }
     else {
-      $descriptions[] = format_plural($cardinality, 'One file only.', 'Maximum @count files.');
+      $descriptions[] = \Drupal::translation()->formatPlural($cardinality, 'One file only.', 'Maximum @count files.');
     }
   }
   if (isset($upload_validators['file_validate_size'])) {
diff --git a/core/modules/file/src/Tests/FileManagedTestBase.php b/core/modules/file/src/Tests/FileManagedTestBase.php
index 3147f73..031a1a7 100644
--- a/core/modules/file/src/Tests/FileManagedTestBase.php
+++ b/core/modules/file/src/Tests/FileManagedTestBase.php
@@ -80,7 +80,7 @@ function assertFileHookCalled($hook, $expected_count = 1, $message = NULL) {
         $message = format_string('hook_file_@name was called correctly.', array('@name' => $hook));
       }
       elseif ($expected_count == 0) {
-        $message = format_plural($actual_count, 'hook_file_@name was not expected to be called but was actually called once.', 'hook_file_@name was not expected to be called but was actually called @count times.', array('@name' => $hook, '@count' => $actual_count));
+        $message = \Drupal::translation()->formatPlural($actual_count, 'hook_file_@name was not expected to be called but was actually called once.', 'hook_file_@name was not expected to be called but was actually called @count times.', array('@name' => $hook, '@count' => $actual_count));
       }
       else {
         $message = format_string('hook_file_@name was expected to be called %expected times but was called %actual times.', array('@name' => $hook, '%expected' => $expected_count, '%actual' => $actual_count));
diff --git a/core/modules/file/src/Tests/FileManagedUnitTestBase.php b/core/modules/file/src/Tests/FileManagedUnitTestBase.php
index 051601a..c770202 100644
--- a/core/modules/file/src/Tests/FileManagedUnitTestBase.php
+++ b/core/modules/file/src/Tests/FileManagedUnitTestBase.php
@@ -92,7 +92,7 @@ function assertFileHookCalled($hook, $expected_count = 1, $message = NULL) {
         $message = format_string('hook_file_@name was called correctly.', array('@name' => $hook));
       }
       elseif ($expected_count == 0) {
-        $message = format_plural($actual_count, 'hook_file_@name was not expected to be called but was actually called once.', 'hook_file_@name was not expected to be called but was actually called @count times.', array('@name' => $hook, '@count' => $actual_count));
+        $message = \Drupal::translation()->formatPlural($actual_count, 'hook_file_@name was not expected to be called but was actually called once.', 'hook_file_@name was not expected to be called but was actually called @count times.', array('@name' => $hook, '@count' => $actual_count));
       }
       else {
         $message = format_string('hook_file_@name was expected to be called %expected times but was called %actual times.', array('@name' => $hook, '%expected' => $expected_count, '%actual' => $actual_count));
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 1b15b3e..3760168 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -563,7 +563,7 @@ function template_preprocess_forums(&$variables) {
           $page_number = \Drupal::entityManager()->getStorage('comment')
             ->getNewCommentPageNumber($topic->comment_count, $topic->new_replies, $topic, 'comment_forum');
           $query = $page_number ? array('page' => $page_number) : NULL;
-          $variables['topics'][$id]->new_text = format_plural($topic->new_replies, '1 new post<span class="visually-hidden"> in topic %title</span>', '@count new posts<span class="visually-hidden"> in topic %title</span>', array('%title' => $variables['topics'][$id]->label()));
+          $variables['topics'][$id]->new_text = \Drupal::translation()->formatPlural($topic->new_replies, '1 new post<span class="visually-hidden"> in topic %title</span>', '@count new posts<span class="visually-hidden"> in topic %title</span>', array('%title' => $variables['topics'][$id]->label()));
           $variables['topics'][$id]->new_url = \Drupal::url('entity.node.canonical', ['node' => $topic->id()], ['query' => $query, 'fragment' => 'new']);
         }
 
@@ -645,7 +645,7 @@ function template_preprocess_forum_list(&$variables) {
     if ($user->isAuthenticated()) {
       $variables['forums'][$id]->new_topics = \Drupal::service('forum_manager')->unreadTopics($forum->id(), $user->id());
       if ($variables['forums'][$id]->new_topics) {
-        $variables['forums'][$id]->new_text = format_plural($variables['forums'][$id]->new_topics, '1 new post<span class="visually-hidden"> in forum %title</span>', '@count new posts<span class="visually-hidden"> in forum %title</span>', array('%title' => $variables['forums'][$id]->label()));
+        $variables['forums'][$id]->new_text = \Drupal::translation()->formatPlural($variables['forums'][$id]->new_topics, '1 new post<span class="visually-hidden"> in forum %title</span>', '@count new posts<span class="visually-hidden"> in forum %title</span>', array('%title' => $variables['forums'][$id]->label()));
         $variables['forums'][$id]->new_url = \Drupal::url('forum.page', ['taxonomy_term' => $forum->id()], ['fragment' => 'new']);
         $variables['forums'][$id]->icon_class = 'new';
         $variables['forums'][$id]->icon_title = t('New posts');
diff --git a/core/modules/forum/src/Tests/ForumTest.php b/core/modules/forum/src/Tests/ForumTest.php
index ebda138..c33d7a7 100644
--- a/core/modules/forum/src/Tests/ForumTest.php
+++ b/core/modules/forum/src/Tests/ForumTest.php
@@ -163,7 +163,7 @@ function testForum() {
 
     // Verify the number of unread topics.
     $unread_topics = $this->container->get('forum_manager')->unreadTopics($this->forum['tid'], $this->edit_any_topics_user->id());
-    $unread_topics = format_plural($unread_topics, '1 new post', '@count new posts');
+    $unread_topics = \Drupal::translation()->formatPlural($unread_topics, '1 new post', '@count new posts');
     $xpath = $this->buildXPathQuery('//tr[@id=:forum]//td[@class="topics"]//a', $forum_arg);
     $this->assertFieldByXPath($xpath, $unread_topics, 'Number of unread topics found.');
     // Verify that the forum name is in the unread topics text.
diff --git a/core/modules/locale/locale.batch.inc b/core/modules/locale/locale.batch.inc
index 67ce5d8..eb57555 100644
--- a/core/modules/locale/locale.batch.inc
+++ b/core/modules/locale/locale.batch.inc
@@ -94,15 +94,15 @@ function locale_translation_batch_status_finished($success, $results) {
   if ($success) {
     if (isset($results['failed_files'])) {
       if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {
-        $message = format_plural(count($results['failed_files']), 'One translation file could not be checked. <a href="@url">See the log</a> for details.', '@count translation files could not be checked. <a href="@url">See the log</a> for details.', array('@url' => \Drupal::url('dblog.overview')));
+        $message = \Drupal::translation()->formatPlural(count($results['failed_files']), 'One translation file could not be checked. <a href="@url">See the log</a> for details.', '@count translation files could not be checked. <a href="@url">See the log</a> for details.', array('@url' => \Drupal::url('dblog.overview')));
       }
       else {
-        $message = format_plural(count($results['failed_files']), 'One translation files could not be checked. See the log for details.', '@count translation files could not be checked. See the log for details.');
+        $message = \Drupal::translation()->formatPlural(count($results['failed_files']), 'One translation files could not be checked. See the log for details.', '@count translation files could not be checked. See the log for details.');
       }
       drupal_set_message($message, 'error');
     }
     if (isset($results['files'])) {
-      drupal_set_message(format_plural(
+      drupal_set_message(\Drupal::translation()->formatPlural(
         count($results['files']),
         'Checked available interface translation updates for one project.',
         'Checked available interface translation updates for @count projects.'
diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc
index 83cd425..7a3ed12 100644
--- a/core/modules/locale/locale.bulk.inc
+++ b/core/modules/locale/locale.bulk.inc
@@ -350,10 +350,10 @@ function locale_translate_batch_finished($success, $results) {
     $additions = $updates = $deletes = $skips = $config = 0;
     if (isset($results['failed_files'])) {
       if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {
-        $message = format_plural(count($results['failed_files']), 'One translation file could not be imported. <a href="@url">See the log</a> for details.', '@count translation files could not be imported. <a href="@url">See the log</a> for details.', array('@url' => \Drupal::url('dblog.overview')));
+        $message = \Drupal::translation()->formatPlural(count($results['failed_files']), 'One translation file could not be imported. <a href="@url">See the log</a> for details.', '@count translation files could not be imported. <a href="@url">See the log</a> for details.', array('@url' => \Drupal::url('dblog.overview')));
       }
       else {
-        $message = format_plural(count($results['failed_files']), 'One translation file could not be imported. See the log for details.', '@count translation files could not be imported. See the log for details.');
+        $message = \Drupal::translation()->formatPlural(count($results['failed_files']), 'One translation file could not be imported. See the log for details.', '@count translation files could not be imported. See the log for details.');
       }
       drupal_set_message($message, 'error');
     }
@@ -372,7 +372,7 @@ function locale_translate_batch_finished($success, $results) {
           }
         }
       }
-      drupal_set_message(format_plural(count($results['files']),
+      drupal_set_message(\Drupal::translation()->formatPlural(count($results['files']),
         'One translation file imported. %number translations were added, %update translations were updated and %delete translations were removed.',
         '@count translation files imported. %number translations were added, %update translations were updated and %delete translations were removed.',
         array('%number' => $additions, '%update' => $updates, '%delete' => $deletes)
@@ -381,10 +381,10 @@ function locale_translate_batch_finished($success, $results) {
 
       if ($skips) {
         if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {
-          $message = format_plural($skips, 'One translation string was skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', '@count translation strings were skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', array('@url' => \Drupal::url('dblog.overview')));
+          $message = \Drupal::translation()->formatPlural($skips, 'One translation string was skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', '@count translation strings were skipped because of disallowed or malformed HTML. <a href="@url">See the log</a> for details.', array('@url' => \Drupal::url('dblog.overview')));
         }
         else {
-          $message = format_plural($skips, 'One translation string was skipped because of disallowed or malformed HTML. See the log for details.', '@count translation strings were skipped because of disallowed or malformed HTML. See the log for details.');
+          $message = \Drupal::translation()->formatPlural($skips, 'One translation string was skipped because of disallowed or malformed HTML. See the log for details.', '@count translation strings were skipped because of disallowed or malformed HTML. See the log for details.');
         }
         drupal_set_message($message, 'warning');
         $logger->warning('@count disallowed HTML string(s) in files: @files.', array('@count' => $skips, '@files' => implode(',', $skipped_files)));
diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc
index 3ff2a15..1934956 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -118,7 +118,7 @@ function template_preprocess_locale_translation_update_info(&$variables) {
   // Build output for updates not found.
   if (isset($variables['not_found'])) {
     $releases = array();
-    $variables['missing_updates_status'] = format_plural(count($variables['not_found']), 'Missing translations for one project', 'Missing translations for @count projects');
+    $variables['missing_updates_status'] = \Drupal::translation()->formatPlural(count($variables['not_found']), 'Missing translations for one project', 'Missing translations for @count projects');
     if ($variables['not_found']) {
       foreach ($variables['not_found'] as $update) {
         $version = $update['version'] ? $update['version'] : t('no version');
diff --git a/core/modules/locale/src/Form/TranslateEditForm.php b/core/modules/locale/src/Form/TranslateEditForm.php
index 131612f..b3d04bf 100644
--- a/core/modules/locale/src/Form/TranslateEditForm.php
+++ b/core/modules/locale/src/Form/TranslateEditForm.php
@@ -117,7 +117,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
             for ($i = 0; $i < $plural_formulas[$langcode]['plurals']; $i++) {
               $form['strings'][$string->lid]['translations'][$i] = array(
                 '#type' => 'textarea',
-                '#title' => ($i == 0 ? $this->t('Singular form') : format_plural($i, 'First plural form', '@count. plural form')),
+                '#title' => ($i == 0 ? $this->t('Singular form') : \Drupal::translation()->formatPlural($i, 'First plural form', '@count. plural form')),
                 '#rows' => $rows,
                 '#default_value' => isset($translation_array[$i]) ? $translation_array[$i] : '',
                 '#attributes' => array('lang' => $langcode),
diff --git a/core/modules/locale/src/Tests/LocalePluralFormatTest.php b/core/modules/locale/src/Tests/LocalePluralFormatTest.php
index 7d9f1dc..f11e9a8 100644
--- a/core/modules/locale/src/Tests/LocalePluralFormatTest.php
+++ b/core/modules/locale/src/Tests/LocalePluralFormatTest.php
@@ -34,7 +34,7 @@ protected function setUp() {
   }
 
   /**
-   * Tests locale_get_plural() and format_plural() functionality.
+   * Tests locale_get_plural() and \Drupal::translation()->formatPlural() functionality.
    */
   public function testGetPluralFormat() {
     // Import some .po files with formulas to set up the environment.
@@ -129,7 +129,7 @@ public function testGetPluralFormat() {
         // expected index as per the logic for translation lookups.
         $expected_plural_index = ($count == 1) ? 0 : $expected_plural_index;
         $expected_plural_string = str_replace('@count', $count, $plural_strings[$langcode][$expected_plural_index]);
-        $this->assertIdentical(format_plural($count, '1 hour', '@count hours', array(), array('langcode' => $langcode)), $expected_plural_string, 'Plural translation of 1 hours / @count hours for count ' . $count . ' in ' . $langcode . ' is ' . $expected_plural_string);
+        $this->assertIdentical(\Drupal::translation()->formatPlural($count, '1 hour', '@count hours', array(), array('langcode' => $langcode)), $expected_plural_string, 'Plural translation of 1 hours / @count hours for count ' . $count . ' in ' . $langcode . ' is ' . $expected_plural_string);
       }
     }
   }
@@ -217,7 +217,7 @@ public function testPluralEditExport() {
     // langcode here because the language will be English by default and will
     // not save our source string for performance optimization if we do not ask
     // specifically for a language.
-    format_plural(1, '1 day', '@count days', array(), array('langcode' => 'fr'));
+    \Drupal::translation()->formatPlural(1, '1 day', '@count days', array(), array('langcode' => 'fr'));
     $lid = db_query("SELECT lid FROM {locales_source} WHERE source = :source AND context = ''", array(':source' => "1 day" . LOCALE_PLURAL_DELIMITER . "@count days"))->fetchField();
     // Look up editing page for this plural string and check fields.
     $search = array(
diff --git a/core/modules/menu_ui/src/Form/MenuDeleteForm.php b/core/modules/menu_ui/src/Form/MenuDeleteForm.php
index 2d72b84..b177362 100644
--- a/core/modules/menu_ui/src/Form/MenuDeleteForm.php
+++ b/core/modules/menu_ui/src/Form/MenuDeleteForm.php
@@ -76,7 +76,7 @@ public function getDescription() {
     $caption = '';
     $num_links = $this->menuLinkManager->countMenuLinks($this->entity->id());
     if ($num_links) {
-      $caption .= '<p>' . format_plural($num_links, '<strong>Warning:</strong> There is currently 1 menu link in %title. It will be deleted (system-defined items will be reset).', '<strong>Warning:</strong> There are currently @count menu links in %title. They will be deleted (system-defined links will be reset).', array('%title' => $this->entity->label())) . '</p>';
+      $caption .= '<p>' . \Drupal::translation()->formatPlural($num_links, '<strong>Warning:</strong> There is currently 1 menu link in %title. It will be deleted (system-defined items will be reset).', '<strong>Warning:</strong> There are currently @count menu links in %title. They will be deleted (system-defined links will be reset).', array('%title' => $this->entity->label())) . '</p>';
     }
     $caption .= '<p>' . t('This action cannot be undone.') . '</p>';
     return $caption;
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 9278f97..a11f903 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -158,7 +158,7 @@ function _node_mass_update_batch_finished($success, $results, $operations) {
   }
   else {
     drupal_set_message(t('An error occurred and processing did not complete.'), 'error');
-    $message = format_plural(count($results), '1 item successfully processed:', '@count items successfully processed:');
+    $message = \Drupal::translation()->formatPlural(count($results), '1 item successfully processed:', '@count items successfully processed:');
     $item_list = array(
       '#theme' => 'item_list',
       '#items' => $results,
diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php
index d42f748..2aaac50 100644
--- a/core/modules/node/node.api.php
+++ b/core/modules/node/node.api.php
@@ -376,7 +376,7 @@ function hook_node_access(\Drupal\node\NodeInterface $node, $op, \Drupal\Core\Se
  */
 function hook_node_search_result(\Drupal\node\NodeInterface $node, $langcode) {
   $rating = db_query('SELECT SUM(points) FROM {my_rating} WHERE nid = :nid', array('nid' => $node->id()))->fetchField();
-  return array('rating' => format_plural($rating, '1 point', '@count points'));
+  return array('rating' => \Drupal::translation()->formatPlural($rating, '1 point', '@count points'));
 }
 
 /**
diff --git a/core/modules/node/node.install b/core/modules/node/node.install
index 36c7d75..04b571a 100644
--- a/core/modules/node/node.install
+++ b/core/modules/node/node.install
@@ -21,7 +21,7 @@ function node_requirements($phase) {
     // implement hook_node_grants().
     $grant_count = \Drupal::entityManager()->getAccessControlHandler('node')->countGrants();
     if ($grant_count != 1 || count(\Drupal::moduleHandler()->getImplementations('node_grants')) > 0) {
-      $value = format_plural($grant_count, 'One permission in use', '@count permissions in use', array('@count' => $grant_count));
+      $value = \Drupal::translation()->formatPlural($grant_count, 'One permission in use', '@count permissions in use', array('@count' => $grant_count));
     }
     else {
       $value = t('Disabled');
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 4e3bc46..f51d39d 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -204,7 +204,7 @@ function node_title_list(StatementInterface $result, $title = NULL) {
   foreach ($result as $row) {
     // Do not use $node->label() or $node->urlInfo() here, because we only have
     // database rows, not actual nodes.
-    $options = !empty($row->comment_count) ? array('attributes' => array('title' => format_plural($row->comment_count, '1 comment', '@count comments'))) : array();
+    $options = !empty($row->comment_count) ? array('attributes' => array('title' => \Drupal::translation()->formatPlural($row->comment_count, '1 comment', '@count comments'))) : array();
     $items[] = \Drupal::l($row->title, new Url('entity.node.canonical', ['node' => $row->nid], $options));
     $num_rows = TRUE;
   }
diff --git a/core/modules/node/src/Entity/NodeType.php b/core/modules/node/src/Entity/NodeType.php
index 73e1202..e94a830 100644
--- a/core/modules/node/src/Entity/NodeType.php
+++ b/core/modules/node/src/Entity/NodeType.php
@@ -192,7 +192,7 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
     elseif ($this->getOriginalId() != $this->id()) {
       $update_count = node_type_update_nodes($this->getOriginalId(), $this->id());
       if ($update_count) {
-        drupal_set_message(format_plural($update_count,
+        drupal_set_message(\Drupal::translation()->formatPlural($update_count,
           'Changed the content type of 1 post from %old-type to %type.',
           'Changed the content type of @count posts from %old-type to %type.',
           array(
diff --git a/core/modules/node/src/Form/DeleteMultiple.php b/core/modules/node/src/Form/DeleteMultiple.php
index 7b2aced..f546b0a 100644
--- a/core/modules/node/src/Form/DeleteMultiple.php
+++ b/core/modules/node/src/Form/DeleteMultiple.php
@@ -76,7 +76,7 @@ public function getFormId() {
    * {@inheritdoc}
    */
   public function getQuestion() {
-    return format_plural(count($this->nodes), 'Are you sure you want to delete this item?', 'Are you sure you want to delete these items?');
+    return \Drupal::translation()->formatPlural(count($this->nodes), 'Are you sure you want to delete this item?', 'Are you sure you want to delete these items?');
   }
 
   /**
@@ -122,7 +122,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       $this->tempStoreFactory->get('node_multiple_delete_confirm')->delete(\Drupal::currentUser()->id());
       $count = count($this->nodes);
       $this->logger('content')->notice('Deleted @count posts.', array('@count' => $count));
-      drupal_set_message(format_plural($count, 'Deleted 1 post.', 'Deleted @count posts.'));
+      drupal_set_message(\Drupal::translation()->formatPlural($count, 'Deleted 1 post.', 'Deleted @count posts.'));
     }
     $form_state->setRedirect('system.admin_content');
   }
diff --git a/core/modules/node/src/Form/NodeTypeDeleteConfirm.php b/core/modules/node/src/Form/NodeTypeDeleteConfirm.php
index 0242301..d8ec6ac 100644
--- a/core/modules/node/src/Form/NodeTypeDeleteConfirm.php
+++ b/core/modules/node/src/Form/NodeTypeDeleteConfirm.php
@@ -74,7 +74,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       ->count()
       ->execute();
     if ($num_nodes) {
-      $caption = '<p>' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. You can not remove this content type until you have removed all of the %type content.', '%type is used by @count pieces of content on your site. You may not remove %type until you have removed all of the %type content.', array('%type' => $this->entity->label())) . '</p>';
+      $caption = '<p>' . \Drupal::translation()->formatPlural($num_nodes, '%type is used by 1 piece of content on your site. You can not remove this content type until you have removed all of the %type content.', '%type is used by @count pieces of content on your site. You may not remove %type until you have removed all of the %type content.', array('%type' => $this->entity->label())) . '</p>';
       $form['#title'] = $this->getQuestion();
       $form['description'] = array('#markup' => $caption);
       return $form;
diff --git a/core/modules/search/src/Plugin/views/filter/Search.php b/core/modules/search/src/Plugin/views/filter/Search.php
index a061fc1..ff9814d 100644
--- a/core/modules/search/src/Plugin/views/filter/Search.php
+++ b/core/modules/search/src/Plugin/views/filter/Search.php
@@ -108,7 +108,7 @@ public function validateExposed(&$form, FormStateInterface $form_state) {
     if (!$form_state->isValueEmpty($key)) {
       $this->queryParseSearchExpression($form_state->getValue($key));
       if (count($this->searchQuery->words()) == 0) {
-        $form_state->setErrorByName($key, format_plural(\Drupal::config('search.settings')->get('index.minimum_word_size'), 'You must include at least one positive keyword with 1 character or more.', 'You must include at least one positive keyword with @count characters or more.'));
+        $form_state->setErrorByName($key, \Drupal::translation()->formatPlural(\Drupal::config('search.settings')->get('index.minimum_word_size'), 'You must include at least one positive keyword with 1 character or more.', 'You must include at least one positive keyword with @count characters or more.'));
       }
     }
   }
diff --git a/core/modules/search/src/SearchPageListBuilder.php b/core/modules/search/src/SearchPageListBuilder.php
index 5714f0a..fb904e6 100644
--- a/core/modules/search/src/SearchPageListBuilder.php
+++ b/core/modules/search/src/SearchPageListBuilder.php
@@ -169,7 +169,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     }
 
     $this->moduleHandler->loadAllIncludes('admin.inc');
-    $count = format_plural($remaining, 'There is 1 item left to index.', 'There are @count items left to index.');
+    $count = \Drupal::translation()->formatPlural($remaining, 'There is 1 item left to index.', 'There are @count items left to index.');
     $done = $total - $remaining;
     // Use floor() to calculate the percentage, so if it is not quite 100%, it
     // will show as 99%, to indicate "almost done".
diff --git a/core/modules/search/src/Tests/SearchMultilingualEntityTest.php b/core/modules/search/src/Tests/SearchMultilingualEntityTest.php
index 832200e..904de8d 100644
--- a/core/modules/search/src/Tests/SearchMultilingualEntityTest.php
+++ b/core/modules/search/src/Tests/SearchMultilingualEntityTest.php
@@ -235,7 +235,7 @@ protected function assertIndexCounts($remaining, $total, $message) {
     $this->assertEqual($status['total'], $total, 'Total items ' . $message . ' is ' . $total);
 
     // Check text in progress section of Search settings page. Note that this
-    // test avoids using format_plural(), so it tests for fragments of text.
+    // test avoids using \Drupal::translation()->formatPlural(), so it tests for fragments of text.
     $indexed = $total - $remaining;
     $percent = ($total > 0) ? floor(100 * $indexed / $total) : 100;
     $this->drupalGet('admin/config/search/pages');
diff --git a/core/modules/shortcut/src/Form/ShortcutSetDeleteForm.php b/core/modules/shortcut/src/Form/ShortcutSetDeleteForm.php
index 4ab3448..0a0bf1a 100644
--- a/core/modules/shortcut/src/Form/ShortcutSetDeleteForm.php
+++ b/core/modules/shortcut/src/Form/ShortcutSetDeleteForm.php
@@ -80,7 +80,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $number = $this->storage->countAssignedUsers($this->entity);
     $info = '';
     if ($number) {
-      $info .= '<p>' . format_plural($number,
+      $info .= '<p>' . \Drupal::translation()->formatPlural($number,
         '1 user has chosen or been assigned to this shortcut set.',
         '@count users have chosen or been assigned to this shortcut set.') . '</p>';
     }
diff --git a/core/modules/simpletest/css/simpletest.module.css b/core/modules/simpletest/css/simpletest.module.css
index 71f7eea..88c4564 100644
--- a/core/modules/simpletest/css/simpletest.module.css
+++ b/core/modules/simpletest/css/simpletest.module.css
@@ -35,7 +35,7 @@ table#simpletest-form-table tr.simpletest-group label {
   display: inline;
 }
 
-div.message > div.item-list {
+div.message > ul {
   font-weight: normal;
 }
 
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index d45bd36..d1b2c01 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -530,7 +530,7 @@ function simpletest_clean_environment() {
   simpletest_clean_temporary_directories();
   if (\Drupal::config('simpletest.settings')->get('clear_results')) {
     $count = simpletest_clean_results_table();
-    drupal_set_message(format_plural($count, 'Removed 1 test result.', 'Removed @count test results.'));
+    drupal_set_message(\Drupal::translation()->formatPlural($count, 'Removed 1 test result.', 'Removed @count test results.'));
   }
   else {
     drupal_set_message(t('Clear results is disabled and the test results table will not be cleared.'), 'warning');
@@ -558,7 +558,7 @@ function simpletest_clean_database() {
   }
 
   if ($count > 0) {
-    drupal_set_message(format_plural($count, 'Removed 1 leftover table.', 'Removed @count leftover tables.'));
+    drupal_set_message(\Drupal::translation()->formatPlural($count, 'Removed 1 leftover table.', 'Removed @count leftover tables.'));
   }
   else {
     drupal_set_message(t('No leftover tables to remove.'));
@@ -582,7 +582,7 @@ function simpletest_clean_temporary_directories() {
   }
 
   if ($count > 0) {
-    drupal_set_message(format_plural($count, 'Removed 1 temporary directory.', 'Removed @count temporary directories.'));
+    drupal_set_message(\Drupal::translation()->formatPlural($count, 'Removed 1 temporary directory.', 'Removed @count temporary directories.'));
   }
   else {
     drupal_set_message(t('No temporary directories to remove.'));
diff --git a/core/modules/statistics/statistics.module b/core/modules/statistics/statistics.module
index 00ca78d..c338e46 100644
--- a/core/modules/statistics/statistics.module
+++ b/core/modules/statistics/statistics.module
@@ -55,7 +55,7 @@ function statistics_node_links_alter(array &$node_links, NodeInterface $entity,
     if (\Drupal::currentUser()->hasPermission('view post access counter')) {
       $statistics = statistics_get($entity->id());
       if ($statistics) {
-        $links['statistics_counter']['title'] = format_plural($statistics['totalcount'], '1 view', '@count views');
+        $links['statistics_counter']['title'] = \Drupal::translation()->formatPlural($statistics['totalcount'], '1 view', '@count views');
         $node_links['statistics'] = array(
           '#theme' => 'links__node__statistics',
           '#links' => $links,
diff --git a/core/modules/system/css/system.theme.css b/core/modules/system/css/system.theme.css
index bf14339..0f1d8ae 100644
--- a/core/modules/system/css/system.theme.css
+++ b/core/modules/system/css/system.theme.css
@@ -21,24 +21,6 @@ td.active {
 }
 
 /**
- * Markup generated by theme_item_list().
- */
-.item-list .title {
-  font-weight: bold;
-}
-.item-list ul {
-  margin: 0 0 0.75em 0;
-  padding: 0;
-}
-.item-list ul li {
-  margin: 0 0 0.25em 1.5em; /* LTR */
-  padding: 0;
-}
-[dir="rtl"] .item-list ul li {
-  margin: 0 1.5em 0.25em 0;
-}
-
-/**
  * Markup generated by Form API.
  */
 .form-item,
diff --git a/core/modules/system/src/Form/ModulesListConfirmForm.php b/core/modules/system/src/Form/ModulesListConfirmForm.php
index df7dfef..0cf869e 100644
--- a/core/modules/system/src/Form/ModulesListConfirmForm.php
+++ b/core/modules/system/src/Form/ModulesListConfirmForm.php
@@ -114,7 +114,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     // Display a list of required modules that have to be installed as well but
     // were not manually selected.
     foreach ($this->modules['dependencies'] as $module => $dependencies) {
-      $items[] = format_plural(count($dependencies), 'You must enable the @required module to install @module.', 'You must enable the @required modules to install @module.', array(
+      $items[] = \Drupal::translation()->formatPlural(count($dependencies), 'You must enable the @required module to install @module.', 'You must enable the @required modules to install @module.', array(
         '@module' => $this->modules['install'][$module],
         '@required' => implode(', ', $dependencies),
       ));
diff --git a/core/modules/system/src/Tests/Theme/FunctionsTest.php b/core/modules/system/src/Tests/Theme/FunctionsTest.php
index c8d068c..0e55865 100644
--- a/core/modules/system/src/Tests/Theme/FunctionsTest.php
+++ b/core/modules/system/src/Tests/Theme/FunctionsTest.php
@@ -44,21 +44,21 @@ function testItemList() {
     // Verify that empty items produce the empty string.
     $variables = array();
     $variables['empty'] = 'No items found.';
-    $expected = '<div class="item-list">No items found.</div>';
+    $expected = 'No items found.';
     $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback generates empty string.');
 
     // Verify that empty items produce the empty string with title.
     $variables = array();
     $variables['title'] = 'Some title';
     $variables['empty'] = 'No items found.';
-    $expected = '<div class="item-list"><h3>Some title</h3>No items found.</div>';
+    $expected = '<h3>Some title</h3>No items found.';
     $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback generates empty string with title.');
 
     // Verify that title set to 0 is output.
     $variables = array();
     $variables['title'] = 0;
     $variables['empty'] = 'No items found.';
-    $expected = '<div class="item-list"><h3>0</h3>No items found.</div>';
+    $expected = '<h3>0</h3>No items found.';
     $this->assertThemeOutput('item_list', $variables, $expected, '%callback with title set to 0 generates a title.');
 
     // Verify that title set to a render array is output.
@@ -67,7 +67,7 @@ function testItemList() {
       '#markup' => '<span>Render array</span>',
     );
     $variables['empty'] = 'No items found.';
-    $expected = '<div class="item-list"><h3><span>Render array</span></h3>No items found.</div>';
+    $expected = '<h3><span>Render array</span></h3>No items found.';
     $this->assertThemeOutput('item_list', $variables, $expected, '%callback with title set to a render array generates a title.');
 
     // Verify that empty text is not displayed when there are list items.
@@ -75,7 +75,7 @@ function testItemList() {
     $variables['title'] = 'Some title';
     $variables['empty'] = 'No items found.';
     $variables['items'] = array('Un', 'Deux', 'Trois');
-    $expected = '<div class="item-list"><h3>Some title</h3><ul><li>Un</li><li>Deux</li><li>Trois</li></ul></div>';
+    $expected = '<h3>Some title</h3><ul><li>Un</li><li>Deux</li><li>Trois</li></ul>';
     $this->assertThemeOutput('item_list', $variables, $expected, '%callback does not print empty text when there are list items.');
 
     // Verify nested item lists.
@@ -136,24 +136,23 @@ function testItemList() {
       'f',
     );
 
-    $inner_b = '<div class="item-list"><ol id="blist">';
+    $inner_b = '<ol id="blist">';
     $inner_b .= '<li>ba</li>';
     $inner_b .= '<li class="item-class-bb">bb</li>';
-    $inner_b .= '</ol></div>';
+    $inner_b .= '</ol>';
 
-    $inner_cb = '<div class="item-list"><ul>';
+    $inner_cb = '<ul>';
     $inner_cb .= '<li>cba</li>';
     $inner_cb .= '<li>cbb</li>';
-    $inner_cb .= '</ul></div>';
+    $inner_cb .= '</ul>';
 
-    $inner_c = '<div class="item-list"><ul id="clist">';
+    $inner_c = '<ul id="clist">';
     $inner_c .= '<li>ca</li>';
     $inner_c .= '<li class="item-class-cb">cb' . $inner_cb . '</li>';
     $inner_c .= '<li>cc</li>';
-    $inner_c .= '</ul></div>';
+    $inner_c .= '</ul>';
 
-    $expected = '<div class="item-list">';
-    $expected .= '<h3>Some title</h3>';
+    $expected = '<h3>Some title</h3>';
     $expected .= '<ul id="parentlist">';
     $expected .= '<li>a</li>';
     $expected .= '<li id="item-id-b">b' . $inner_b . '</li>';
@@ -161,7 +160,7 @@ function testItemList() {
     $expected .= '<li id="item-id-d">d</li>';
     $expected .= '<li id="item-id-e"></li>';
     $expected .= '<li>f</li>';
-    $expected .= '</ul></div>';
+    $expected .= '</ul>';
 
     $this->assertThemeOutput('item_list', $variables, $expected);
   }
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 0231667..b7eed4e 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -302,7 +302,7 @@ function theme_system_modules_uninstall($variables) {
   $rows = array();
   foreach (Element::children($form['modules']) as $module) {
     if (!empty($form['modules'][$module]['#required_by'])) {
-      $disabled_message = format_plural(count($form['modules'][$module]['#required_by']),
+      $disabled_message = \Drupal::translation()->formatPlural(count($form['modules'][$module]['#required_by']),
         'To uninstall @module, the following module must be uninstalled first: @required_modules',
         'To uninstall @module, the following modules must be uninstalled first: @required_modules',
         array('@module' => $form['modules'][$module]['#module_name'], '@required_modules' => implode(', ', $form['modules'][$module]['#required_by'])));
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 868b2eb..1678adc 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -572,7 +572,7 @@ function system_requirements($phase) {
       $requirements['disabled_modules'] = array(
         'severity' => REQUIREMENT_ERROR,
         'title' => t('Disabled modules'),
-        'value' => format_plural(count($modules), 'The %modules module is disabled.', 'The following modules are disabled: %modules', array('%modules' => implode(', ', $modules))),
+        'value' => \Drupal::translation()->formatPlural(count($modules), 'The %modules module is disabled.', 'The following modules are disabled: %modules', array('%modules' => implode(', ', $modules))),
         'description' => t('Drupal 8 no longer supports disabled modules. Please either enable or uninstall them before upgrading.'),
       );
     }
diff --git a/core/modules/system/templates/item-list.html.twig b/core/modules/system/templates/item-list.html.twig
index bd71e7f..2a59319 100644
--- a/core/modules/system/templates/item-list.html.twig
+++ b/core/modules/system/templates/item-list.html.twig
@@ -19,18 +19,16 @@
  */
 #}
 {%- if items or empty -%}
-  <div class="item-list">
-    {%- if title is not empty -%}
-      <h3>{{ title }}</h3>
-    {%- endif -%}
-    {%- if items -%}
-      <{{ list_type }}{{ attributes }}>
-        {%- for item in items -%}
-          <li{{ item.attributes }}>{{ item.value }}</li>
-        {%- endfor -%}
-      </{{ list_type }}>
-    {%- else -%}
-      {{- empty -}}
-    {%- endif -%}
-  </div>
+  {%- if title is not empty -%}
+    <h3>{{ title }}</h3>
+  {%- endif -%}
+  {%- if items -%}
+    <{{ list_type }}{{ attributes }}>
+      {%- for item in items -%}
+        <li{{ item.attributes }}>{{ item.value }}</li>
+      {%- endfor -%}
+    </{{ list_type }}>
+  {%- else -%}
+    {{- empty -}}
+  {%- endif -%}
 {%- endif %}
diff --git a/core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php b/core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php
index d1b7278..ddd318a 100644
--- a/core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php
+++ b/core/modules/taxonomy/src/Plugin/views/filter/TaxonomyIndexTid.php
@@ -322,7 +322,7 @@ function validate_term_strings(&$form, $values, FormStateInterface $form_state)
     }
 
     if ($missing && !empty($this->options['error_message'])) {
-      $form_state->setError($form, format_plural(count($missing), 'Unable to find term: @terms', 'Unable to find terms: @terms', array('@terms' => implode(', ', array_keys($missing)))));
+      $form_state->setError($form, \Drupal::translation()->formatPlural(count($missing), 'Unable to find term: @terms', 'Unable to find terms: @terms', array('@terms' => implode(', ', array_keys($missing)))));
     }
     elseif ($missing && empty($this->options['error_message'])) {
       $tids = array(0);
diff --git a/core/modules/toolbar/css/toolbar.module.css b/core/modules/toolbar/css/toolbar.module.css
index 06224fe..30661d7 100644
--- a/core/modules/toolbar/css/toolbar.module.css
+++ b/core/modules/toolbar/css/toolbar.module.css
@@ -20,10 +20,9 @@
 /**
  * Very specific overrides for Drupal system CSS.
  */
+.toolbar ul,
 .toolbar li,
 .toolbar .menu li,
-.toolbar .item-list,
-.toolbar .item-list li,
 .toolbar .menu li.expanded {
   list-style-type: none;
   list-style-image: none;
diff --git a/core/modules/tracker/tracker.pages.inc b/core/modules/tracker/tracker.pages.inc
index 8275c78..1a0577d 100644
--- a/core/modules/tracker/tracker.pages.inc
+++ b/core/modules/tracker/tracker.pages.inc
@@ -74,7 +74,7 @@ function tracker_page($account = NULL) {
 
         if ($new = \Drupal::service('comment.manager')->getCountNewComments($node)) {
           $comments .= '<br />';
-          $comments .= \Drupal::l(format_plural($new, '1 new', '@count new'), $node->urlInfo()->setOptions(array('fragment' => 'new')));
+          $comments .= \Drupal::l(\Drupal::translation()->formatPlural($new, '1 new', '@count new'), $node->urlInfo()->setOptions(array('fragment' => 'new')));
         }
       }
 
diff --git a/core/modules/update/update.manager.inc b/core/modules/update/update.manager.inc
index 41866c7..13be6df 100644
--- a/core/modules/update/update.manager.inc
+++ b/core/modules/update/update.manager.inc
@@ -112,7 +112,7 @@ function _update_manager_check_backends(&$form, $operation) {
     $backend_names[] = $backend['title'];
   }
   if ($operation == 'update') {
-    $form['available_backends']['#markup'] = format_plural(
+    $form['available_backends']['#markup'] = \Drupal::translation()->formatPlural(
       count($available_backends),
       'Updating modules and themes requires <strong>@backends access</strong> to your server. See the <a href="@handbook_url">handbook</a> for other update methods.',
       'Updating modules and themes requires access to your server via one of the following methods: <strong>@backends</strong>. See the <a href="@handbook_url">handbook</a> for other update methods.',
@@ -122,7 +122,7 @@ function _update_manager_check_backends(&$form, $operation) {
       ));
   }
   else {
-    $form['available_backends']['#markup'] = format_plural(
+    $form['available_backends']['#markup'] = \Drupal::translation()->formatPlural(
       count($available_backends),
       'Installing modules and themes requires <strong>@backends access</strong> to your server. See the <a href="@handbook_url">handbook</a> for other installation methods.',
       'Installing modules and themes requires access to your server via one of the following methods: <strong>@backends</strong>. See the <a href="@handbook_url">handbook</a> for other installation methods.',
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index 44aa884..fe6635b 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -419,10 +419,10 @@ function update_fetch_data_finished($success, $results) {
   if ($success) {
     if (!empty($results)) {
       if (!empty($results['updated'])) {
-        drupal_set_message(format_plural($results['updated'], 'Checked available update data for one project.', 'Checked available update data for @count projects.'));
+        drupal_set_message(\Drupal::translation()->formatPlural($results['updated'], 'Checked available update data for one project.', 'Checked available update data for @count projects.'));
       }
       if (!empty($results['failures'])) {
-        drupal_set_message(format_plural($results['failures'], 'Failed to get available update data for one project.', 'Failed to get available update data for @count projects.'), 'error');
+        drupal_set_message(\Drupal::translation()->formatPlural($results['failures'], 'Failed to get available update data for one project.', 'Failed to get available update data for @count projects.'), 'error');
       }
     }
   }
@@ -651,7 +651,7 @@ function update_verify_update_archive($project, $archive_file, $directory) {
     $errors[] = t('%archive_file does not contain any .info.yml files.', array('%archive_file' => drupal_basename($archive_file)));
   }
   elseif (!$compatible_project) {
-    $errors[] = format_plural(
+    $errors[] = \Drupal::translation()->formatPlural(
       count($incompatible),
       '%archive_file contains a version of %names that is not compatible with Drupal !version.',
       '%archive_file contains versions of modules or themes that are not compatible with Drupal !version: %names',
diff --git a/core/modules/user/config/install/views.view.who_s_online.yml b/core/modules/user/config/install/views.view.who_s_online.yml
index 5b22082..0109ebd 100644
--- a/core/modules/user/config/install/views.view.who_s_online.yml
+++ b/core/modules/user/config/install/views.view.who_s_online.yml
@@ -52,7 +52,6 @@ display:
           row_class: ''
           default_row_class: true
           type: ul
-          wrapper_class: item-list
           class: ''
         provider: views
       row:
diff --git a/core/modules/user/src/Form/UserLoginForm.php b/core/modules/user/src/Form/UserLoginForm.php
index 4cfdff3..66a2b94 100644
--- a/core/modules/user/src/Form/UserLoginForm.php
+++ b/core/modules/user/src/Form/UserLoginForm.php
@@ -207,7 +207,7 @@ public function validateFinal(array &$form, FormStateInterface $form_state) {
 
       if ($flood_control_triggered = $form_state->get('flood_control_triggered')) {
         if ($flood_control_triggered == 'user') {
-          $form_state->setErrorByName('name', format_plural($flood_config->get('user_limit'), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => $this->url('user.pass'))));
+          $form_state->setErrorByName('name', \Drupal::translation()->formatPlural($flood_config->get('user_limit'), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => $this->url('user.pass'))));
         }
         else {
           // We did not find a uid, so the limit is IP-based.
diff --git a/core/modules/user/src/Plugin/views/filter/Name.php b/core/modules/user/src/Plugin/views/filter/Name.php
index 531dc5d..f49bd6d 100644
--- a/core/modules/user/src/Plugin/views/filter/Name.php
+++ b/core/modules/user/src/Plugin/views/filter/Name.php
@@ -135,7 +135,7 @@ function validate_user_strings(&$form, FormStateInterface $form_state, $values)
     }
 
     if ($missing) {
-      $form_state->setError($form, format_plural(count($missing), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', array_keys($missing)))));
+      $form_state->setError($form, \Drupal::translation()->formatPlural(count($missing), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', array_keys($missing)))));
     }
 
     return $uids;
diff --git a/core/modules/user/src/Tests/UserAdminListingTest.php b/core/modules/user/src/Tests/UserAdminListingTest.php
index 65e9ef3..0a45c5e 100644
--- a/core/modules/user/src/Tests/UserAdminListingTest.php
+++ b/core/modules/user/src/Tests/UserAdminListingTest.php
@@ -69,8 +69,8 @@ public function testUserListing() {
     foreach ($result as $account) {
       $name = (string) $account->td[0]->span;
       $roles = array();
-      if (isset($account->td[2]->div->ul)) {
-        foreach ($account->td[2]->div->ul->li as $element) {
+      if (isset($account->td[2]->ul)) {
+        foreach ($account->td[2]->ul->li as $element) {
           $roles[] = (string) $element;
         }
       }
diff --git a/core/modules/user/src/Tests/UserLoginTest.php b/core/modules/user/src/Tests/UserLoginTest.php
index cf0fc8a..7912414 100644
--- a/core/modules/user/src/Tests/UserLoginTest.php
+++ b/core/modules/user/src/Tests/UserLoginTest.php
@@ -155,7 +155,7 @@ function assertFailedLogin($account, $flood_trigger = NULL) {
     $this->assertNoFieldByXPath("//input[@name='pass' and @value!='']", NULL, 'Password value attribute is blank.');
     if (isset($flood_trigger)) {
       if ($flood_trigger == 'user') {
-        $this->assertRaw(format_plural(\Drupal::config('user.flood')->get('user_limit'), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => \Drupal::url('user.pass'))));
+        $this->assertRaw(\Drupal::translation()->formatPlural(\Drupal::config('user.flood')->get('user_limit'), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => \Drupal::url('user.pass'))));
       }
       else {
         // No uid, so the limit is IP-based.
diff --git a/core/modules/user/src/Tests/Views/HandlerFilterUserNameTest.php b/core/modules/user/src/Tests/Views/HandlerFilterUserNameTest.php
index b582d34..0faa52c 100644
--- a/core/modules/user/src/Tests/Views/HandlerFilterUserNameTest.php
+++ b/core/modules/user/src/Tests/Views/HandlerFilterUserNameTest.php
@@ -102,7 +102,7 @@ public function testAdminUserInterface() {
       'options[value]' => implode(', ', $users)
     );
     $this->drupalPostForm($path, $edit, t('Apply'));
-    $message = format_plural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
+    $message = \Drupal::translation()->formatPlural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
     $this->assertText($message);
 
     // Pass in an invalid username and a valid username.
@@ -114,7 +114,7 @@ public function testAdminUserInterface() {
     );
     $users = array($users[0]);
     $this->drupalPostForm($path, $edit, t('Apply'));
-    $message = format_plural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
+    $message = \Drupal::translation()->formatPlural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
     $this->assertRaw($message);
 
     // Pass in just valid usernames.
@@ -124,7 +124,7 @@ public function testAdminUserInterface() {
       'options[value]' => implode(', ', $users)
     );
     $this->drupalPostForm($path, $edit, t('Apply'));
-    $message = format_plural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
+    $message = \Drupal::translation()->formatPlural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
     $this->assertNoRaw($message);
   }
 
@@ -141,7 +141,7 @@ public function testExposedFilter() {
     $users = array_map('strtolower', $users);
     $options['query']['uid'] = implode(', ', $users);
     $this->drupalGet($path, $options);
-    $message = format_plural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
+    $message = \Drupal::translation()->formatPlural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
     $this->assertRaw($message);
 
     // Pass in an invalid username and a valid username.
@@ -151,7 +151,7 @@ public function testExposedFilter() {
     $users = array($users[0]);
 
     $this->drupalGet($path, $options);
-    $message = format_plural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
+    $message = \Drupal::translation()->formatPlural(count($users), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', $users)));
     $this->assertRaw($message);
 
     // Pass in just valid usernames.
diff --git a/core/modules/views/src/Plugin/views/field/Numeric.php b/core/modules/views/src/Plugin/views/field/Numeric.php
index 1e38a85..199b427 100644
--- a/core/modules/views/src/Plugin/views/field/Numeric.php
+++ b/core/modules/views/src/Plugin/views/field/Numeric.php
@@ -150,7 +150,7 @@ public function render(ResultRow $values) {
 
     // Should we format as a plural.
     if (!empty($this->options['format_plural'])) {
-      $value = format_plural($value, $this->options['format_plural_singular'], $this->options['format_plural_plural']);
+      $value = \Drupal::translation()->formatPlural($value, $this->options['format_plural_singular'], $this->options['format_plural_plural']);
     }
 
     return $this->sanitizeValue($this->options['prefix'], 'xss')
diff --git a/core/modules/views/src/Plugin/views/pager/Full.php b/core/modules/views/src/Plugin/views/pager/Full.php
index 2fbf4c8..3504dd0 100644
--- a/core/modules/views/src/Plugin/views/pager/Full.php
+++ b/core/modules/views/src/Plugin/views/pager/Full.php
@@ -73,9 +73,9 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    */
   public function summaryTitle() {
     if (!empty($this->options['offset'])) {
-      return format_plural($this->options['items_per_page'], '@count item, skip @skip', 'Paged, @count items, skip @skip', array('@count' => $this->options['items_per_page'], '@skip' => $this->options['offset']));
+      return \Drupal::translation()->formatPlural($this->options['items_per_page'], '@count item, skip @skip', 'Paged, @count items, skip @skip', array('@count' => $this->options['items_per_page'], '@skip' => $this->options['offset']));
     }
-    return format_plural($this->options['items_per_page'], '@count item', 'Paged, @count items', array('@count' => $this->options['items_per_page']));
+    return \Drupal::translation()->formatPlural($this->options['items_per_page'], '@count item', 'Paged, @count items', array('@count' => $this->options['items_per_page']));
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/pager/Mini.php b/core/modules/views/src/Plugin/views/pager/Mini.php
index f0195ae..61aef9e 100644
--- a/core/modules/views/src/Plugin/views/pager/Mini.php
+++ b/core/modules/views/src/Plugin/views/pager/Mini.php
@@ -41,9 +41,9 @@ public function defineOptions() {
    */
   public function summaryTitle() {
     if (!empty($this->options['offset'])) {
-      return format_plural($this->options['items_per_page'], 'Mini pager, @count item, skip @skip', 'Mini pager, @count items, skip @skip', array('@count' => $this->options['items_per_page'], '@skip' => $this->options['offset']));
+      return \Drupal::translation()->formatPlural($this->options['items_per_page'], 'Mini pager, @count item, skip @skip', 'Mini pager, @count items, skip @skip', array('@count' => $this->options['items_per_page'], '@skip' => $this->options['offset']));
     }
-      return format_plural($this->options['items_per_page'], 'Mini pager, @count item', 'Mini pager, @count items', array('@count' => $this->options['items_per_page']));
+      return \Drupal::translation()->formatPlural($this->options['items_per_page'], 'Mini pager, @count item', 'Mini pager, @count items', array('@count' => $this->options['items_per_page']));
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/pager/Some.php b/core/modules/views/src/Plugin/views/pager/Some.php
index effc40e..9222fe2 100644
--- a/core/modules/views/src/Plugin/views/pager/Some.php
+++ b/core/modules/views/src/Plugin/views/pager/Some.php
@@ -25,9 +25,9 @@ class Some extends PagerPluginBase {
 
   public function summaryTitle() {
     if (!empty($this->options['offset'])) {
-      return format_plural($this->options['items_per_page'], '@count item, skip @skip', '@count items, skip @skip', array('@count' => $this->options['items_per_page'], '@skip' => $this->options['offset']));
+      return \Drupal::translation()->formatPlural($this->options['items_per_page'], '@count item, skip @skip', '@count items, skip @skip', array('@count' => $this->options['items_per_page'], '@skip' => $this->options['offset']));
     }
-      return format_plural($this->options['items_per_page'], '@count item', '@count items', array('@count' => $this->options['items_per_page']));
+      return \Drupal::translation()->formatPlural($this->options['items_per_page'], '@count item', '@count items', array('@count' => $this->options['items_per_page']));
   }
 
   protected function defineOptions() {
diff --git a/core/modules/views/src/Plugin/views/style/HtmlList.php b/core/modules/views/src/Plugin/views/style/HtmlList.php
index d965792..b98b030 100644
--- a/core/modules/views/src/Plugin/views/style/HtmlList.php
+++ b/core/modules/views/src/Plugin/views/style/HtmlList.php
@@ -46,7 +46,6 @@ protected function defineOptions() {
 
     $options['type'] = array('default' => 'ul');
     $options['class'] = array('default' => '');
-    $options['wrapper_class'] = array('default' => 'item-list');
 
     return $options;
   }
@@ -62,13 +61,6 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
       '#options' => array('ul' => $this->t('Unordered list'), 'ol' => $this->t('Ordered list')),
       '#default_value' => $this->options['type'],
     );
-    $form['wrapper_class'] = array(
-      '#title' => $this->t('Wrapper class'),
-      '#description' => $this->t('The class to provide on the wrapper, outside the list.'),
-      '#type' => 'textfield',
-      '#size' => '30',
-      '#default_value' => $this->options['wrapper_class'],
-    );
     $form['class'] = array(
       '#title' => $this->t('List class'),
       '#description' => $this->t('The class to provide on the list element itself.'),
diff --git a/core/modules/views/src/Tests/Plugin/StyleHtmlListTest.php b/core/modules/views/src/Tests/Plugin/StyleHtmlListTest.php
index 0642eff..65d5db7 100644
--- a/core/modules/views/src/Tests/Plugin/StyleHtmlListTest.php
+++ b/core/modules/views/src/Tests/Plugin/StyleHtmlListTest.php
@@ -33,24 +33,16 @@ function testDefaultRowClasses() {
     $output = $view->preview();
     $output = drupal_render($output);
 
-    // Check that an empty class attribute is not added if the wrapper class is
-    // not set.
-    $this->assertTrue(strpos($output, '<div>') !== FALSE, 'Empty class is not added to DIV when class is not set');
-
     // Check that an empty class attribute is not added if the list class is
     // not set.
     $this->assertTrue(strpos($output, '<ul>') !== FALSE, 'Empty class is not added to UL when class is not set');
 
     // Set wrapper class and list class in style options.
     $view->style_plugin->options['class'] = 'class';
-    $view->style_plugin->options['wrapper_class'] = 'wrapper-class';
 
     $output = $view->preview();
     $output = drupal_render($output);
 
-    // Check that class attribute is present if the wrapper class is set.
-    $this->assertTrue(strpos($output, '<div class="wrapper-class">') !== FALSE, 'Class is added to DIV');
-
     // Check that class attribute is present if the list class is set.
     $this->assertTrue(strpos($output, '<ul class="class">') !== FALSE, 'Class is added to UL');
   }
diff --git a/core/modules/views/templates/views-view-list.html.twig b/core/modules/views/templates/views-view-list.html.twig
index 8de787c..207a25b 100644
--- a/core/modules/views/templates/views-view-list.html.twig
+++ b/core/modules/views/templates/views-view-list.html.twig
@@ -4,7 +4,6 @@
  * Default theme implementation for a view template to display a list of rows.
  *
  * Available variables:
- * - attributes: HTML attributes for the container.
  * - rows: A list of rows for this list.
  *   - attributes: The row's HTML attributes.
  *   - content: The row's contents.
@@ -18,21 +17,14 @@
  * @ingroup themeable
  */
 #}
-{% if attributes -%}
-  <div{{ attributes }}>
+{% if title %}
+  <h3>{{ title }}</h3>
 {% endif %}
-  {% if title %}
-    <h3>{{ title }}</h3>
-  {% endif %}
 
-  <{{ list.type }}{{ list.attributes }}>
+<{{ list.type }}{{ list.attributes }}>
 
-    {% for row in rows %}
-      <li{{ row.attributes }}>{{ row.content }}</li>
-    {% endfor %}
+  {% for row in rows %}
+    <li{{ row.attributes }}>{{ row.content }}</li>
+  {% endfor %}
 
-  </{{ list.type }}>
-
-{% if attributes -%}
-  </div>
-{% endif %}
+</{{ list.type }}>
diff --git a/core/modules/views/templates/views-view-summary.html.twig b/core/modules/views/templates/views-view-summary.html.twig
index 4d8ed8f..db9bae5 100644
--- a/core/modules/views/templates/views-view-summary.html.twig
+++ b/core/modules/views/templates/views-view-summary.html.twig
@@ -19,14 +19,12 @@
  * @ingroup themeable
  */
 #}
-<div class="item-list">
-  <ul class="views-summary">
-  {% for row in rows %}
-    <li><a href="{{ row.url }}"{{ row.attributes }}>{{ row.link }}</a>
-      {% if options.count %}
-        ({{ row.count }})
-      {% endif %}
-    </li>
-  {% endfor %}
-  </ul>
-</div>
+<ul class="views-summary">
+{% for row in rows %}
+  <li><a href="{{ row.url }}"{{ row.attributes }}>{{ row.link }}</a>
+    {% if options.count %}
+      ({{ row.count }})
+    {% endif %}
+  </li>
+{% endfor %}
+</ul>
diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc
index 02f0175..a9bf6f6 100644
--- a/core/modules/views/views.theme.inc
+++ b/core/modules/views/views.theme.inc
@@ -842,12 +842,6 @@ function template_preprocess_views_view_list(&$variables) {
     $variables['list']['attributes'] = new Attribute(array('class' => $class));
   }
 
-  // Fetch wrapper classes from handler options.
-  if ($handler->options['wrapper_class']) {
-    $wrapper_class = explode(' ', $handler->options['wrapper_class']);
-    $variables['attributes']['class'] = array_map('drupal_clean_css_identifier', $wrapper_class);
-  }
-
   $variables['list']['type'] = $handler->options['type'];
 
   template_preprocess_views_view_unformatted($variables);
diff --git a/core/modules/views_ui/css/views_ui.admin.theme.css b/core/modules/views_ui/css/views_ui.admin.theme.css
index 47909d9..124be4c 100644
--- a/core/modules/views_ui/css/views_ui.admin.theme.css
+++ b/core/modules/views_ui/css/views_ui.admin.theme.css
@@ -912,7 +912,7 @@ td.group-title {
   content: "\00A0\003E";
 }
 
-.views-ui-dialog details .item-list {
+.views-ui-dialog details ul {
   padding-left: 2em;
 }
 /* @end */
@@ -1059,11 +1059,11 @@ td.group-title {
 
 /* @group HTML list */
 
-#views-live-preview .view-content > .item-list > ul {
+#views-live-preview .view-content > ul {
   list-style-position: outside;
   padding-left: 21px; /* LTR */
 }
-[dir="rtl"] #views-live-preview .view-content > .item-list > ul {
+[dir="rtl"] #views-live-preview .view-content > ul {
   padding-left: 0;
   padding-right: 21px;
 }
diff --git a/core/modules/views_ui/src/Tests/FieldUITest.php b/core/modules/views_ui/src/Tests/FieldUITest.php
index fac6e46..32bd4c4 100644
--- a/core/modules/views_ui/src/Tests/FieldUITest.php
+++ b/core/modules/views_ui/src/Tests/FieldUITest.php
@@ -42,18 +42,18 @@ public function testFieldUI() {
     // Ensure that the expected tokens appear in the UI.
     $edit_handler_url = 'admin/structure/views/nojs/handler/test_view/default/field/age';
     $this->drupalGet($edit_handler_url);
-    $result = $this->xpath('//details[@id="edit-options-alter-help"]/div[@class="details-wrapper"]/div[@class="item-list"]/fields/li');
+    $result = $this->xpath('//details[@id="edit-options-alter-help"]/div[@class="details-wrapper"]//li');
     $this->assertEqual((string) $result[0], '[age] == Age');
 
     $edit_handler_url = 'admin/structure/views/nojs/handler/test_view/default/field/id';
     $this->drupalGet($edit_handler_url);
-    $result = $this->xpath('//details[@id="edit-options-alter-help"]/div[@class="details-wrapper"]/div[@class="item-list"]/fields/li');
+    $result = $this->xpath('//details[@id="edit-options-alter-help"]/div[@class="details-wrapper"]//li');
     $this->assertEqual((string) $result[0], '[age] == Age');
     $this->assertEqual((string) $result[1], '[id] == ID');
 
     $edit_handler_url = 'admin/structure/views/nojs/handler/test_view/default/field/name';
     $this->drupalGet($edit_handler_url);
-    $result = $this->xpath('//details[@id="edit-options-alter-help"]/div[@class="details-wrapper"]/div[@class="item-list"]/fields/li');
+    $result = $this->xpath('//details[@id="edit-options-alter-help"]/div[@class="details-wrapper"]//li');
     $this->assertEqual((string) $result[0], '[age] == Age');
     $this->assertEqual((string) $result[1], '[id] == ID');
     $this->assertEqual((string) $result[2], '[name] == Name');
diff --git a/core/modules/views_ui/views_ui.theme.inc b/core/modules/views_ui/views_ui.theme.inc
index 80f2f45..0ddd959 100644
--- a/core/modules/views_ui/views_ui.theme.inc
+++ b/core/modules/views_ui/views_ui.theme.inc
@@ -94,7 +94,7 @@ function template_preprocess_views_ui_view_info(&$variables) {
     $displays = t('None');
   }
   else {
-    $displays = format_plural(count($variables['displays']), 'Display', 'Displays') . ': <em>';
+    $displays = \Drupal::translation()->formatPlural(count($variables['displays']), 'Display', 'Displays') . ': <em>';
     $separator = '';
     foreach ($variables['displays'] as $displays_item) {
       $displays .= $separator . SafeMarkup::escape($displays_item);
diff --git a/core/themes/bartik/css/style.css b/core/themes/bartik/css/style.css
index f03caa5..0d9ba5e 100644
--- a/core/themes/bartik/css/style.css
+++ b/core/themes/bartik/css/style.css
@@ -326,11 +326,11 @@ ul.menu li {
 [dir="rtl"] .region-content ol {
   padding: 0 15px 0.25em 0;
 }
-.item-list ul li {
+li {
   margin: 0;
   padding: 0.2em 0.5em 0 0; /* LTR */
 }
-[dir="rtl"] .item-list ul li {
+[dir="rtl"] li {
   padding: 0.2em 0 0 0.5em;
 }
 ul.tips {
@@ -494,30 +494,30 @@ h1.site-name {
   margin: 0;
   padding: 0;
 }
-.region-header #block-user-login div.item-list,
+.region-header #block-user-login ul,
 .region-header #block-user-login div.description {
   font-size: 0.916em;
   margin: 0;
 }
-.region-header #block-user-login div.item-list {
+.region-header #block-user-login ul {
   clear: both;
 }
 .region-header #block-user-login div.description {
   display: inline;
 }
-.region-header #block-user-login .item-list ul {
+.region-header #block-user-login ul {
   padding: 0;
   line-height: 1;
 }
-.region-header #block-user-login .item-list li {
+.region-header #block-user-login li {
   list-style: none;
   float: left; /* LTR */
   padding: 3px 0 1px;
 }
-.region-header #block-user-login .item-list li:last-child {
+.region-header #block-user-login li:last-child {
   padding-left: 0.5em; /* LTR */
 }
-[dir="rtl"] .region-header #block-user-login .item-list li:last-child {
+[dir="rtl"] .region-header #block-user-login li:last-child {
   padding-left: 0;
   padding-right: 0.5em;
 }
@@ -559,7 +559,7 @@ h1.site-name {
 [dir="rtl"] .site-branding-text,
 [dir="rtl"] .region-header .block,
 [dir="rtl"] .region-header #block-user-login .form-item,
-[dir="rtl"] .region-header #block-user-login .item-list li {
+[dir="rtl"] .region-header #block-user-login li {
   float: right;
 }
 
diff --git a/core/themes/seven/css/components/menus-and-lists.css b/core/themes/seven/css/components/menus-and-lists.css
index bd2d908..c68808b 100644
--- a/core/themes/seven/css/components/menus-and-lists.css
+++ b/core/themes/seven/css/components/menus-and-lists.css
@@ -1,15 +1,7 @@
 /**
  * Menus and lists.
  */
-.item-list ul {
-  list-style-type: disc;
-  list-style-image: none;
-  margin: 0.25em 0 0.25em 1.5em; /* LTR */
-}
-[dir="rtl"] .item-list ul {
-  margin: 0.25em 1.5em 0.25em 0;
-}
-.item-list ul li,
+li,
 li.leaf,
 ul.menu li {
   list-style-type: disc;
@@ -18,13 +10,11 @@ ul.menu li {
 ul.menu li {
   margin: 0;
 }
-.item-list ul li.collapsed,
-ul.menu li.collapsed {
+li.collapsed {
   list-style-image: url(../../../../misc/menu-collapsed.png);
   list-style-type: disc;
 }
-.item-list ul li.expanded,
-ul.menu li.expanded {
+li.expanded {
   list-style-image: url(../../../../misc/menu-expanded.png);
   list-style-type: circle;
 }
diff --git a/core/themes/seven/css/components/tables.css b/core/themes/seven/css/components/tables.css
index 8242d85..14e1c92 100644
--- a/core/themes/seven/css/components/tables.css
+++ b/core/themes/seven/css/components/tables.css
@@ -93,7 +93,7 @@ th.active > a:focus:after,
 th.active > a:hover:after {
   border-bottom-color: #008ee6;
 }
-td .item-list ul {
+td ul {
   margin: 0;
 }
 td.active {
diff --git a/core/themes/seven/css/components/views-ui.css b/core/themes/seven/css/components/views-ui.css
index ed33366..d6a159f 100644
--- a/core/themes/seven/css/components/views-ui.css
+++ b/core/themes/seven/css/components/views-ui.css
@@ -93,8 +93,8 @@ details.fieldset-no-legend {
 
 /* @group Lists */
 
-.views-admin ul.secondary,
-.views-admin .item-list ul {
+.views-admin ul,
+.views-admin ul.secondary {
   margin: 0;
   padding: 0;
 }
