diff --git a/core/core.libraries.yml b/core/core.libraries.yml
index 3e933c5..3d5fcef 100644
--- a/core/core.libraries.yml
+++ b/core/core.libraries.yml
@@ -161,6 +161,9 @@ drupal.dialog:
     misc/dialog/dialog.js: {}
     misc/dialog/dialog.position.js: {}
     misc/dialog/dialog.jquery-ui.js: {}
+  css:
+    theme:
+      misc/dialog.theme.css: {}
   dependencies:
     - core/jquery
     - core/drupal
@@ -196,6 +199,8 @@ drupal.dropbutton:
   css:
     component:
       misc/dropbutton/dropbutton.css: {}
+    theme:
+      misc/dropbutton/dropbutton.theme.css: {}
   dependencies:
     - core/jquery
     - core/drupal
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index f2c8436..23ab6db 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -737,22 +737,10 @@ public function getTranslation($langcode) {
     if (isset($this->translations[$langcode]['entity'])) {
       $translation = $this->translations[$langcode]['entity'];
     }
-    else {
-      if (isset($this->translations[$langcode])) {
-        $translation = $this->initializeTranslation($langcode);
-        $this->translations[$langcode]['entity'] = $translation;
-      }
-      else {
-        // If we were given a valid language and there is no translation for it,
-        // we return a new one.
-        $this->getLanguages();
-        if (isset($this->languages[$langcode])) {
-          // If the entity or the requested language  is not a configured
-          // language, we fall back to the entity itself, since in this case it
-          // cannot have translations.
-          $translation = !$this->languages[$this->defaultLangcode]->isLocked() && !$this->languages[$langcode]->isLocked() ? $this->addTranslation($langcode) : $this;
-        }
-      }
+    // Otherwise if an existing language was specified instantiate it.
+    elseif (isset($this->translations[$langcode])) {
+      $translation = $this->initializeTranslation($langcode);
+      $this->translations[$langcode]['entity'] = $translation;
     }
 
     if (empty($translation)) {
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityForm.php b/core/lib/Drupal/Core/Entity/ContentEntityForm.php
index eed3cac..d29ae3a 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityForm.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityForm.php
@@ -173,7 +173,7 @@ protected function init(FormStateInterface $form_state) {
     // language.
     $this->initFormLangcodes($form_state);
     $langcode = $this->getFormLangcode($form_state);
-    $this->entity = $this->entity->getTranslation($langcode);
+    $this->entity = $this->entity->hasTranslation($langcode) ? $this->entity->getTranslation($langcode) : $this->entity->addTranslation($langcode);
 
     $form_display = EntityFormDisplay::collectRenderDisplay($this->entity, $this->getOperation());
     $this->setFormDisplay($form_display, $form_state);
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkTree.php b/core/lib/Drupal/Core/Menu/MenuLinkTree.php
index 6307c49..090293c 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkTree.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkTree.php
@@ -243,28 +243,26 @@ protected function buildItems(array $tree, CacheableMetadata &$tree_access_cache
       if ($data->access instanceof AccessResultInterface && !$data->access->isAllowed()) {
         continue;
       }
-      $element = [];
 
-      // Set a variable for the <li> tag. Only set 'expanded' to true if the
-      // link also has visible children within the current tree.
-      $element['is_expanded'] = FALSE;
-      $element['is_collapsed'] = FALSE;
+      $class = ['menu-item'];
+      // Set a class for the <li>-tag. Only set 'expanded' class if the link
+      // also has visible children within the current tree.
       if ($data->hasChildren && !empty($data->subtree)) {
-        $element['is_expanded'] = TRUE;
+        $class[] = 'menu-item--expanded';
       }
       elseif ($data->hasChildren) {
-        $element['is_collapsed'] = TRUE;
+        $class[] = 'menu-item--collapsed';
       }
-      // Set a helper variable to indicate whether the link is in the active
-      // trail.
-      $element['in_active_trail'] = FALSE;
+      // Set a class if the link is in the active trail.
       if ($data->inActiveTrail) {
-        $element['in_active_trail'] = TRUE;
+        $class[] = 'menu-item--active-trail';
       }
 
       // Note: links are rendered in the menu.html.twig template; and they
       // automatically bubble their associated cacheability metadata.
+      $element = array();
       $element['attributes'] = new Attribute();
+      $element['attributes']['class'] = $class;
       $element['title'] = $link->getTitle();
       $element['url'] = $link->getUrlObject();
       $element['url']->setOption('set_active_class', TRUE);
diff --git a/core/themes/classy/css/components/dialog.css b/core/misc/dialog.theme.css
similarity index 99%
rename from core/themes/classy/css/components/dialog.css
rename to core/misc/dialog.theme.css
index d45d34b..837e49f 100644
--- a/core/themes/classy/css/components/dialog.css
+++ b/core/misc/dialog.theme.css
@@ -1,5 +1,4 @@
 /**
- * @file
  * Presentational styles for Drupal dialogs.
  */
 
diff --git a/core/themes/classy/css/components/dropbutton.css b/core/misc/dropbutton/dropbutton.theme.css
similarity index 99%
rename from core/themes/classy/css/components/dropbutton.css
rename to core/misc/dropbutton/dropbutton.theme.css
index cf8c40a..65f2568 100644
--- a/core/themes/classy/css/components/dropbutton.css
+++ b/core/misc/dropbutton/dropbutton.theme.css
@@ -1,3 +1,4 @@
+
 /**
  * @file
  * General styles for dropbuttons.
diff --git a/core/modules/book/src/BookManager.php b/core/modules/book/src/BookManager.php
index e6e2588..fcb46a4 100644
--- a/core/modules/book/src/BookManager.php
+++ b/core/modules/book/src/BookManager.php
@@ -539,33 +539,30 @@ protected function buildItems(array $tree) {
     $items = [];
 
     foreach ($tree as $data) {
-      $element = [];
-
+      $class = ['menu-item'];
       // Generally we only deal with visible links, but just in case.
       if (!$data['link']['access']) {
         continue;
       }
-      // Set a class for the <li> tag. Since $data['below'] may contain local
-      // tasks, only set 'expanded' to true if the link also has children within
+      // Set a class for the <li>-tag. Since $data['below'] may contain local
+      // tasks, only set 'expanded' class if the link also has children within
       // the current book.
-      $element['is_expanded'] = FALSE;
-      $element['is_collapsed'] = FALSE;
       if ($data['link']['has_children'] && $data['below']) {
-        $element['is_expanded'] = TRUE;
+        $class[] = 'menu-item--expanded';
       }
       elseif ($data['link']['has_children']) {
-        $element['is_collapsed'] = TRUE;
+        $class[] = 'menu-item--collapsed';
       }
 
-      // Set a helper variable to indicate whether the link is in the active
-      // trail.
-      $element['in_active_trail'] = FALSE;
+      // Set a class if the link is in the active trail.
       if ($data['link']['in_active_trail']) {
-        $element['in_active_trail'] = TRUE;
+        $class[] = 'menu-item--active-trail';
       }
 
       // Allow book-specific theme overrides.
+      $element = [];
       $element['attributes'] = new Attribute();
+      $element['attributes']['class'] = $class;
       $element['title'] = $data['link']['title'];
       $node = $this->entityManager->getStorage('node')->load($data['link']['nid']);
       $element['url'] = $node->urlInfo();
diff --git a/core/modules/book/templates/book-tree.html.twig b/core/modules/book/templates/book-tree.html.twig
index bf7424f..a4edb37 100644
--- a/core/modules/book/templates/book-tree.html.twig
+++ b/core/modules/book/templates/book-tree.html.twig
@@ -11,11 +11,6 @@
  *   - below: The book item child items.
  *   - title: The book link title.
  *   - url: The book link URL, instance of \Drupal\Core\Url.
- *   - is_expanded: TRUE if the link has visible children within the current
- *     book tree.
- *   - is_collapsed: TRUE if the link has children within the current book tree
- *     that are not currently visible.
- *   - in_active_trail: TRUE if the link is in the active trail.
  *
  * @ingroup themeable
  */
@@ -36,14 +31,14 @@
     {% else %}
       <ul>
     {% endif %}
-    {% for item in items %}
-      <li{{ item.attributes }}>
-        {{ link(item.title, item.url) }}
-        {% if item.below %}
-          {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
-        {% endif %}
-      </li>
-    {% endfor %}
+      {% for item in items %}
+        <li{{ item.attributes }}>
+          {{ link(item.title, item.url) }}
+          {% if item.below %}
+            {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
+          {% endif %}
+        </li>
+      {% endfor %}
     </ul>
   {% endif %}
 {% endmacro %}
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationSyncImageTest.php b/core/modules/content_translation/src/Tests/ContentTranslationSyncImageTest.php
index 606b5b3..56b1ed5 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationSyncImageTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationSyncImageTest.php
@@ -160,7 +160,7 @@ function testImageFieldSync() {
     // items will be one less than the original values to check that only the
     // translated ones will be preserved. In fact we want the same fids and
     // items order for both languages.
-    $translation = $entity->getTranslation($langcode);
+    $translation = $entity->addTranslation($langcode);
     for ($delta = 0; $delta < $this->cardinality - 1; $delta++) {
       // Simulate a field reordering: items are shifted of one position ahead.
       // The modulo operator ensures we start from the beginning after reaching
diff --git a/core/modules/field/src/Tests/TranslationTest.php b/core/modules/field/src/Tests/TranslationTest.php
index d73beaf..8328951 100644
--- a/core/modules/field/src/Tests/TranslationTest.php
+++ b/core/modules/field/src/Tests/TranslationTest.php
@@ -124,7 +124,8 @@ function testTranslatableFieldSaveLoad() {
     $entity->langcode->value = reset($available_langcodes);
     foreach ($available_langcodes as $langcode) {
       $field_translations[$langcode] = $this->_generateTestFieldValues($this->fieldStorage->getCardinality());
-      $entity->getTranslation($langcode)->{$this->fieldName}->setValue($field_translations[$langcode]);
+      $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
+      $translation->{$this->fieldName}->setValue($field_translations[$langcode]);
     }
 
     // Save and reload the field translations.
@@ -160,7 +161,8 @@ function testTranslatableFieldSaveLoad() {
     $entity = entity_create($entity_type_id, $values);
     foreach ($translation_langcodes as $langcode) {
       $values[$this->fieldName][$langcode] = $this->_generateTestFieldValues($this->fieldStorage->getCardinality());
-      $entity->getTranslation($langcode, FALSE)->{$this->fieldName}->setValue($values[$this->fieldName][$langcode]);
+      $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
+      $translation->{$this->fieldName}->setValue($values[$this->fieldName][$langcode]);
     }
 
     $field_langcodes = array_keys($entity->getTranslationLanguages());
@@ -178,8 +180,9 @@ function testTranslatableFieldSaveLoad() {
       $entity = entity_create($entity_type_id, $values);
       foreach ($translation_langcodes as $langcode) {
         $values[$this->fieldName][$langcode] = $this->_generateTestFieldValues($this->fieldStorage->getCardinality());
-        $entity->getTranslation($langcode)->{$this->fieldName}->setValue($values[$this->fieldName][$langcode]);
-        $entity->getTranslation($langcode)->{$field_name_default}->setValue($empty_items);
+        $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
+        $translation->{$this->fieldName}->setValue($values[$this->fieldName][$langcode]);
+        $translation->{$field_name_default}->setValue($empty_items);
         $values[$field_name_default][$langcode] = $empty_items;
       }
 
diff --git a/core/modules/field/src/Tests/TranslationWebTest.php b/core/modules/field/src/Tests/TranslationWebTest.php
index 326692d..4aa8c48 100644
--- a/core/modules/field/src/Tests/TranslationWebTest.php
+++ b/core/modules/field/src/Tests/TranslationWebTest.php
@@ -104,7 +104,8 @@ function testFieldFormTranslationRevisions() {
     ksort($available_langcodes);
     $entity->langcode->value = key($available_langcodes);
     foreach ($available_langcodes as $langcode => $value) {
-      $entity->getTranslation($langcode)->{$field_name}->value = $value + 1;
+      $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
+      $translation->{$field_name}->value = $value + 1;
     }
     $entity->save();
 
diff --git a/core/modules/file/css/file.theme.css b/core/modules/file/css/file.theme.css
new file mode 100644
index 0000000..e17e2b8
--- /dev/null
+++ b/core/modules/file/css/file.theme.css
@@ -0,0 +1,62 @@
+/**
+ * @file
+ * Default style for file module.
+ */
+
+/* File icons.*/
+
+.file {
+  padding-left: 20px; /* LTR */
+  display: inline-block;
+  min-height: 16px;
+  background-repeat: no-repeat;
+  background-position: left center; /* LTR */
+}
+[dir="rtl"] .file {
+  padding-left: inherit;
+  padding-right: 20px;
+  background-position: right center;
+}
+.file--general,
+.file--application-octet-stream {
+  background-image: url(../icons/application-octet-stream.png);
+}
+.file--package-x-generic {
+  background-image: url(../icons/package-x-generic.png);
+}
+.file--x-office-spreadsheet {
+  background-image: url(../icons/x-office-spreadsheet.png);
+}
+.file--x-office-document {
+  background-image: url(../icons/x-office-document.png);
+}
+.file--x-office-presentation {
+  background-image: url(../icons/x-office-presentation.png);
+}
+.file--text-x-script {
+  background-image: url(../icons/text-x-script.png);
+}
+.file--text-html {
+  background-image: url(../icons/text-html.png);
+}
+.file--text-plain {
+  background-image: url(../icons/text-plain.png);
+}
+.file--application-pdf {
+  background-image: url(../icons/application-pdf.png);
+}
+.file--application-x-executable {
+  background-image: url(../icons/application-x-executable.png);
+}
+.file--audio {
+  background-image: url(../icons/audio-x-generic.png);
+}
+.file--video {
+  background-image: url(../icons/video-x-generic.png);
+}
+.file--text {
+  background-image: url(../icons/text-x-generic.png);
+}
+.file--image {
+  background-image: url(../icons/image-x-generic.png);
+}
diff --git a/core/modules/file/file.libraries.yml b/core/modules/file/file.libraries.yml
index f72a2eb..c44af55 100644
--- a/core/modules/file/file.libraries.yml
+++ b/core/modules/file/file.libraries.yml
@@ -12,3 +12,10 @@ drupal.file:
     - core/jquery.once
     - core/drupal
     - core/drupalSettings
+
+drupal.file.formatter.generic:
+  version: VERSION
+  css:
+    theme:
+      css/file.theme.css: {}
+
diff --git a/core/themes/classy/images/icons/application-octet-stream.png b/core/modules/file/icons/application-octet-stream.png
similarity index 100%
rename from core/themes/classy/images/icons/application-octet-stream.png
rename to core/modules/file/icons/application-octet-stream.png
diff --git a/core/themes/classy/images/icons/application-pdf.png b/core/modules/file/icons/application-pdf.png
similarity index 100%
rename from core/themes/classy/images/icons/application-pdf.png
rename to core/modules/file/icons/application-pdf.png
diff --git a/core/themes/classy/images/icons/application-x-executable.png b/core/modules/file/icons/application-x-executable.png
similarity index 100%
rename from core/themes/classy/images/icons/application-x-executable.png
rename to core/modules/file/icons/application-x-executable.png
diff --git a/core/themes/classy/images/icons/audio-x-generic.png b/core/modules/file/icons/audio-x-generic.png
similarity index 100%
rename from core/themes/classy/images/icons/audio-x-generic.png
rename to core/modules/file/icons/audio-x-generic.png
diff --git a/core/themes/classy/images/icons/image-x-generic.png b/core/modules/file/icons/image-x-generic.png
similarity index 100%
rename from core/themes/classy/images/icons/image-x-generic.png
rename to core/modules/file/icons/image-x-generic.png
diff --git a/core/themes/classy/images/icons/package-x-generic.png b/core/modules/file/icons/package-x-generic.png
similarity index 100%
rename from core/themes/classy/images/icons/package-x-generic.png
rename to core/modules/file/icons/package-x-generic.png
diff --git a/core/themes/classy/images/icons/text-html.png b/core/modules/file/icons/text-html.png
similarity index 100%
rename from core/themes/classy/images/icons/text-html.png
rename to core/modules/file/icons/text-html.png
diff --git a/core/themes/classy/images/icons/text-plain.png b/core/modules/file/icons/text-plain.png
similarity index 100%
rename from core/themes/classy/images/icons/text-plain.png
rename to core/modules/file/icons/text-plain.png
diff --git a/core/themes/classy/images/icons/text-x-generic.png b/core/modules/file/icons/text-x-generic.png
similarity index 100%
rename from core/themes/classy/images/icons/text-x-generic.png
rename to core/modules/file/icons/text-x-generic.png
diff --git a/core/themes/classy/images/icons/text-x-script.png b/core/modules/file/icons/text-x-script.png
similarity index 100%
rename from core/themes/classy/images/icons/text-x-script.png
rename to core/modules/file/icons/text-x-script.png
diff --git a/core/themes/classy/images/icons/video-x-generic.png b/core/modules/file/icons/video-x-generic.png
similarity index 100%
rename from core/themes/classy/images/icons/video-x-generic.png
rename to core/modules/file/icons/video-x-generic.png
diff --git a/core/themes/classy/images/icons/x-office-document.png b/core/modules/file/icons/x-office-document.png
similarity index 100%
rename from core/themes/classy/images/icons/x-office-document.png
rename to core/modules/file/icons/x-office-document.png
diff --git a/core/themes/classy/images/icons/x-office-presentation.png b/core/modules/file/icons/x-office-presentation.png
similarity index 100%
rename from core/themes/classy/images/icons/x-office-presentation.png
rename to core/modules/file/icons/x-office-presentation.png
diff --git a/core/themes/classy/images/icons/x-office-spreadsheet.png b/core/modules/file/icons/x-office-spreadsheet.png
similarity index 100%
rename from core/themes/classy/images/icons/x-office-spreadsheet.png
rename to core/modules/file/icons/x-office-spreadsheet.png
diff --git a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
index 6219cd0..a157d96 100644
--- a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
+++ b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
@@ -47,6 +47,11 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         unset($item->_attributes);
       }
     }
+    if (!empty($elements)) {
+      $elements['#attached'] = array(
+        'library' => array('file/drupal.file.formatter.generic'),
+      );
+    }
 
     return $elements;
   }
diff --git a/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php b/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php
index 90dcaa9..d28d26f 100644
--- a/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php
+++ b/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php
@@ -54,7 +54,9 @@ public function postSave($update) {
       // Get the file IDs attached to the field before this update.
       $field_name = $this->getFieldDefinition()->getName();
       $original_ids = array();
-      $original_items = $entity->original->getTranslation($this->getLangcode())->$field_name;
+      $langcode = $this->getLangcode();
+      $original = $entity->original;
+      $original_items = $original->hasTranslation($langcode) ? $original->getTranslation($langcode)->{$field_name} : $original->{$field_name};
       foreach ($original_items as $item) {
         $original_ids[] = $item->target_id;
       }
diff --git a/core/themes/classy/css/components/forum.css b/core/modules/forum/css/forum.theme.css
similarity index 92%
rename from core/themes/classy/css/components/forum.css
rename to core/modules/forum/css/forum.theme.css
index 2f71524..1ce5c4d 100644
--- a/core/themes/classy/css/components/forum.css
+++ b/core/modules/forum/css/forum.theme.css
@@ -8,7 +8,7 @@
   margin: 0.5em;
 }
 .forum__icon {
-  background-image: url(../../images/icons/forum-icons.png);
+  background-image: url(../icons/forum-icons.png);
   background-repeat: no-repeat;
   float: left; /* LTR */
   height: 24px;
diff --git a/core/modules/forum/forum.libraries.yml b/core/modules/forum/forum.libraries.yml
new file mode 100644
index 0000000..bf7079e
--- /dev/null
+++ b/core/modules/forum/forum.libraries.yml
@@ -0,0 +1,5 @@
+forum.index:
+  version: VERSION
+  css:
+    component:
+      css/forum.theme.css: {}
diff --git a/core/themes/classy/images/icons/forum-icons.png b/core/modules/forum/icons/forum-icons.png
similarity index 100%
rename from core/themes/classy/images/icons/forum-icons.png
rename to core/modules/forum/icons/forum-icons.png
diff --git a/core/modules/forum/src/Controller/ForumController.php b/core/modules/forum/src/Controller/ForumController.php
index 7e2a815..7f84a02 100644
--- a/core/modules/forum/src/Controller/ForumController.php
+++ b/core/modules/forum/src/Controller/ForumController.php
@@ -224,6 +224,7 @@ protected function build($forums, TermInterface $term, $topics = array(), $paren
       '#sortby' => $config->get('topics.order'),
       '#forums_per_page' => $config->get('topics.page_limit'),
     );
+    $build['#attached']['library'][] = 'forum/forum.index';
     if (empty($term->forum_container->value)) {
       $build['#attached']['feed'][] = array('taxonomy/term/' . $term->id() . '/feed', 'RSS - ' . $term->getName());
     }
diff --git a/core/modules/hal/src/Normalizer/FieldItemNormalizer.php b/core/modules/hal/src/Normalizer/FieldItemNormalizer.php
index 53c544c..0f7ef6f 100644
--- a/core/modules/hal/src/Normalizer/FieldItemNormalizer.php
+++ b/core/modules/hal/src/Normalizer/FieldItemNormalizer.php
@@ -107,7 +107,8 @@ protected function createTranslatedInstance(FieldItemInterface $item, $langcode)
     unset($items[$delta]);
 
     // Instead, create a new item for the entity in the requested language.
-    $entity_translation = $item->getEntity()->getTranslation($langcode);
+    $entity = $item->getEntity();
+    $entity_translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
     $field_name = $item->getFieldDefinition()->getName();
     return $entity_translation->get($field_name)->appendItem();
   }
diff --git a/core/modules/hal/src/Tests/NormalizeTest.php b/core/modules/hal/src/Tests/NormalizeTest.php
index 44d7f24..0f24d73 100644
--- a/core/modules/hal/src/Tests/NormalizeTest.php
+++ b/core/modules/hal/src/Tests/NormalizeTest.php
@@ -58,7 +58,7 @@ public function testNormalize() {
     $entity = entity_create('entity_test', $values);
     $entity->save();
     // Add an English value for name and entity reference properties.
-    $entity->getTranslation('en')->set('name', array(0 => array('value' => $translation_values['name'])));
+    $entity->addTranslation('en')->set('name', array(0 => array('value' => $translation_values['name'])));
     $entity->getTranslation('en')->set('field_test_entity_reference', array(0 => $translation_values['field_test_entity_reference']));
     $entity->save();
 
diff --git a/core/themes/classy/css/components/image-widget.css b/core/modules/image/css/image.theme.css
similarity index 100%
rename from core/themes/classy/css/components/image-widget.css
rename to core/modules/image/css/image.theme.css
diff --git a/core/modules/image/image.libraries.yml b/core/modules/image/image.libraries.yml
index e9061a4..fbf9ef4 100644
--- a/core/modules/image/image.libraries.yml
+++ b/core/modules/image/image.libraries.yml
@@ -1,3 +1,9 @@
+form:
+  version: VERSION
+  css:
+    theme:
+      css/image.theme.css: {}
+
 admin:
   version: VERSION
   css:
diff --git a/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php b/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php
index ec83970..1449c7f 100644
--- a/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php
+++ b/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php
@@ -160,6 +160,7 @@ public static function process($element, FormStateInterface $form_state, $form)
     $item['fids'] = $element['fids']['#value'];
 
     $element['#theme'] = 'image_widget';
+    $element['#attached']['library'][] = 'image/form';
 
     // Add the image preview.
     if (!empty($element['#files']) && $element['#preview_image_style']) {
diff --git a/core/modules/node/src/NodeAccessControlHandler.php b/core/modules/node/src/NodeAccessControlHandler.php
index f655a5e..1d29b39 100644
--- a/core/modules/node/src/NodeAccessControlHandler.php
+++ b/core/modules/node/src/NodeAccessControlHandler.php
@@ -100,7 +100,8 @@ public function createAccess($entity_bundle = NULL, AccountInterface $account =
   protected function checkAccess(EntityInterface $node, $operation, $langcode, AccountInterface $account) {
     /** @var \Drupal\node\NodeInterface $node */
     /** @var \Drupal\node\NodeInterface $translation */
-    $translation = $node->getTranslation($langcode);
+    $translation = $node->hasTranslation($langcode) ? $node->getTranslation($langcode) : $node;
+
     // Fetch information from the node object if possible.
     $status = $translation->isPublished();
     $uid = $translation->getOwnerId();
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php b/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
index d60cf6f..afa5368 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
@@ -110,7 +110,7 @@ protected function setUp() {
       'field_private' => array(array('value' => 0)),
       'private' => FALSE,
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
@@ -121,7 +121,7 @@ protected function setUp() {
       'field_private' => array(array('value' => 0)),
       'private' => TRUE,
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
@@ -132,7 +132,7 @@ protected function setUp() {
       'field_private' => array(array('value' => 1)),
       'private' => FALSE,
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
@@ -143,7 +143,7 @@ protected function setUp() {
       'field_private' => array(array('value' => 0)),
       'private' => FALSE,
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
@@ -154,7 +154,7 @@ protected function setUp() {
       'field_private' => array(array('value' => 1)),
       'private' => FALSE,
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
@@ -165,7 +165,7 @@ protected function setUp() {
       'field_private' => array(array('value' => 1)),
       'private' => TRUE,
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php b/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
index 81ecbd1..1f5c1fb 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
@@ -103,7 +103,7 @@ protected function setUp() {
       'langcode' => 'hu',
       'field_private' => array(array('value' => 0)),
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
@@ -113,7 +113,7 @@ protected function setUp() {
       'langcode' => 'hu',
       'field_private' => array(array('value' => 0)),
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
@@ -123,7 +123,7 @@ protected function setUp() {
       'langcode' => 'hu',
       'field_private' => array(array('value' => 1)),
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
@@ -133,7 +133,7 @@ protected function setUp() {
       'langcode' => 'hu',
       'field_private' => array(array('value' => 1)),
     ));
-    $translation = $node->getTranslation('ca');
+    $translation = $node->addTranslation('ca');
     $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module
index e4a0c9f..9c818ca 100644
--- a/core/modules/responsive_image/responsive_image.module
+++ b/core/modules/responsive_image/responsive_image.module
@@ -178,38 +178,18 @@ function template_preprocess_responsive_image(&$variables) {
       $variables['sources'][] = responsive_image_build_source_attributes($image, $variables, $breakpoints[$breakpoint_id], $multipliers);
     }
   }
-
-  if (isset($variables['sources']) && count($variables['sources']) === 1 && !isset($variables['sources'][0]['media'])) {
-    // There is only one source tag with an empty media attribute. This means
-    // we can output an image tag with the srcset attribute in stead of a
-    // picture tag.
-    $variables['output_image_tag'] = TRUE;
-    foreach ($variables['sources'][0] as $attribute => $value) {
-      if ($attribute != 'type') {
-        $variables['attributes'][$attribute] = $value;
-      }
-    }
-    $variables['img_element'] = array(
-      '#theme' => 'image',
-      '#uri' => _responsive_image_image_style_url($responsive_image_style->getFallbackImageStyle(), $image->getSource()),
-    );
-  }
-  else {
-    $variables['output_image_tag'] = FALSE;
-    // Prepare the fallback image. Use srcset in the fallback image to avoid
-    // unnecessary preloading of images in older browsers. See
-    // http://scottjehl.github.io/picturefill/#using-picture and
-    // http://scottjehl.github.io/picturefill/#gotchas for more information.
-    $variables['img_element'] = array(
-      '#theme' => 'image',
-      '#srcset' => array(
-        array(
-          'uri' => _responsive_image_image_style_url($responsive_image_style->getFallbackImageStyle(), $image->getSource()),
-        ),
+  // Prepare the fallback image. Use srcset in the fallback image to avoid
+  // unnecessary preloading of images in older browsers. See
+  // http://scottjehl.github.io/picturefill/#using-picture and
+  // http://scottjehl.github.io/picturefill/#gotchas for more information.
+  $variables['img_element'] = array(
+    '#theme' => 'image',
+    '#srcset' => array(
+      array(
+        'uri' => _responsive_image_image_style_url($responsive_image_style->getFallbackImageStyle(), $image->getSource()),
       ),
-    );
-  }
-
+    ),
+  );
   if (isset($variables['attributes'])) {
     if (isset($variables['attributes']['alt'])) {
       $variables['img_element']['#alt'] = $variables['attributes']['alt'];
diff --git a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
index 0d03835..9e10fe9 100644
--- a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
+++ b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
@@ -100,17 +100,6 @@ public function form(array $form, FormStateInterface $form_state) {
       '#options' => $this->breakpointManager->getGroups(),
       '#required' => TRUE,
       '#description' => $description,
-      '#ajax' => array(
-        'callback' => '::breakpointMappingFormAjax',
-        'wrapper' => 'responsive-image-style-breakpoints-wrapper',
-      ),
-    );
-
-    $form['keyed_styles'] = array(
-      '#type' => 'container',
-      '#attributes' => array(
-        'id' => 'responsive-image-style-breakpoints-wrapper',
-      ),
     );
 
     // By default, breakpoints are ordered from smallest weight to largest:
@@ -160,15 +149,12 @@ public function form(array $form, FormStateInterface $form_state) {
         $form['keyed_styles'][$breakpoint_id][$multiplier]['sizes'] = array(
           '#type' => 'textfield',
           '#title' => $this->t('Sizes'),
-          '#default_value' => isset($image_style_mapping['image_mapping']['sizes']) ? $image_style_mapping['image_mapping']['sizes'] : '100vw',
+          '#default_value' => isset($image_style_mapping['image_mapping']['sizes']) ? $image_style_mapping['image_mapping']['sizes'] : '',
           '#description' => $this->t('Enter the value for the sizes attribute: for example "(min-width:700px) 700px, 100vw)".'),
           '#states' => array(
             'visible' => array(
               ':input[name="keyed_styles[' . $breakpoint_id . '][' . $multiplier . '][image_mapping_type]"]' => array('value' => 'sizes'),
             ),
-            'required' => array(
-              ':input[name="keyed_styles[' . $breakpoint_id . '][' . $multiplier . '][image_mapping_type]"]' => array('value' => 'sizes'),
-            ),
           ),
         );
         $form['keyed_styles'][$breakpoint_id][$multiplier]['sizes_image_styles'] = array(
@@ -181,9 +167,6 @@ public function form(array $form, FormStateInterface $form_state) {
             'visible' => array(
               ':input[name="keyed_styles[' . $breakpoint_id . '][' . $multiplier . '][image_mapping_type]"]' => array('value' => 'sizes'),
             ),
-            'required' => array(
-              ':input[name="keyed_styles[' . $breakpoint_id . '][' . $multiplier . '][image_mapping_type]"]' => array('value' => 'sizes'),
-            ),
           ),
         );
 
@@ -209,13 +192,6 @@ public function form(array $form, FormStateInterface $form_state) {
   }
 
   /**
-   * Get the form for mapping breakpoints to image styles.
-   */
-  public function breakpointMappingFormAjax($form, FormStateInterface $form_state) {
-    return $form['keyed_styles'];
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function validateForm(array &$form, FormStateInterface $form_state) {
@@ -227,20 +203,6 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
         // Remove the image style mappings since the breakpoint ID has changed.
         $form_state->unsetValue('keyed_styles');
       }
-
-      // Check that at least 1 image style has been selected when using sizes.
-      foreach ($form_state->getValue('keyed_styles') as $breakpoint_id => $multipliers) {
-        foreach ($multipliers as $multiplier => $image_style_mapping) {
-          if ($image_style_mapping['image_mapping_type'] === 'sizes') {
-            if (empty($image_style_mapping['sizes'])) {
-              $form_state->setError($form['keyed_styles'][$breakpoint_id][$multiplier]['sizes'], 'Provide a value for the sizes attribute.');
-            }
-            if (empty(array_keys(array_filter($image_style_mapping['sizes_image_styles'])))) {
-              $form_state->setError($form['keyed_styles'][$breakpoint_id][$multiplier]['sizes_image_styles'], 'Select at least one image style.');
-            }
-          }
-        }
-      }
     }
   }
 
diff --git a/core/modules/responsive_image/src/Tests/ResponsiveImageFieldDisplayTest.php b/core/modules/responsive_image/src/Tests/ResponsiveImageFieldDisplayTest.php
index 112caeb..06fd862 100644
--- a/core/modules/responsive_image/src/Tests/ResponsiveImageFieldDisplayTest.php
+++ b/core/modules/responsive_image/src/Tests/ResponsiveImageFieldDisplayTest.php
@@ -244,7 +244,6 @@ protected function doTestResponsiveImageFieldFormatters($scheme, $empty_styles =
     $cache_tags_header = $this->drupalGetHeader('X-Drupal-Cache-Tags');
     $this->assertTrue(!preg_match('/ image_style\:/', $cache_tags_header), 'No image style cache tag found.');
 
-    $this->removeWhiteSpace();
     $this->assertRaw($default_output, 'Image linked to file formatter displaying correctly on full node view.');
     // Verify that the image can be downloaded.
     $this->assertEqual(file_get_contents($test_image->uri), $this->drupalGet(file_create_url($image_uri)), 'File was downloaded successfully.');
@@ -400,52 +399,6 @@ public function testResponsiveImageFieldFormattersEmptyMediaQuery() {
   }
 
   /**
-   * Tests responsive image formatter on node display with one source.
-   */
-  public function testResponsiveImageFieldFormattersOneSource() {
-    $this->responsiveImgStyle
-      // Test the output of an empty media query.
-      ->addImageStyleMapping('responsive_image_test_module.empty', '1x', array(
-        'image_mapping_type' => 'image_style',
-        'image_mapping' => 'medium',
-      ))
-      ->addImageStyleMapping('responsive_image_test_module.empty', '2x', array(
-          'image_mapping_type' => 'image_style',
-          'image_mapping' => 'large',
-        ))
-      ->save();
-    $node_storage = $this->container->get('entity.manager')->getStorage('node');
-    $field_name = Unicode::strtolower($this->randomMachineName());
-    $this->createImageField($field_name, 'article', array('uri_scheme' => 'public'));
-    // Create a new node with an image attached.
-    $test_image = current($this->drupalGetTestFiles('image'));
-    $nid = $this->uploadNodeImage($test_image, $field_name, 'article', $this->randomMachineName());
-    $node_storage->resetCache(array($nid));
-
-    // Use the responsive image formatter linked to file formatter.
-    $display_options = array(
-      'type' => 'responsive_image',
-      'settings' => array(
-        'image_link' => '',
-        'responsive_image_style' => 'style_one',
-      ),
-    );
-    $display = entity_get_display('node', 'article', 'default');
-    $display->setComponent($field_name, $display_options)
-      ->save();
-
-    // View the node.
-    $this->drupalGet('node/' . $nid);
-
-    // Assert the media attribute is present if it has a value.
-    $large_style = ImageStyle::load('large');
-    $medium_style = ImageStyle::load('medium');
-    $node = $node_storage->load($nid);
-    $image_uri = File::load($node->{$field_name}->target_id)->getFileUri();
-    $this->assertRaw('<img srcset="' . $medium_style->buildUrl($image_uri) . ' 1x, ' . $large_style->buildUrl($image_uri) . ' 2x"');
-  }
-
-  /**
    * Tests responsive image formatters linked to the file or node.
    *
    * @param string $link_type
@@ -498,7 +451,6 @@ private function assertResponsiveImageFieldFormattersLink($link_type) {
 
     // Output should contain all image styles and all breakpoints.
     $this->drupalGet('node/' . $nid);
-    $this->removeWhiteSpace();
     switch ($link_type) {
       case 'file':
         // Make sure the link to the file is present.
diff --git a/core/modules/responsive_image/templates/responsive-image.html.twig b/core/modules/responsive_image/templates/responsive-image.html.twig
index 99fca6b..a3a51a6 100644
--- a/core/modules/responsive_image/templates/responsive-image.html.twig
+++ b/core/modules/responsive_image/templates/responsive-image.html.twig
@@ -6,8 +6,6 @@
  * Available variables:
  * - sources: The attributes of the <source> tags for this <picture> tag.
  * - img_element: The controlling image, with the fallback image in srcset.
- * - output_image_tag: Whether or not to output an <img> tag instead of a
- *   <picture> tag.
  *
  * @see template_preprocess()
  * @see template_preprocess_responsive_image()
@@ -15,22 +13,18 @@
  * @ingroup themeable
  */
 #}
-{% if output_image_tag %}
+<picture>
+  {% if sources %}
+    {#
+    Internet Explorer 9 doesn't recognise source elements that are wrapped in
+    picture tags. See http://scottjehl.github.io/picturefill/#ie9
+    #}
+    <!--[if IE 9]><video style="display: none;"><![endif]-->
+    {% for source_attributes in sources %}
+      <source{{ source_attributes }}/>
+    {% endfor %}
+    <!--[if IE 9]></video><![endif]-->
+  {% endif %}
+  {# The controlling image, with the fallback image in srcset. #}
   {{ img_element }}
-{% else %}
-  <picture>
-    {% if sources %}
-      {#
-      Internet Explorer 9 doesn't recognise source elements that are wrapped in
-      picture tags. See http://scottjehl.github.io/picturefill/#ie9
-      #}
-      <!--[if IE 9]><video style="display: none;"><![endif]-->
-      {% for source_attributes in sources %}
-        <source{{ source_attributes }}/>
-      {% endfor %}
-      <!--[if IE 9]></video><![endif]-->
-    {% endif %}
-    {# The controlling image, with the fallback image in srcset. #}
-    {{ img_element }}
-  </picture>
-{% endif %}
+</picture>
diff --git a/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php b/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
index daa85be..6f7e692 100644
--- a/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
+++ b/core/modules/system/src/Tests/Entity/ContentEntityChangedTest.php
@@ -422,7 +422,7 @@ public function testRevisionChanged() {
       'Changed flag of German translation is set when changing the German translation.'
     );
 
-    $french = $entity->getTranslation('fr');
+    $french = $entity->addTranslation('fr');
 
     $entity->setNewRevision();
     $entity->save();
diff --git a/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php b/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php
index a048150..ab73ee1 100644
--- a/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityAccessControlHandlerTest.php
@@ -137,7 +137,7 @@ function testEntityTranslationAccess() {
     ));
     $entity->save();
 
-    $translation = $entity->getTranslation('bar');
+    $translation = $entity->addTranslation('bar');
     $this->assertEntityAccess(array(
       'view' => TRUE,
     ), $translation);
diff --git a/core/modules/system/src/Tests/Entity/EntityQueryTest.php b/core/modules/system/src/Tests/Entity/EntityQueryTest.php
index 4130804..3124f54 100644
--- a/core/modules/system/src/Tests/Entity/EntityQueryTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityQueryTest.php
@@ -130,7 +130,7 @@ protected function setUp() {
       ));
       // Make sure the name is set for every language that we might create.
       foreach (array('tr', 'pl') as $langcode) {
-        $entity->getTranslation($langcode)->name = $this->randomMachineName();
+        $entity->addTranslation($langcode)->name = $this->randomMachineName();
       }
       foreach (array_reverse(str_split(decbin($i))) as $key => $bit) {
         if ($bit) {
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
index 4ff9f22..805f682 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
@@ -106,9 +106,10 @@ function testEntityFormLanguage() {
 
     // Create a body translation and check the form language.
     $langcode2 = $this->langcodes[1];
-    $node->getTranslation($langcode2)->title->value = $this->randomString();
-    $node->getTranslation($langcode2)->body->value = $this->randomMachineName(16);
-    $node->getTranslation($langcode2)->setOwnerId($web_user->id());
+    $translation = $node->addTranslation($langcode2);
+    $translation->title->value = $this->randomString();
+    $translation->body->value = $this->randomMachineName(16);
+    $translation->setOwnerId($web_user->id());
     $node->save();
     $this->drupalGet($langcode2 . '/node/' . $node->id() . '/edit');
     $form_langcode = \Drupal::state()->get('entity_test.form_langcode');
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
index 21ff392..55e3050 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\system\Tests\Entity;
 
 use Drupal\Component\Utility\SafeMarkup;
-use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\entity_test\Entity\EntityTestMulRev;
 use Drupal\language\Entity\ConfigurableLanguage;
@@ -87,7 +86,7 @@ protected function doTestEntityLanguageMethods($entity_type) {
     $this->assertEqual($field->getLangcode(), $default_langcode, format_string('%entity_type: Field object has the expected langcode.', array('%entity_type' => $entity_type)));
 
     // Set a translation.
-    $entity->getTranslation($this->langcodes[1])->set($this->fieldName, array(0 => array('value' => 'translation 1')));
+    $entity->addTranslation($this->langcodes[1])->set($this->fieldName, array(0 => array('value' => 'translation 1')));
     $field = $entity->getTranslation($this->langcodes[1])->{$this->fieldName};
     $this->assertEqual($field->value, 'translation 1', format_string('%entity_type: Translated value set.', array('%entity_type' => $entity_type)));
     $this->assertEqual($field->getLangcode(), $this->langcodes[1], format_string('%entity_type: Field object has the expected langcode.', array('%entity_type' => $entity_type)));
@@ -100,16 +99,27 @@ protected function doTestEntityLanguageMethods($entity_type) {
     $translations[$this->langcodes[1]] = \Drupal::languageManager()->getLanguage($this->langcodes[1]);
     $this->assertEqual($entity->getTranslationLanguages(FALSE), $translations, 'Translations retrieved.');
 
+    // Try to get a value using a language code for a non-existing translation.
+    $message = 'Getting a non existing translation results in an error.';
+    try {
+      $entity->getTranslation($this->langcodes[2])->get($this->fieldName)->value;
+      $this->fail($message);
+    }
+    catch (\InvalidArgumentException $e) {
+      $this->pass($message);
+    }
+
     // Try to get a not available translation.
-    $this->assertNull($entity->getTranslation($this->langcodes[2])->get($this->fieldName)->value, format_string('%entity_type: A translation that is not available is NULL.', array('%entity_type' => $entity_type)));
+    $this->assertNull($entity->addTranslation($this->langcodes[2])->get($this->fieldName)->value, format_string('%entity_type: A translation that is not available is NULL.', array('%entity_type' => $entity_type)));
 
     // Try to get a value using an invalid language code.
+    $message = 'Getting an invalid translation results in an error.';
     try {
       $entity->getTranslation('invalid')->get($this->fieldName)->value;
-      $this->fail('Getting a translation for an invalid language is NULL.');
+      $this->fail($message);
     }
     catch (\InvalidArgumentException $e) {
-      $this->pass('A translation for an invalid language is NULL.');
+      $this->pass($message);
     }
 
     // Try to set a value using an invalid language code.
@@ -164,10 +174,11 @@ protected function doTestMultilingualProperties($entity_type) {
     $this->assertEqual($name, $field->value, format_string('%entity_type: The entity name has been correctly stored as language neutral.', array('%entity_type' => $entity_type)));
     $this->assertEqual($default_langcode, $field->getLangcode(), format_string('%entity_type: The field object has the expect langcode.', array('%entity_type' => $entity_type)));
     $this->assertEqual($uid, $entity->getTranslation(LanguageInterface::LANGCODE_DEFAULT)->get('user_id')->target_id, format_string('%entity_type: The entity author has been correctly stored as language neutral.', array('%entity_type' => $entity_type)));
-    $field = $entity->getTranslation($langcode)->get('name');
+    $translation = $entity->getTranslation($langcode);
+    $field = $translation->get('name');
     $this->assertEqual($name, $field->value, format_string('%entity_type: The entity name defaults to neutral language.', array('%entity_type' => $entity_type)));
     $this->assertEqual($default_langcode, $field->getLangcode(), format_string('%entity_type: The field object has the expect langcode.', array('%entity_type' => $entity_type)));
-    $this->assertEqual($uid, $entity->getTranslation($langcode)->get('user_id')->target_id, format_string('%entity_type: The entity author defaults to neutral language.', array('%entity_type' => $entity_type)));
+    $this->assertEqual($uid, $translation->get('user_id')->target_id, format_string('%entity_type: The entity author defaults to neutral language.', array('%entity_type' => $entity_type)));
     $field = $entity->get('name');
     $this->assertEqual($name, $field->value, format_string('%entity_type: The entity name can be retrieved without specifying a language.', array('%entity_type' => $entity_type)));
     $this->assertEqual($default_langcode, $field->getLangcode(), format_string('%entity_type: The field object has the expect langcode.', array('%entity_type' => $entity_type)));
@@ -211,7 +222,7 @@ protected function doTestMultilingualProperties($entity_type) {
           'user_id' => array(0 => $uid),
         );
       }
-      $translation = $entity->getTranslation($langcode);
+      $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
       foreach ($properties[$langcode] as $field_name => $values) {
         $translation->set($field_name, $values);
       }
@@ -416,7 +427,7 @@ protected function doTestEntityTranslationAPI($entity_type) {
     // new translation object can be obtained also by just specifying a valid
     // language.
     $langcode2 = $this->langcodes[2];
-    $translation = $entity->getTranslation($langcode2);
+    $translation = $entity->addTranslation($langcode2);
     $value = $entity !== $translation && $translation->language()->getId() == $langcode2 && $entity->hasTranslation($langcode2);
     $this->assertTrue($value, 'A new translation object can be obtained also by specifying a valid language.');
     $this->assertEqual($entity->language()->getId(), $default_langcode, 'The original language has been preserved.');
diff --git a/core/modules/system/src/Tests/Update/SevenSecondaryLocalTasksConvertedIntoBlockUpdateTest.php b/core/modules/system/src/Tests/Update/SevenSecondaryLocalTasksConvertedIntoBlockUpdateTest.php
deleted file mode 100644
index 1a15213..0000000
--- a/core/modules/system/src/Tests/Update/SevenSecondaryLocalTasksConvertedIntoBlockUpdateTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\system\Tests\Update\SevenSecondaryLocalTasksConvertedIntoBlockUpdateTest.
- */
-
-namespace Drupal\system\Tests\Update;
-
-use Drupal\node\Entity\Node;
-
-/**
- * Tests the upgrade path for converting seven secondary local tasks into a block.
- *
- * @see https://www.drupal.org/node/2569529
- *
- * @group system
- */
-class SevenSecondaryLocalTasksConvertedIntoBlockUpdateTest extends UpdatePathTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setDatabaseDumpFiles() {
-    $this->databaseDumpFiles = [
-      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
-      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.seven-secondary-local-tasks-block-2569529.php',
-    ];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    parent::setUp();
-    /** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
-    $theme_handler = \Drupal::service('theme_handler');
-    $theme_handler->refreshInfo();
-  }
-
-  /**
-   * Tests that local actions/tasks are being converted into blocks.
-   */
-  public function testUpdateHookN() {
-    $this->runUpdates();
-
-    /** @var \Drupal\block\BlockInterface $block_storage */
-    $block_storage = \Drupal::entityManager()->getStorage('block');
-
-    // Disable maintenance mode.
-    // @todo Can be removed once maintenance mode is automatically turned off
-    // after updates in https://www.drupal.org/node/2435135.
-    \Drupal::state()->set('system.maintenance_mode', FALSE);
-
-    // We finished updating so we can login the user now.
-    $this->drupalLogin($this->rootUser);
-
-    // Local actions are visible on the content listing page.
-    $this->drupalGet('admin/structure/block');
-    $action_link = $this->cssSelect('#secondary-tabs-title');
-    $this->assertTrue($action_link);
-  }
-
-}
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 6ece8ce..86a924a 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -1440,7 +1440,6 @@ function system_update_8005() {
         ] + $tabs_default_settings;
         _system_update_create_block($name, $theme_name, $values);
 
-        $name = 'block.block.seven_secondary_local_tasks';
         $values = [
           'region' => 'pre_content',
           'id' => 'seven_secondary_local_tasks',
@@ -1786,27 +1785,5 @@ function system_update_8010() {
 }
 
 /**
- * Add secondary local tasks block to Seven (fixes system_update_8005).
- */
-function system_update_8011() {
-  $langcode = \Drupal::service('language_manager')->getCurrentLanguage()->getId();
-  $theme_name = 'seven';
-  $name = 'block.block.seven_secondary_local_tasks';
-  $values = [
-      'plugin' => 'local_tasks_block',
-      'region' => 'pre_content',
-      'id' => 'seven_secondary_local_tasks',
-      'settings.label' => 'Secondary tabs',
-      'settings.label_display' => 0,
-      'settings.primary' => FALSE,
-      'settings.secondary' => TRUE,
-      'visibility' => [],
-      'weight' => 0,
-      'langcode' => $langcode,
-    ];
-  _system_update_create_block($name, $theme_name, $values);
-}
-
-/**
  * @} End of "addtogroup updates-8.0.0-beta".
  */
diff --git a/core/modules/system/templates/menu.html.twig b/core/modules/system/templates/menu.html.twig
index 03704f2..a9c7899 100644
--- a/core/modules/system/templates/menu.html.twig
+++ b/core/modules/system/templates/menu.html.twig
@@ -11,11 +11,6 @@
  *   - title: The menu link title.
  *   - url: The menu link url, instance of \Drupal\Core\Url
  *   - localized_options: Menu link localized options.
- *   - is_expanded: TRUE if the link has visible children within the current
- *     menu tree.
- *   - is_collapsed: TRUE if the link has children within the current menu tree
- *     that are not currently visible.
- *   - in_active_trail: TRUE if the link is in the active trail.
  *
  * @ingroup themeable
  */
@@ -36,14 +31,14 @@
     {% else %}
       <ul>
     {% endif %}
-    {% for item in items %}
-      <li{{ item.attributes }}>
-        {{ link(item.title, item.url) }}
-        {% if item.below %}
-          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
-        {% endif %}
-      </li>
-    {% endfor %}
+      {% for item in items %}
+        <li{{ item.attributes }}>
+          {{ link(item.title, item.url) }}
+          {% if item.below %}
+            {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
+          {% endif %}
+        </li>
+      {% endfor %}
     </ul>
   {% endif %}
 {% endmacro %}
diff --git a/core/modules/system/tests/fixtures/update/block.block.testfor2569529.yml b/core/modules/system/tests/fixtures/update/block.block.testfor2569529.yml
deleted file mode 100644
index 3339199..0000000
--- a/core/modules/system/tests/fixtures/update/block.block.testfor2569529.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-langcode: en
-status: true
-dependencies:
-  theme:
-    - seven
-id: seven_secondary_local_tasks
-theme: seven
-region: pre_content
-weight: 0
-provider: null
-plugin: local_tasks_block
-settings:
-  id: local_tasks_block
-  label: 'Secondary tabs'
-  provider: core
-  label_display: '0'
-  primary: false
-  secondary: true
-visibility: {  }
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.seven-secondary-local-tasks-block-2569529.php b/core/modules/system/tests/fixtures/update/drupal-8.seven-secondary-local-tasks-block-2569529.php
deleted file mode 100644
index 474a085..0000000
--- a/core/modules/system/tests/fixtures/update/drupal-8.seven-secondary-local-tasks-block-2569529.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains database additions to drupal-8.bare.standard.php.gz for testing the
- * upgrade path of https://www.drupal.org/node/507488.
- */
-
-use Drupal\Core\Database\Database;
-
-$connection = Database::getConnection();
-
-// Structure of a custom block with visibility settings.
-$block_configs[] = \Drupal\Component\Serialization\Yaml::decode(file_get_contents(__DIR__ . '/block.block.testfor2569529.yml'));
-
-foreach ($block_configs as $block_config) {
-  $connection->insert('config')
-    ->fields([
-      'collection',
-      'name',
-      'data',
-    ])
-    ->values([
-      'collection' => '',
-      'name' => 'block.block.' . $block_config['id'],
-      'data' => serialize($block_config),
-    ])
-    ->execute();
-}
-
-// Update the config entity query "index".
-$existing_blocks = $connection->select('key_value')
-    ->fields('key_value', ['value'])
-    ->condition('collection', 'config.entity.key_store.block')
-    ->condition('name', 'theme:seven')
-    ->execute()
-    ->fetchField();
-$existing_blocks = unserialize($existing_blocks);
-
-$connection->update('key_value')
-  ->fields([
-    'value' => serialize(array_merge($existing_blocks, ['block.block.seven_secondary_local_tasks']))
-  ])
-  ->condition('collection', 'config.entity.key_store.block')
-  ->condition('name', 'theme:seven')
-  ->execute();
diff --git a/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php b/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php
index 9faa03d..da545b2 100644
--- a/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php
+++ b/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php
@@ -140,29 +140,14 @@ public function providerTestBuildCacheability() {
       ]
     ];
 
-    $get_built_element = function(MenuLinkTreeElement $element) {
-      $return = [
-        'attributes' => new Attribute(),
+    $get_built_element = function(MenuLinkTreeElement $element, array $classes) {
+      return [
+        'attributes' => new Attribute(['class' => array_merge(['menu-item'], $classes)]),
         'title' => $element->link->getTitle(),
         'url' => new Url($element->link->getRouteName(), $element->link->getRouteParameters(), ['set_active_class' => TRUE]),
         'below' => [],
         'original_link' => $element->link,
-        'is_expanded' => FALSE,
-        'is_collapsed' => FALSE,
-        'in_active_trail' => FALSE,
       ];
-
-      if ($element->hasChildren && !empty($element->subtree)) {
-        $return['is_expanded'] = TRUE;
-      }
-      elseif ($element->hasChildren) {
-        $return['is_collapsed'] = TRUE;
-      }
-      if ($element->inActiveTrail) {
-        $return['in_active_trail'] = TRUE;
-      }
-
-      return $return;
     };
 
     // The three access scenarios described in this method's documentation.
@@ -210,7 +195,7 @@ public function providerTestBuildCacheability() {
         $tree[0]->access = $access;
         if ($access === NULL || $access->isAllowed()) {
           $expected_build = $base_expected_build;
-          $expected_build['#items']['test.example1'] = $get_built_element($tree[0]);
+          $expected_build['#items']['test.example1'] = $get_built_element($tree[0], []);
         }
         else {
           $expected_build = $base_expected_build_empty;
@@ -232,9 +217,9 @@ public function providerTestBuildCacheability() {
         $tree[0]->access = $access;
         $expected_build = $base_expected_build;
         if ($access === NULL || $access->isAllowed()) {
-          $expected_build['#items']['test.example1'] = $get_built_element($tree[0]);
+          $expected_build['#items']['test.example1'] = $get_built_element($tree[0], []);
         }
-        $expected_build['#items']['test.example2'] = $get_built_element($tree[1]);
+        $expected_build['#items']['test.example2'] = $get_built_element($tree[1], []);
         $expected_build['#cache']['contexts'] = array_merge($expected_build['#cache']['contexts'], $access_cache_contexts, $links[0]->getCacheContexts(), $links[1]->getCacheContexts());
         $data[] = [
           'description' => "Single-level tree; access=$i; link=$j.",
@@ -260,13 +245,13 @@ public function providerTestBuildCacheability() {
         ];
         $tree[0]->subtree[0]->subtree[0]->access = $access;
         $expected_build = $base_expected_build;
-        $expected_build['#items']['test.roota'] = $get_built_element($tree[0]);
-        $expected_build['#items']['test.roota']['below']['test.parentc'] = $get_built_element($tree[0]->subtree[0]);
+        $expected_build['#items']['test.roota'] = $get_built_element($tree[0], ['menu-item--expanded']);
+        $expected_build['#items']['test.roota']['below']['test.parentc'] = $get_built_element($tree[0]->subtree[0], ['menu-item--expanded']);
         if ($access === NULL || $access->isAllowed()) {
-          $expected_build['#items']['test.roota']['below']['test.parentc']['below']['test.example1'] = $get_built_element($tree[0]->subtree[0]->subtree[0]);
+          $expected_build['#items']['test.roota']['below']['test.parentc']['below']['test.example1'] = $get_built_element($tree[0]->subtree[0]->subtree[0], []);
         }
-        $expected_build['#items']['test.rootb'] = $get_built_element($tree[1]);
-        $expected_build['#items']['test.rootb']['below']['test.example2'] = $get_built_element($tree[1]->subtree[0]);
+        $expected_build['#items']['test.rootb'] = $get_built_element($tree[1], ['menu-item--expanded']);
+        $expected_build['#items']['test.rootb']['below']['test.example2'] = $get_built_element($tree[1]->subtree[0], []);
         $expected_build['#cache']['contexts'] = array_merge($expected_build['#cache']['contexts'], $access_cache_contexts, $links[0]->getCacheContexts(), $links[1]->getCacheContexts());
         $data[] = [
           'description' => "Multi-level tree; access=$i; link=$j.",
diff --git a/core/modules/toolbar/templates/menu--toolbar.html.twig b/core/modules/toolbar/templates/menu--toolbar.html.twig
index 659e8f5..3578b95 100644
--- a/core/modules/toolbar/templates/menu--toolbar.html.twig
+++ b/core/modules/toolbar/templates/menu--toolbar.html.twig
@@ -11,11 +11,6 @@
  *   - title: The menu link title.
  *   - url: The menu link url, instance of \Drupal\Core\Url
  *   - localized_options: Menu link localized options.
- *   - is_expanded: TRUE if the link has visible children within the current
- *     menu tree.
- *   - is_collapsed: TRUE if the link has children within the current menu tree
- *     that are not currently visible.
- *   - in_active_trail: TRUE if the link is in the active trail.
  *
  * @ingroup themeable
  */
@@ -36,22 +31,14 @@
     {% else %}
       <ul class="toolbar-menu">
     {% endif %}
-    {% for item in items %}
-      {%
-        set classes = [
-          'menu-item',
-          item.is_expanded ? 'menu-item--expanded',
-          item.is_collapsed ? 'menu-item--collapsed',
-          item.in_active_trail ? 'menu-item--active-trail',
-        ]
-      %}
-      <li{{ item.attributes.addClass(classes) }}>
-        {{ link(item.title, item.url) }}
-        {% if item.below %}
-          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
-        {% endif %}
-      </li>
-    {% endfor %}
+      {% for item in items %}
+        <li{{ item.attributes }}>
+          {{ link(item.title, item.url) }}
+          {% if item.below %}
+            {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
+          {% endif %}
+        </li>
+      {% endfor %}
     </ul>
   {% endif %}
 {% endmacro %}
diff --git a/core/modules/user/css/user.icons.admin.css b/core/modules/user/css/user.icons.theme.css
similarity index 100%
rename from core/modules/user/css/user.icons.admin.css
rename to core/modules/user/css/user.icons.theme.css
diff --git a/core/themes/classy/css/components/user.css b/core/modules/user/css/user.theme.css
similarity index 100%
rename from core/themes/classy/css/components/user.css
rename to core/modules/user/css/user.theme.css
diff --git a/core/modules/user/user.libraries.yml b/core/modules/user/user.libraries.yml
index 73e4e15..e11cbfa 100644
--- a/core/modules/user/user.libraries.yml
+++ b/core/modules/user/user.libraries.yml
@@ -5,6 +5,8 @@ drupal.user:
   css:
     component:
       css/user.module.css: {}
+    theme:
+      css/user.theme.css: {}
   dependencies:
     - core/jquery
     - core/drupal
@@ -31,4 +33,4 @@ drupal.user.icons:
   version: VERSION
   css:
     theme:
-      css/user.icons.admin.css: {}
+      css/user.icons.theme.css: {}
diff --git a/core/modules/views/src/Tests/Entity/FieldEntityTranslationTest.php b/core/modules/views/src/Tests/Entity/FieldEntityTranslationTest.php
index f83199c..8e4515a 100644
--- a/core/modules/views/src/Tests/Entity/FieldEntityTranslationTest.php
+++ b/core/modules/views/src/Tests/Entity/FieldEntityTranslationTest.php
@@ -70,7 +70,7 @@ public function testTranslationRows() {
     ]);
     $node->save();
 
-    $translation = $node->getTranslation('es');
+    $translation = $node->addTranslation('es');
     $translation->title->value = 'example ES';
     $translation->sticky->value = true;
     $translation->save();
diff --git a/core/themes/classy/classy.libraries.yml b/core/themes/classy/classy.libraries.yml
index d39d202..67477a8 100644
--- a/core/themes/classy/classy.libraries.yml
+++ b/core/themes/classy/classy.libraries.yml
@@ -31,30 +31,6 @@ book-navigation:
     component:
       css/components/book-navigation.css: {}
 
-dialog:
-  version: VERSION
-  css:
-    component:
-      css/components/dialog.css: { weight: -10 }
-
-dropbutton:
-  version: VERSION
-  css:
-    component:
-      css/components/dropbutton.css: { weight: -10 }
-
-file:
-  version: VERSION
-  css:
-    component:
-      css/components/file.css: { weight: -10 }
-
-forum:
-  version: VERSION
-  css:
-    component:
-      css/components/forum.css: { weight: -10 }
-
 indented:
   version: VERSION
   css:
@@ -84,9 +60,3 @@ search-results:
   css:
     component:
       css/components/search-results.css: {}
-
-user:
-  version: VERSION
-  css:
-    component:
-      css/components/user.css: { weight: -10 }
diff --git a/core/themes/classy/classy.theme b/core/themes/classy/classy.theme
deleted file mode 100644
index bc2cede..0000000
--- a/core/themes/classy/classy.theme
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * @file
- * Functions to support theming in the Classy theme.
- */
-
-/**
- * Implements hook_library_info_alter().
- */
-function classy_library_info_alter(&$libraries, $extension) {
-  if ($extension == 'user' && isset($libraries['drupal.user'])) {
-    // @todo Replace with https://www.drupal.org/node/2497667 when possible.
-    $library_discovery = \Drupal::service('library.discovery');
-    $library = $library_discovery->getLibraryByName('classy', 'user');
-    foreach ($library['css'] as $css) {
-      $libraries['drupal.user']['css']['component'][base_path() . $css['data']] = [];
-    }
-  }
-  if ($extension == 'core' && isset($libraries['drupal.dropbutton'])) {
-    $libraries['drupal.dropbutton']['dependencies'][] = 'classy/dropbutton';
-  }
-  if ($extension == 'core' && isset($libraries['drupal.dialog'])) {
-    $libraries['drupal.dialog']['dependencies'][] = 'classy/dialog';
-  }
-}
diff --git a/core/themes/classy/css/components/file.css b/core/themes/classy/css/components/file.css
deleted file mode 100644
index 5e16b4f..0000000
--- a/core/themes/classy/css/components/file.css
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * @file
- * Default style for file module.
- */
-
-/* File icons.*/
-
-.file {
-  padding-left: 20px; /* LTR */
-  display: inline-block;
-  min-height: 16px;
-  background-repeat: no-repeat;
-  background-position: left center; /* LTR */
-}
-[dir="rtl"] .file {
-  padding-left: inherit;
-  padding-right: 20px;
-  background-position: right center;
-}
-.file--general,
-.file--application-octet-stream {
-  background-image: url(../../images/icons/application-octet-stream.png);
-}
-.file--package-x-generic {
-  background-image: url(../../images/icons/package-x-generic.png);
-}
-.file--x-office-spreadsheet {
-  background-image: url(../../images/icons/x-office-spreadsheet.png);
-}
-.file--x-office-document {
-  background-image: url(../../images/icons/x-office-document.png);
-}
-.file--x-office-presentation {
-  background-image: url(../../images/icons/x-office-presentation.png);
-}
-.file--text-x-script {
-  background-image: url(../../images/icons/text-x-script.png);
-}
-.file--text-html {
-  background-image: url(../../images/icons/text-html.png);
-}
-.file--text-plain {
-  background-image: url(../../images/icons/text-plain.png);
-}
-.file--application-pdf {
-  background-image: url(../../images/icons/application-pdf.png);
-}
-.file--application-x-executable {
-  background-image: url(../../images/icons/application-x-executable.png);
-}
-.file--audio {
-  background-image: url(../../images/icons/audio-x-generic.png);
-}
-.file--video {
-  background-image: url(../../images/icons/video-x-generic.png);
-}
-.file--text {
-  background-image: url(../../images/icons/text-x-generic.png);
-}
-.file--image {
-  background-image: url(../../images/icons/image-x-generic.png);
-}
diff --git a/core/themes/classy/templates/content-edit/file-managed-file.html.twig b/core/themes/classy/templates/content-edit/file-managed-file.html.twig
index e7ae48d..f639237 100644
--- a/core/themes/classy/templates/content-edit/file-managed-file.html.twig
+++ b/core/themes/classy/templates/content-edit/file-managed-file.html.twig
@@ -10,7 +10,6 @@
  * @see template_preprocess_file_managed_file()
  */
 #}
-{{ attach_library('classy/file') }}
 {%
   set classes = [
     'js-form-managed-file',
diff --git a/core/themes/classy/templates/content-edit/file-widget.html.twig b/core/themes/classy/templates/content-edit/file-widget.html.twig
index 23d03a1..55de590 100644
--- a/core/themes/classy/templates/content-edit/file-widget.html.twig
+++ b/core/themes/classy/templates/content-edit/file-widget.html.twig
@@ -10,7 +10,6 @@
  * @see template_preprocess_file_widget()
  */
 #}
-{{ attach_library('classy/file') }}
 <div{{ attributes }}>
   {{ element }}
 </div>
diff --git a/core/themes/classy/templates/content-edit/image-widget.html.twig b/core/themes/classy/templates/content-edit/image-widget.html.twig
index 5e8033f..dac3a22 100644
--- a/core/themes/classy/templates/content-edit/image-widget.html.twig
+++ b/core/themes/classy/templates/content-edit/image-widget.html.twig
@@ -10,7 +10,6 @@
  * @see template_preprocess_image_widget()
  */
 #}
-{{ attach_library('classy/image-widget') }}
 <div{{ attributes }}>
   {% if data.preview %}
     <div class="image-preview">
diff --git a/core/themes/classy/templates/dataset/forums.html.twig b/core/themes/classy/templates/dataset/forums.html.twig
index e3f2212..eada3a8 100644
--- a/core/themes/classy/templates/dataset/forums.html.twig
+++ b/core/themes/classy/templates/dataset/forums.html.twig
@@ -14,7 +14,6 @@
  * @see template_preprocess_forums()
  */
 #}
-{{ attach_library('classy/forum') }}
 {% if forums_defined %}
   <div class="forum">
     {{ forums }}
diff --git a/core/themes/classy/templates/field/file-link.html.twig b/core/themes/classy/templates/field/file-link.html.twig
index 11170c0..ad93361 100644
--- a/core/themes/classy/templates/field/file-link.html.twig
+++ b/core/themes/classy/templates/field/file-link.html.twig
@@ -11,5 +11,4 @@
  * @see template_preprocess_file_link()
  */
 #}
-{{ attach_library('classy/file') }}
 <span{{ attributes }}>{{ icon }} {{ link }}</span>
diff --git a/core/themes/classy/templates/navigation/book-tree.html.twig b/core/themes/classy/templates/navigation/book-tree.html.twig
index 186a547..543696c 100644
--- a/core/themes/classy/templates/navigation/book-tree.html.twig
+++ b/core/themes/classy/templates/navigation/book-tree.html.twig
@@ -11,11 +11,6 @@
  *   - below: The book item child items.
  *   - title: The book link title.
  *   - url: The book link URL, instance of \Drupal\Core\Url.
- *   - is_expanded: TRUE if the link has visible children within the current
- *     book tree.
- *   - is_collapsed: TRUE if the link has children within the current book tree
- *     that are not currently visible.
- *   - in_active_trail: TRUE if the link is in the active trail.
  */
 #}
 {% import _self as book_tree %}
@@ -34,22 +29,14 @@
     {% else %}
       <ul class="menu">
     {% endif %}
-    {% for item in items %}
-      {%
-        set classes = [
-          'menu-item',
-          item.is_expanded ? 'menu-item--expanded',
-          item.is_collapsed ? 'menu-item--collapsed',
-          item.in_active_trail ? 'menu-item--active-trail',
-        ]
-      %}
-      <li{{ item.attributes.addClass(classes) }}>
-        {{ link(item.title, item.url) }}
-        {% if item.below %}
-          {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
-        {% endif %}
-      </li>
-    {% endfor %}
+      {% for item in items %}
+        <li{{ item.attributes }}>
+          {{ link(item.title, item.url) }}
+          {% if item.below %}
+            {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
+          {% endif %}
+        </li>
+      {% endfor %}
     </ul>
   {% endif %}
 {% endmacro %}
diff --git a/core/themes/classy/templates/navigation/menu.html.twig b/core/themes/classy/templates/navigation/menu.html.twig
index e482ef4..4e12ea1 100644
--- a/core/themes/classy/templates/navigation/menu.html.twig
+++ b/core/themes/classy/templates/navigation/menu.html.twig
@@ -11,11 +11,6 @@
  *   - title: The menu link title.
  *   - url: The menu link url, instance of \Drupal\Core\Url
  *   - localized_options: Menu link localized options.
- *   - is_expanded: TRUE if the link has visible children within the current
- *     menu tree.
- *   - is_collapsed: TRUE if the link has children within the current menu tree
- *     that are not currently visible.
- *   - in_active_trail: TRUE if the link is in the active trail.
  */
 #}
 {% import _self as menus %}
@@ -34,22 +29,14 @@
     {% else %}
       <ul class="menu">
     {% endif %}
-    {% for item in items %}
-      {%
-        set classes = [
-          'menu-item',
-          item.is_expanded ? 'menu-item--expanded',
-          item.is_collapsed ? 'menu-item--collapsed',
-          item.in_active_trail ? 'menu-item--active-trail',
-        ]
-      %}
-      <li{{ item.attributes.addClass(classes) }}>
-        {{ link(item.title, item.url) }}
-        {% if item.below %}
-          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
-        {% endif %}
-      </li>
-    {% endfor %}
+      {% for item in items %}
+        <li{{ item.attributes }}>
+          {{ link(item.title, item.url) }}
+          {% if item.below %}
+            {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
+          {% endif %}
+        </li>
+      {% endfor %}
     </ul>
   {% endif %}
 {% endmacro %}
diff --git a/core/themes/seven/css/components/dialog.css b/core/themes/seven/css/components/dialog.theme.css
similarity index 100%
rename from core/themes/seven/css/components/dialog.css
rename to core/themes/seven/css/components/dialog.theme.css
diff --git a/core/themes/seven/seven.libraries.yml b/core/themes/seven/seven.libraries.yml
index cec9887..764403b 100644
--- a/core/themes/seven/seven.libraries.yml
+++ b/core/themes/seven/seven.libraries.yml
@@ -92,4 +92,4 @@ seven.drupal.dialog:
   version: VERSION
   css:
     theme:
-      css/components/dialog.css: {}
+      css/components/dialog.theme.css: {}
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index 7bd56e0..9727e15 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -186,8 +186,8 @@ function seven_library_info_alter(&$libraries, $extension) {
     unset($libraries['jquery.ui']['css']['theme']['assets/vendor/jquery.ui/themes/base/theme.css']);
     $libraries['jquery.ui']['dependencies'][] = 'seven/seven.jquery.ui';
   }
-  if ($extension == 'classy' && isset($libraries['dialog'])) {
-    unset($libraries['dialog']['css']['component']['css/components/dialog.css']);
-    $libraries['dialog']['dependencies'][] = 'seven/seven.drupal.dialog';
+  if ($extension == 'core' && isset($libraries['drupal.dialog'])) {
+    unset($libraries['drupal.dialog']['css']['theme']['misc/dialog.theme.css']);
+    $libraries['drupal.dialog']['dependencies'][] = 'seven/seven.drupal.dialog';
   }
 }
