diff --git a/core/.stylelintrc.json b/core/.stylelintrc.json
index 84123b2e7f328070e83c06f0675b60ea84355968..56d405e57f92d6f46b76436f93ee74b8c14d5436 100644
--- a/core/.stylelintrc.json
+++ b/core/.stylelintrc.json
@@ -442,6 +442,8 @@
     "assets/vendor/**/*.css",
     "tests/Drupal/Tests/Core/Asset/css_test_files/**/*.css",
     "modules/media/css/plugins/drupalmedia/ckeditor.drupalmedia.css",
-    "themes/stable/css/core/assets/vendor/**/*.css"
+    "themes/stable/css/core/assets/vendor/**/*.css",
+    "themes/stable9/css/core/assets/vendor/**/*.css",
+    "themes/stable9/css/media/plugins/drupalmedia/ckeditor.drupalmedia.css"
   ]
 }
diff --git a/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9213813c6601a2078a95eee8e5a6002d69e8d8b8
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Theme;
+
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests Stable 9's library overrides.
+ *
+ * @group Theme
+ */
+class Stable9LibraryOverrideTest extends KernelTestBase {
+
+  /**
+   * The theme manager.
+   *
+   * @var \Drupal\Core\Theme\ThemeManagerInterface
+   */
+  protected $themeManager;
+
+  /**
+   * The theme initialization.
+   *
+   * @var \Drupal\Core\Theme\ThemeInitializationInterface
+   */
+  protected $themeInitialization;
+
+  /**
+   * The library discovery service.
+   *
+   * @var \Drupal\Core\Asset\LibraryDiscoveryInterface
+   */
+  protected $libraryDiscovery;
+
+  /**
+   * A list of all core modules.
+   *
+   * @var string[]
+   */
+  protected $allModules;
+
+  /**
+   * A list of libraries to skip checking, in the format extension/library_name.
+   *
+   * @var string[]
+   */
+  protected $librariesToSkip = [];
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system', 'user', 'path_alias'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->container->get('theme_installer')->install(['stable9']);
+
+    // Enable all core modules.
+    $all_modules = $this->container->get('extension.list.module')->getList();
+    $all_modules = array_filter($all_modules, function ($module) {
+      // Filter contrib, hidden, experimental, already enabled modules, and
+      // modules in the Testing package.
+      if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') {
+        return FALSE;
+      }
+      return TRUE;
+    });
+    $this->allModules = array_keys($all_modules);
+    $this->allModules[] = 'system';
+    $this->allModules[] = 'user';
+    $this->allModules[] = 'path_alias';
+    sort($this->allModules);
+    $this->container->get('module_installer')->install($this->allModules);
+
+    $this->themeManager = $this->container->get('theme.manager');
+    $this->themeInitialization = $this->container->get('theme.initialization');
+    $this->libraryDiscovery = $this->container->get('library.discovery');
+  }
+
+  /**
+   * Ensures that Stable 9 overrides all relevant core library assets.
+   */
+  public function testStable9LibraryOverrides() {
+    // First get the clean library definitions with no active theme.
+    $libraries_before = $this->getAllLibraries();
+    $libraries_before = $this->removeVendorAssets($libraries_before);
+
+    $this->themeManager->setActiveTheme($this->themeInitialization->getActiveThemeByName('stable9'));
+    $this->libraryDiscovery->clearCachedDefinitions();
+
+    // Now get the library definitions with Stable 9 as the active theme.
+    $libraries_after = $this->getAllLibraries();
+    $libraries_after = $this->removeVendorAssets($libraries_after);
+
+    foreach ($libraries_before as $extension => $libraries) {
+      foreach ($libraries as $library_name => $library) {
+        // Allow skipping libraries.
+        if (in_array("$extension/$library_name", $this->librariesToSkip)) {
+          continue;
+        }
+        $library_after = $libraries_after[$extension][$library_name];
+
+        // Check that all the CSS assets are overridden.
+        foreach ($library['css'] as $index => $asset) {
+          $clean_path = $asset['data'];
+          $stable_path = $library_after['css'][$index]['data'];
+          // Make core/misc assets look like they are coming from a "core"
+          // module.
+          $replacements = [
+            'core/misc/' => "core/modules/core/css/",
+          ];
+          $expected_path = strtr($clean_path, $replacements);
+
+          // Adjust the module asset paths to correspond with the Stable 9
+          // folder structure.
+          $replacements = [
+            "core/modules/$extension/css/" => "core/themes/stable9/css/$extension/",
+            "core/modules/$extension/layouts/" => "core/themes/stable9/layouts/$extension/",
+          ];
+          $expected_path = strtr($expected_path, $replacements);
+          $assert_path = str_replace("core/modules/$extension/", '', $clean_path);
+
+          $this->assertEqual($expected_path, $stable_path, "$assert_path from the $extension/$library_name library is overridden in Stable 9.");
+          $this->assertFileExists("{$this->root}/$clean_path", "$clean_path exists.");
+          $this->assertFileExists("{$this->root}/$stable_path", "$stable_path exists.");
+        }
+      }
+    }
+  }
+
+  /**
+   * Removes all vendor libraries and assets from the library definitions.
+   *
+   * @param array[] $all_libraries
+   *   An associative array of libraries keyed by extension, then by library
+   *   name, and so on.
+   *
+   * @return array[]
+   *   The reduced array of libraries.
+   */
+  protected function removeVendorAssets(array $all_libraries) {
+    foreach ($all_libraries as $extension => $libraries) {
+      foreach ($libraries as $library_name => $library) {
+        if (isset($library['remote'])) {
+          unset($all_libraries[$extension][$library_name]);
+        }
+        foreach (['css', 'js'] as $asset_type) {
+          foreach ($library[$asset_type] as $index => $asset) {
+            if (strpos($asset['data'], 'core/assets/vendor') !== FALSE) {
+              unset($all_libraries[$extension][$library_name][$asset_type][$index]);
+              // Re-key the array of assets. This is needed because
+              // libraries-override doesn't always preserve the order.
+              if (!empty($all_libraries[$extension][$library_name][$asset_type])) {
+                $all_libraries[$extension][$library_name][$asset_type] = array_values($all_libraries[$extension][$library_name][$asset_type]);
+              }
+            }
+          }
+        }
+      }
+    }
+    return $all_libraries;
+  }
+
+  /**
+   * Gets all libraries for core and all installed modules.
+   *
+   * @return array[]
+   *   An associative array of libraries keyed by extension, then by library
+   *   name, and so on.
+   */
+  protected function getAllLibraries() {
+    $modules = \Drupal::moduleHandler()->getModuleList();
+    $module_list = array_keys($modules);
+    sort($module_list);
+    $this->assertEqual($this->allModules, $module_list, 'All core modules are installed.');
+
+    $libraries['core'] = $this->libraryDiscovery->getLibrariesByExtension('core');
+
+    foreach ($modules as $module_name => $module) {
+      $library_file = $module->getPath() . '/' . $module_name . '.libraries.yml';
+      if (is_file($this->root . '/' . $library_file)) {
+        $libraries[$module_name] = $this->libraryDiscovery->getLibrariesByExtension($module_name);
+      }
+    }
+    return $libraries;
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d7b39cd9910dfbbc1faef616705d4bf13d0419d
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Theme;
+
+use Drupal\Core\Theme\Registry;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests Stable 9's template overrides.
+ *
+ * @group Theme
+ */
+class Stable9TemplateOverrideTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system', 'user'];
+
+  /**
+   * An array of template names to skip, without the extension.
+   *
+   * @var string[]
+   */
+  protected $templatesToSkip = [
+    // Registered as a template in the views_theme() function in views.module
+    // but an actual template does not exist.
+    'views-form-views-form',
+  ];
+
+  /**
+   * The theme handler.
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
+   * A list of all core modules.
+   *
+   * @var string[]
+   */
+  protected $allModules;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->themeHandler = $this->container->get('theme_handler');
+
+    $this->container->get('theme_installer')->install(['stable9']);
+
+    $this->installAllModules();
+  }
+
+  /**
+   * Installs all core modules.
+   */
+  protected function installAllModules() {
+    // Enable all core modules.
+    $all_modules = $this->container->get('extension.list.module')->getList();
+    $all_modules = array_filter($all_modules, function ($module) {
+      // Filter contrib, hidden, experimental, already enabled modules, and
+      // modules in the Testing package.
+      if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') {
+        return FALSE;
+      }
+      return TRUE;
+    });
+    $this->allModules = array_keys($all_modules);
+    sort($this->allModules);
+
+    $module_installer = $this->container->get('module_installer');
+    $module_installer->install($this->allModules);
+
+    $this->installConfig(['system', 'user']);
+  }
+
+  /**
+   * Ensures that Stable 9 overrides all relevant core templates.
+   */
+  public function testStable9TemplateOverrides() {
+    $registry = new Registry($this->root, \Drupal::cache(), \Drupal::lock(), \Drupal::moduleHandler(), $this->themeHandler, \Drupal::service('theme.initialization'), 'stable9');
+    $registry->setThemeManager(\Drupal::theme());
+
+    $registry_full = $registry->get();
+
+    foreach ($registry_full as $hook => $info) {
+      if (isset($info['template'])) {
+        // Allow skipping templates.
+        if (in_array($info['template'], $this->templatesToSkip)) {
+          continue;
+        }
+
+        $this->assertEquals('core/themes/stable9', $info['theme path'], $info['template'] . '.html.twig overridden in Stable 9.');
+      }
+    }
+  }
+
+}
diff --git a/core/themes/stable9/README.txt b/core/themes/stable9/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..66be55f6009f9e2dd0af112b48d8d70e78f0be39
--- /dev/null
+++ b/core/themes/stable9/README.txt
@@ -0,0 +1,18 @@
+
+ABOUT STABLE 9
+--------------
+
+Stable allows core markup and styling to evolve by functioning as a backwards
+compatibility layer for themes against changes to core markup and CSS. If you
+browse Stable's contents, you will find copies of all the Twig templates and
+CSS files provided by core.
+
+Warning: Themes that decide to not use Stable 9 as a base theme will need
+continuous maintenance as core changes, so only opt out if you are prepared to
+keep track of those changes and how they affect your theme.
+
+ABOUT DRUPAL THEMING
+--------------------
+
+For more information, see Drupal.org's theming guide.
+https://www.drupal.org/docs/8/theming
diff --git a/core/themes/stable9/css/block/block.admin.css b/core/themes/stable9/css/block/block.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..df1dda398b4e792b13fb49717d27c5c8e3ace083
--- /dev/null
+++ b/core/themes/stable9/css/block/block.admin.css
@@ -0,0 +1,46 @@
+/* Block listing page */
+.region-title__action {
+  display: inline-block;
+  margin-left: 1em; /* LTR */
+}
+[dir="rtl"] .region-title__action {
+  margin-right: 1em;
+  margin-left: 0;
+}
+
+/* Block demo mode */
+.block-region {
+  margin-top: 4px;
+  margin-bottom: 4px;
+  padding: 3px;
+  background-color: #ff6;
+}
+a.block-demo-backlink,
+a.block-demo-backlink:link,
+a.block-demo-backlink:visited {
+  position: fixed;
+  z-index: 499;
+  left: 20px; /* LTR */
+  padding: 5px 10px;
+  color: #000;
+  border-radius: 0 0 10px 10px;
+  background-color: #b4d7f0;
+  font-family: "Lucida Grande", Verdana, sans-serif;
+  font-size: small;
+  line-height: 20px;
+}
+a.block-demo-backlink:hover {
+  text-decoration: underline;
+}
+
+/* Configure block form - Block description */
+.block-form .form-item-settings-admin-label label {
+  display: inline;
+}
+.block-form .form-item-settings-admin-label label:after {
+  content: ":";
+}
+.block-disabled:not(:hover) {
+  opacity: 0.675;
+  background: #fcfcfa;
+}
diff --git a/core/themes/stable9/css/ckeditor/ckeditor-iframe.css b/core/themes/stable9/css/ckeditor/ckeditor-iframe.css
new file mode 100644
index 0000000000000000000000000000000000000000..aafa5f20553669dde22ad3fd6b1e040e9cec68c0
--- /dev/null
+++ b/core/themes/stable9/css/ckeditor/ckeditor-iframe.css
@@ -0,0 +1,25 @@
+/**
+ * CSS added to iframe-based instances only.
+ */
+body {
+  margin: 8px;
+  color: #222;
+  background-color: #fff;
+  font-family: Arial, Verdana, sans-serif;
+  font-size: 15px;
+}
+
+@media screen and (max-width: 600px) {
+  /* A font-size of 16px prevents iOS from zooming. */
+  body {
+    font-size: 16px;
+  }
+}
+
+ol,
+ul,
+dl {
+  /* Preserved spaces for list items with text direction other than the list.
+   * (CKEditor issues #6249,#8049) */
+  padding: 0 40px;
+}
diff --git a/core/themes/stable9/css/ckeditor/ckeditor.admin.css b/core/themes/stable9/css/ckeditor/ckeditor.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..d1eff01f96a4bd2eeaecace8c2feee83e7732864
--- /dev/null
+++ b/core/themes/stable9/css/ckeditor/ckeditor.admin.css
@@ -0,0 +1,331 @@
+/**
+ * @file
+ * Styles for configuration of CKEditor module.
+ *
+ * Many of these styles are adapted directly from the default CKEditor theme
+ * "moono".
+ */
+
+.ckeditor-toolbar {
+  margin: 5px 0;
+  padding: 0.1667em 0.1667em 0.08em;
+  /* Disallow any user selections in the drag-and-drop toolbar config UI. */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  border: 1px solid #b6b6b6;
+  background: #cfd1cf;
+  background-image: -webkit-linear-gradient(top, whiteSmoke, #cfd1cf);
+  background-image: linear-gradient(top, whiteSmoke, #cfd1cf);
+  box-shadow: 0 1px 0 white inset;
+}
+.ckeditor-toolbar-active {
+  margin-top: 0.25em;
+}
+.ckeditor-toolbar-disabled {
+  margin-bottom: 0.5em;
+}
+.ckeditor-toolbar ul,
+.ckeditor-toolbar-disabled ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+/* This is required to win over specificity of [dir="rtl"] ul */
+[dir="rtl"] .ckeditor-toolbar ul,
+[dir="rtl"] .ckeditor-toolbar-disabled ul {
+  margin-right: 0;
+}
+
+.ckeditor-row {
+  padding: 2px 0 3px;
+  border-radius: 3px;
+}
+.ckeditor-group-names-are-visible .ckeditor-row {
+  border: 1px solid whitesmoke;
+}
+.ckeditor-row + .ckeditor-row {
+  margin-top: 0.25em;
+}
+.ckeditor-toolbar-group,
+.ckeditor-toolbar-group-placeholder,
+.ckeditor-add-new-group {
+  float: left; /* LTR */
+}
+[dir="rtl"] .ckeditor-toolbar-group,
+[dir="rtl"] .ckeditor-toolbar-group-placeholder,
+[dir="rtl"] .ckeditor-add-new-group {
+  float: right;
+}
+.ckeditor-toolbar-groups {
+  min-height: 2em;
+}
+.ckeditor-toolbar-group {
+  margin: 0 0.3333em;
+  cursor: move;
+}
+.ckeditor-group-names-are-visible .ckeditor-toolbar-group,
+.ckeditor-add-new-group {
+  padding: 0.2em 0.4em;
+  border: 1px dotted #a6a6a6;
+  border-radius: 3px;
+}
+.ckeditor-toolbar-group.placeholder,
+.ckeditor-toolbar-group.placeholder .ckeditor-toolbar-group-name {
+  cursor: not-allowed;
+}
+.ckeditor-toolbar-group.placeholder .ckeditor-toolbar-group-name {
+  font-style: italic;
+}
+.ckeditor-toolbar-group-name {
+  display: none;
+  margin: 0.25em 0;
+  font-size: 1em;
+  font-weight: normal;
+}
+.ckeditor-group-names-are-visible .ckeditor-toolbar-group-name {
+  display: block;
+  cursor: pointer;
+}
+.ckeditor-toolbar-active .placeholder,
+.ckeditor-toolbar-active .ckeditor-add-new-group {
+  display: none;
+}
+.ckeditor-group-names-are-visible .placeholder,
+.ckeditor-group-names-are-visible .ckeditor-add-new-group {
+  display: block;
+}
+.ckeditor-toolbar-group-buttons {
+  float: left; /* LTR */
+}
+[dir="rtl"] .ckeditor-toolbar-group-buttons {
+  float: right;
+}
+.ckeditor-groupnames-toggle {
+  float: right; /* LTR */
+  cursor: pointer;
+}
+[dir="rtl"] .ckeditor-groupnames-toggle {
+  float: left;
+}
+.ckeditor-toolbar .ckeditor-toolbar-group > li {
+  margin: 3px 6px;
+  padding: 3px;
+  border: 1px solid white;
+  border-radius: 5px;
+  background-image: -webkit-linear-gradient(transparent 60%, rgba(0, 0, 0, 0.1));
+  background-image: linear-gradient(transparent 60%, rgba(0, 0, 0, 0.1));
+}
+.ckeditor-toolbar-configuration .fieldset-description {
+  margin-bottom: 1em;
+}
+.ckeditor-toolbar-disabled .ckeditor-toolbar-available,
+.ckeditor-toolbar-disabled .ckeditor-toolbar-dividers {
+  box-sizing: border-box;
+}
+.ckeditor-toolbar-disabled .ckeditor-toolbar-available {
+  float: left; /* LTR */
+  width: 80%;
+}
+[dir="rtl"] .ckeditor-toolbar-disabled .ckeditor-toolbar-available {
+  float: right;
+}
+.ckeditor-toolbar-disabled .ckeditor-toolbar-dividers {
+  float: right; /* LTR */
+  width: 20%;
+}
+[dir="rtl"] .ckeditor-toolbar-disabled .ckeditor-toolbar-dividers {
+  float: left;
+}
+.ckeditor-toolbar-disabled .ckeditor-buttons li a,
+.ckeditor-toolbar .ckeditor-buttons,
+.ckeditor-add-new-group button {
+  border: 1px solid #a6a6a6;
+  border-bottom-color: #979797;
+  border-radius: 3px;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5), 0 0 2px rgba(255, 255, 255, 0.15) inset, 0 1px 0 rgba(255, 255, 255, 0.15) inset;
+}
+.ckeditor-toolbar-disabled .ckeditor-buttons {
+  border: 0;
+}
+.ckeditor-toolbar-disabled .ckeditor-buttons li {
+  margin: 2px;
+}
+.ckeditor-buttons {
+  min-width: 26px;
+  min-height: 26px;
+}
+.ckeditor-buttons li {
+  float: left; /* LTR */
+  margin: 0;
+  padding: 0;
+}
+[dir="rtl"] .ckeditor-buttons li {
+  float: right;
+}
+.ckeditor-buttons li a,
+.ckeditor-add-new-group button {
+  color: #474747;
+  background: #e4e4e4;
+  background-image: -webkit-linear-gradient(top, white, #e4e4e4);
+  background-image: linear-gradient(top, white, #e4e4e4);
+}
+.ckeditor-buttons li a {
+  position: relative;
+  display: block;
+  min-height: 18px;
+  padding: 4px 6px;
+  cursor: move;
+  white-space: nowrap;
+  text-decoration: none;
+  border: 0;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  line-height: 1.4;
+}
+.ckeditor-toolbar-dividers {
+  float: right; /* LTR */
+}
+[dir="rtl"] .ckeditor-toolbar-dividers {
+  float: left;
+}
+.ckeditor-buttons li .cke-icon-only {
+  /* Firefox includes the offscreen text in the focus indicator, resulting in a
+     far too wide focus indicator. This fixes that. */
+  overflow: hidden;
+  width: 16px;
+  text-indent: -9999px;
+}
+.ckeditor-buttons .cke_button_icon img {
+  width: 16px;
+  height: 16px;
+}
+.ckeditor-buttons li .cke_ltr {
+  direction: ltr;
+}
+.ckeditor-buttons li .cke_rtl {
+  direction: rtl;
+}
+.ckeditor-buttons li a:focus,
+.ckeditor-buttons li a:active,
+.ckeditor-multiple-buttons li a:focus {
+  z-index: 11; /* Ensure focused buttons show their outline on all sides. */
+}
+.ckeditor-buttons li:first-child a {
+  border-top-left-radius: 2px; /* LTR */
+  border-bottom-left-radius: 2px; /* LTR */
+}
+[dir="rtl"] .ckeditor-buttons li:first-child a {
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+}
+.ckeditor-buttons li:last-child a {
+  border-top-right-radius: 2px; /* LTR */
+  border-bottom-right-radius: 2px; /* LTR */
+}
+[dir="rtl"] .ckeditor-buttons li:last-child a {
+  border-top-left-radius: 2px;
+  border-bottom-left-radius: 2px;
+}
+.ckeditor-button-placeholder,
+.ckeditor-buttons .ckeditor-button-placeholder a,
+.ckeditor-toolbar-group-placeholder {
+  background: #9dcae7;
+}
+.ckeditor-toolbar-group-placeholder {
+  border-radius: 4px;
+}
+.ckeditor-multiple-buttons {
+  float: left; /* LTR */
+  margin: 5px;
+  padding: 1px 2px;
+  list-style: none;
+}
+[dir="rtl"] .ckeditor-multiple-buttons {
+  float: right;
+}
+.ckeditor-multiple-buttons li {
+  float: left; /* LTR */
+  margin: 0;
+  padding: 0;
+}
+[dir="rtl"] .ckeditor-multiple-buttons li {
+  float: right;
+}
+.ckeditor-multiple-buttons li a {
+  display: inline-block;
+  min-height: 18px;
+  margin: 0;
+  padding: 2px 0;
+  cursor: move;
+  line-height: 1.4;
+}
+.ckeditor-buttons .ckeditor-group-button-separator,
+.ckeditor-multiple-buttons .ckeditor-group-button-separator {
+  margin: -1px -3px -2px;
+}
+.ckeditor-buttons .ckeditor-group-button-separator a,
+.ckeditor-multiple-buttons .ckeditor-group-button-separator a {
+  position: relative;
+  z-index: 10;
+  width: 13px;
+  height: 29px;
+  padding: 0;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAdCAMAAABG4xbVAAAAhFBMVEUAAACmpqampqampqb////l5eX////5+fmmpqatra2urq6vr6+1tbW2tra4uLi6urq8vLzb29ve3t7i4uLl5eXn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz+/v7qIQO+AAAACHRSTlMATVmAi8XM29MuWToAAABjSURBVBiVrc5BCoAwDETRMKhtRBduev9LKm1xjItWRBBE6Nt9QkIwOTcUzk0Imi8aoMssxbgoTHMtqsFMLta0vPh2N49HyfdelPg6k9uvX/a+Bmggt1qJRNzQFVgjEnkUZDoBmH57VSypjg4AAAAASUVORK5CYII=) no-repeat center center;
+}
+ul.ckeditor-buttons li.ckeditor-button-separator a {
+  position: relative;
+  z-index: 10;
+  width: 1px;
+  height: 24px;
+  margin: 1px 0 0;
+  padding: 0;
+  background: #e4e4e4;
+  background-image: -webkit-linear-gradient(#e4e4e4, #b4b4b4);
+  background-image: linear-gradient(#e4e4e4, #b4b4b4);
+}
+.ckeditor-multiple-buttons .ckeditor-button-separator a {
+  width: 2px;
+  height: 26px;
+  margin: 0 10px;
+  padding: 0;
+}
+.ckeditor-separator {
+  display: block;
+  width: 1px;
+  height: 18px;
+  margin: 5px 0;
+  background-color: silver;
+  background-color: rgba(0, 0, 0, 0.2);
+  box-shadow: 1px 0 1px rgba(255, 255, 255, 0.5);
+}
+.ckeditor-button-arrow {
+  display: inline-block;
+  width: 0;
+  margin: 0 4px 2px;
+  text-align: center;
+  border-top: 3px solid #333;
+  border-right: 3px solid transparent;
+  border-left: 3px solid transparent;
+}
+.ckeditor-row-controls {
+  float: right; /* LTR */
+  width: 40px;
+  text-align: right; /* LTR */
+  font-size: 18px;
+}
+[dir="rtl"] .ckeditor-row-controls {
+  float: left;
+  text-align: left;
+}
+.ckeditor-row-controls a {
+  display: inline-block;
+  box-sizing: border-box;
+  width: 20px;
+  height: 28px;
+  padding: 6px 2px;
+  text-decoration: none;
+  color: #333;
+  font-weight: bold;
+  line-height: 0.9;
+}
diff --git a/core/themes/stable9/css/ckeditor/ckeditor.css b/core/themes/stable9/css/ckeditor/ckeditor.css
new file mode 100644
index 0000000000000000000000000000000000000000..c1e2d4409fb15cb7b4c9f0bc77b80b1075cf4273
--- /dev/null
+++ b/core/themes/stable9/css/ckeditor/ckeditor.css
@@ -0,0 +1,39 @@
+.ckeditor-dialog-loading {
+  position: absolute;
+  top: 0;
+  width: 100%;
+  text-align: center;
+}
+
+.ckeditor-dialog-loading-link {
+  position: relative;
+  top: 0;
+  display: inline-block;
+  padding: 3px 10px;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  border: 1px solid #b6b6b6;
+  border-top: none;
+  border-radius: 0 0 5px 5px;
+  background: white;
+  box-shadow: 0 0 10px -3px #000;
+  font-size: 14px;
+  -webkit-touch-callout: none;
+}
+
+/**
+ * Adjust the style of in-place editing CKEditor instances.
+ */
+.quickedit-toolgroup.wysiwyg-main .cke_chrome,
+.quickedit-toolgroup.wysiwyg-main .cke_inner,
+.quickedit-toolgroup.wysiwyg-main .cke_top {
+  border-top: none;
+  border-right: none;
+  border-bottom: none;
+  border-left: none;
+  background: transparent;
+  box-shadow: none;
+}
diff --git a/core/themes/stable9/css/ckeditor/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css b/core/themes/stable9/css/ckeditor/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css
new file mode 100644
index 0000000000000000000000000000000000000000..29f6a490e5c321cb2004cbbc3212ef32a01d9eff
--- /dev/null
+++ b/core/themes/stable9/css/ckeditor/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css
@@ -0,0 +1,21 @@
+/**
+ * @file
+ * Image Caption: overrides to make centered alignment work inside CKEditor.
+ */
+
+/**
+ * Since .align-center is set on the non-captioned image's parent block element
+ * in CKEditor, the image must be centered separately.
+ */
+p[data-widget="image"].align-center {
+  text-align: center;
+}
+
+/**
+ * Since .align-center is set on captioned widget's wrapper element in CKEditor,
+ * the alignment of internals must be set separately.
+ */
+div[data-cke-widget-wrapper].align-center > figure[data-widget="image"] {
+  margin-right: auto;
+  margin-left: auto;
+}
diff --git a/core/themes/stable9/css/ckeditor/plugins/language/ckeditor.language.css b/core/themes/stable9/css/ckeditor/plugins/language/ckeditor.language.css
new file mode 100644
index 0000000000000000000000000000000000000000..41b75699523facef399cd9d3e439f00e50f05c7b
--- /dev/null
+++ b/core/themes/stable9/css/ckeditor/plugins/language/ckeditor.language.css
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Language: add styling for elements that have a language attribute.
+ */
+
+/**
+ * Show the user that a 'lang' tag has been applied by adding a thin dotted
+ * border. We also append the value of the tag between brackets, for example:
+ * '(en)'. Since the html element has a 'lang' attribute too we only target
+ * elements within the html scope.
+ */
+html [lang] {
+  outline: 1px dotted gray;
+}
+html [lang]:after {
+  content: " ("attr(lang)")";
+  color: #666;
+  font-size: 10px;
+}
diff --git a/core/themes/stable9/css/color/color.admin.css b/core/themes/stable9/css/color/color.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..5138ca7ff308fd27cbb931c5dd416ac77e88c351
--- /dev/null
+++ b/core/themes/stable9/css/color/color.admin.css
@@ -0,0 +1,153 @@
+/**
+ * @file
+ * Stylesheet for the administration pages of the Color module.
+ */
+.color-form {
+  max-width: 50em;
+}
+.farbtastic {
+  margin: 0 auto;
+}
+.color-form .form-item {
+  height: 2em;
+  margin: 0.5em 0;
+  padding: 0.5em;
+}
+.color-form label {
+  clear: left; /* LTR */
+}
+[dir="rtl"] .color-form label {
+  clear: right;
+}
+.color-form .form-text {
+  float: left; /* LTR */
+  width: 86%;
+  cursor: pointer;
+  text-align: center;
+}
+[dir="rtl"] .color-form .form-text {
+  float: right;
+}
+.color-palette__hook {
+  float: left; /* LTR */
+  width: 16px;
+  height: 16px;
+}
+[dir="rtl"] .color-palette__hook {
+  float: right;
+}
+.color-palette__hook.is-down,
+.color-palette__hook.is-up,
+.color-palette__hook.is-both {
+  background: url(../../../../modules/color/images/hook.png) no-repeat 100% 0; /* LTR */
+}
+[dir="rtl"] .color-palette__hook.is-down,
+[dir="rtl"] .color-palette__hook.is-up,
+[dir="rtl"] .color-palette__hook.is-both {
+  background: url(../../../../modules/color/images/hook-rtl.png) no-repeat 0 0;
+}
+.color-palette__hook.is-up {
+  background-position: 100% -27px; /* LTR */
+}
+[dir="rtl"] .color-palette__hook.is-up {
+  background-position: 0 -27px;
+}
+.color-palette__hook.is-both {
+  background-position: 100% -54px; /* LTR */
+}
+[dir="rtl"] .color-palette__hook.is-both {
+  background-position: 0 -54px;
+}
+/**
+ * The button also inherits from .link, which hides the background. Use a more
+ * specific selector to overwrite.
+ */
+button.color-palette__lock,
+.color-palette__lock {
+  position: relative;
+  top: -1.7em;
+  left: -10px;
+  float: left; /* LTR */
+  width: 20px;
+  height: 19px;
+  cursor: pointer;
+  text-indent: -9999px;
+  direction: ltr;
+  border: 0;
+  outline: 0;
+  background: url(../../../../modules/color/images/lock.png) no-repeat 50% 0;
+}
+[dir="rtl"] button.color-palette__lock,
+[dir="rtl"] .color-palette__lock {
+  float: right;
+}
+/* Same as above .color-palette__lock rule. */
+button.is-unlocked,
+.is-unlocked {
+  background-position: 50% -22px;
+}
+
+/* wide viewport. */
+@media screen and (min-width: 37.5625em) { /* 601px */
+  .color-placeholder {
+    float: right; /* LTR */
+  }
+  [dir="rtl"] .color-placeholder {
+    float: left;
+  }
+  .color-form .form-item {
+    margin: 0.5em 195px 0.5em 0; /* LTR */
+  }
+  [dir="rtl"] .color-form .form-item {
+    margin: 0.5em 0 0.5em 195px;
+  }
+  .color-form label {
+    float: left; /* LTR */
+    clear: left; /* LTR */
+    width: 15em;
+  }
+  [dir="rtl"] .color-form label {
+    float: right;
+    clear: right;
+  }
+  .color-form .form-text,
+  .color-form .form-select {
+    float: left; /* LTR */
+    width: auto;
+  }
+  [dir="rtl"] .color-form .form-text,
+  [dir="rtl"] .color-form .form-select {
+    float: right;
+  }
+  .color-palette__hook {
+    float: left; /* LTR */
+    margin-top: 3px;
+  }
+  [dir="rtl"] .color-palette__hook {
+    float: right;
+  }
+}
+.item-selected {
+  background: #eee;
+}
+
+/* Preview */
+.color-preview {
+  display: none;
+}
+.js .color-preview {
+  position: relative;
+  display: block;
+  float: left; /* LTR */
+}
+.js[dir="rtl"] .color-preview {
+  float: right;
+}
+
+@media screen and (max-width: 30em) { /* 480px */
+  .color-form .color-preview-sidebar,
+  .color-form .color-preview-content {
+    width: auto;
+    margin: 0;
+  }
+}
diff --git a/core/themes/stable9/css/config_translation/config_translation.admin.css b/core/themes/stable9/css/config_translation/config_translation.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..0a79b48d93a0491ada0a0db797fce920fd7a9b4d
--- /dev/null
+++ b/core/themes/stable9/css/config_translation/config_translation.admin.css
@@ -0,0 +1,24 @@
+/**
+ * @file
+ * Styles for Configuration Translation.
+ */
+
+/**
+ * Hide the label, in an accessible way, for responsive screens which show the
+ * form in one column.
+ */
+.translation-set__translated label {
+  position: absolute;
+  overflow: hidden;
+  clip: rect(1px, 1px, 1px, 1px);
+  width: 1px;
+  height: 1px;
+}
+
+@media screen and (min-width: 38em) {
+  .translation-set__translated label {
+    position: inherit;
+    width: auto;
+    height: auto;
+  }
+}
diff --git a/core/themes/stable9/css/content_moderation/content_moderation.module.css b/core/themes/stable9/css/content_moderation/content_moderation.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..2ffefa52698a37d0c9883c6b42af8edeb46798da
--- /dev/null
+++ b/core/themes/stable9/css/content_moderation/content_moderation.module.css
@@ -0,0 +1,38 @@
+/**
+ * @file
+ * Component styles for the content_moderation module.
+ */
+.entity-moderation-form {
+  display: -webkit-flex; /* Safari */
+  display: flex;
+  -webkit-flex-wrap: wrap; /* Safari */
+  flex-wrap: wrap;
+  -webkit-align-items: flex-start; /* Safari */
+  align-items: flex-start;
+  list-style: none;
+}
+
+.entity-moderation-form__item {
+  display: table;
+  margin-right: 2em;
+}
+
+.entity-moderation-form__item:last-child {
+  -webkit-align-self: flex-end; /* Safari */
+  align-self: flex-end;
+  margin-right: 0;
+}
+
+.entity-moderation-form .form-item {
+  margin-top: 1em;
+  margin-bottom: 1em;
+}
+
+.entity-moderation-form .form-item label {
+  display: table;
+  padding-bottom: 0.25em;
+}
+
+.entity-moderation-form input[type=submit] {
+  margin-bottom: 1.2em;
+}
diff --git a/core/themes/stable9/css/content_moderation/content_moderation.theme.css b/core/themes/stable9/css/content_moderation/content_moderation.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..12242db25c8fd96e7fb4a1f61404fc34093d8fad
--- /dev/null
+++ b/core/themes/stable9/css/content_moderation/content_moderation.theme.css
@@ -0,0 +1,10 @@
+/**
+ * @file
+ * Theme styles for the content_moderation module.
+ */
+.entity-moderation-form {
+  margin: 2em 0;
+  padding-left: 1em;
+  border: 1px dashed #bbb;
+  background: #fff;
+}
diff --git a/core/themes/stable9/css/content_translation/content_translation.admin.css b/core/themes/stable9/css/content_translation/content_translation.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..732ea0f11b62d49cd86a5ffffbd966cb3c6597c4
--- /dev/null
+++ b/core/themes/stable9/css/content_translation/content_translation.admin.css
@@ -0,0 +1,33 @@
+/**
+ * @file
+ * Styles for the content language administration page.
+ */
+
+.language-content-settings-form .bundle {
+  width: 24%;
+}
+.language-content-settings-form .field {
+  width: 24%;
+  padding-left: 3em; /* LTR */
+}
+[dir="rtl"] .language-content-settings-form .field {
+  padding-right: 3em;
+  padding-left: 1em;
+}
+.language-content-settings-form .column {
+  padding-left: 5em; /* LTR */
+}
+[dir="rtl"] .language-content-settings-form .column {
+  padding-right: 5em;
+  padding-left: 1em;
+}
+.language-content-settings-form .field label,
+.language-content-settings-form .column label {
+  font-weight: normal;
+}
+.language-content-settings-form .translatable {
+  width: 1%;
+}
+.language-content-settings-form .operations {
+  width: 75%;
+}
diff --git a/core/themes/stable9/css/contextual/contextual.icons.theme.css b/core/themes/stable9/css/contextual/contextual.icons.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..208fe77c504b589d9ecb64913ac708392f07afae
--- /dev/null
+++ b/core/themes/stable9/css/contextual/contextual.icons.theme.css
@@ -0,0 +1,39 @@
+/**
+ * @file
+ * Styling for contextual module icons.
+ */
+
+/**
+ * Toolbar tab icon.
+ */
+.toolbar-bar .toolbar-icon-edit:before {
+  background-image: url(../../../../misc/icons/bebebe/pencil.svg);
+}
+.toolbar-bar .toolbar-icon-edit:active:before,
+.toolbar-bar .toolbar-icon-edit.is-active:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+
+/**
+ * Contextual trigger.
+ */
+.contextual .trigger {
+  /* Override the .focusable height: auto */
+  width: 26px !important;
+  /* Override the .focusable height: auto */
+  height: 26px !important;
+  text-indent: -9999px;
+  background-image: url(../../../../misc/icons/bebebe/pencil.svg);
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: 16px 16px;
+}
+
+.contextual .trigger:hover {
+  background-image: url(../../../../misc/icons/787878/pencil.svg);
+}
+
+.contextual .trigger:focus {
+  outline: none;
+  background-image: url(../../../../misc/icons/5181c6/pencil.svg);
+}
diff --git a/core/themes/stable9/css/contextual/contextual.module.css b/core/themes/stable9/css/contextual/contextual.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..2a21e1bb0a80a27824e0db9c4c20a46630576034
--- /dev/null
+++ b/core/themes/stable9/css/contextual/contextual.module.css
@@ -0,0 +1,18 @@
+/**
+ * @file
+ * Generic base styles for contextual module.
+ */
+
+.contextual-region {
+  position: relative;
+}
+.contextual .trigger:focus {
+  /* Override the .focusable position: static */
+  position: relative !important;
+}
+.contextual-links {
+  display: none;
+}
+.contextual.open .contextual-links {
+  display: block;
+}
diff --git a/core/themes/stable9/css/contextual/contextual.theme.css b/core/themes/stable9/css/contextual/contextual.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..d84444d18d7c3799e495cb8a7b81ed28c20fdfa1
--- /dev/null
+++ b/core/themes/stable9/css/contextual/contextual.theme.css
@@ -0,0 +1,112 @@
+/**
+ * @file
+ * Styling for contextual module.
+ */
+
+/**
+ * Contextual links wrappers.
+ */
+.contextual {
+  position: absolute;
+  z-index: 500;
+  top: 6px;
+  right: 0; /* LTR */
+}
+[dir="rtl"] .contextual {
+  right: auto;
+  left: 0;
+}
+
+/**
+ * Contextual region.
+ */
+.contextual-region.focus {
+  outline: 1px dashed #d6d6d6;
+  outline-offset: 1px;
+}
+
+/**
+ * Contextual trigger.
+ */
+.contextual .trigger {
+  position: relative;
+  right: 6px; /* LTR */
+  float: right; /* LTR */
+  overflow: hidden;
+  margin: 0;
+  padding: 0 2px;
+  cursor: pointer;
+  border: 1px solid #ccc;
+  border-radius: 13px;
+  background-color: #fff;
+  background-attachment: scroll;
+}
+[dir="rtl"] .contextual .trigger {
+  right: auto;
+  left: 6px;
+  float: left;
+}
+.contextual.open .trigger {
+  z-index: 2;
+  border: 1px solid #ccc;
+  border-bottom-color: transparent;
+  border-radius: 13px 13px 0 0;
+  box-shadow: none;
+}
+
+/**
+ * Contextual links.
+ *
+ * The following selectors are heavy to discourage theme overriding.
+ */
+.contextual-region .contextual .contextual-links {
+  position: relative;
+  top: -1px;
+  right: 6px; /* LTR */
+  float: right; /* LTR */
+  clear: both;
+  margin: 0;
+  padding: 0.25em 0;
+  text-align: left; /* LTR */
+  white-space: nowrap;
+  border: 1px solid #ccc;
+  border-radius: 4px 0 4px 4px; /* LTR */
+  background-color: #fff;
+}
+[dir="rtl"] .contextual-region .contextual .contextual-links {
+  right: auto;
+  left: 6px;
+  float: left;
+  text-align: right;
+  border-radius: 0 4px 4px 4px;
+}
+.contextual-region .contextual .contextual-links li {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  list-style-image: none;
+  border: none;
+  background-color: #fff;
+  line-height: 100%;
+}
+.contextual-region .contextual .contextual-links a {
+  display: block;
+  margin: 0.25em 0;
+  padding: 0.4em 0.6em;
+  color: #333;
+  background-color: #fff;
+  font-family: sans-serif;
+  font-size: small;
+  line-height: 0.8em;
+}
+.touchevents .contextual-region .contextual .contextual-links a {
+  font-size: large;
+}
+.contextual-region .contextual .contextual-links a,
+.contextual-region .contextual .contextual-links a:hover {
+  text-decoration: none;
+}
+.no-touchevents .contextual-region .contextual .contextual-links li a:hover {
+  color: #000;
+  background: #f7fcff;
+}
diff --git a/core/themes/stable9/css/contextual/contextual.toolbar.css b/core/themes/stable9/css/contextual/contextual.toolbar.css
new file mode 100644
index 0000000000000000000000000000000000000000..5b84c24accdccf3bb1eda10154f8867d063087ba
--- /dev/null
+++ b/core/themes/stable9/css/contextual/contextual.toolbar.css
@@ -0,0 +1,24 @@
+/**
+ * @file
+ * Styling for contextual module's toolbar tab.
+ */
+
+/* Tab appearance. */
+.toolbar .toolbar-bar .contextual-toolbar-tab.toolbar-tab {
+  float: right; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-bar .contextual-toolbar-tab.toolbar-tab {
+  float: left;
+}
+.toolbar .toolbar-bar .contextual-toolbar-tab .toolbar-item {
+  margin: 0;
+}
+.toolbar .toolbar-bar .contextual-toolbar-tab .toolbar-item.is-active {
+  background-image: -webkit-linear-gradient(rgb(78, 159, 234) 0%, rgb(69, 132, 221) 100%);
+  background-image: linear-gradient(rgb(78, 159, 234) 0%, rgb(69, 132, 221) 100%);
+}
+
+/* @todo get rid of this declaration by making toolbar.module's CSS less specific */
+.toolbar .toolbar-bar .contextual-toolbar-tab.toolbar-tab.hidden {
+  display: none;
+}
diff --git a/core/themes/stable9/css/core/assets/vendor/normalize-css/normalize.css b/core/themes/stable9/css/core/assets/vendor/normalize-css/normalize.css
new file mode 100644
index 0000000000000000000000000000000000000000..192eb9ce43389039996bc2e9344c5bb14b730d72
--- /dev/null
+++ b/core/themes/stable9/css/core/assets/vendor/normalize-css/normalize.css
@@ -0,0 +1,349 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+   ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+html {
+  line-height: 1.15; /* 1 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/* Sections
+   ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
+  margin: 0;
+}
+
+/**
+ * Render the `main` element consistently in IE.
+ */
+
+main {
+  display: block;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+  box-sizing: content-box; /* 1 */
+  height: 0; /* 1 */
+  overflow: visible; /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
+  background-color: transparent;
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+  border-bottom: none; /* 1 */
+  text-decoration: underline; /* 2 */
+  text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+  font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
+  border-style: none;
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  font-family: inherit; /* 1 */
+  font-size: 100%; /* 1 */
+  line-height: 1.15; /* 1 */
+  margin: 0; /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
+  overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
+  text-transform: none;
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  border-style: none;
+  padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+  outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+  padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ *    `fieldset` elements in all browsers.
+ */
+
+legend {
+  box-sizing: border-box; /* 1 */
+  color: inherit; /* 2 */
+  display: table; /* 1 */
+  max-width: 100%; /* 1 */
+  padding: 0; /* 3 */
+  white-space: normal; /* 1 */
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+  vertical-align: baseline;
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
+  overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+  box-sizing: border-box; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+  -webkit-appearance: textfield; /* 1 */
+  outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button; /* 1 */
+  font: inherit; /* 2 */
+}
+
+/* Interactive
+   ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
+  display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+  display: list-item;
+}
+
+/* Misc
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
+  display: none;
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
+  display: none;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.base.css b/core/themes/stable9/css/core/dialog/off-canvas.base.css
new file mode 100644
index 0000000000000000000000000000000000000000..95fe5868e7aee892074231cea825e892fc59e62c
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.base.css
@@ -0,0 +1,234 @@
+/**
+ * @file
+ * Set base styles for the off-canvas dialog.
+ */
+
+/* Set some global attributes. */
+#drupal-off-canvas *,
+#drupal-off-canvas *:not(div) {
+  color: #ddd;
+  background: #444;
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+}
+
+/* Generic elements. */
+#drupal-off-canvas a,
+#drupal-off-canvas .link {
+  transition: color 0.5s ease;
+  text-decoration: none;
+  color: #85bef4;
+  border-bottom: none;
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+  font-size: inherit;
+  font-weight: normal;
+}
+
+#drupal-off-canvas a:focus,
+#drupal-off-canvas .link:focus,
+#drupal-off-canvas a:hover,
+#drupal-off-canvas .link:hover {
+  text-decoration: underline;
+}
+#drupal-off-canvas hr {
+  height: 1px;
+  background: #ccc;
+}
+#drupal-off-canvas summary,
+#drupal-off-canvas .fieldgroup:not(.form-composite) > legend {
+  font-weight: bold;
+}
+#drupal-off-canvas h1,
+#drupal-off-canvas .heading-a {
+  display: block;
+  font-size: 1.625em;
+  font-weight: bold;
+  line-height: 1.875em;
+}
+#drupal-off-canvas h2,
+#drupal-off-canvas .heading-b {
+  display: block;
+  margin: 10px 0;
+  font-size: 1.385em;
+  font-weight: bold;
+}
+#drupal-off-canvas h3,
+#drupal-off-canvas .heading-c {
+  display: block;
+  margin: 10px 0;
+  font-size: 1.231em;
+  font-weight: bold;
+}
+#drupal-off-canvas h4,
+#drupal-off-canvas .heading-d {
+  display: block;
+  margin: 10px 0;
+  font-size: 1.154em;
+  font-weight: bold;
+}
+#drupal-off-canvas h5,
+#drupal-off-canvas .heading-e {
+  display: block;
+  margin: 10px 0;
+  font-size: 1.077em;
+  font-weight: bold;
+}
+#drupal-off-canvas h6,
+#drupal-off-canvas .heading-f {
+  display: block;
+  margin: 10px 0;
+  font-size: 1.077em;
+  font-weight: bold;
+}
+#drupal-off-canvas p {
+  margin: 1em 0;
+}
+#drupal-off-canvas dl {
+  margin: 0 0 20px;
+}
+#drupal-off-canvas dl dd,
+#drupal-off-canvas dl dl {
+  margin-bottom: 10px;
+  margin-left: 20px; /* LTR */
+}
+[dir="rtl"] #drupal-off-canvas dl dd,
+[dir="rtl"] #drupal-off-canvas dl dl {
+  margin-right: 20px;
+}
+#drupal-off-canvas blockquote {
+  margin: 1em 40px;
+}
+#drupal-off-canvas address {
+  font-style: italic;
+}
+#drupal-off-canvas u,
+#drupal-off-canvas ins {
+  text-decoration: underline;
+}
+#drupal-off-canvas s,
+#drupal-off-canvas strike,
+#drupal-off-canvas del {
+  text-decoration: line-through;
+}
+#drupal-off-canvas big {
+  font-size: larger;
+}
+#drupal-off-canvas small {
+  font-size: smaller;
+}
+#drupal-off-canvas sub {
+  vertical-align: sub;
+  font-size: smaller;
+  line-height: normal;
+}
+#drupal-off-canvas sup {
+  vertical-align: super;
+  font-size: smaller;
+  line-height: normal;
+}
+#drupal-off-canvas abbr,
+#drupal-off-canvas acronym {
+  border-bottom: dotted 1px;
+  background: transparent;
+}
+
+#drupal-off-canvas ul {
+  list-style-type: disc;
+  list-style-image: none;
+}
+[dir="rtl"] #drupal-off-canvas .messages__list {
+  margin-right: 0;
+}
+#drupal-off-canvas ol {
+  list-style-type: decimal;
+}
+#drupal-off-canvas ul li,
+#drupal-off-canvas ol li {
+  display: block;
+}
+#drupal-off-canvas blockquote,
+#drupal-off-canvas code {
+  margin: 20px 0;
+}
+#drupal-off-canvas pre {
+  margin: 20px 0;
+  white-space: pre-wrap;
+}
+
+/* Classes for hidden and visually hidden elements. See hidden.module.css. */
+#drupal-off-canvas .hidden {
+  display: none;
+}
+#drupal-off-canvas .visually-hidden {
+  position: absolute !important;
+  overflow: hidden;
+  clip: rect(1px, 1px, 1px, 1px);
+  width: 1px;
+  height: 1px;
+  word-wrap: normal;
+}
+#drupal-off-canvas .visually-hidden.focusable:active,
+#drupal-off-canvas .visually-hidden.focusable:focus {
+  position: static !important;
+  overflow: visible;
+  clip: auto;
+  width: auto;
+  height: auto;
+}
+#drupal-off-canvas .invisible {
+  visibility: hidden;
+}
+
+/* Some system classes. See system.admin.css. */
+#drupal-off-canvas .panel {
+  padding: 5px 5px 15px;
+}
+#drupal-off-canvas .panel__description {
+  margin: 0 0 3px;
+  padding: 2px 0 3px 0;
+}
+#drupal-off-canvas .compact-link {
+  margin: 0 0 10px 0;
+}
+#drupal-off-canvas small .admin-link:before {
+  content: " [";
+}
+#drupal-off-canvas small .admin-link:after {
+  content: "]";
+}
+
+/* Override jQuery UI */
+#drupal-off-canvas .ui-widget-content a {
+  color: #85bef4 !important;
+}
+
+/* Message styles */
+#drupal-off-canvas .messages {
+  background: no-repeat 10px 17px;
+}
+[dir="rtl"] #drupal-off-canvas .messages {
+  background-position: right 10px top 17px;
+}
+#drupal-off-canvas .messages abbr {
+  color: #444;
+}
+#drupal-off-canvas .messages--status {
+  color: #325e1c;
+  background-color: #f3faef;
+  background-image: url(../../../../../misc/icons/73b355/check.svg);
+}
+#drupal-off-canvas .messages--warning {
+  color: #734c00;
+  background-color: #fdf8ed;
+  background-image: url(../../../../../misc/icons/e29700/warning.svg);
+}
+
+#drupal-off-canvas .messages--error {
+  color: #a51b00;
+  background-color: #fcf4f2;
+  background-image: url(../../../../../misc/icons/e32700/error.svg);
+}
+
+#drupal-off-canvas .messages--error div[role="alert"] {
+  color: inherit;
+  background: transparent;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.button.css b/core/themes/stable9/css/core/dialog/off-canvas.button.css
new file mode 100644
index 0000000000000000000000000000000000000000..9aa1bf5681d9c7037abae19b81b9c836c84ba3bf
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.button.css
@@ -0,0 +1,118 @@
+/**
+ * @file
+ * Visual styling for buttons in the off-canvas dialog.
+ *
+ * @see seven/css/components/buttons.css
+ */
+
+#drupal-off-canvas button,
+#drupal-off-canvas .button {
+  margin: 0 0 10px;
+  padding: 0;
+  cursor: pointer;
+  text-decoration: none;
+  text-transform: none;
+  border: 0;
+  box-shadow: none;
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+  line-height: normal;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+}
+#drupal-off-canvas button.link {
+  display: inline;
+  transition: color 0.5s ease;
+  color: #85bef4;
+  background: transparent;
+  font-size: 14px;
+}
+#drupal-off-canvas button.link:hover,
+#drupal-off-canvas button.link:focus {
+  text-decoration: none;
+  color: #46a0f5;
+}
+#drupal-off-canvas input[type="submit"].button {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  height: auto;
+  padding: 4px 20px;
+  cursor: pointer;
+  transition: background 0.5s ease;
+  text-align: center;
+  color: #f5f5f5;
+  border: 0;
+  border-radius: 20em;
+  background: #777;
+  font-size: 14px;
+  font-weight: 600;
+}
+#drupal-off-canvas input[type="submit"].button:hover,
+#drupal-off-canvas input[type="submit"].button:focus,
+#drupal-off-canvas input[type="submit"].button:active {
+  z-index: 10;
+  text-decoration: none;
+  color: #fff;
+  border: 0;
+  outline: none;
+}
+#drupal-off-canvas input[type="submit"].button:focus,
+#drupal-off-canvas input[type="submit"].button:active {
+  box-shadow: 0 3px 3px 2px rgba(0, 0, 0, 0.1);
+}
+#drupal-off-canvas input[type="submit"].button--primary {
+  margin-top: 15px;
+  color: #fff;
+  border: 0;
+  background: #277abd;
+}
+#drupal-off-canvas input[type="submit"].button--primary:hover,
+#drupal-off-canvas input[type="submit"].button--primary:focus,
+#drupal-off-canvas input[type="submit"].button--primary:active {
+  outline: none;
+  background: #236aaf;
+}
+#drupal-off-canvas .button-action:before {
+  margin-left: -0.2em; /* LTR */
+  padding-right: 0.2em; /* LTR */
+  font-size: 14px;
+  line-height: 16px;
+}
+[dir="rtl"] #drupal-off-canvas .button-action:before {
+  margin-right: -0.2em;
+  margin-left: 0;
+  padding-right: 0;
+  padding-left: 0.2em;
+}
+#drupal-off-canvas .no-touchevents .button--small {
+  padding: 2px 1em;
+  font-size: 13px;
+}
+#drupal-off-canvas .button:disabled,
+#drupal-off-canvas .button:disabled:active,
+#drupal-off-canvas .button.is-disabled,
+#drupal-off-canvas .button.is-disabled:active {
+  cursor: default;
+  color: #5c5c5c;
+  border: 0;
+  background: #555;
+  font-weight: normal;
+}
+#drupal-off-canvas .button--danger {
+  text-decoration: none;
+  color: #c72100;
+  border-radius: 0;
+  font-weight: 400;
+}
+#drupal-off-canvas .button--danger:hover,
+#drupal-off-canvas .button--danger:focus,
+#drupal-off-canvas .button--danger:active {
+  text-decoration: none;
+  color: #ff2a00;
+  text-shadow: none;
+}
+#drupal-off-canvas .button--danger:disabled,
+#drupal-off-canvas .button--danger.is-disabled {
+  cursor: default;
+  color: #737373;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.css b/core/themes/stable9/css/core/dialog/off-canvas.css
new file mode 100644
index 0000000000000000000000000000000000000000..245dc7adb9f3f0d6d51ad893c51b71f3015a3fbd
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.css
@@ -0,0 +1,55 @@
+/**
+ * @file
+ * CSS for off-canvas dialog.
+ */
+
+/* Position the off-canvas dialog container outside the right of the viewport. */
+.ui-dialog-off-canvas {
+  overflow: visible;
+  box-sizing: border-box;
+  height: 100%;
+}
+
+/* Wrap the form that's inside the off-canvas dialog. */
+.ui-dialog-off-canvas .ui-dialog-content {
+  /* Prevent horizontal scrollbar. */
+  overflow-x: hidden;
+  overflow-y: auto;
+  padding: 0 20px;
+}
+[dir="rtl"] .ui-dialog-off-canvas .ui-dialog-content {
+  text-align: right;
+}
+
+/* Position the off-canvas dialog container outside the right of the viewport. */
+.ui-dialog-off-canvas {
+  overflow: visible;
+  box-sizing: border-box;
+  height: 100%;
+}
+
+/* Wrap the form that's inside the off-canvas dialog. */
+.ui-dialog-off-canvas #drupal-off-canvas {
+  /* Prevent horizontal scrollbar. */
+  overflow-x: hidden;
+  overflow-y: auto;
+  padding: 0 20px 20px;
+}
+[dir="rtl"] .ui-dialog-off-canvas #drupal-off-canvas {
+  text-align: right;
+}
+
+/*
+ * Force the off-canvas dialog to be 100% width at the same breakpoint the
+ * dialog system uses to expand dialog widths.
+ */
+@media all and (max-width: 48em) { /* 768px */
+  .ui-dialog.ui-dialog-off-canvas {
+    width: 100% !important;
+  }
+  /* When off-canvas dialog is at 100% width stop the body from scrolling */
+  .js-off-canvas-dialog-open {
+    overflow-y: hidden;
+    height: 100%;
+  }
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.details.css b/core/themes/stable9/css/core/dialog/off-canvas.details.css
new file mode 100644
index 0000000000000000000000000000000000000000..6991dd00c4029f02843a367e6957c0aeb0992e5f
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.details.css
@@ -0,0 +1,62 @@
+/**
+ * @file
+ * Visual styling for summary and details in the off-canvas dialog.
+ */
+
+#drupal-off-canvas details {
+  display: block;
+}
+#drupal-off-canvas details,
+#drupal-off-canvas summary {
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+}
+#drupal-off-canvas details,
+#drupal-off-canvas summary,
+#drupal-off-canvas .ui-dialog-content {
+  color: #ddd;
+  background: #474747;
+}
+#drupal-off-canvas summary a {
+  padding-top: 0;
+  padding-bottom: 0;
+  color: #ddd;
+}
+#drupal-off-canvas summary a:hover,
+#drupal-off-canvas summary a:focus {
+  color: #fff;
+}
+#drupal-off-canvas details,
+#drupal-off-canvas summary,
+#drupal-off-canvas .details-wrapper {
+  /* Cancel out the padding of the parent. */
+  margin: 0 -20px;
+  padding: 0 20px;
+  border-width: 0;
+}
+#drupal-off-canvas summary {
+  padding: 10px 20px;
+  transition: all 0.5s ease;
+  text-shadow: none;
+  font-size: 14px;
+}
+#drupal-off-canvas summary:hover,
+#drupal-off-canvas summary:focus {
+  background-color: #222;
+}
+#drupal-off-canvas details[open] {
+  padding-bottom: 10px;
+}
+#drupal-off-canvas details[open] > summary {
+  color: #eee;
+  background-color: #333;
+}
+#drupal-off-canvas details[open] > summary:hover {
+  color: #fff;
+  background-color: #222;
+}
+#drupal-off-canvas details .placeholder {
+  color: inherit;
+  background: transparent;
+  font: inherit;
+  font-style: italic;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.dropbutton.css b/core/themes/stable9/css/core/dialog/off-canvas.dropbutton.css
new file mode 100644
index 0000000000000000000000000000000000000000..308f386b7151fcfec31e940f5453d6e9630b4204
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.dropbutton.css
@@ -0,0 +1,291 @@
+/**
+ * @file
+ * Styles for dropbuttons in the off-canvas dialog.
+ */
+
+#drupal-off-canvas .dropbutton-wrapper,
+#drupal-off-canvas .dropbutton-widget {
+  position: static;
+  display: block;
+  transition: none;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+}
+#drupal-off-canvas .dropbutton-widget {
+  margin: 0;
+  padding: 0;
+  cursor: pointer;
+  transition: background 0.5s ease;
+  text-align: center;
+  text-decoration: none;
+  text-transform: none;
+  color: #fff;
+  border: 0;
+  border-radius: 1em;
+  background: #277abd;
+  font-weight: 600;
+  line-height: normal;
+}
+#drupal-off-canvas .dropbutton-widget:hover {
+  background: #2b8bd8;
+}
+
+/*
+ * Style dropbutton single.
+ */
+
+#drupal-off-canvas .dropbutton-single .dropbutton-action a {
+  height: 2.2em;
+  /* Overlap icon for trigger. */
+  margin-top: -2em;
+  padding: 0;
+  cursor: pointer;
+}
+#drupal-off-canvas .dropbutton-single .dropbutton-action:hover,
+#drupal-off-canvas .dropbutton-single .dropbutton-action:focus,
+#drupal-off-canvas .dropbutton-single .dropbutton-action a:hover,
+#drupal-off-canvas .dropbutton-single .dropbutton-action a:focus {
+  text-decoration: none;
+  outline: none;
+}
+#drupal-off-canvas .dropbutton-widget .dropbutton {
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+}
+#drupal-off-canvas .dropbutton li,
+#drupal-off-canvas .dropbutton a {
+  display: block;
+  width: auto;
+  padding: 4px 0;
+  text-align: left;
+  color: #555;
+  outline: none;
+}
+#drupal-off-canvas .dropbutton li:hover,
+#drupal-off-canvas .dropbutton li:focus,
+#drupal-off-canvas .dropbutton a:hover,
+#drupal-off-canvas .dropbutton a:focus {
+  color: #333;
+  outline: none;
+  background: transparent;
+}
+
+/*
+ * Style dropbutton multiple.
+ */
+
+#drupal-off-canvas .dropbutton-multiple .dropbutton-widget {
+  width: 2em;
+  height: 2em;
+}
+#drupal-off-canvas .dropbutton-multiple .dropbutton-widget:hover {
+  background-color: #2b8bd8;
+}
+
+/* Hide the other actions until the dropbutton is triggered. */
+#drupal-off-canvas .dropbutton-multiple .dropbutton .secondary-action {
+  display: none;
+}
+
+/* The toggle to expand the button. */
+#drupal-off-canvas .dropbutton-toggle {
+  position: absolute;
+  top: 0;
+  right: 0; /* LTR */
+  bottom: 0;
+  display: block;
+  width: 2em;
+  white-space: nowrap;
+  text-indent: 110%;
+  color: #fff;
+}
+#drupal-off-canvas .dropbutton-toggle button {
+  display: block;
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  cursor: pointer;
+  border: 0 solid transparent;
+  border-top-right-radius: 1em; /* LTR */
+  border-bottom-right-radius: 1em; /* LTR */
+}
+#drupal-off-canvas .dropbutton-toggle button:hover,
+#drupal-off-canvas .dropbutton-toggle button:focus {
+  outline: none;
+}
+
+/* The toggle arrow. */
+#drupal-off-canvas .dropbutton-arrow {
+  position: absolute;
+  display: block;
+  overflow: hidden;
+  width: 0;
+  height: 0;
+  margin-top: 0;
+  color: #fff;
+  border-width: 0.3333em 0.3333em 0;
+  border-style: solid;
+  border-right-color: transparent;
+  border-bottom-color: transparent;
+  border-left-color: transparent;
+  line-height: 0;
+}
+#drupal-off-canvas span.dropbutton-arrow {
+  top: 7px;
+  right: 7px; /* LTR */
+  background: transparent;
+}
+#drupal-off-canvas span.dropbutton-arrow:hover {
+  background: transparent;
+}
+
+#drupal-off-canvas .dropbutton-action > .js-form-submit.form-submit,
+#drupal-off-canvas .dropbutton-toggle button {
+  position: relative;
+  text-shadow: none;
+}
+
+/*
+ * Dropbuttons when in a table cell.
+ */
+
+/* Make sure table cell doesn't collapse around absolute positioned dropbutton. */
+#drupal-off-canvas td .dropbutton-single {
+  min-width: 2em;
+}
+#drupal-off-canvas td .dropbutton-multiple {
+  min-width: 2em;
+  margin-right: 0;
+  margin-left: 0;
+  padding-right: 0;
+  padding-left: 0;
+  border: 0;
+}
+#drupal-off-canvas td .dropbutton-multiple .dropbutton-action a,
+#drupal-off-canvas td .dropbutton-multiple .dropbutton-action input,
+#drupal-off-canvas td .dropbutton-multiple .dropbutton-action button {
+  width: auto;
+  padding: 0;
+  font-size: inherit;
+}
+#drupal-off-canvas td .dropbutton-wrapper {
+  margin-bottom: 0;
+}
+
+/* Push the widget to the right so text expands left. */
+#drupal-off-canvas td .dropbutton-widget {
+  position: absolute;
+  right: 12px; /* LTR */
+  padding: 0;
+  background: #277abd none;
+}
+
+/* Push the wrapper to the right edge of the td. */
+#drupal-off-canvas td .dropbutton-single,
+#drupal-off-canvas td .dropbutton-multiple {
+  position: relative;
+  float: right; /* LTR */
+  min-width: initial;
+  max-width: initial;
+  margin-right: 0;
+  padding-right: 0;
+}
+#drupal-off-canvas td .dropbutton-widget .dropbutton {
+  overflow: hidden;
+  width: 2em;
+  height: 2em;
+  margin: 0;
+  background: transparent;
+}
+
+/* Push text out of the way. */
+#drupal-off-canvas td .dropbutton-multiple li,
+#drupal-off-canvas td .dropbutton-multiple a {
+  margin-left: -9999px;
+  background: transparent;
+}
+#drupal-off-canvas td .dropbutton-multiple.open .dropbutton li,
+#drupal-off-canvas td .dropbutton-multiple.open .dropbutton a {
+  width: auto;
+  margin-left: 0;
+  color: #fff;
+}
+
+/* Collapse the button to a circle. */
+#drupal-off-canvas td .dropbutton-toggle {
+  width: 2em;
+  height: 2em;
+  border-radius: 1em;
+}
+#drupal-off-canvas td .dropbutton-wrapper .dropbutton-widget .dropbutton-toggle button {
+  border: 0;
+  background: transparent;
+}
+
+/* Prevent list item from expanding its container. */
+#drupal-off-canvas td ul.dropbutton li.edit {
+  width: 2em;
+  height: 2em;
+}
+
+/* Make li text transparent above icon so it's clickable. */
+#drupal-off-canvas td .dropbutton-single li.edit.dropbutton-action > a {
+  z-index: 1;
+  color: transparent;
+}
+
+/* Put pencil icon in place of hidden 'edit' text on single buttons. */
+#drupal-off-canvas td .dropbutton-single .edit:before {
+  display: block;
+  content: ".";
+  color: transparent;
+  background: transparent url(../../../../../misc/icons/ffffff/pencil.svg) no-repeat center;
+  background-size: 14px;
+}
+
+/* Dropbutton when triggered expands to show secondary items. */
+#drupal-off-canvas .dropbutton-multiple.open {
+  z-index: 100;
+}
+
+/* Create visual separation if there is an adjacent button. */
+#drupal-off-canvas .dropbutton-multiple.open .dropbutton-widget {
+  box-shadow: 0 3px 3px 2px rgba(0, 0, 0, 0.5);
+}
+
+/* Triggered dropbutton expands to show secondary items. */
+#drupal-off-canvas .dropbutton-multiple.open,
+#drupal-off-canvas .dropbutton-multiple.open .dropbutton-widget {
+  display: block;
+  overflow: visible;
+  width: auto;
+  min-width: 0;
+  max-width: none;
+  height: auto;
+  padding: 0;
+}
+
+/* Triggered dropbutton in td expands to show secondary items. */
+#drupal-off-canvas td .dropbutton-multiple.open .dropbutton,
+#drupal-off-canvas .dropbutton-multiple.open .dropbutton .secondary-action {
+  display: block;
+  width: auto;
+  height: auto;
+  padding-right: 1em; /* LTR */
+}
+[dir="rtl"] #drupal-off-canvas td .dropbutton-multiple.open .dropbutton {
+  padding-right: inherit;
+  padding-left: 1em;
+}
+#drupal-off-canvas .dropbutton-multiple.open .dropbutton li a {
+  padding: 2px 1em;
+}
+
+/* When open, the toggle arrow points upward. */
+#drupal-off-canvas .dropbutton-multiple.open span.dropbutton-arrow {
+  top: 2px;
+  border-top-color: transparent;
+  border-bottom: 0.3333em solid;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.form.css b/core/themes/stable9/css/core/dialog/off-canvas.form.css
new file mode 100644
index 0000000000000000000000000000000000000000..d4c39be5d9498b72ee00661d12a36efc6c853dc3
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.form.css
@@ -0,0 +1,133 @@
+/**
+ * @file
+ * Visual styling for forms in the off-canvas dialog.
+ */
+
+#drupal-off-canvas form {
+  color: #ddd;
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+}
+#drupal-off-canvas input[type="checkbox"] {
+  -webkit-appearance: checkbox;
+}
+#drupal-off-canvas input[type="radio"] {
+  -webkit-appearance: radio;
+}
+#drupal-off-canvas select:not([multiple]) {
+  -webkit-appearance: menulist;
+  -moz-appearance: menulist;
+}
+#drupal-off-canvas option {
+  display: block;
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+}
+#drupal-off-canvas label {
+  color: #ddd;
+  font-family: inherit;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: normal;
+}
+#drupal-off-canvas .visually-hidden {
+  width: 0;
+  height: 0;
+  letter-spacing: -2em;
+  opacity: 0;
+}
+#drupal-off-canvas .description,
+#drupal-off-canvas .form-item .description,
+#drupal-off-canvas .details-description {
+  margin-top: 5px;
+  color: #ddd;
+  font-family: inherit;
+  font-size: 12px;
+  font-style: normal;
+}
+#drupal-off-canvas .form-item {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+/* Set size and position for all inputs. */
+#drupal-off-canvas .form-select,
+#drupal-off-canvas .form-text,
+#drupal-off-canvas .form-tel,
+#drupal-off-canvas .form-email,
+#drupal-off-canvas .form-url,
+#drupal-off-canvas .form-search,
+#drupal-off-canvas .form-number,
+#drupal-off-canvas .form-color,
+#drupal-off-canvas .form-file,
+#drupal-off-canvas .form-textarea,
+#drupal-off-canvas .form-date,
+#drupal-off-canvas .form-time {
+  display: block;
+  box-sizing: border-box;
+  max-width: 100%;
+  margin: 5px 0 0 0;
+  padding: 6px;
+  color: #333;
+  border-width: 1px;
+  border-radius: 2px;
+  font-family: inherit;
+  font-size: 14px;
+  line-height: 16px;
+}
+/* Reduce contrast for fields against dark background. */
+#drupal-off-canvas .form-text,
+#drupal-off-canvas .form-tel,
+#drupal-off-canvas .form-email,
+#drupal-off-canvas .form-url,
+#drupal-off-canvas .form-search,
+#drupal-off-canvas .form-number,
+#drupal-off-canvas .form-color,
+#drupal-off-canvas .form-file,
+#drupal-off-canvas .form-textarea,
+#drupal-off-canvas .form-date,
+#drupal-off-canvas .form-time {
+  color: #595959;
+  border-color: #333;
+  background-color: #eee;
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.125);
+}
+#drupal-off-canvas .form-text:focus,
+#drupal-off-canvas .form-tel:focus,
+#drupal-off-canvas .form-email:focus,
+#drupal-off-canvas .form-url:focus,
+#drupal-off-canvas .form-search:focus,
+#drupal-off-canvas .form-number:focus,
+#drupal-off-canvas .form-color:focus,
+#drupal-off-canvas .form-file:focus,
+#drupal-off-canvas .form-textarea:focus,
+#drupal-off-canvas .form-date:focus,
+#drupal-off-canvas .form-time:focus {
+  border-color: #40b6ff;
+  background-color: #fff;
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.125), 0 0 8px #40b6ff;
+}
+#drupal-off-canvas td .form-item,
+#drupal-off-canvas td .form-select {
+  margin: 0;
+}
+#drupal-off-canvas .form-file {
+  width: 100%;
+  margin-bottom: 5px;
+}
+#drupal-off-canvas .form-actions {
+  margin: 10px 0;
+  text-align: center;
+}
+#drupal-off-canvas .ui-autocomplete {
+  position: absolute;
+  top: 0;
+  left: 0;
+  cursor: default;
+  background-color: white;
+}
+#drupal-off-canvas .ui-autocomplete li {
+  display: block;
+}
+#drupal-off-canvas .ui-autocomplete li a {
+  padding: 5px;
+  cursor: pointer;
+  color: #595959 !important;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.layout.css b/core/themes/stable9/css/core/dialog/off-canvas.layout.css
new file mode 100644
index 0000000000000000000000000000000000000000..aa3a5373ea3e0e4ed49f174e59f497b6e37628d1
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.layout.css
@@ -0,0 +1,11 @@
+/**
+ * @file
+ * Visual styling for layouts in the off-canvas dialog.
+ *
+ * See seven/css/layout/layout.css
+ */
+
+.layout-icon__region {
+  fill: #f5f5f2;
+  stroke: #666;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.motion.css b/core/themes/stable9/css/core/dialog/off-canvas.motion.css
new file mode 100644
index 0000000000000000000000000000000000000000..60d8d6a1dd2d29ac7dad4a83e7b28768b3e157a0
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.motion.css
@@ -0,0 +1,11 @@
+/**
+ * @file
+ * Motion effects for off-canvas dialog.
+ *
+ * Motion effects are in a separate file so that they can be easily turned off
+ * to improve performance if desired.
+ */
+
+.dialog-off-canvas-main-canvas {
+  transition: padding-right 0.7s ease, padding-left 0.7s ease, padding-top 0.3s ease;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.reset.css b/core/themes/stable9/css/core/dialog/off-canvas.reset.css
new file mode 100644
index 0000000000000000000000000000000000000000..6c16f3ddd6974c2a0745275b2c532ad8d413a8b5
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.reset.css
@@ -0,0 +1,388 @@
+/**
+ * @file
+ * Reset most HTML elements styles for the off-canvas dialog.
+ *
+ * This is a generic reset. Drupal-specific classes are reset in components.
+ */
+
+/**
+ * Do not include div in then initial overrides because including div will
+ * cause the need for many more overrides in this file.
+ */
+#drupal-off-canvas *:not(div),
+#drupal-off-canvas *:not(svg *),
+#drupal-off-canvas *:after,
+#drupal-off-canvas *:before {
+  all: initial;
+  box-sizing: border-box;
+  text-shadow: none;
+  -webkit-font-smoothing: antialiased;
+  -webkit-tap-highlight-color: initial;
+}
+
+/* Reset size and position on elements. */
+#drupal-off-canvas a,
+#drupal-off-canvas abbr,
+#drupal-off-canvas acronym,
+#drupal-off-canvas address,
+#drupal-off-canvas applet,
+#drupal-off-canvas article,
+#drupal-off-canvas aside,
+#drupal-off-canvas audio,
+#drupal-off-canvas b,
+#drupal-off-canvas big,
+#drupal-off-canvas blockquote,
+#drupal-off-canvas body,
+#drupal-off-canvas canvas,
+#drupal-off-canvas caption,
+#drupal-off-canvas cite,
+#drupal-off-canvas code,
+#drupal-off-canvas dd,
+#drupal-off-canvas del,
+#drupal-off-canvas dfn,
+#drupal-off-canvas dialog,
+#drupal-off-canvas dl,
+#drupal-off-canvas dt,
+#drupal-off-canvas em,
+#drupal-off-canvas embed,
+#drupal-off-canvas fieldset,
+#drupal-off-canvas figcaption,
+#drupal-off-canvas figure,
+#drupal-off-canvas footer,
+#drupal-off-canvas form,
+#drupal-off-canvas h1,
+#drupal-off-canvas h2,
+#drupal-off-canvas h3,
+#drupal-off-canvas h4,
+#drupal-off-canvas h5,
+#drupal-off-canvas h6,
+#drupal-off-canvas header,
+#drupal-off-canvas hgroup,
+#drupal-off-canvas hr,
+#drupal-off-canvas html,
+#drupal-off-canvas i,
+#drupal-off-canvas iframe,
+#drupal-off-canvas img,
+#drupal-off-canvas ins,
+#drupal-off-canvas kbd,
+#drupal-off-canvas label,
+#drupal-off-canvas legend,
+#drupal-off-canvas li,
+#drupal-off-canvas main,
+#drupal-off-canvas mark,
+#drupal-off-canvas menu,
+#drupal-off-canvas meter,
+#drupal-off-canvas nav,
+#drupal-off-canvas object,
+#drupal-off-canvas ol,
+#drupal-off-canvas output,
+#drupal-off-canvas p,
+#drupal-off-canvas pre,
+#drupal-off-canvas progress,
+#drupal-off-canvas q,
+#drupal-off-canvas rp,
+#drupal-off-canvas rt,
+#drupal-off-canvas s,
+#drupal-off-canvas samp,
+#drupal-off-canvas section,
+#drupal-off-canvas small,
+#drupal-off-canvas span,
+#drupal-off-canvas strike,
+#drupal-off-canvas strong,
+#drupal-off-canvas sub,
+#drupal-off-canvas sup,
+#drupal-off-canvas table,
+#drupal-off-canvas tbody,
+#drupal-off-canvas td,
+#drupal-off-canvas tfoot,
+#drupal-off-canvas th,
+#drupal-off-canvas thead,
+#drupal-off-canvas time,
+#drupal-off-canvas tr,
+#drupal-off-canvas tt,
+#drupal-off-canvas u,
+#drupal-off-canvas ul,
+#drupal-off-canvas var,
+#drupal-off-canvas video,
+#drupal-off-canvas xmp {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+}
+
+/*
+ * Override the default (display: inline) for browsers that do not recognize HTML5 tags.
+ * IE8 (and lower) requires a shiv: http://ejohn.org/blog/html5-shiv
+ */
+#drupal-off-canvas article,
+#drupal-off-canvas aside,
+#drupal-off-canvas figcaption,
+#drupal-off-canvas figure,
+#drupal-off-canvas footer,
+#drupal-off-canvas header,
+#drupal-off-canvas hgroup,
+#drupal-off-canvas main,
+#drupal-off-canvas menu,
+#drupal-off-canvas nav,
+#drupal-off-canvas section {
+  display: block;
+  border-radius: 0;
+  line-height: normal;
+}
+
+/*
+ * Makes browsers agree.
+ * IE + Opera = font-weight: bold.
+ * Gecko + WebKit = font-weight: bolder.
+ */
+#drupal-off-canvas b,
+#drupal-off-canvas strong {
+  font-weight: bold;
+}
+
+#drupal-off-canvas em,
+#drupal-off-canvas i {
+  font-style: italic;
+}
+
+#drupal-off-canvas img {
+  vertical-align: middle;
+  color: transparent;
+  font-size: 0;
+}
+
+#drupal-off-canvas ul,
+#drupal-off-canvas ol {
+  list-style: none;
+}
+
+/* reset table styling. */
+#drupal-off-canvas table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+#drupal-off-canvas table thead,
+#drupal-off-canvas table tbody,
+#drupal-off-canvas table tbody tr:nth-child(even),
+#drupal-off-canvas table tbody tr:nth-child(odd),
+#drupal-off-canvas table tfoot {
+  border: 0;
+  background: transparent none;
+}
+#drupal-off-canvas th,
+#drupal-off-canvas td,
+#drupal-off-canvas caption {
+  font-weight: normal;
+}
+#drupal-off-canvas q {
+  quotes: none;
+}
+#drupal-off-canvas q:before,
+#drupal-off-canvas q:after {
+  content: none;
+}
+#drupal-off-canvas sub,
+#drupal-off-canvas sup,
+#drupal-off-canvas small {
+  font-size: 75%;
+}
+#drupal-off-canvas sub,
+#drupal-off-canvas sup {
+  position: relative;
+  vertical-align: baseline;
+  line-height: 0;
+}
+#drupal-off-canvas sub {
+  bottom: -0.25em;
+}
+#drupal-off-canvas sup {
+  top: -0.5em;
+}
+
+/*
+ * For IE9. Without, occasionally draws shapes
+ * outside the boundaries of <svg> rectangle.
+ */
+#drupal-off-canvas svg {
+  overflow: hidden;
+}
+
+/* Specific resets for inputs. */
+#drupal-off-canvas input[type="search"]::-webkit-search-decoration {
+  display: none;
+}
+#drupal-off-canvas input {
+  margin: 0;
+  padding: 0;
+}
+#drupal-off-canvas input[type="checkbox"],
+#drupal-off-canvas input[type="radio"] {
+  position: static;
+  margin: 0;
+}
+#drupal-off-canvas input:invalid,
+#drupal-off-canvas button:invalid,
+#drupal-off-canvas select:invalid,
+#drupal-off-canvas textarea:invalid,
+#drupal-off-canvas input:focus,
+#drupal-off-canvas button:focus,
+#drupal-off-canvas select:focus,
+#drupal-off-canvas textarea:focus,
+#drupal-off-canvas input[type="file"]:focus,
+#drupal-off-canvas input[type="file"]:active,
+#drupal-off-canvas input[type="radio"]:focus,
+#drupal-off-canvas input[type="radio"]:active,
+#drupal-off-canvas input[type="checkbox"]:focus,
+#drupal-off-canvas input[type="checkbox"]:active {
+  z-index: 1;
+  box-shadow: none;
+}
+#drupal-off-canvas input[role="button"] {
+  cursor: pointer;
+}
+#drupal-off-canvas button,
+#drupal-off-canvas input[type="reset"],
+#drupal-off-canvas input[type="submit"],
+#drupal-off-canvas input[type="button"] {
+  display: inline-block;
+  overflow: visible;
+  cursor: pointer;
+  vertical-align: middle;
+  text-decoration: none;
+  border: 0;
+  outline: 0;
+  background-image: none;
+  text-shadow: none;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+}
+#drupal-off-canvas button:hover,
+#drupal-off-canvas input[type="reset"]:hover,
+#drupal-off-canvas input[type="submit"]:hover,
+#drupal-off-canvas input[type="button"]:hover {
+  text-decoration: none;
+  background-image: none;
+}
+#drupal-off-canvas button:active,
+#drupal-off-canvas input[type="reset"]:active,
+#drupal-off-canvas input[type="submit"]:active,
+#drupal-off-canvas input[type="button"]:active {
+  border-color: grey;
+  background-image: none;
+  box-shadow: none;
+}
+#drupal-off-canvas button::-moz-focus-inner,
+#drupal-off-canvas input[type="reset"]::-moz-focus-inner,
+#drupal-off-canvas input[type="submit"]::-moz-focus-inner,
+#drupal-off-canvas input[type="button"]::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+#drupal-off-canvas textarea,
+#drupal-off-canvas select,
+#drupal-off-canvas input[type="date"],
+#drupal-off-canvas input[type="datetime"],
+#drupal-off-canvas input[type="datetime-local"],
+#drupal-off-canvas input[type="email"],
+#drupal-off-canvas input[type="month"],
+#drupal-off-canvas input[type="number"],
+#drupal-off-canvas input[type="password"],
+#drupal-off-canvas input[type="search"],
+#drupal-off-canvas input[type="tel"],
+#drupal-off-canvas input[type="text"],
+#drupal-off-canvas input[type="time"],
+#drupal-off-canvas input[type="url"],
+#drupal-off-canvas input[type="week"] {
+  height: auto;
+  vertical-align: middle;
+  border-radius: 0;
+}
+#drupal-off-canvas textarea[disabled],
+#drupal-off-canvas select[disabled],
+#drupal-off-canvas input[type="date"][disabled],
+#drupal-off-canvas input[type="datetime"][disabled],
+#drupal-off-canvas input[type="datetime-local"][disabled],
+#drupal-off-canvas input[type="email"][disabled],
+#drupal-off-canvas input[type="month"][disabled],
+#drupal-off-canvas input[type="number"][disabled],
+#drupal-off-canvas input[type="password"][disabled],
+#drupal-off-canvas input[type="search"][disabled],
+#drupal-off-canvas input[type="tel"][disabled],
+#drupal-off-canvas input[type="text"][disabled],
+#drupal-off-canvas input[type="time"][disabled],
+#drupal-off-canvas input[type="url"][disabled],
+#drupal-off-canvas input[type="week"][disabled] {
+  background-color: grey;
+}
+#drupal-off-canvas input[type="hidden"] {
+  visibility: hidden;
+}
+#drupal-off-canvas button[disabled],
+#drupal-off-canvas input[disabled],
+#drupal-off-canvas select[disabled],
+#drupal-off-canvas select[disabled] option,
+#drupal-off-canvas select[disabled] optgroup,
+#drupal-off-canvas textarea[disabled] {
+  cursor: default;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  box-shadow: none;
+}
+#drupal-off-canvas input:placeholder,
+#drupal-off-canvas textarea:placeholder {
+  color: grey;
+}
+#drupal-off-canvas textarea,
+#drupal-off-canvas select[size],
+#drupal-off-canvas select[multiple] {
+  height: auto;
+}
+#drupal-off-canvas select[size="0"],
+#drupal-off-canvas select[size="1"] {
+  height: auto;
+}
+#drupal-off-canvas textarea {
+  overflow: auto;
+  width: 100%;
+  min-height: 40px;
+  resize: vertical;
+}
+#drupal-off-canvas optgroup {
+  color: black;
+  font-weight: normal;
+  font-style: normal;
+}
+#drupal-off-canvas optgroup::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+#drupal-off-canvas * button {
+  overflow: visible;
+  width: auto;
+  padding: 0;
+  vertical-align: middle;
+  text-decoration: none;
+  color: black;
+  border: 1px solid grey;
+  background: none;
+}
+#drupal-off-canvas * textarea,
+#drupal-off-canvas * select,
+#drupal-off-canvas *:not(div) textarea,
+#drupal-off-canvas *:not(div) select {
+  padding: 0;
+  vertical-align: top;
+  color: black;
+  border: 1px solid grey;
+  background: white;
+}
+
+/* To standardize off-canvas selection color. */
+#drupal-off-canvas ::-moz-selection,
+#drupal-off-canvas ::selection {
+  color: inherit;
+  background-color: rgba(175, 175, 175, 0.5);
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.table.css b/core/themes/stable9/css/core/dialog/off-canvas.table.css
new file mode 100644
index 0000000000000000000000000000000000000000..24154cdff3e5486b0bf4e813a394f8b9f8eb0c5b
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.table.css
@@ -0,0 +1,89 @@
+/**
+ * @file
+ * Visual styling for tables in the off-canvas dialog.
+ */
+
+#drupal-off-canvas table * {
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+}
+#drupal-off-canvas table {
+  display: table;
+  width: 100%;
+  min-width: calc(100% + 40px);
+  /* Cancel out the padding of the parent to make the table full width. */
+  margin: 0 -20px -10px -20px;
+  color: #ddd;
+  border: 0;
+  border-collapse: collapse;
+  font-size: 12px;
+}
+#drupal-off-canvas table thead {
+  display: table-header-group;
+}
+#drupal-off-canvas table tbody {
+  display: table-row-group;
+}
+#drupal-off-canvas tr {
+  display: table-row;
+}
+#drupal-off-canvas tr:hover td {
+  background-color: transparent;
+}
+
+#drupal-off-canvas td,
+#drupal-off-canvas th {
+  display: table-cell;
+  width: auto;
+  height: auto;
+  padding: 2px 8px;
+  vertical-align: middle;
+  border-bottom: 1px solid #777;
+  background-color: transparent;
+}
+[dir="rtl"] #drupal-off-canvas th,
+[dir="rtl"] #drupal-off-canvas td {
+  text-align: right;
+}
+#drupal-off-canvas th {
+  font-weight: bold;
+}
+#drupal-off-canvas th.checkbox,
+#drupal-off-canvas td.checkbox {
+  width: 20px;
+  padding: 0;
+  text-align: center;
+}
+#drupal-off-canvas div.checkbox.menu-enabled {
+  position: static;
+  display: inline;
+  width: auto;
+}
+#drupal-off-canvas th:first-child,
+#drupal-off-canvas td:first-child {
+  width: 150px;
+}
+/* For lack of a better class, using this to grab the operations th. */
+#drupal-off-canvas .tabledrag-has-colspan {
+  padding-right: 20px;
+  text-align: right;
+}
+#drupal-off-canvas td {
+  padding: 6px 8px;
+  color: #ddd;
+}
+/* Hide overflow with ellipsis for links. */
+#drupal-off-canvas td a {
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  background: transparent;
+}
+#drupal-off-canvas tr td:first-child,
+#drupal-off-canvas tr th:first-child {
+  padding-left: 20px; /* LTR */
+}
+[dir="rtl"] #drupal-off-canvas tr td:first-child,
+[dir="rtl"] #drupal-off-canvas tr th:first-child {
+  padding-right: 20px;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.tabledrag.css b/core/themes/stable9/css/core/dialog/off-canvas.tabledrag.css
new file mode 100644
index 0000000000000000000000000000000000000000..db9d21fa4a102d7c73eb0b8265848ed189c3890b
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.tabledrag.css
@@ -0,0 +1,122 @@
+/**
+ * @file
+ * Table drag behavior for off-canvas dialog.
+ *
+ * @see tabledrag.js
+ */
+
+#drupal-off-canvas .drag {
+  cursor: move;
+}
+#drupal-off-canvas tr.region-title {
+  font-weight: normal;
+}
+#drupal-off-canvas table .region-message {
+  color: #fff;
+}
+#drupal-off-canvas table .region-populated {
+  display: none;
+}
+#drupal-off-canvas .add-new .tabledrag-changed {
+  display: none;
+}
+#drupal-off-canvas .draggable a.tabledrag-handle {
+  float: left; /* LTR */
+  overflow: hidden;
+  min-width: 20px;
+  height: auto;
+  margin: 0 5px 0 0;
+  padding: 0;
+  cursor: move;
+  text-decoration: none;
+  background-image: none;
+}
+[dir="rtl"] #drupal-off-canvas .draggable a.tabledrag-handle {
+  float: right;
+  margin-right: 0;
+  margin-left: 5px;
+}
+#drupal-off-canvas a.tabledrag-handle .handle {
+  width: auto;
+  height: auto;
+  margin: 0;
+  padding: 0;
+  background-color: transparent;
+  /* Use lighter drag icon against dark background. */
+  background-image: url(../../../../../misc/icons/bebebe/move.svg);
+  background-repeat: no-repeat;
+  background-position: center;
+}
+#drupal-off-canvas .draggable a.tabledrag-handle:hover .handle,
+#drupal-off-canvas .draggable a.tabledrag-handle:focus .handle {
+  text-decoration: none;
+  background-image: url(../../../../../misc/icons/787878/move.svg);
+}
+#drupal-off-canvas tr td {
+  transition: background 0.3s ease;
+}
+
+#drupal-off-canvas tr td abbr {
+  margin-left: 5px; /* LTR */
+}
+
+[dir="rtl"] #drupal-off-canvas tr td abbr {
+  margin-right: 5px;
+  margin-left: 0;
+}
+#drupal-off-canvas tr:hover td {
+  background: #222;
+}
+#drupal-off-canvas tr.drag td {
+  background: #111;
+}
+#drupal-off-canvas tr.drag-previous td {
+  background: #000;
+}
+#drupal-off-canvas tr.drag-previous:hover td {
+  background: #222;
+}
+body div.tabledrag-changed-warning {
+  margin-bottom: 0.5em;
+  font-size: 14px;
+}
+#drupal-off-canvas .touchevents .draggable td {
+  padding: 0 10px;
+}
+#drupal-off-canvas .touchevents .draggable .menu-item__link {
+  display: inline-block;
+  padding: 10px 0;
+}
+#drupal-off-canvas .touchevents a.tabledrag-handle {
+  width: 40px;
+  height: 44px;
+}
+#drupal-off-canvas .touchevents a.tabledrag-handle .handle {
+  height: 21px;
+  background-position: 40% 19px; /* LTR */
+}
+[dir="rtl"] #drupal-off-canvas .touch a.tabledrag-handle .handle {
+  background-position: right 40% top 19px;
+}
+#drupal-off-canvas .touchevents .draggable.drag a.tabledrag-handle .handle {
+  background-position: 50% -32px;
+}
+#drupal-off-canvas .tabledrag-toggle-weight-wrapper {
+  padding-top: 10px;
+  text-align: right; /* LTR */
+}
+[dir="rtl"] #drupal-off-canvas .tabledrag-toggle-weight-wrapper {
+  text-align: left;
+}
+#drupal-off-canvas .indentation {
+  float: left; /* LTR */
+  width: auto;
+  height: auto;
+  margin: 0 3px 0 -10px; /* LTR */
+  padding: 0 0 0 10px; /* LTR */
+}
+[dir="rtl"] #drupal-off-canvas .indentation {
+  float: right;
+  margin: 0 -10px 0 3px;
+  padding: 0 10px 0 0;
+}
diff --git a/core/themes/stable9/css/core/dialog/off-canvas.theme.css b/core/themes/stable9/css/core/dialog/off-canvas.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..5bf667a330bc329f586eaa0a640a4c8057fb4754
--- /dev/null
+++ b/core/themes/stable9/css/core/dialog/off-canvas.theme.css
@@ -0,0 +1,102 @@
+/**
+ * @file
+ * Styling for the off-canvas ui dialog. Including overrides for jQuery UI.
+ */
+
+/* Style the dialog-off-canvas container. */
+.ui-dialog.ui-dialog-off-canvas {
+  /* Layer the dialog just under the toolbar. */
+  z-index: 501;
+  padding: 0;
+  color: #ddd;
+  border-radius: 0;
+  background: #444;
+  box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.3333);
+}
+.ui-widget.ui-dialog.ui-dialog-off-canvas {
+  border: 1px solid transparent;
+}
+
+/* Style the off-canvas dialog header. */
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar {
+  padding: 1em;
+  color: #fff;
+  border: 0;
+  border-bottom: 1px solid #000;
+  border-radius: 0;
+  background: #2d2d2d;
+  font-weight: normal;
+}
+/* Hide the default jQuery UI dialog close button. */
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar-close .ui-icon {
+  visibility: hidden;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar-close {
+  position: absolute;
+  top: calc(50% - 6px);
+  right: 1em;
+  width: 30px;
+  height: 30px;
+  transition: all 0.5s ease;
+  border: 3px solid transparent;
+  background-color: transparent;
+  background-image: url(../../../../../misc/icons/bebebe/ex.svg);
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar-close:hover,
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar-close:focus {
+  border: 3px solid #fff;
+  background-image: url(../../../../../misc/icons/ffffff/ex.svg);
+}
+[dir="rtl"] .ui-dialog.ui-dialog-off-canvas .ui-dialog-titlebar-close {
+  right: auto;
+  left: 1em;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-title {
+  /* Ensure that long titles do not overlap the close button. */
+  max-width: 210px;
+  margin: 0;
+  padding-right: 0; /* LTR */
+  /* Push the text away from the icon. */
+  padding-left: 30px; /* LTR */
+  text-align: left; /* LTR */
+  /* Ensure that long titles are not truncated. */
+  white-space: normal;
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "liberation sans", sans-serif;
+  font-size: 16px;
+}
+[dir="rtl"] .ui-dialog.ui-dialog-off-canvas .ui-dialog-title {
+  float: right;
+  padding-right: 30px;
+  padding-left: 0;
+  text-align: right;
+}
+.ui-dialog.ui-dialog-off-canvas .ui-dialog-title:before {
+  position: absolute;
+  top: 0;
+  left: 1em; /* LTR */
+  display: block;
+  width: 20px;
+  height: 100%;
+  content: "";
+  background: transparent url(../../../../../misc/icons/ffffff/pencil.svg) no-repeat scroll center center;
+  background-size: 100% auto;
+}
+[dir="rtl"] .ui-dialog.ui-dialog-off-canvas .ui-dialog-title:before {
+  right: 1em;
+  left: auto;
+}
+
+/* Override default styling from jQuery UI. */
+#drupal-off-canvas .ui-state-default,
+#drupal-off-canvas .ui-widget-content .ui-state-default,
+#drupal-off-canvas .ui-widget-header .ui-state-default {
+  color: #333;
+  border: 0;
+  font-size: 14px;
+  font-weight: normal;
+}
+#drupal-off-canvas .ui-widget-content a {
+  color: #85bef4;
+}
diff --git a/core/themes/stable9/css/core/dropbutton/dropbutton.css b/core/themes/stable9/css/core/dropbutton/dropbutton.css
new file mode 100644
index 0000000000000000000000000000000000000000..0a9c5dbdbed22d975908b8138e7787f69db311de
--- /dev/null
+++ b/core/themes/stable9/css/core/dropbutton/dropbutton.css
@@ -0,0 +1,164 @@
+
+/**
+ * @file
+ * Base styles for dropbuttons.
+ */
+
+/**
+ * When a dropbutton has only one option, it is simply a button.
+ */
+.dropbutton-wrapper,
+.dropbutton-wrapper div {
+  box-sizing: border-box;
+}
+.js .dropbutton-wrapper,
+.js .dropbutton-widget {
+  position: relative;
+  display: block;
+}
+
+@media screen and (max-width: 600px) {
+  .js .dropbutton-wrapper {
+    width: 100%;
+  }
+}
+
+/* Splitbuttons */
+@media screen and (min-width: 600px) {
+  .form-actions .dropbutton-wrapper {
+    float: left; /* LTR */
+  }
+  [dir="rtl"] .form-actions .dropbutton-wrapper {
+    float: right;
+  }
+}
+.js .form-actions .dropbutton-widget {
+  position: static;
+}
+.js td .dropbutton-widget {
+  position: absolute;
+}
+.js td .dropbutton-wrapper {
+  min-height: 2em;
+}
+.js td .dropbutton-multiple {
+  max-width: 100%;
+  margin-right: 2em; /* LTR */
+  padding-right: 10em; /* LTR */
+}
+[dir="rtl"].js td .dropbutton-multiple {
+  margin-right: 0;
+  margin-left: 2em;
+  padding-right: 0;
+  padding-left: 10em;
+}
+.js td .dropbutton-multiple .dropbutton-action a,
+.js td .dropbutton-multiple .dropbutton-action input,
+.js td .dropbutton-multiple .dropbutton-action button {
+  width: auto;
+}
+
+/* UL styles are over-scoped in core, so this selector needs weight parity. */
+.js .dropbutton-widget .dropbutton {
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+  list-style-image: none;
+}
+.js .dropbutton li,
+.js .dropbutton a {
+  display: block;
+  outline: none;
+}
+
+.js .dropbutton li:hover,
+.js .dropbutton li:focus,
+.js .dropbutton a:hover,
+.js .dropbutton a:focus {
+  outline: initial;
+}
+
+/**
+ * The dropbutton styling.
+ *
+ * A dropbutton is a widget that displays a list of action links as a button
+ * with a primary action. Secondary actions are hidden behind a click on a
+ * twisty arrow.
+ *
+ * The arrow is created using border on a zero-width, zero-height span.
+ * The arrow inherits the link color, but can be overridden with border colors.
+ */
+.js .dropbutton-multiple .dropbutton-widget {
+  padding-right: 2em; /* LTR */
+}
+.js[dir="rtl"] .dropbutton-multiple .dropbutton-widget {
+  padding-right: 0;
+  padding-left: 2em;
+}
+.dropbutton-multiple.open,
+.dropbutton-multiple.open .dropbutton-widget {
+  max-width: none;
+}
+.dropbutton-multiple.open {
+  z-index: 100;
+}
+.dropbutton-multiple .dropbutton .secondary-action {
+  display: none;
+}
+.dropbutton-multiple.open .dropbutton .secondary-action {
+  display: block;
+}
+.dropbutton-toggle {
+  position: absolute;
+  top: 0;
+  right: 0; /* LTR */
+  bottom: 0;
+  display: block;
+  width: 2em;
+  white-space: nowrap;
+  text-indent: 110%;
+}
+[dir="rtl"] .dropbutton-toggle {
+  right: auto;
+  left: 0;
+}
+.dropbutton-toggle button {
+  display: block;
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  cursor: pointer;
+  border: 0;
+  background: none;
+}
+.dropbutton-toggle button:hover,
+.dropbutton-toggle button:focus {
+  outline: initial;
+}
+.dropbutton-arrow {
+  position: absolute;
+  top: 50%;
+  right: 40%; /* 0.6667em; */ /* LTR */
+  display: block;
+  overflow: hidden;
+  width: 0;
+  height: 0;
+  margin-top: -0.1666em;
+  border-width: 0.3333em 0.3333em 0;
+  border-style: solid;
+  border-right-color: transparent;
+  border-bottom-color: transparent;
+  border-left-color: transparent;
+  line-height: 0;
+}
+[dir="rtl"] .dropbutton-arrow {
+  right: auto;
+  left: 0.6667em;
+}
+.dropbutton-multiple.open .dropbutton-arrow {
+  top: 0.6667em;
+  border-top-color: transparent;
+  border-bottom: 0.3333em solid;
+}
diff --git a/core/themes/stable9/css/core/normalize-fixes.css b/core/themes/stable9/css/core/normalize-fixes.css
new file mode 100644
index 0000000000000000000000000000000000000000..0845eebf286decbebe0637842e8d50c883ecebc2
--- /dev/null
+++ b/core/themes/stable9/css/core/normalize-fixes.css
@@ -0,0 +1,40 @@
+/**
+ * @file
+ * Fixes for core/assets/vendor/normalize-css/normalize.css since version 8.0.1.
+ */
+
+/**
+ * Add SVG styling for IE that was mistakenly removed from normalize.css in
+ * 8.0.0.
+ */
+svg:not(:root) {
+  overflow: hidden;
+}
+
+/**
+ * Prevent regression due to normalize.css no longer hiding the cancel search
+ * button in 8.0.0.
+ * @todo Remove this rule in https://drupal.org/node/3114878
+ */
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+/**
+ * Prevent IE11 and Edge <summary> elements from being displayed as list-item.
+ * due to a rule added in normalize.css 5.0.0. For browsers that support
+ * <summary>, this is the correct styling. For IE11 and Edge, which do not
+ * support this element, this results in an unwanted list-item bullet.
+ */
+/* Target IE11 */
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+  summary {
+    display: block;
+  }
+}
+/* Target Edge */
+@supports (-ms-ime-align:auto) {
+  summary {
+    display: block;
+  }
+}
diff --git a/core/themes/stable9/css/core/print.css b/core/themes/stable9/css/core/print.css
new file mode 100644
index 0000000000000000000000000000000000000000..586d3329434493588bb72bab61596051a7aa97d5
--- /dev/null
+++ b/core/themes/stable9/css/core/print.css
@@ -0,0 +1,25 @@
+
+body {
+  margin: 1em;
+  background-color: #fff;
+}
+[dir="rtl"] body {
+  direction: rtl;
+}
+th {
+  text-align: left; /* LTR */
+  color: #006;
+  border-bottom: 1px solid #ccc;
+}
+[dir="rtl"] th {
+  text-align: right;
+}
+tr:nth-child(odd) {
+  background-color: #ddd;
+}
+tr:nth-child(even) {
+  background-color: #fff;
+}
+td {
+  padding: 5px;
+}
diff --git a/core/themes/stable9/css/core/vertical-tabs.css b/core/themes/stable9/css/core/vertical-tabs.css
new file mode 100644
index 0000000000000000000000000000000000000000..f6ae0a2b93e1aba0b0c942c9f188508f2337d0c5
--- /dev/null
+++ b/core/themes/stable9/css/core/vertical-tabs.css
@@ -0,0 +1,69 @@
+/**
+ * @file
+ * Vertical Tabs.
+ */
+
+.vertical-tabs {
+  margin: 1em 0 1em 15em; /* LTR */
+  border: 1px solid #ccc;
+}
+[dir="rtl"] .vertical-tabs {
+  margin-right: 15em;
+  margin-left: 0;
+}
+.vertical-tabs__menu {
+  float: left; /* LTR */
+  width: 15em;
+  margin: -1px 0 -1px -15em; /* LTR */
+  padding: 0;
+  list-style: none;
+  border-top: 1px solid #ccc;
+}
+[dir="rtl"] .vertical-tabs__menu {
+  float: right;
+  margin-right: -15em;
+  margin-left: 0;
+}
+.vertical-tabs__pane {
+  margin: 0;
+  border: 0;
+}
+.vertical-tabs__pane > summary {
+  display: none;
+}
+
+/* Layout of each tab. */
+.vertical-tabs__menu-item {
+  border: 1px solid #ccc;
+  border-top: 0;
+  background: #eee;
+}
+.vertical-tabs__menu-item a {
+  display: block;
+  padding: 0.5em 0.6em;
+  text-decoration: none;
+}
+.vertical-tabs__menu-item a:focus .vertical-tabs__menu-item-title,
+.vertical-tabs__menu-item a:active .vertical-tabs__menu-item-title,
+.vertical-tabs__menu-item a:hover .vertical-tabs__menu-item-title {
+  text-decoration: underline;
+}
+.vertical-tabs__menu-item a:hover {
+  outline: 1px dotted;
+}
+.vertical-tabs__menu-item.is-selected {
+  border-right-width: 0; /* LTR */
+  background-color: #fff;
+}
+[dir="rtl"] .vertical-tabs__menu-item.is-selected {
+  border-right-width: 1px;
+  border-left-width: 0;
+}
+.vertical-tabs__menu-item.is-selected .vertical-tabs__menu-item-title {
+  color: #000;
+}
+.vertical-tabs__menu-item-summary {
+  display: block;
+  margin-bottom: 0;
+  line-height: normal;
+}
diff --git a/core/themes/stable9/css/dblog/dblog.module.css b/core/themes/stable9/css/dblog/dblog.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..fa2c187a72c3bdb2f9a9de10e68c9047bfbbbe4e
--- /dev/null
+++ b/core/themes/stable9/css/dblog/dblog.module.css
@@ -0,0 +1,37 @@
+/**
+ * @file
+ * Admin styles for the Database Logging module.
+ */
+.dblog-filter-form .form-item-type,
+.dblog-filter-form .form-item-severity {
+  display: inline-block;
+  max-width: 30%;
+  margin: 0.1em 0.9em 0.1em 0.1em; /* LTR */
+}
+[dir="rtl"] .dblog-filter-form .form-item-type,
+[dir="rtl"] .dblog-filter-form .form-item-severity {
+  margin: 0.1em 0.1em 0.1em 0.9em;
+}
+.dblog-filter-form .form-actions {
+  display: inline-block;
+  padding: 3ex 0 0;
+  vertical-align: top;
+}
+.admin-dblog .icon,
+.admin-dblog .dblog-warning .icon,
+.admin-dblog .dblog-error .icon,
+.admin-dblog .dblog-critical .icon,
+.admin-dblog .dblog-alert .icon,
+.admin-dblog .dblog-emergency .icon {
+  width: 16px;
+  background: no-repeat center;
+}
+.admin-dblog .dblog-warning .icon {
+  background-image: url(../../../../misc/icons/e29700/warning.svg);
+}
+.admin-dblog .dblog-error .icon,
+.admin-dblog .dblog-critical .icon,
+.admin-dblog .dblog-alert .icon,
+.admin-dblog .dblog-emergency .icon {
+  background-image: url(../../../../misc/icons/e32700/error.svg);
+}
diff --git a/core/themes/stable9/css/field_ui/field_ui.admin.css b/core/themes/stable9/css/field_ui/field_ui.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..f1716491c4495a735d4a7d2694716eebbbd83a05
--- /dev/null
+++ b/core/themes/stable9/css/field_ui/field_ui.admin.css
@@ -0,0 +1,53 @@
+/**
+ * @file
+ * Stylesheet for the Field UI module.
+ */
+
+/* 'Manage fields' and 'Manage display' overviews */
+.field-ui-overview .region-title td {
+  font-weight: bold;
+}
+.field-ui-overview .region-message td {
+  font-style: italic;
+}
+
+/* 'Manage form display' and 'Manage display' overview */
+.field-ui-overview .field-plugin-summary-cell {
+  line-height: 1em;
+}
+.field-ui-overview .field-plugin-summary {
+  float: left; /* LTR */
+  font-size: 0.9em;
+}
+[dir="rtl"] .field-ui-overview .field-plugin-summary {
+  float: right;
+}
+.field-ui-overview .field-plugin-summary-cell .warning {
+  display: block;
+  float: left; /* LTR */
+  margin-right: 0.5em;
+}
+[dir="rtl"] .field-ui-overview .field-plugin-summary-cell .warning {
+  float: right;
+}
+.field-ui-overview .field-plugin-settings-edit-wrapper {
+  float: right; /* LTR */
+}
+[dir="rtl"] .field-ui-overview .field-plugin-settings-edit-wrapper {
+  float: left;
+}
+.field-ui-overview .field-plugin-settings-edit {
+  float: right; /* LTR */
+}
+[dir="rtl"] .field-ui-overview .field-plugin-settings-edit {
+  float: left;
+}
+.field-ui-overview .field-plugin-settings-editing td {
+  vertical-align: top;
+}
+.field-ui-overview .field-plugin-settings-editing .field-plugin-type {
+  display: none;
+}
+.field-ui-overview .field-plugin-settings-edit-form .plugin-name {
+  font-weight: bold;
+}
diff --git a/core/themes/stable9/css/filter/filter.caption.css b/core/themes/stable9/css/filter/filter.caption.css
new file mode 100644
index 0000000000000000000000000000000000000000..327b733030e78825769acad262c95dad52942400
--- /dev/null
+++ b/core/themes/stable9/css/filter/filter.caption.css
@@ -0,0 +1,30 @@
+/**
+ * @file
+ * Caption filter: default styling for displaying image captions.
+ */
+
+/**
+ * Essentials, based on http://stackoverflow.com/a/13363408.
+ */
+.caption {
+  display: table;
+}
+.caption > * {
+  display: block;
+  max-width: 100%;
+}
+.caption > figcaption {
+  display: table-caption;
+  max-width: none;
+  caption-side: bottom;
+}
+
+/**
+ * While editing and whenever the caption is empty, show a placeholder.
+ *
+ * Based on http://codepen.io/flesler/pen/AEIFc.
+ */
+.caption > figcaption[contenteditable=true]:empty:before {
+  content: attr(data-placeholder);
+  font-style: italic;
+}
diff --git a/core/themes/stable9/css/image/editors/image.css b/core/themes/stable9/css/image/editors/image.css
new file mode 100644
index 0000000000000000000000000000000000000000..f9733d283486e3a49530c1d29785b64fc64fad00
--- /dev/null
+++ b/core/themes/stable9/css/image/editors/image.css
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * Functional styles for the Image module's in-place editor.
+ */
+
+/**
+ * A minimum width/height is required so that users can drag and drop files
+ * onto small images.
+ */
+.quickedit-image-element {
+  min-width: 200px;
+  min-height: 200px;
+}
+
+.quickedit-image-dropzone {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+}
+
+.quickedit-image-icon {
+  display: block;
+  width: 50px;
+  height: 50px;
+  background-repeat: no-repeat;
+  background-size: cover;
+}
+
+.quickedit-image-field-info {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+
+.quickedit-image-text {
+  display: block;
+}
+
+/**
+ * If we do not prevent pointer-events for child elements, our drag+drop events
+ * will not fire properly. This can lead to unintentional redirects if a file
+ * is dropped on a child element when a user intended to upload it.
+ */
+.quickedit-image-dropzone * {
+  pointer-events: none;
+}
diff --git a/core/themes/stable9/css/image/editors/image.theme.css b/core/themes/stable9/css/image/editors/image.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..25a21ba446e6a5ef4177bf244028ca1d7fad6c97
--- /dev/null
+++ b/core/themes/stable9/css/image/editors/image.theme.css
@@ -0,0 +1,100 @@
+/**
+ * @file
+ * Theme styles for the Image module's in-place editor.
+ */
+
+.quickedit-image-dropzone {
+  transition: background 0.2s;
+  background: rgba(116, 183, 255, 0.8);
+}
+
+.quickedit-image-icon {
+  margin: 0 0 10px 0;
+  transition: margin 0.5s;
+}
+
+.quickedit-image-dropzone.hover {
+  background: rgba(116, 183, 255, 0.9);
+}
+
+.quickedit-image-dropzone.error {
+  background: rgba(255, 52, 27, 0.81);
+}
+
+.quickedit-image-dropzone.upload .quickedit-image-icon {
+  background-image: url("../../../../../modules/image/images/upload.svg");
+}
+
+.quickedit-image-dropzone.error .quickedit-image-icon {
+  background-image: url("../../../../../modules/image/images/error.svg");
+}
+
+.quickedit-image-dropzone.loading .quickedit-image-icon {
+  margin: -10px 0 20px 0;
+}
+
+.quickedit-image-dropzone.loading .quickedit-image-icon::after {
+  display: block;
+  width: 60px;
+  height: 60px;
+  margin-top: -5px;
+  margin-left: -10px;
+  content: "";
+  animation-name: quickedit-image-spin;
+  animation-duration: 2s;
+  animation-timing-function: linear;
+  animation-iteration-count: infinite;
+  border-width: 5px;
+  border-style: solid;
+  border-color: white transparent transparent transparent;
+  border-radius: 35px;
+}
+
+@keyframes quickedit-image-spin {
+  0% { transform: rotate(0deg); }
+  50% { transform: rotate(180deg); }
+  100% { transform: rotate(360deg); }
+}
+
+.quickedit-image-text {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  text-align: center;
+  color: white;
+  font-family: "Droid sans", "Lucida Grande", sans-serif;
+  font-size: 16px;
+}
+
+.quickedit-image-field-info {
+  padding: 5px;
+  border-top: 1px solid #c5c5c5;
+  background: rgba(0, 0, 0, 0.05);
+}
+
+.quickedit-image-field-info div {
+  margin-right: 10px; /* LTR */
+}
+
+.quickedit-image-field-info div:last-child {
+  margin-right: 0; /* LTR */
+}
+
+[dir="rtl"] .quickedit-image-field-info div {
+  margin-right: 0;
+  margin-left: 10px;
+}
+
+[dir="rtl"] .quickedit-image-field-info div:last-child {
+  margin-left: 0;
+}
+
+.quickedit-image-errors .messages__wrapper {
+  margin: 0;
+  padding: 0;
+}
+
+.quickedit-image-errors .messages--error {
+  box-shadow: none;
+}
diff --git a/core/themes/stable9/css/image/image.admin.css b/core/themes/stable9/css/image/image.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..40e06151c0e797788516e79602fe8e7e3991f1a0
--- /dev/null
+++ b/core/themes/stable9/css/image/image.admin.css
@@ -0,0 +1,74 @@
+
+/**
+ * Image style configuration pages.
+ */
+.image-style-new,
+.image-style-new div {
+  display: inline;
+}
+.image-style-preview .preview-image-wrapper {
+  top: 50%;
+  float: left;
+  width: 48%;
+  padding-bottom: 2em;
+  text-align: center;
+}
+.image-style-preview .preview-image {
+  position: relative;
+  margin: auto;
+}
+.image-style-preview .preview-image .width {
+  position: absolute;
+  bottom: -6px;
+  left: -1px;
+  box-sizing: content-box;
+  height: 2px;
+  border: 1px solid #666;
+  border-top: none;
+}
+.image-style-preview .preview-image .width span {
+  position: relative;
+  top: 4px;
+}
+.image-style-preview .preview-image .height {
+  position: absolute;
+  top: -1px;
+  right: -6px;
+  box-sizing: content-box;
+  width: 2px;
+  border: 1px solid #666;
+  border-left: none;
+}
+.image-style-preview .preview-image .height span {
+  position: absolute;
+  top: 50%;
+  left: 10px;
+  height: 2em;
+  margin-top: -1em;
+}
+
+/**
+ * Improve image style preview on narrow viewports.
+ */
+@media screen and (max-width: 470px) {
+  .image-style-preview .preview-image-wrapper {
+    float: none;
+    margin-bottom: 1em;
+  }
+  .image-style-preview .preview-image-wrapper:last-child {
+    margin-bottom: 0;
+  }
+}
+
+/**
+ * Image anchor element.
+ */
+.image-anchor {
+  width: auto;
+}
+.image-anchor tr {
+  background: none;
+}
+.image-anchor td {
+  border: 1px solid #ccc;
+}
diff --git a/core/themes/stable9/css/language/language.admin.css b/core/themes/stable9/css/language/language.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..910279ee3cff361929180445f5b368f9c36eb16f
--- /dev/null
+++ b/core/themes/stable9/css/language/language.admin.css
@@ -0,0 +1,11 @@
+/**
+ * @file
+ * Styles for the content language administration page.
+ */
+
+#language-content-settings-form table .bundle {
+  width: 25%;
+}
+#language-content-settings-form table .operations {
+  width: 75%;
+}
diff --git a/core/themes/stable9/css/layout_builder/layout-builder.css b/core/themes/stable9/css/layout_builder/layout-builder.css
new file mode 100644
index 0000000000000000000000000000000000000000..6ccdf205ad33c2c30ab9dddc1e4b8351a1a903ef
--- /dev/null
+++ b/core/themes/stable9/css/layout_builder/layout-builder.css
@@ -0,0 +1,222 @@
+.layout-builder {
+  padding: 1.5em 1.5em 0.5em;
+  border: 3px solid #2f91da;
+  background-color: #fff;
+}
+
+.layout-builder__add-section {
+  width: 100%;
+  margin-bottom: 1.5em;
+  padding: 1.5em 0;
+  text-align: center;
+  outline: 2px dashed #979797;
+  background-color: #f7f7f7;
+}
+
+.layout-builder__link--add {
+  padding-left: 1.3em; /* LTR */
+  color: #686868;
+  border-bottom: none;
+  background: url(../../../../misc/icons/787878/plus.svg) transparent center left / 1em no-repeat; /* LTR */
+}
+
+[dir="rtl"] .layout-builder__link--add {
+  padding-right: 1.3em;
+  padding-left: 0;
+  background-position-x: right;
+}
+
+.layout-builder__link--add:hover,
+.layout-builder__link--add:active,
+.layout-builder__link--add:focus {
+  color: #000;
+  border-bottom-style: none;
+}
+
+.layout-builder__section {
+  margin-bottom: 1.5em;
+}
+
+.layout-builder__section .ui-sortable-helper {
+  outline: 2px solid #f7f7f7;
+  background-color: #fff;
+}
+
+.layout-builder__section .ui-state-drop {
+  margin: 20px;
+  padding: 30px;
+  outline: 2px dashed #fedb60;
+  background-color: #ffd;
+}
+
+.layout-builder__region {
+  outline: 2px dashed #2f91da;
+}
+
+.layout-builder__add-block {
+  padding: 1.5em 0;
+  text-align: center;
+  background-color: #eff6fc;
+}
+
+.layout-builder__link--remove {
+  position: relative;
+  z-index: 2;
+  display: inline-block;
+  box-sizing: border-box;
+  width: 26px;
+  height: 26px;
+  margin-right: 6px; /* LTR */
+  margin-left: -10px; /* LTR */
+  padding: 0;
+  white-space: nowrap;
+  text-indent: -9999px;
+  border: 1px solid #ccc;
+  border-radius: 26px;
+  background: url(../../../../misc/icons/bebebe/ex.svg) #fff center center / 16px 16px no-repeat;
+  font-size: 1rem;
+}
+
+[dir="rtl"] .layout-builder__link--remove {
+  margin-right: -10px;
+  margin-left: 6px;
+}
+
+.layout-builder__link--remove:hover {
+  background-image: url(../../../../misc/icons/787878/ex.svg);
+}
+
+.layout-builder-block {
+  padding: 1.5em;
+  cursor: move;
+  background-color: #fff;
+}
+
+.layout-builder-block [tabindex="-1"] {
+  pointer-events: none;
+}
+
+.layout-builder__message .messages {
+  background-repeat: no-repeat;
+}
+.layout-builder__message--defaults .messages {
+  background-image: url("../../../../misc/icons/73b355/globe.svg");
+}
+.layout-builder__message--overrides .messages {
+  background-image: url("../../../../misc/icons/73b355/location.svg");
+}
+
+.layout-builder-block__content-preview-placeholder-label {
+  margin: 0;
+  text-align: center;
+  font-size: 1.429em;
+  line-height: 1.4;
+}
+
+.layout-builder--content-preview-disabled .layout-builder-block {
+  margin: 0;
+  border-bottom: 2px dashed #979797;
+}
+
+#drupal-off-canvas .layout-selection li {
+  display: block;
+  padding-bottom: 1em;
+}
+
+#drupal-off-canvas .layout-selection li a {
+  display: block;
+  padding-top: 0.55em;
+}
+
+#drupal-off-canvas .inline-block-create-button {
+  display: block;
+  padding: 24px;
+  padding-left: 44px;
+  color: #eee;
+  border-bottom: 1px solid #333;
+  background: url(../../../../misc/icons/bebebe/plus.svg) transparent 16px no-repeat;
+  font-size: 16px;
+}
+
+#drupal-off-canvas .inline-block-create-button,
+#drupal-off-canvas .inline-block-list__item {
+  margin: 0 -20px;
+  background-color: #444;
+}
+
+#drupal-off-canvas .inline-block-create-button:hover,
+#drupal-off-canvas .inline-block-list__item:hover {
+  background-color: #333;
+}
+
+#drupal-off-canvas .inline-block-list {
+  margin-bottom: 15px;
+}
+
+#drupal-off-canvas .inline-block-list__item {
+  display: block;
+  padding: 15px 0 15px 25px;
+}
+
+.layout-builder__add-section.is-layout-builder-highlighted {
+  margin-bottom: calc(1.5em - 8px);
+  outline: none;
+}
+.layout-builder__layout.is-layout-builder-highlighted,
+.layout-builder-block.is-layout-builder-highlighted,
+.layout-builder__add-block.is-layout-builder-highlighted {
+  position: relative;
+  z-index: 1;
+  margin: -4px -2px;
+}
+.layout-builder__add-block.is-layout-builder-highlighted,
+.layout-builder__add-section.is-layout-builder-highlighted,
+.layout-builder__layout.is-layout-builder-highlighted:before,
+.layout-builder__layout.is-layout-builder-highlighted,
+.layout-builder-block.is-layout-builder-highlighted {
+  border: 4px solid #000;
+}
+
+/* Highlight the active block in the Move Block dialog. */
+#drupal-off-canvas .layout-builder-components-table__block-label--current {
+  padding-left: 17px;
+  border-left: solid 5px;
+}
+
+/**
+ * @todo remove in https://www.drupal.org/project/drupal/issues/3042127
+ *   This rule ensures the row weight dropdowns in the Move Block dialog
+ *   maintain the background color of their container when they are hovered
+ *   over or are inside the active row.
+ */
+#drupal-off-canvas .layout-builder-components-table__row .form-item {
+  background-color: transparent;
+}
+
+.layout-builder__region-label,
+.layout-builder__section-label {
+  display: none;
+}
+
+.layout-builder--move-blocks-active .layout-builder__region-label {
+  display: block;
+}
+
+.layout-builder--move-blocks-active .layout-builder__section-label {
+  display: inline;
+}
+
+.layout__region-info {
+  padding: 0.5em;
+  text-align: center;
+  border-bottom: 2px dashed #979797;
+}
+
+/**
+ * Remove "You have unsaved changes" warning because Layout Builder always has
+ * unsaved changes until "Save layout" is submitted.
+ * @todo create issue for todo.
+ */
+.layout-builder-components-table .tabledrag-changed-warning {
+  display: none !important;
+}
diff --git a/core/themes/stable9/css/locale/locale.admin.css b/core/themes/stable9/css/locale/locale.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..f759fa4159d346018002bf4bcd1f48ebb740fd29
--- /dev/null
+++ b/core/themes/stable9/css/locale/locale.admin.css
@@ -0,0 +1,134 @@
+.locale-translate-filter-form .details-wrapper {
+  overflow: hidden;
+}
+.locale-translate-filter-form .form-item-langcode,
+.locale-translate-filter-form .form-item-translation,
+.locale-translate-filter-form .form-item-customized {
+  float: left; /* LTR */
+  /**
+   * In Opera 9, DOM elements with the property of "overflow: auto"
+   * will partially hide its contents with unnecessary scrollbars when
+   * its immediate child is floated without an explicit width set.
+   */
+  width: 15em;
+  margin-right: 1em; /* LTR */
+  margin-bottom: 0;
+}
+[dir="rtl"] .locale-translate-filter-form .form-item-langcode,
+[dir="rtl"] .locale-translate-filter-form .form-item-translation,
+[dir="rtl"] .locale-translate-filter-form .form-item-customized {
+  float: right;
+  margin-right: 0;
+  margin-left: 1em;
+}
+.locale-translate-filter-form .form-type-select select {
+  width: 100%;
+}
+.locale-translate-filter-form .form-actions {
+  float: left; /* LTR */
+  padding: 3.8ex 0 0 0; /* LTR */
+}
+[dir="rtl"] .locale-translate-filter-form .form-actions {
+  float: right;
+  padding: 3.5ex 0 0 0;
+}
+.locale-translate-edit-form th {
+  width: 50%;
+  table-layout: fixed;
+}
+.locale-translate-edit-form td {
+  vertical-align: top;
+}
+
+.locale-translate-edit-form tr.changed {
+  background: #ffb;
+}
+
+.locale-translate-edit-form tr .form-type-item .ajax-changed {
+  position: absolute;
+}
+
+.locale-translate-filter-form .form-wrapper {
+  margin-bottom: 0;
+}
+
+.locale-translate-edit-form table.changed {
+  margin-top: 0;
+}
+
+/**
+ * Available translation updates page.
+ */
+#locale-translation-status-form table {
+  table-layout: fixed;
+}
+#locale-translation-status-form th.select-all {
+  width: 4%;
+}
+#locale-translation-status-form th.title {
+  width: 25%;
+}
+#locale-translation-status-form td {
+  vertical-align: top;
+}
+.locale-translation-update__wrapper {
+  margin-left: -12px;
+  padding-left: 12px;
+  background: transparent url(../../../../misc/menu-collapsed.png) left 0.6em no-repeat;
+}
+.expanded .locale-translation-update__wrapper {
+  background: transparent url(../../../../misc/menu-expanded.png) left 0.6em no-repeat;
+}
+#locale-translation-status-form .description {
+  cursor: pointer;
+}
+.locale-translation-update__wrapper {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  color: #5c5c5b;
+  line-height: 20px;
+}
+.expanded .locale-translation-update__wrapper {
+  overflow: visible;
+  height: auto;
+  white-space: normal;
+}
+.expanded .locale-translation-update__message {
+  -webkit-hyphens: auto;
+  -moz-hyphens: auto;
+  -ms-hyphens: auto;
+  hyphens: auto;
+}
+.js .locale-translation-update__wrapper {
+  height: 20px;
+}
+.expanded .locale-translation-update__wrapper {
+  overflow: visible;
+  height: auto;
+  white-space: normal;
+}
+.locale-translation-update__details {
+  max-width: 490px;
+  padding: 5px 0;
+  white-space: normal;
+  color: #666;
+  font-size: 0.9em;
+}
+.locale-translation-update__details ul {
+  margin: 0;
+  padding: 0;
+}
+.locale-translation-update__details li {
+  margin: 0 0 0.25em 1.5em;
+  padding: 0;
+}
+
+@media screen and (max-width: 40em) {
+  #locale-translation-status-form th.title {
+    width: 20%;
+  }
+  #locale-translation-status-form th.status {
+    width: 40%;
+  }
+}
diff --git a/core/themes/stable9/css/media/filter.caption.css b/core/themes/stable9/css/media/filter.caption.css
new file mode 100644
index 0000000000000000000000000000000000000000..a92505c3084936d398f655d3ff467dc997a2b159
--- /dev/null
+++ b/core/themes/stable9/css/media/filter.caption.css
@@ -0,0 +1,10 @@
+/**
+ * @file
+ * Caption filter: default styling for displaying Media Embed captions.
+ */
+
+.caption .media .field,
+.caption .media .field * {
+  float: none;
+  margin: unset;
+}
diff --git a/core/themes/stable9/css/media/oembed.formatter.css b/core/themes/stable9/css/media/oembed.formatter.css
new file mode 100644
index 0000000000000000000000000000000000000000..caf220e444dd9f701258faa5a95bcb1e17ae0b80
--- /dev/null
+++ b/core/themes/stable9/css/media/oembed.formatter.css
@@ -0,0 +1,3 @@
+.media-oembed-content {
+  max-width: 100%;
+}
diff --git a/core/themes/stable9/css/media/oembed.frame.css b/core/themes/stable9/css/media/oembed.frame.css
new file mode 100644
index 0000000000000000000000000000000000000000..c0c283b3996b7d364ad87a2b553f38227ab75b80
--- /dev/null
+++ b/core/themes/stable9/css/media/oembed.frame.css
@@ -0,0 +1,8 @@
+iframe {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  margin: 0;
+}
diff --git a/core/themes/stable9/css/media/plugins/drupalmedia/ckeditor.drupalmedia.css b/core/themes/stable9/css/media/plugins/drupalmedia/ckeditor.drupalmedia.css
new file mode 100644
index 0000000000000000000000000000000000000000..82923ff63e96111f8253b043392708d1639eb1d0
--- /dev/null
+++ b/core/themes/stable9/css/media/plugins/drupalmedia/ckeditor.drupalmedia.css
@@ -0,0 +1,41 @@
+/**
+ * @file
+ * Media embed: overrides to make focus styles and alignment work in CKEditor.
+ */
+
+/**
+ * Allow the drupal-media element's width to collapse to the size of its
+ * contents so that the outline has no extra white space (margin). This
+ * emulates the image2 plugin's styles inherited by the drupallink CKEditor
+ * plugin.
+ */
+drupal-media {
+  display: inline-block;
+}
+
+/**
+ * For center alignment, take advantage of drupal-media's inline-block
+ * display and center it as if it were text.
+ */
+.cke_widget_drupalmedia.align-center {
+  text-align: center;
+}
+
+/**
+ * Fix positioning without delete button. Can be removed with this issue:
+ * @see https://www.drupal.org/project/drupal/issues/3074859
+ */
+drupal-media .media-library-item__edit {
+  right: 10px;
+}
+
+/**
+ * Allow alignment to display in CKEditor.
+ */
+drupal-media[data-align=left],
+drupal-media[data-align=right] {
+  display: inline;
+}
+drupal-media[data-align=center] {
+  display: flex;
+}
diff --git a/core/themes/stable9/css/menu_ui/menu_ui.admin.css b/core/themes/stable9/css/menu_ui/menu_ui.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..efbfe7515efa35e37a62935800bd883fbf8f05ad
--- /dev/null
+++ b/core/themes/stable9/css/menu_ui/menu_ui.admin.css
@@ -0,0 +1,6 @@
+.menu-enabled {
+  width: 70px;
+}
+.menu-label {
+  font-weight: bold;
+}
diff --git a/core/themes/stable9/css/migrate_drupal_ui/components/upgrade-analysis-report-tables.css b/core/themes/stable9/css/migrate_drupal_ui/components/upgrade-analysis-report-tables.css
new file mode 100644
index 0000000000000000000000000000000000000000..ff5dba0b38a3c01637caeec646d91e1d965ba2ef
--- /dev/null
+++ b/core/themes/stable9/css/migrate_drupal_ui/components/upgrade-analysis-report-tables.css
@@ -0,0 +1,23 @@
+/**
+ * @file
+ * Styles for the upgrade analysis report tables.
+ */
+.upgrade-analysis-report__status-icon:before {
+  display: inline-block;
+  width: 32px;
+  height: 14px;
+  content: "";
+  background-repeat: no-repeat;
+  background-position: left center;
+  background-size: 16px;
+}
+
+.upgrade-analysis-report__status-icon--warning:before {
+  background-image: url(../../../../../misc/icons/e29700/warning.svg);
+}
+.upgrade-analysis-report__status-icon--checked:before {
+  background-image: url(../../../../../misc/icons/73b355/check.svg);
+}
+.upgrade-analysis-report__status-icon--error:before {
+  background-image: url(../../../../../misc/icons/e32700/error.svg);
+}
diff --git a/core/themes/stable9/css/node/node.admin.css b/core/themes/stable9/css/node/node.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..101a38d5390485f8f36f2a72aa88f3d45e8430d3
--- /dev/null
+++ b/core/themes/stable9/css/node/node.admin.css
@@ -0,0 +1,11 @@
+/**
+ * @file
+ * Styles for administration pages.
+ */
+
+/**
+ * Revisions overview screen.
+ */
+.revision-current {
+  background: #ffc;
+}
diff --git a/core/themes/stable9/css/node/node.module.css b/core/themes/stable9/css/node/node.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..c564633691c3bb98dadda3d4cf46601cbf72f74c
--- /dev/null
+++ b/core/themes/stable9/css/node/node.module.css
@@ -0,0 +1,76 @@
+/**
+ * @file
+ * Styles for administration pages.
+ */
+
+/**
+ * Node add/edit form layout
+ */
+
+/* Narrow screens */
+.layout-region {
+  box-sizing: border-box;
+}
+
+/* Wide screens */
+@media
+  screen and (min-width: 780px),
+  (orientation: landscape) and (min-device-height: 780px) {
+
+  .layout-region-node-main,
+  .layout-region-node-footer {
+    float: left; /* LTR */
+    box-sizing: border-box;
+    width: 65%;
+    padding-right: 2em; /* LTR */
+  }
+
+  [dir="rtl"] .layout-region-node-main,
+  [dir="rtl"] .layout-region-node-footer {
+    float: right;
+    padding-right: 0;
+    padding-left: 2em;
+  }
+
+  .layout-region-node-secondary {
+    float: right; /* LTR */
+    width: 35%;
+  }
+
+  [dir="rtl"] .layout-region-node-secondary {
+    float: left;
+  }
+
+  /* @todo File an issue to add a standard class to all text-like inputs */
+  .layout-region-node-secondary .form-autocomplete,
+  .layout-region-node-secondary .form-text,
+  .layout-region-node-secondary .form-tel,
+  .layout-region-node-secondary .form-email,
+  .layout-region-node-secondary .form-url,
+  .layout-region-node-secondary .form-search,
+  .layout-region-node-secondary .form-number,
+  .layout-region-node-secondary .form-color,
+  .layout-region-node-secondary textarea {
+    box-sizing: border-box;
+    width: 100%;
+    max-width: 100%;
+  }
+}
+
+/**
+ * The vertical toolbar mode gets triggered for narrow screens, which throws off
+ * the intent of media queries written for the viewport width. When the vertical
+ * toolbar is on, we need to suppress layout for the original media width + the
+ * toolbar width (240px). In this case, 240px + 780px.
+ */
+@media
+  screen and (max-width: 1020px) {
+
+  .toolbar-vertical.toolbar-tray-open .layout-region-node-main,
+  .toolbar-vertical.toolbar-tray-open .layout-region-node-footer,
+  .toolbar-vertical.toolbar-tray-open .layout-region-node-secondary {
+    float: none;
+    width: auto;
+    padding-right: 0;
+  }
+}
diff --git a/core/themes/stable9/css/node/node.preview.css b/core/themes/stable9/css/node/node.preview.css
new file mode 100644
index 0000000000000000000000000000000000000000..15205ab92d18d4dc0d3390f19e167fd2b6031025
--- /dev/null
+++ b/core/themes/stable9/css/node/node.preview.css
@@ -0,0 +1,22 @@
+/**
+ * @file
+ * Styles for node preview page.
+ */
+
+.node-preview-container {
+  position: fixed;
+  z-index: 499;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 10px;
+}
+
+@media only screen and (min-width: 36em) {
+  .node-preview-container .form-type-select {
+    margin-left: 25%; /* LTR */
+  }
+  [dir="rtl"] .node-preview-container .form-type-select {
+    margin-right: 25%;
+    margin-left: 0;
+  }
+}
diff --git a/core/themes/stable9/css/quickedit/quickedit.icons.theme.css b/core/themes/stable9/css/quickedit/quickedit.icons.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..ab566ab1d2fd2e45492f7d5461ad08ca8974b9bf
--- /dev/null
+++ b/core/themes/stable9/css/quickedit/quickedit.icons.theme.css
@@ -0,0 +1,74 @@
+/**
+ * @file
+ * Icons for Quick Edit module.
+ */
+
+.quickedit .icon {
+  position: relative;
+  min-width: 2.5em;
+  min-height: 1em;
+}
+.quickedit .icon.icon-only {
+  text-indent: -9999px;
+}
+.quickedit .icon.icon-end {
+  padding-right: 2.5em; /* LTR */
+}
+[dir="rtl"] .quickedit .icon.icon-end {
+  padding-right: 0;
+  padding-left: 2.5em;
+}
+.quickedit .icon:before {
+  position: absolute;
+  top: 0;
+  left: 0; /* LTR */
+  display: block;
+  width: 100%;
+  height: 100%;
+  content: "";
+  background-color: transparent;
+  background-repeat: no-repeat;
+  background-attachment: scroll;
+  background-position: center center;
+}
+[dir="rtl"] .quickedit .icon:before {
+  right: 0;
+  left: auto;
+}
+.quickedit .icon-end:before {
+  right: 0.5em; /* LTR */
+  left: auto; /* LTR */
+  width: 18px;
+}
+[dir="rtl"] .quickedit .icon-end:before {
+  right: auto;
+  left: 0.5em;
+}
+.quickedit button.icon {
+  font-size: 1em;
+}
+.quickedit .icon-pencil {
+  margin-left: 0.5em;
+  padding-left: 1.5em;
+}
+
+/**
+ * Images.
+ */
+.quickedit .icon-close:before {
+  top: 10px;
+  height: 12px;
+  background-image: url(../../../../misc/icons/787878/ex.svg);
+}
+.quickedit .icon-close:hover:before,
+.quickedit .icon-close:active:before {
+  background-image: url(../../../../misc/icons/000000/ex.svg);
+}
+.quickedit .icon-throbber:before {
+  background-image: url(../../../../modules/quickedit/images/icon-throbber.gif);
+}
+.quickedit .icon-pencil:before {
+  background-image: url(../../../../misc/icons/5181c6/pencil.svg);
+  background-position: left center;
+  background-size: 1.3em;
+}
diff --git a/core/themes/stable9/css/quickedit/quickedit.module.css b/core/themes/stable9/css/quickedit/quickedit.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..4c55a9a4f72c29475b4424df0f546480dca555db
--- /dev/null
+++ b/core/themes/stable9/css/quickedit/quickedit.module.css
@@ -0,0 +1,122 @@
+/**
+ * @file
+ * Generic base styles for Quick Edit module.
+ *
+ * Note: every class is prefixed with "quickedit-" to prevent collisions with
+ * modules or themes. In Edit module-specific DOM subtrees, this is not
+ * necessary.
+ */
+
+/**
+ * Editable.
+ */
+.quickedit-editable {
+  position: relative;
+  z-index: 98;
+  cursor: pointer;
+}
+.quickedit-editable:focus {
+  outline: none;
+}
+
+/**
+ * Highlighted (hovered) editable.
+ */
+.quickedit-editable.quickedit-highlighted {
+  z-index: 99;
+}
+.quickedit-validation-errors > .messages {
+  margin-right: 0;
+  margin-left: 0;
+}
+.quickedit-validation-errors > .messages > ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+
+/**
+ * In-place editors that don't use a popup.
+ */
+.quickedit-validation-errors {
+  position: relative;
+  z-index: 300;
+}
+.quickedit-validation-errors .messages.error {
+  position: absolute;
+  top: 6px;
+  left: -5px; /* LTR */
+  margin: 0;
+  border: none;
+}
+[dir="rtl"] .quickedit-validation-errors .messages.error {
+  right: -5px;
+  left: auto;
+}
+
+/**
+ * Styling specific to the 'form' in-place editor.
+ */
+#quickedit_backstage {
+  display: none;
+}
+.quickedit-form {
+  position: absolute;
+  z-index: 300;
+  max-width: 35em;
+}
+.quickedit-form .placeholder {
+  min-height: 22px;
+}
+
+/**
+ * Default form styling overrides.
+ */
+.quickedit-form .form-wrapper .form-wrapper {
+  margin: inherit;
+}
+.quickedit-form .form-actions {
+  display: none;
+}
+.quickedit-form input {
+  max-width: 100%;
+}
+
+/**
+ * Entity toolbar.
+ */
+.quickedit-toolbar-container {
+  position: absolute;
+  z-index: 100;
+  width: 320px;
+  max-width: 320px;
+}
+.quickedit-toolbar-container > .quickedit-toolbar-pointer,
+.quickedit-toolbar-container > .quickedit-toolbar-lining {
+  display: none;
+}
+.quickedit-form-container {
+  position: relative;
+  z-index: 100;
+  margin: 0;
+  padding: 0;
+  vertical-align: baseline;
+  border: 0;
+}
+.quickedit-toolgroup.ops {
+  float: right; /* LTR */
+}
+[dir="rtl"] .quickedit-toolgroup.ops {
+  float: left;
+}
+.quickedit-toolbar-label {
+  overflow: hidden;
+}
+#quickedit-toolbar-fence {
+  position: fixed;
+  z-index: -1;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
diff --git a/core/themes/stable9/css/quickedit/quickedit.theme.css b/core/themes/stable9/css/quickedit/quickedit.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..cf8f60c56118f282a431cc8c5919c800200ab44a
--- /dev/null
+++ b/core/themes/stable9/css/quickedit/quickedit.theme.css
@@ -0,0 +1,254 @@
+/**
+ * @file
+ * Styling for Quick Edit module.
+ */
+
+/**
+ * Editable.
+ */
+.quickedit-field.quickedit-editable,
+.quickedit-field .quickedit-editable {
+  box-shadow: 0 0 0 2px #74b7ff;
+}
+
+/**
+ * Highlighted (hovered) editable.
+ */
+.quickedit-field.quickedit-highlighted,
+.quickedit-form.quickedit-highlighted,
+.quickedit-field .quickedit-highlighted {
+  box-shadow: 0 0 0 1px #74b7ff, 0 0 0 2px #007fff;
+}
+.quickedit-field.quickedit-changed,
+.quickedit-form.quickedit-changed,
+.quickedit-field .quickedit-changed {
+  box-shadow: 0 0 0 1px #fec17e, 0 0 0 2px #f7870a;
+}
+.quickedit-editing.quickedit-validation-error,
+.quickedit-form.quickedit-validation-error {
+  box-shadow: 0 0 0 1px #ee8b74, 0 0 0 2px #fa2209;
+}
+.quickedit-editing.quickedit-editor-is-popup {
+  box-shadow: none;
+}
+.quickedit-form .form-item .error {
+  border: 1px solid #eea0a0;
+}
+
+/**
+ * Default form styling overrides.
+ */
+.quickedit-form form {
+  padding: 0.5em;
+}
+.quickedit-form .form-item {
+  margin: 0;
+}
+.quickedit-form .form-wrapper {
+  margin: 0.5em;
+}
+
+/**
+ * Animations.
+ */
+.quickedit-animate-invisible {
+  opacity: 0;
+}
+.quickedit-animate-default {
+  -webkit-transition: all 0.4s ease;
+  transition: all 0.4s ease;
+}
+.quickedit-animate-slow {
+  -webkit-transition: all 0.6s ease;
+  transition: all 0.6s ease;
+}
+.quickedit-animate-delay-veryfast {
+  -webkit-transition-delay: 0.05s;
+  transition-delay: 0.05s;
+}
+.quickedit-animate-delay-fast {
+  -webkit-transition-delay: 0.2s;
+  transition-delay: 0.2s;
+}
+.quickedit-animate-disable-width {
+  -webkit-transition: width 0s;
+  transition: width 0s;
+}
+.quickedit-animate-only-visibility {
+  -webkit-transition: opacity 0.2s ease;
+  transition: opacity 0.2s ease;
+}
+
+/**
+ * In-place editors that don't use a popup.
+ */
+.quickedit-validation-errors .messages.error {
+  background-color: white;
+  box-shadow: 0 0 1px 1px red, 0 0 3px 3px rgba(153, 153, 153, 0.5);
+}
+
+/**
+ * Styling specific to the 'form' in-place editor.
+ */
+.quickedit-form {
+  background-color: white;
+  box-shadow: 0 0 30px 4px #4f4f4f;
+}
+
+/**
+ * Toolbars.
+ */
+.quickedit-toolbar-container {
+  padding-top: 7px;
+  padding-bottom: 7px;
+  -webkit-transition: all 1s;
+  transition: all 1s;
+  font-family: "Source Sans Pro", "Lucida Grande", sans-serif;
+}
+.quickedit-toolbar-container > .quickedit-toolbar-content {
+  position: relative;
+  z-index: 2;
+  box-sizing: border-box;
+  padding: 0.1667em;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  color: black;
+  background-image: -webkit-linear-gradient(top, #fff, #e4e4e4);
+  background-image: linear-gradient(to bottom, #fff, #e4e4e4);
+}
+.quickedit-toolbar-container > .quickedit-toolbar-pointer {
+  position: absolute;
+  z-index: 1;
+  bottom: 2px;
+  left: 18px; /* LTR */
+  display: block;
+  width: 16px;
+  height: 16px;
+  -webkit-transform: rotate(45deg);
+  -ms-transform: rotate(45deg);
+  transform: rotate(45deg);
+  background-color: #e4e4e4;
+  box-shadow: 0 0 0 1px #818181, 0 0 0 4px rgba(150, 150, 150, 0.5);
+}
+[dir="rtl"] .quickedit-toolbar-container > .quickedit-toolbar-pointer {
+  right: 18px;
+  left: auto;
+}
+.quickedit-toolbar-container.quickedit-toolbar-pointer-top > .quickedit-toolbar-pointer {
+  top: 2px;
+  bottom: auto;
+}
+.quickedit-toolbar-container > .quickedit-toolbar-lining {
+  position: absolute;
+  z-index: 0;
+  top: 7px;
+  right: 0;
+  bottom: 7px;
+  left: 0;
+  display: block;
+  box-shadow: 0 0 0 1px #818181, 0 3px 0 1px rgba(150, 150, 150, 0.5);
+}
+
+.quickedit-toolbar-label {
+  overflow: hidden;
+  padding: 0.333em 0.4em;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  font-style: italic;
+}
+.quickedit-toolbar-label .field:after {
+  content: " → "; /* LTR */
+}
+
+[dir="rtl"] .quickedit-toolbar-label .field:after {
+  content: " ← ";
+}
+
+/* The toolbar; these are not necessarily visible. */
+.quickedit-toolbar {
+  font-family: "Droid sans", "Lucida Grande", sans-serif;
+}
+.quickedit-toolbar-entity {
+  padding: 0.1667em 0.2em;
+}
+
+/**
+ * Info toolgroup.
+ */
+.quickedit-toolbar-fullwidth {
+  width: 100%;
+}
+.quickedit-toolgroup.wysiwyg-floated {
+  float: right; /* LTR */
+}
+[dir="rtl"] .quickedit-toolgroup.wysiwyg-floated {
+  float: left;
+}
+.quickedit-toolgroup.wysiwyg-main {
+  clear: both;
+  width: 100%;
+  padding-left: 0; /* LTR */
+}
+[dir="rtl"] .quickedit-toolgroup.wysiwyg-main {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+/**
+ * Buttons.
+ */
+.quickedit-button {
+  display: inline-block;
+  margin: 0;
+  padding: 0.345em;
+  cursor: pointer;
+  -webkit-transition: opacity 0.1s ease;
+  transition: opacity 0.1s ease;
+  opacity: 1;
+  color: #5a5a5a;
+  border: 1px solid #d2d2d2;
+  background-color: #e4e4e4;
+}
+.quickedit-button[aria-hidden="true"] {
+  visibility: hidden;
+  opacity: 0;
+}
+.quickedit-button + .quickedit-button {
+  margin-left: 0.2em; /* LTR */
+}
+[dir="rtl"] .quickedit-button + .quickedit-button {
+  margin-right: 0.25em;
+  margin-left: auto;
+}
+/* Button with icons. */
+.quickedit-button:hover,
+.quickedit-button:active {
+  color: #2e2e2e;
+  border: 1px solid #a0a0a0;
+  background-color: #c8c8c8;
+}
+.quickedit-toolbar-container .quickedit-button.action-cancel {
+  border: 1px solid transparent;
+  background-color: transparent;
+}
+.quickedit-button.action-save {
+  color: white;
+  border: 1px solid transparent;
+  background-color: #50a0e9;
+  background-image: -webkit-linear-gradient(top, #50a0e9, #4481dc);
+  background-image: linear-gradient(to bottom, #50a0e9, #4481dc);
+}
+.quickedit-button.action-save:hover,
+.quickedit-button.action-save:active {
+  border: 1px solid #a0a0a0;
+}
+.quickedit-button.action-saving,
+.quickedit-button.action-saving:hover,
+.quickedit-button.action-saving:active {
+  color: #5a5a5a;
+  border-color: #d2d2d2;
+  background-color: #e4e4e4;
+  background-image: none;
+}
diff --git a/core/themes/stable9/css/settings_tray/settings_tray.module.css b/core/themes/stable9/css/settings_tray/settings_tray.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..75ba0474aa1b971c056630aad89fea27c9650582
--- /dev/null
+++ b/core/themes/stable9/css/settings_tray/settings_tray.module.css
@@ -0,0 +1,23 @@
+/**
+ * @file
+ * Styling for Settings Tray module.
+ */
+/*
+ * Position the edit toolbar tab.
+ * @todo Move changes into contextual module when Settings Tray is not
+ *   experimental: https://www.drupal.org/node/2784591.
+ */
+.toolbar .toolbar-bar .contextual-toolbar-tab.toolbar-tab {
+  float: left;
+}
+[dir="rtl"] .toolbar .toolbar-bar .contextual-toolbar-tab.toolbar-tab {
+  float: right;
+}
+
+.dialog-off-canvas-main-canvas.js-settings-tray-edit-mode a,
+.dialog-off-canvas-main-canvas.js-settings-tray-edit-mode input {
+  pointer-events: none;
+}
+.dialog-off-canvas-main-canvas.js-settings-tray-edit-mode .contextual-links a {
+  pointer-events: inherit;
+}
diff --git a/core/themes/stable9/css/settings_tray/settings_tray.motion.css b/core/themes/stable9/css/settings_tray/settings_tray.motion.css
new file mode 100644
index 0000000000000000000000000000000000000000..820f708123c6b63d5a0dc8a226a924cb8f697182
--- /dev/null
+++ b/core/themes/stable9/css/settings_tray/settings_tray.motion.css
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Motion effects for Settings Tray module.
+ *
+ * Motion effects are in a separate file so that they can be easily turned off
+ * to improve performance if desired.
+ */
+
+/* Transition the edit icon in the toolbar. */
+#toolbar-bar.button.toolbar-icon.toolbar-icon.toolbar-icon-edit:before {
+  transition: all 0.7s ease;
+}
+
+/* Transition the editables on the page, their contextual links and their hover states. */
+.dialog-off-canvas-main-canvas .contextual,
+.dialog-off-canvas-main-canvas .js-settings-tray-edit-mode .settings-tray-editable,
+.dialog-off-canvas-main-canvas.js-off-canvas-dialog-open .js-settings-tray-edit-mode .settings-tray-editable {
+  transition: all 0.7s ease;
+}
diff --git a/core/themes/stable9/css/settings_tray/settings_tray.theme.css b/core/themes/stable9/css/settings_tray/settings_tray.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..aeb15b363cbe68eb61b8e45a4f4c5609f7c50d25
--- /dev/null
+++ b/core/themes/stable9/css/settings_tray/settings_tray.theme.css
@@ -0,0 +1,70 @@
+/**
+ * @file
+ * Visual styling for Settings Tray module.
+ */
+
+/* @todo remove the @imports when we find a better way to load these styles last.
+ * https://www.drupal.org/node/1945262.
+ */
+
+/* Style the edit mode toolbar and tabs. */
+#toolbar-bar.js-settings-tray-edit-mode {
+  background-image: linear-gradient(to bottom, #0a7bc1, #0a6eb4);
+}
+.js-settings-tray-edit-mode .toolbar-item:not(.toolbar-icon-edit) {
+  color: #999;
+}
+.js-settings-tray-edit-mode .toolbar-item:not(.toolbar-icon-edit) .is-active {
+  color: #333;
+}
+
+/* Style both the edit and editing states of the contextual links toggle tab. */
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item,
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item.is-active,
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item:focus {
+  color: #eee;
+  outline: none;
+  background-color: #0066a1;
+  background-image: linear-gradient(to bottom, #0066a1, #005b98);
+  text-shadow: none;
+  font-weight: bold;
+}
+/* Make the hover of the inactive state the same as the active state. */
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item:hover,
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item.is-active {
+  color: #fff;
+  background-image: linear-gradient(to bottom, #0a7bc1, #0a6eb4);
+}
+/* Make the hover of the active state the same as the inactive state. */
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item.is-active:hover {
+  color: #fff;
+  background-color: #0066a1;
+  background-image: linear-gradient(to bottom, #0066a1, #005b98);
+}
+/* Make the inactive icon grey. */
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item:before {
+  background-image: url(../../../../misc/icons/bebebe/pencil.svg);
+}
+/* Make the active icon white. */
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item.is-active:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item:hover:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+.toolbar-tab > .toolbar-icon.toolbar-icon-edit.toolbar-item:hover > .toolbar-icon-edit:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+.toolbar-tab > .button.toolbar-icon.toolbar-icon.toolbar-icon-edit:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+
+/* Style the editables while in edit mode. */
+.dialog-off-canvas-main-canvas.js-settings-tray-edit-mode .settings-tray-editable {
+  outline: 1px dashed rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.7);
+}
+.dialog-off-canvas-main-canvas.js-settings-tray-edit-mode .settings-tray-editable:hover,
+.dialog-off-canvas-main-canvas.js-settings-tray-edit-mode .settings-tray-editable.settings-tray-active-editable {
+  background-color: rgba(0, 0, 0, 0.2);
+}
diff --git a/core/themes/stable9/css/settings_tray/settings_tray.toolbar.css b/core/themes/stable9/css/settings_tray/settings_tray.toolbar.css
new file mode 100644
index 0000000000000000000000000000000000000000..754411b9544fd34d63b987352efec4d6c48eedab
--- /dev/null
+++ b/core/themes/stable9/css/settings_tray/settings_tray.toolbar.css
@@ -0,0 +1,66 @@
+/**
+ * @file
+ * Visual styling for the toolbar when Settings Tray module is enabled.
+ */
+
+/* @todo Move this into toolbar when module is not experimental:
+ *   https://www.drupal.org/node/2784593.
+ */
+
+/* Style the edit mode toolbar and tabs. */
+#toolbar-bar.js-settings-tray-edit-mode {
+  background-color: #fff;
+}
+#toolbar-bar.js-settings-tray-edit-mode .toolbar-item {
+  color: #999;
+}
+#toolbar-bar.js-settings-tray-edit-mode .toolbar-item .is-active {
+  color: #333;
+}
+
+/* Style both the edit and editing states of the contextual links toggle tab. */
+.toolbar-icon-edit.toolbar-item {
+  color: #eee;
+  background-color: #0066a1;
+  background-image: linear-gradient(to bottom, #0066a1, #005b98);
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+  font-weight: 700;
+  -webkit-font-smoothing: antialiased;
+}
+.toolbar-icon-edit.toolbar-item.is-active {
+  color: #fff;
+  background-color: #0a7bc1;
+  background-image: linear-gradient(to bottom, #0a7bc1, #0a6eb4);
+  text-shadow: 0 1px hsla(0, 0%, 0%, 0.5);
+  font-weight: 700;
+  -webkit-font-smoothing: antialiased;
+}
+.toolbar-tab:hover > .toolbar-icon-edit,
+.toolbar-icon-edit:focus .toolbar-item {
+  color: #fff;
+  border-color: #1e5c90;
+  outline: none;
+  background-color: #0a7bc1;
+  background-image: linear-gradient(to bottom, #0a7bc1, #0a6eb4);
+}
+.toolbar-icon.toolbar-icon-edit.toolbar-item:before,
+button.toolbar-icon.toolbar-icon-edit.toolbar-item:before {
+  background-image: url(../../../../misc/icons/bebebe/pencil.svg);
+}
+.toolbar-icon.toolbar-icon-edit.toolbar-item:before:hover,
+button.toolbar-icon.toolbar-icon-edit.toolbar-item:before:focus {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+.toolbar-icon.toolbar-icon-edit.toolbar-item:hover > .toolbar-icon-edit:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+#toolbar-bar.button.toolbar-icon.toolbar-icon.toolbar-icon-edit:before {
+  background-image: url(../../../../misc/icons/ffffff/pencil.svg);
+}
+
+#toolbar-bar.js-settings-tray-edit-mode button.toolbar-icon.toolbar-icon-edit.toolbar-item.is-active {
+  color: #fff;
+}
+#toolbar-bar.js-settings-tray-edit-mode button.toolbar-icon.toolbar-icon-edit.toolbar-item.is-active:hover {
+  background-image: linear-gradient(to bottom, #0a6fb4, #0a65aa);
+}
diff --git a/core/themes/stable9/css/shortcut/shortcut.icons.theme.css b/core/themes/stable9/css/shortcut/shortcut.icons.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..7eebdc4221e836c776bc897433da5c2b89426635
--- /dev/null
+++ b/core/themes/stable9/css/shortcut/shortcut.icons.theme.css
@@ -0,0 +1,40 @@
+/**
+ * @file
+ * Styling for the shortcut module icons.
+ */
+
+/**
+ * Toolbar tab icon.
+ */
+.toolbar-bar .toolbar-icon-shortcut:before {
+  background-image: url(../../../../misc/icons/bebebe/star.svg);
+}
+.toolbar-bar .toolbar-icon-shortcut:active:before,
+.toolbar-bar .toolbar-icon-shortcut.is-active:before {
+  background-image: url(../../../../misc/icons/ffffff/star.svg);
+}
+
+/**
+ * Add/remove links.
+ */
+.shortcut-action__icon {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  vertical-align: -2px;
+  background: transparent url(../../../../modules/shortcut/images/favstar.svg) no-repeat left top;
+}
+[dir="rtl"] .shortcut-action__icon {
+  background-image: url(../../../../modules/shortcut/images/favstar-rtl.svg);
+}
+.shortcut-action--add:hover .shortcut-action__icon,
+.shortcut-action--add:focus .shortcut-action__icon {
+  background-position: -20px top;
+}
+.shortcut-action--remove .shortcut-action__icon {
+  background-position: -40px top;
+}
+.shortcut-action--remove:focus .shortcut-action__icon,
+.shortcut-action--remove:hover .shortcut-action__icon {
+  background-position: -60px top;
+}
diff --git a/core/themes/stable9/css/shortcut/shortcut.theme.css b/core/themes/stable9/css/shortcut/shortcut.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..97edead062baac69a9882e2461490e68606b8620
--- /dev/null
+++ b/core/themes/stable9/css/shortcut/shortcut.theme.css
@@ -0,0 +1,62 @@
+/**
+ * @file
+ * Styling for the shortcut module.
+ */
+
+/**
+ * Toolbar.
+ */
+.toolbar .toolbar-tray-vertical .edit-shortcuts {
+  padding: 1em;
+  text-align: right; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical .edit-shortcuts {
+  text-align: left;
+}
+.toolbar .toolbar-tray-horizontal .edit-shortcuts {
+  float: right; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-horizontal .edit-shortcuts {
+  float: left;
+}
+
+/**
+ * Add/remove links.
+ */
+.shortcut-action {
+  display: inline-block;
+  margin-left: 0.3em; /* LTR */
+}
+[dir="rtl"] .shortcut-action {
+  margin-right: 0.3em;
+  margin-left: 0;
+}
+.shortcut-action__message {
+  display: inline-block;
+  margin-left: 0.3em; /* LTR */
+  padding: 0 5px;
+  -webkit-transition: all 200ms ease-out;
+  transition: all 200ms ease-out;
+  -ms-transform: translateY(-12px);
+  -webkit-transform: translateY(-12px);
+  transform: translateY(-12px);
+  opacity: 0;
+  color: #fff;
+  border-radius: 5px;
+  background: #000;
+  background: rgba(0, 0, 0, 0.5);
+  -ms-backface-visibility: hidden;
+  -webkit-backface-visibility: hidden;
+  backface-visibility: hidden;
+}
+[dir="rtl"] .shortcut-action__message {
+  margin-right: 0.3em;
+  margin-left: 0;
+}
+.shortcut-action:hover .shortcut-action__message,
+.shortcut-action:focus .shortcut-action__message {
+  -ms-transform: translateY(-2px);
+  -webkit-transform: translateY(-2px);
+  transform: translateY(-2px);
+  opacity: 1;
+}
diff --git a/core/themes/stable9/css/system/components/ajax-progress.module.css b/core/themes/stable9/css/system/components/ajax-progress.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..268c190596ef712f7d80e3d5d3efe6855bcc1c21
--- /dev/null
+++ b/core/themes/stable9/css/system/components/ajax-progress.module.css
@@ -0,0 +1,49 @@
+/**
+ * @file
+ * Throbber.
+ */
+
+.ajax-progress {
+  display: inline-block;
+  padding: 1px 5px 2px 5px;
+}
+[dir="rtl"] .ajax-progress {
+  float: right;
+}
+.ajax-progress-throbber .throbber {
+  display: inline;
+  padding: 1px 5px 2px;
+  background: transparent url(../../../../../misc/throbber-active.gif) no-repeat 0 center;
+}
+.ajax-progress-throbber .message {
+  display: inline;
+  padding: 1px 5px 2px;
+}
+tr .ajax-progress-throbber .throbber {
+  margin: 0 2px;
+}
+.ajax-progress-bar {
+  width: 16em;
+}
+
+/* Full screen throbber */
+.ajax-progress-fullscreen {
+  position: fixed;
+  z-index: 1000;
+  top: 48.5%;
+  /* Can't do center:50% middle: 50%, so approximate it for a typical window size. */
+  left: 49%; /* LTR */
+  width: 24px;
+  height: 24px;
+  padding: 4px;
+  opacity: 0.9;
+  border-radius: 7px;
+  background-color: #232323;
+  background-image: url(../../../../../misc/loading-small.gif);
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+[dir="rtl"] .ajax-progress-fullscreen {
+  right: 49%;
+  left: auto;
+}
diff --git a/core/themes/stable9/css/system/components/align.module.css b/core/themes/stable9/css/system/components/align.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..1ea4a8d1ce8875cf9edebdc909c2dacb0b0ed19a
--- /dev/null
+++ b/core/themes/stable9/css/system/components/align.module.css
@@ -0,0 +1,32 @@
+/**
+ * @file
+ * Alignment classes for text and block level elements.
+ */
+
+.text-align-left {
+  text-align: left;
+}
+.text-align-right {
+  text-align: right;
+}
+.text-align-center {
+  text-align: center;
+}
+.text-align-justify {
+  text-align: justify;
+}
+
+/**
+ * Alignment classes for block level elements (images, videos, blockquotes, etc.)
+ */
+.align-left {
+  float: left;
+}
+.align-right {
+  float: right;
+}
+.align-center {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
diff --git a/core/themes/stable9/css/system/components/autocomplete-loading.module.css b/core/themes/stable9/css/system/components/autocomplete-loading.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..c4fb3a6bc1ca5f45e04cb2161ee3769e1c0c5f69
--- /dev/null
+++ b/core/themes/stable9/css/system/components/autocomplete-loading.module.css
@@ -0,0 +1,22 @@
+/**
+ * @file
+ * Visual styles for animated throbber.
+ *
+ * @see autocomplete.js
+ */
+
+.js input.form-autocomplete {
+  background-image: url(../../../../../misc/throbber-inactive.png);
+  background-repeat: no-repeat;
+  background-position: 100% center; /* LTR */
+}
+.js[dir="rtl"] input.form-autocomplete {
+  background-position: 0% center;
+}
+.js input.form-autocomplete.ui-autocomplete-loading {
+  background-image: url(../../../../../misc/throbber-active.gif);
+  background-position: 100% center; /* LTR */
+}
+.js[dir="rtl"] input.form-autocomplete.ui-autocomplete-loading {
+  background-position: 0% center;
+}
diff --git a/core/themes/stable9/css/system/components/clearfix.module.css b/core/themes/stable9/css/system/components/clearfix.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..cb978d4c4bda562c078327c2de559e973defd29a
--- /dev/null
+++ b/core/themes/stable9/css/system/components/clearfix.module.css
@@ -0,0 +1,15 @@
+/**
+ * @file
+ * Float clearing.
+ *
+ * Based on the micro clearfix hack by Nicolas Gallagher, with the :before
+ * pseudo selector removed to allow normal top margin collapse.
+ *
+ * @see http://nicolasgallagher.com/micro-clearfix-hack
+ */
+
+.clearfix:after {
+  display: table;
+  clear: both;
+  content: "";
+}
diff --git a/core/themes/stable9/css/system/components/container-inline.module.css b/core/themes/stable9/css/system/components/container-inline.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..ba99a36563eade1dfa156061c1c9f4822e8878f3
--- /dev/null
+++ b/core/themes/stable9/css/system/components/container-inline.module.css
@@ -0,0 +1,13 @@
+/**
+ * @file
+ * Inline items.
+ */
+
+.container-inline div,
+.container-inline label {
+  display: inline-block;
+}
+/* Details contents always need to be rendered as block. */
+.container-inline .details-wrapper {
+  display: block;
+}
diff --git a/core/themes/stable9/css/system/components/details.module.css b/core/themes/stable9/css/system/components/details.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..23ee3b4121d412ac476dd19acd960b20a38323d3
--- /dev/null
+++ b/core/themes/stable9/css/system/components/details.module.css
@@ -0,0 +1,10 @@
+/**
+ * @file
+ * Collapsible details.
+ *
+ * @see collapse.js
+ */
+
+.js details:not([open]) .details-wrapper {
+  display: none;
+}
diff --git a/core/themes/stable9/css/system/components/fieldgroup.module.css b/core/themes/stable9/css/system/components/fieldgroup.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..887c8f9c08330720d95a4441eb6bcd94992a64eb
--- /dev/null
+++ b/core/themes/stable9/css/system/components/fieldgroup.module.css
@@ -0,0 +1,9 @@
+/**
+ * @file
+ * Fieldgroup border reset.
+ */
+
+.fieldgroup {
+  padding: 0;
+  border-width: 0;
+}
diff --git a/core/themes/stable9/css/system/components/hidden.module.css b/core/themes/stable9/css/system/components/hidden.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..dde91701221049fba61e36deed307eee99b49de9
--- /dev/null
+++ b/core/themes/stable9/css/system/components/hidden.module.css
@@ -0,0 +1,53 @@
+/**
+ * @file
+ * Utility classes to hide elements in different ways.
+ */
+
+/**
+ * Hide elements from all users.
+ *
+ * Used for elements which should not be immediately displayed to any user. An
+ * example would be collapsible details that will be expanded with a click
+ * from a user. The effect of this class can be toggled with the jQuery show()
+ * and hide() functions.
+ */
+.hidden {
+  display: none;
+}
+
+/**
+ * Hide elements visually, but keep them available for screen readers.
+ *
+ * Used for information required for screen reader users to understand and use
+ * the site where visual display is undesirable. Information provided in this
+ * manner should be kept concise, to avoid unnecessary burden on the user.
+ * "!important" is used to prevent unintentional overrides.
+ */
+.visually-hidden {
+  position: absolute !important;
+  overflow: hidden;
+  clip: rect(1px, 1px, 1px, 1px);
+  width: 1px;
+  height: 1px;
+  word-wrap: normal;
+}
+
+/**
+ * The .focusable class extends the .visually-hidden class to allow
+ * the element to be focusable when navigated to via the keyboard.
+ */
+.visually-hidden.focusable:active,
+.visually-hidden.focusable:focus {
+  position: static !important;
+  overflow: visible;
+  clip: auto;
+  width: auto;
+  height: auto;
+}
+
+/**
+ * Hide visually and from screen readers, but maintain layout.
+ */
+.invisible {
+  visibility: hidden;
+}
diff --git a/core/themes/stable9/css/system/components/item-list.module.css b/core/themes/stable9/css/system/components/item-list.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..7bddff9e768b4fe0aab4057b1305972996d60a84
--- /dev/null
+++ b/core/themes/stable9/css/system/components/item-list.module.css
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Styles for item list.
+ */
+
+.item-list__comma-list,
+.item-list__comma-list li {
+  display: inline;
+}
+.item-list__comma-list {
+  margin: 0;
+  padding: 0;
+}
+.item-list__comma-list li:after {
+  content: ", ";
+}
+.item-list__comma-list li:last-child:after {
+  content: "";
+}
diff --git a/core/themes/stable9/css/system/components/js.module.css b/core/themes/stable9/css/system/components/js.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..f827020326daed6d93a0c75f06999c264f57cfb3
--- /dev/null
+++ b/core/themes/stable9/css/system/components/js.module.css
@@ -0,0 +1,22 @@
+/**
+ * @file
+ * Utility classes to assist with Javascript functionality.
+ */
+
+/**
+ * For anything you want to hide on page load when JS is enabled, so
+ * that you can use the JS to control visibility and avoid flicker.
+ */
+.js .js-hide {
+  display: none;
+}
+
+/**
+ * For anything you want to show on page load only when JS is enabled.
+ */
+.js-show {
+  display: none;
+}
+.js .js-show {
+  display: block;
+}
diff --git a/core/themes/stable9/css/system/components/nowrap.module.css b/core/themes/stable9/css/system/components/nowrap.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..466d9fe68ae287976363a726f7ae385661b6c192
--- /dev/null
+++ b/core/themes/stable9/css/system/components/nowrap.module.css
@@ -0,0 +1,8 @@
+/**
+ * @file
+ * Utility class to prevent text wrapping.
+ */
+
+.nowrap {
+  white-space: nowrap;
+}
diff --git a/core/themes/stable9/css/system/components/position-container.module.css b/core/themes/stable9/css/system/components/position-container.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..ae209f3aa614b9437226ba8bb9637bdd7b4e8e86
--- /dev/null
+++ b/core/themes/stable9/css/system/components/position-container.module.css
@@ -0,0 +1,8 @@
+/*
+ * @file
+ * Contain positioned elements.
+ */
+
+.position-container {
+  position: relative;
+}
diff --git a/core/themes/stable9/css/system/components/progress.module.css b/core/themes/stable9/css/system/components/progress.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..960e28b6ba7c6983fd3befd69870ad8d0bdba254
--- /dev/null
+++ b/core/themes/stable9/css/system/components/progress.module.css
@@ -0,0 +1,51 @@
+/**
+ * @file
+ * Progress behavior.
+ *
+ * @see progress.js
+ */
+
+.progress {
+  position: relative;
+}
+.progress__track {
+  min-width: 100px;
+  max-width: 100%;
+  height: 16px;
+  margin-top: 5px;
+  border: 1px solid;
+  background-color: #fff;
+}
+.progress__bar {
+  width: 3%;
+  min-width: 3%;
+  max-width: 100%;
+  height: 16px;
+  background-color: #000;
+}
+.progress__description,
+.progress__percentage {
+  overflow: hidden;
+  margin-top: 0.2em;
+  color: #555;
+  font-size: 0.875em;
+}
+.progress__description {
+  float: left; /* LTR */
+}
+[dir="rtl"] .progress__description {
+  float: right;
+}
+.progress__percentage {
+  float: right; /* LTR */
+}
+[dir="rtl"] .progress__percentage {
+  float: left;
+}
+.progress--small .progress__track {
+  height: 7px;
+}
+.progress--small .progress__bar {
+  height: 7px;
+  background-size: 20px 20px;
+}
diff --git a/core/themes/stable9/css/system/components/reset-appearance.module.css b/core/themes/stable9/css/system/components/reset-appearance.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..b04ba133fa5d3e388ff5ece47030f3bcfd89f678
--- /dev/null
+++ b/core/themes/stable9/css/system/components/reset-appearance.module.css
@@ -0,0 +1,15 @@
+/*
+ * @file
+ * Utility class to remove browser styles, especially for button.
+ */
+
+.reset-appearance {
+  margin: 0;
+  padding: 0;
+  border: 0 none;
+  background: transparent;
+  line-height: inherit;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
diff --git a/core/themes/stable9/css/system/components/resize.module.css b/core/themes/stable9/css/system/components/resize.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..db727c10273d590e52072de6ce898e4c4a14b2b1
--- /dev/null
+++ b/core/themes/stable9/css/system/components/resize.module.css
@@ -0,0 +1,21 @@
+/**
+ * @file
+ * Resizable textareas.
+ */
+
+.resize-none {
+  resize: none;
+}
+.resize-vertical {
+  min-height: 2em;
+  resize: vertical;
+}
+.resize-horizontal {
+  max-width: 100%;
+  resize: horizontal;
+}
+.resize-both {
+  max-width: 100%;
+  min-height: 2em;
+  resize: both;
+}
diff --git a/core/themes/stable9/css/system/components/sticky-header.module.css b/core/themes/stable9/css/system/components/sticky-header.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..f6a1b1ec0c627b940216f849506eadbe62fc097a
--- /dev/null
+++ b/core/themes/stable9/css/system/components/sticky-header.module.css
@@ -0,0 +1,13 @@
+/**
+ * @file
+ * Table header behavior.
+ *
+ * @see tableheader.js
+ */
+
+table.sticky-header {
+  z-index: 500;
+  top: 0;
+  margin-top: 0;
+  background-color: #fff;
+}
diff --git a/core/themes/stable9/css/system/components/system-status-counter.css b/core/themes/stable9/css/system/components/system-status-counter.css
new file mode 100644
index 0000000000000000000000000000000000000000..567dbb308637a2d8da724a4375ddf4ae669a5b08
--- /dev/null
+++ b/core/themes/stable9/css/system/components/system-status-counter.css
@@ -0,0 +1,30 @@
+/**
+ * @file
+ * Styles for the system status counter component.
+ */
+
+.system-status-counter__status-icon {
+  display: inline-block;
+  width: 25px;
+  height: 25px;
+  vertical-align: middle;
+}
+.system-status-counter__status-icon:before {
+  display: block;
+  width: 100%;
+  height: 100%;
+  content: "";
+  background-repeat: no-repeat;
+  background-position: center 2px;
+  background-size: 16px;
+}
+
+.system-status-counter__status-icon--error:before {
+  background-image: url(../../../../../misc/icons/e32700/error.svg);
+}
+.system-status-counter__status-icon--warning:before {
+  background-image: url(../../../../../misc/icons/e29700/warning.svg);
+}
+.system-status-counter__status-icon--checked:before {
+  background-image: url(../../../../../misc/icons/73b355/check.svg);
+}
diff --git a/core/themes/stable9/css/system/components/system-status-report-counters.css b/core/themes/stable9/css/system/components/system-status-report-counters.css
new file mode 100644
index 0000000000000000000000000000000000000000..7040c257a0f22ed815818ef2c9a0920dbac6f20d
--- /dev/null
+++ b/core/themes/stable9/css/system/components/system-status-report-counters.css
@@ -0,0 +1,27 @@
+/**
+ * @file
+ * Styles for the system status report counters.
+ */
+
+.system-status-report-counters__item {
+  width: 100%;
+  margin-bottom: 0.5em;
+  padding: 0.5em 0;
+  text-align: center;
+  white-space: nowrap;
+  background-color: rgba(0, 0, 0, 0.063);
+}
+
+@media screen and (min-width: 60em) {
+  .system-status-report-counters {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+  }
+  .system-status-report-counters__item--half-width {
+    width: 49%;
+  }
+  .system-status-report-counters__item--third-width {
+    width: 33%;
+  }
+}
diff --git a/core/themes/stable9/css/system/components/system-status-report-general-info.css b/core/themes/stable9/css/system/components/system-status-report-general-info.css
new file mode 100644
index 0000000000000000000000000000000000000000..3056aded67d07e44650c1853a54ffdc3800eb016
--- /dev/null
+++ b/core/themes/stable9/css/system/components/system-status-report-general-info.css
@@ -0,0 +1,14 @@
+/**
+ * @file
+ * Default styles for the System Status general info.
+ */
+
+.system-status-general-info__item {
+  margin-top: 1em;
+  padding: 0 1em 1em;
+  border: 1px solid #ccc;
+}
+
+.system-status-general-info__item-title {
+  border-bottom: 1px solid #ccc;
+}
diff --git a/core/themes/stable9/css/system/components/tabledrag.module.css b/core/themes/stable9/css/system/components/tabledrag.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..79212e8b9b4214593227fcc4736aa4a9eeef2b03
--- /dev/null
+++ b/core/themes/stable9/css/system/components/tabledrag.module.css
@@ -0,0 +1,88 @@
+/**
+ * @file
+ * Table drag behavior.
+ *
+ * @see tabledrag.js
+ */
+
+body.drag {
+  cursor: move;
+}
+tr.region-title {
+  font-weight: bold;
+}
+tr.region-message {
+  color: #999;
+}
+tr.region-populated {
+  display: none;
+}
+tr.add-new .tabledrag-changed {
+  display: none;
+}
+.draggable a.tabledrag-handle {
+  float: left; /* LTR */
+  overflow: hidden;
+  height: 1.7em;
+  margin-left: -1em; /* LTR */
+  cursor: move;
+  text-decoration: none;
+}
+[dir="rtl"] .draggable a.tabledrag-handle {
+  float: right;
+  margin-right: -1em;
+  margin-left: 0;
+}
+a.tabledrag-handle:hover {
+  text-decoration: none;
+}
+a.tabledrag-handle .handle {
+  width: 14px;
+  height: 14px;
+  margin: -0.4em 0.5em 0;
+  padding: 0.42em 0.5em;
+  background: url(../../../../../misc/icons/787878/move.svg) no-repeat 6px 7px;
+}
+a.tabledrag-handle:hover .handle,
+a.tabledrag-handle:focus .handle {
+  background-image: url(../../../../../misc/icons/000000/move.svg);
+}
+.touchevents .draggable td {
+  padding: 0 10px;
+}
+.touchevents .draggable .menu-item__link {
+  display: inline-block;
+  padding: 10px 0;
+}
+.touchevents a.tabledrag-handle {
+  width: 40px;
+  height: 44px;
+}
+.touchevents a.tabledrag-handle .handle {
+  height: 21px;
+  background-position: 40% 19px; /* LTR */
+}
+[dir="rtl"] .touch a.tabledrag-handle .handle {
+  background-position: right 40% top 19px;
+}
+.touchevents .draggable.drag a.tabledrag-handle .handle {
+  background-position: 50% -32px;
+}
+.tabledrag-toggle-weight-wrapper {
+  text-align: right; /* LTR */
+}
+[dir="rtl"] .tabledrag-toggle-weight-wrapper {
+  text-align: left;
+}
+.indentation {
+  float: left; /* LTR */
+  width: 20px;
+  height: 1.7em;
+  margin: -0.4em 0.2em -0.4em -0.4em; /* LTR */
+  padding: 0.42em 0 0.42em 0.6em; /* LTR */
+}
+[dir="rtl"] .indentation {
+  float: right;
+  margin: -0.4em -0.4em -0.4em 0.2em;
+  padding: 0.42em 0.6em 0.42em 0;
+}
diff --git a/core/themes/stable9/css/system/components/tablesort.module.css b/core/themes/stable9/css/system/components/tablesort.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..b30028682ddc8fe8580d1587bab30b95de93951d
--- /dev/null
+++ b/core/themes/stable9/css/system/components/tablesort.module.css
@@ -0,0 +1,19 @@
+/**
+ * @file
+ * Table sort indicator.
+ *
+ * @see tablesort-indicator.html.twig
+ */
+
+.tablesort {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  background-size: 100%;
+}
+.tablesort--asc {
+  background-image: url(../../../../../misc/icons/787878/twistie-down.svg);
+}
+.tablesort--desc {
+  background-image: url(../../../../../misc/icons/787878/twistie-up.svg);
+}
diff --git a/core/themes/stable9/css/system/components/tree-child.module.css b/core/themes/stable9/css/system/components/tree-child.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..8af02b9cdb051b9a16b3892d693bd30123eb4f20
--- /dev/null
+++ b/core/themes/stable9/css/system/components/tree-child.module.css
@@ -0,0 +1,18 @@
+/**
+ * @file
+ * Visual styles for a nested tree child.
+ */
+
+div.tree-child {
+  background: url(../../../../../misc/tree.png) no-repeat 11px center; /* LTR */
+}
+div.tree-child-last {
+  background: url(../../../../../misc/tree-bottom.png) no-repeat 11px center; /* LTR */
+}
+[dir="rtl"] div.tree-child,
+[dir="rtl"] div.tree-child-last {
+  background-position: -65px center;
+}
+div.tree-child-horizontal {
+  background: url(../../../../../misc/tree.png) no-repeat -11px center;
+}
diff --git a/core/themes/stable9/css/system/system.admin.css b/core/themes/stable9/css/system/system.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..3399d0e8d5f0d8d546a42b1b1984eefd60ba50d4
--- /dev/null
+++ b/core/themes/stable9/css/system/system.admin.css
@@ -0,0 +1,401 @@
+/**
+ * @file
+ * Styles for administration pages.
+ */
+
+/**
+ * Reusable layout styles.
+ */
+.layout-container {
+  margin: 0 1.5em;
+}
+.layout-container:after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+@media screen and (min-width: 38em) {
+  .layout-container {
+    margin: 0 2.5em;
+  }
+  .layout-column {
+    float: left;  /* LTR */
+    box-sizing: border-box;
+  }
+  [dir="rtl"] .layout-column {
+    float: right;
+  }
+  .layout-column + .layout-column {
+    padding-left: 10px; /* LTR */
+  }
+  [dir="rtl"] .layout-column + .layout-column {
+    padding-right: 10px;
+    padding-left: 0;
+  }
+  .layout-column--half {
+    width: 50%;
+  }
+  .layout-column--quarter {
+    width: 25%;
+  }
+  .layout-column--three-quarter {
+    width: 75%;
+  }
+}
+
+/**
+ * Panel.
+ * Used to visually group items together.
+ */
+.panel {
+  padding: 5px 5px 15px;
+}
+.panel__description {
+  margin: 0 0 3px;
+  padding: 2px 0 3px 0;
+}
+
+/**
+ * System compact link: to toggle the display of description text.
+ */
+.compact-link {
+  margin: 0 0 0.5em 0;
+}
+
+/**
+ * Quick inline admin links.
+ */
+small .admin-link:before {
+  content: " [";
+}
+small .admin-link:after {
+  content: "]";
+}
+
+/**
+ * Modules page.
+ */
+.system-modules thead > tr {
+  border: 0;
+}
+.system-modules div.incompatible {
+  font-weight: bold;
+}
+.system-modules td.checkbox {
+  width: 4%;
+  min-width: 25px;
+}
+.system-modules td.module {
+  width: 25%;
+}
+.system-modules td {
+  vertical-align: top;
+}
+.system-modules label,
+.system-modules-uninstall label {
+  color: #1d1d1d;
+  font-size: 1.15em;
+}
+.system-modules details {
+  overflow: hidden; /* truncates descriptions if too long */
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  color: #5c5c5b;
+  line-height: 20px;
+}
+.system-modules details[open] {
+  overflow: visible;
+  height: auto;
+  white-space: normal;
+}
+.system-modules details[open] summary .text {
+  text-transform: none;
+  -webkit-hyphens: auto;
+  -moz-hyphens: auto;
+  -ms-hyphens: auto;
+  hyphens: auto;
+}
+.system-modules td details a {
+  color: #5c5c5b;
+  border: 0;
+}
+.system-modules td details {
+  height: 20px;
+  margin: 0;
+  border: 0;
+}
+.system-modules td details summary {
+  padding: 0;
+  cursor: default;
+  text-transform: none;
+  font-weight: normal;
+}
+.system-modules td {
+  padding-left: 0; /* LTR */
+}
+[dir="rtl"] .system-modules td {
+  padding-right: 0;
+  padding-left: 12px;
+}
+
+@media screen and (max-width: 40em) {
+  .system-modules td.name {
+    width: 20%;
+  }
+  .system-modules td.description {
+    width: 40%;
+  }
+}
+.system-modules .requirements {
+  max-width: 490px;
+  padding: 5px 0;
+}
+.system-modules .links {
+  overflow: hidden; /* prevents collapse */
+}
+.system-modules .checkbox {
+  margin: 0 5px;
+}
+.system-modules .checkbox .form-item {
+  margin-bottom: 0;
+}
+.admin-requirements,
+.admin-required {
+  color: #666;
+  font-size: 0.9em;
+}
+.admin-enabled {
+  color: #080;
+}
+.admin-missing {
+  color: #f00;
+}
+.module-link {
+  display: block;
+  float: left; /* LTR */
+  margin-top: 2px;
+  padding: 2px 20px;
+  white-space: nowrap;
+}
+[dir="rtl"] .module-link {
+  float: right;
+}
+.module-link-help {
+  background: url(../../../../misc/icons/787878/questionmark-disc.svg) 0 50% no-repeat; /* LTR */
+}
+[dir="rtl"] .module-link-help {
+  background-position: top 50% right 0;
+}
+.module-link-permissions {
+  background: url(../../../../misc/icons/787878/key.svg) 0 50% no-repeat; /* LTR */
+}
+[dir="rtl"] .module-link-permissions {
+  background-position: top 50% right 0;
+}
+.module-link-configure {
+  background: url(../../../../misc/icons/787878/cog.svg) 0 50% no-repeat; /* LTR */
+}
+[dir="rtl"] .module-link-configure {
+  background-position: top 50% right 0;
+}
+
+/* Status report. */
+.system-status-report__status-title {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 10px 6px 10px 40px; /* LTR */
+  vertical-align: top;
+  background-color: transparent;
+  font-weight: normal;
+}
+[dir="rtl"] .system-status-report__status-title {
+  padding: 10px 40px 10px 6px;
+}
+.system-status-report__status-icon:before {
+  position: absolute;
+  top: 12px;
+  left: 12px; /* LTR */
+  display: block;
+  width: 16px;
+  height: 16px;
+  content: "";
+  background-repeat: no-repeat;
+}
+[dir="rtl"] .system-status-report__status-icon:before {
+  right: 12px;
+  left: auto;
+}
+.system-status-report__status-icon--error:before {
+  background-image: url(../../../../misc/icons/e32700/error.svg);
+}
+.system-status-report__status-icon--warning:before {
+  background-image: url(../../../../misc/icons/e29700/warning.svg);
+}
+.system-status-report__entry__value {
+  padding: 1em 0.5em;
+}
+
+/**
+ * Appearance page.
+ */
+.theme-info__header {
+  margin-bottom: 0;
+  font-weight: normal;
+}
+.theme-default .theme-info__header {
+  font-weight: bold;
+}
+.theme-info__description {
+  margin-top: 0;
+}
+.system-themes-list {
+  margin-bottom: 20px;
+}
+.system-themes-list-uninstalled {
+  padding-top: 20px;
+  border-top: 1px solid #cdcdcd;
+}
+.system-themes-list__header {
+  margin: 0;
+}
+
+.theme-selector {
+  padding-top: 20px;
+}
+.theme-selector .screenshot,
+.theme-selector .no-screenshot {
+  max-width: 100%;
+  height: auto;
+  padding: 2px;
+  text-align: center;
+  vertical-align: bottom;
+  border: 1px solid #e0e0d8;
+}
+.theme-default .screenshot {
+  border: 1px solid #aaa;
+}
+.system-themes-list-uninstalled .screenshot,
+.system-themes-list-uninstalled .no-screenshot {
+  max-width: 194px;
+  height: auto;
+}
+
+/**
+ * Theme display without vertical toolbar.
+ */
+@media screen and (min-width: 45em) {
+  body:not(.toolbar-vertical) .system-themes-list-installed .screenshot,
+  body:not(.toolbar-vertical) .system-themes-list-installed .no-screenshot {
+    float: left; /* LTR */
+    width: 294px;
+    margin: 0 20px 0 0; /* LTR */
+  }
+  [dir="rtl"] body:not(.toolbar-vertical) .system-themes-list-installed .screenshot,
+  [dir="rtl"] body:not(.toolbar-vertical) .system-themes-list-installed .no-screenshot {
+    float: right;
+    margin: 0 0 0 20px;
+  }
+  body:not(.toolbar-vertical) .system-themes-list-installed .system-themes-list__header {
+    margin-top: 0;
+  }
+  body:not(.toolbar-vertical) .system-themes-list-uninstalled .theme-selector {
+    float: left; /* LTR */
+    box-sizing: border-box;
+    width: 31.25%;
+    padding: 20px 20px 20px 0; /* LTR */
+  }
+  [dir="rtl"] body:not(.toolbar-vertical) .system-themes-list-uninstalled .theme-selector {
+    float: right;
+    padding: 20px 0 20px 20px;
+  }
+  body:not(.toolbar-vertical) .system-themes-list-uninstalled .theme-info {
+    min-height: 170px;
+  }
+}
+
+/**
+ * Theme display with vertical toolbar.
+ */
+@media screen and (min-width: 60em) {
+  .toolbar-vertical .system-themes-list-installed .screenshot,
+  .toolbar-vertical .system-themes-list-installed .no-screenshot {
+    float: left; /* LTR */
+    width: 294px;
+    margin: 0 20px 0 0; /* LTR */
+  }
+  [dir="rtl"] .toolbar-vertical .system-themes-list-installed .screenshot,
+  [dir="rtl"] .toolbar-vertical .system-themes-list-installed .no-screenshot {
+    float: right;
+    margin: 0 0 0 20px;
+  }
+  .toolbar-vertical .system-themes-list-installed .theme-info__header {
+    margin-top: 0;
+  }
+  .toolbar-vertical .system-themes-list-uninstalled .theme-selector {
+    float: left; /* LTR */
+    box-sizing: border-box;
+    width: 31.25%;
+    padding: 20px 20px 20px 0; /* LTR */
+  }
+  [dir="rtl"] .toolbar-vertical .system-themes-list-uninstalled .theme-selector {
+    float: right;
+    padding: 20px 0 20px 20px;
+  }
+  .toolbar-vertical .system-themes-list-uninstalled .theme-info {
+    min-height: 170px;
+  }
+}
+.system-themes-list-installed .theme-info {
+  max-width: 940px;
+}
+
+.theme-selector .incompatible {
+  margin-top: 10px;
+  font-weight: bold;
+}
+.theme-selector .operations {
+  margin: 10px 0 0 0;
+  padding: 0;
+}
+.theme-selector .operations li {
+  float: left; /* LTR */
+  margin: 0;
+  padding: 0 0.7em;
+  list-style-type: none;
+  border-right: 1px solid #cdcdcd;  /* LTR */
+}
+[dir="rtl"] .theme-selector .operations li {
+  float: right;
+  border-right: none;
+  border-left: 1px solid #cdcdcd;
+}
+.theme-selector .operations li:last-child {
+  padding: 0 0 0 0.7em; /* LTR */
+  border-right: none; /* LTR */
+}
+[dir="rtl"] .theme-selector .operations li:last-child {
+  padding: 0 0.7em 0 0;
+  border-left: none;
+}
+.theme-selector .operations li:first-child {
+  padding: 0 0.7em 0 0; /* LTR */
+}
+[dir="rtl"] .theme-selector .operations li:first-child {
+  padding: 0 0 0 0.7em;
+}
+.system-themes-admin-form {
+  clear: left; /* LTR */
+}
+[dir="rtl"] .system-themes-admin-form {
+  clear: right;
+}
+.cron-description__run-cron {
+  display: block;
+}
+
+.system-cron-settings__link {
+  overflow-wrap: break-word;
+  word-wrap: break-word;
+}
diff --git a/core/themes/stable9/css/system/system.diff.css b/core/themes/stable9/css/system/system.diff.css
new file mode 100644
index 0000000000000000000000000000000000000000..a6e86423c6cf010c60bf827a443ac4404bb971ee
--- /dev/null
+++ b/core/themes/stable9/css/system/system.diff.css
@@ -0,0 +1,41 @@
+/**
+ * Traditional split diff theming
+ */
+table.diff {
+  width: 100%;
+  margin-bottom: 20px;
+  border-spacing: 4px;
+}
+table.diff .diff-context {
+  background-color: #fafafa;
+}
+table.diff .diff-deletedline {
+  width: 50%;
+  background-color: #ffa;
+}
+table.diff .diff-addedline {
+  width: 50%;
+  background-color: #afa;
+}
+table.diff .diffchange {
+  color: #f00;
+  font-weight: bold;
+}
+table.diff .diff-marker {
+  width: 1.4em;
+}
+table.diff th {
+  padding-right: inherit; /* LTR */
+}
+[dir="rtl"] table.diff th {
+  padding-right: 0;
+  padding-left: inherit;
+}
+table.diff td div {
+  overflow: auto;
+  padding: 0.1ex 0.5em;
+  word-wrap: break-word;
+}
+table.diff td {
+  padding: 0.1ex 0.4em;
+}
diff --git a/core/themes/stable9/css/system/system.maintenance.css b/core/themes/stable9/css/system/system.maintenance.css
new file mode 100644
index 0000000000000000000000000000000000000000..efecda7e84808cccef8a22477887c9b0ccfcc658
--- /dev/null
+++ b/core/themes/stable9/css/system/system.maintenance.css
@@ -0,0 +1,56 @@
+/**
+ * Update styles
+ */
+.update-results {
+  margin-top: 3em;
+  padding: 0.25em;
+  border: 1px solid #ccc;
+  background: #eee;
+  font-size: smaller;
+}
+.update-results h2 {
+  margin-top: 0.25em;
+}
+.update-results h4 {
+  margin-bottom: 0.25em;
+}
+.update-results .none {
+  color: #888;
+  font-style: italic;
+}
+.update-results .failure strong {
+  color: #b63300;
+}
+
+/**
+ * Authorize.php styles
+ */
+#edit-submit-connection {
+  clear: both;
+}
+#edit-submit-process,
+.filetransfer {
+  display: none;
+  clear: both;
+}
+.js #edit-submit-connection {
+  display: none;
+}
+.js #edit-submit-process {
+  display: block;
+}
+
+#edit-connection-settings-change-connection-type {
+  margin: 2.6em 0.5em 0 1em; /* LTR */
+}
+[dir="rtl"] #edit-connection-settings-change-connection-type {
+  margin-right: 1em;
+  margin-left: 0.5em;
+}
+
+/**
+ * Theme maintenance styles
+ */
+.authorize-results__failure {
+  font-weight: bold;
+}
diff --git a/core/themes/stable9/css/taxonomy/taxonomy.theme.css b/core/themes/stable9/css/taxonomy/taxonomy.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..543666a1e9052713a457ae1317fa51e1cf6fc892
--- /dev/null
+++ b/core/themes/stable9/css/taxonomy/taxonomy.theme.css
@@ -0,0 +1,10 @@
+
+.taxonomy-term-preview {
+  background-color: #eee;
+}
+.taxonomy-term-divider-top {
+  border-bottom: none;
+}
+.taxonomy-term-divider-bottom {
+  border-top: 1px dotted #ccc;
+}
diff --git a/core/themes/stable9/css/toolbar/toolbar.icons.theme.css b/core/themes/stable9/css/toolbar/toolbar.icons.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..b0942631b8ebf0000a8d3a05dea65acb80987cae
--- /dev/null
+++ b/core/themes/stable9/css/toolbar/toolbar.icons.theme.css
@@ -0,0 +1,298 @@
+/**
+ * @file
+ * Styling for toolbar module icons.
+ */
+
+.toolbar .toolbar-icon {
+  position: relative;
+  padding-left: 2.75em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-icon {
+  padding-right: 2.75em;
+  padding-left: 1.3333em;
+}
+.toolbar .toolbar-icon:before {
+  position: absolute;
+  top: 0;
+  left: 0.6667em; /* LTR */
+  display: block;
+  width: 20px;
+  height: 100%;
+  content: "";
+  background-color: transparent;
+  background-repeat: no-repeat;
+  background-attachment: scroll;
+  background-position: center center;
+  background-size: 100% auto;
+}
+[dir="rtl"] .toolbar .toolbar-icon:before {
+  right: 0.6667em;
+  left: auto;
+}
+.toolbar button.toolbar-icon {
+  border: 0;
+  background-color: transparent;
+  font-size: 1em;
+}
+.toolbar .toolbar-menu ul .toolbar-icon {
+  padding-left: 1.3333em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-menu ul .toolbar-icon {
+  padding-right: 1.3333em;
+  padding-left: 0;
+}
+.toolbar .toolbar-menu ul a.toolbar-icon:before {
+  display: none;
+}
+.toolbar .toolbar-tray-vertical .toolbar-menu ul a {
+  padding-left: 2.75em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical .toolbar-menu ul a {
+  padding-right: 2.75em;
+  padding-left: 0;
+}
+.toolbar .toolbar-tray-vertical .toolbar-menu ul ul a {
+  padding-left: 3.75em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical .toolbar-menu ul ul a {
+  padding-right: 3.75em;
+  padding-left: 0;
+}
+
+.toolbar .toolbar-tray-vertical .toolbar-menu a {
+  padding-right: 4em; /* LTR */
+  padding-left: 2.75em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical .toolbar-menu a {
+  padding-right: 2.75em;
+  padding-left: 4em;
+}
+
+/**
+ * Top level icons.
+ */
+.toolbar-bar .toolbar-icon-menu:before {
+  background-image: url(../../../../misc/icons/bebebe/hamburger.svg);
+}
+.toolbar-bar .toolbar-icon-menu:active:before,
+.toolbar-bar .toolbar-icon-menu.is-active:before {
+  background-image: url(../../../../misc/icons/ffffff/hamburger.svg);
+}
+.toolbar-bar .toolbar-icon-help:before {
+  background-image: url(../../../../misc/icons/bebebe/questionmark-disc.svg);
+}
+.toolbar-bar .toolbar-icon-help:active:before,
+.toolbar-bar .toolbar-icon-help.is-active:before {
+  background-image: url(../../../../misc/icons/ffffff/questionmark-disc.svg);
+}
+
+/**
+ * Main menu icons.
+ */
+.toolbar-icon-system-admin-content:before {
+  background-image: url(../../../../misc/icons/787878/file.svg);
+}
+.toolbar-icon-system-admin-content:active:before,
+.toolbar-icon-system-admin-content.is-active:before {
+  background-image: url(../../../../misc/icons/000000/file.svg);
+}
+.toolbar-icon-system-admin-structure:before {
+  background-image: url(../../../../misc/icons/787878/orgchart.svg);
+}
+.toolbar-icon-system-admin-structure:active:before,
+.toolbar-icon-system-admin-structure.is-active:before {
+  background-image: url(../../../../misc/icons/000000/orgchart.svg);
+}
+.toolbar-icon-system-themes-page:before {
+  background-image: url(../../../../misc/icons/787878/paintbrush.svg);
+}
+.toolbar-icon-system-themes-page:active:before,
+.toolbar-icon-system-themes-page.is-active:before {
+  background-image: url(../../../../misc/icons/000000/paintbrush.svg);
+}
+.toolbar-icon-entity-user-collection:before {
+  background-image: url(../../../../misc/icons/787878/people.svg);
+}
+.toolbar-icon-entity-user-collection:active:before,
+.toolbar-icon-entity-user-collection.is-active:before {
+  background-image: url(../../../../misc/icons/000000/people.svg);
+}
+.toolbar-icon-system-modules-list:before {
+  background-image: url(../../../../misc/icons/787878/puzzlepiece.svg);
+}
+.toolbar-icon-system-modules-list:active:before,
+.toolbar-icon-system-modules-list.is-active:before {
+  background-image: url(../../../../misc/icons/000000/puzzlepiece.svg);
+}
+.toolbar-icon-system-admin-config:before {
+  background-image: url(../../../../misc/icons/787878/wrench.svg);
+}
+.toolbar-icon-system-admin-config:active:before,
+.toolbar-icon-system-admin-config.is-active:before {
+  background-image: url(../../../../misc/icons/000000/wrench.svg);
+}
+.toolbar-icon-system-admin-reports:before {
+  background-image: url(../../../../misc/icons/787878/barchart.svg);
+}
+.toolbar-icon-system-admin-reports:active:before,
+.toolbar-icon-system-admin-reports.is-active:before {
+  background-image: url(../../../../misc/icons/000000/barchart.svg);
+}
+.toolbar-icon-help-main:before {
+  background-image: url(../../../../misc/icons/787878/questionmark-disc.svg);
+}
+.toolbar-icon-help-main:active:before,
+.toolbar-icon-help-main.is-active:before {
+  background-image: url(../../../../misc/icons/000000/questionmark-disc.svg);
+}
+
+@media only screen and (min-width: 16.5em) {
+  .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon {
+    width: 4em;
+    margin-right: 0;
+    margin-left: 0;
+    padding-right: 0;
+    padding-left: 0;
+    text-indent: -9999px;
+  }
+  .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon:before {
+    left: 0; /* LTR */
+    width: 100%;
+    background-size: 42% auto;
+  }
+  .no-svg .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon:before {
+    background-size: auto auto;
+  }
+  [dir="rtl"] .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon:before {
+    right: 0;
+    left: auto;
+  }
+}
+
+@media only screen and (min-width: 36em) {
+  .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon {
+    width: auto;
+    padding-right: 1.3333em; /* LTR */
+    padding-left: 2.75em; /* LTR */
+    text-indent: 0;
+    background-position: left center; /* LTR */
+  }
+  [dir="rtl"] .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon {
+    padding-right: 2.75em;
+    padding-left: 1.3333em;
+    background-position: right center;
+  }
+  .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon:before {
+    left: 0.6667em; /* LTR */
+    width: 20px;
+    background-size: 100% auto;
+  }
+  .no-svg .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon:before {
+    background-size: auto auto;
+  }
+  [dir="rtl"] .toolbar .toolbar-bar .toolbar-tab > .toolbar-icon:before {
+    right: 0.6667em;
+    left: 0;
+  }
+}
+
+/**
+ *  Accessibility/focus
+ */
+.toolbar-tab a:focus {
+  text-decoration: underline;
+  outline: none;
+}
+.toolbar-lining button:focus {
+  outline: none;
+}
+.toolbar-tray-horizontal a:focus,
+.toolbar-box a:focus {
+  outline: none;
+  background-color: #f5f5f5;
+}
+.toolbar-box a:hover:focus {
+  text-decoration: underline;
+}
+.toolbar .toolbar-icon.toolbar-handle:focus {
+  outline: none;
+  background-color: #f5f5f5;
+}
+
+/**
+ * Handle.
+ */
+.toolbar .toolbar-icon.toolbar-handle {
+  width: 4em;
+  text-indent: -9999px;
+}
+.toolbar .toolbar-icon.toolbar-handle:before {
+  left: 1.6667em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-icon.toolbar-handle:before {
+  right: 1.6667em;
+  left: auto;
+}
+.toolbar .toolbar-icon.toolbar-handle:before {
+  background-image: url(../../../../misc/icons/5181c6/chevron-disc-down.svg);
+}
+.toolbar .toolbar-icon.toolbar-handle.open:before {
+  background-image: url(../../../../misc/icons/787878/chevron-disc-up.svg);
+}
+.toolbar .toolbar-menu .toolbar-menu .toolbar-icon.toolbar-handle:before {
+  background-image: url(../../../../misc/icons/5181c6/twistie-down.svg);
+  background-size: 75%;
+}
+.toolbar .toolbar-menu .toolbar-menu .toolbar-icon.toolbar-handle.open:before {
+  background-image: url(../../../../misc/icons/787878/twistie-up.svg);
+  background-size: 75%;
+}
+.toolbar .toolbar-icon-escape-admin:before {
+  background-image: url(../../../../misc/icons/bebebe/chevron-disc-left.svg);
+}
+[dir="rtl"] .toolbar .toolbar-icon-escape-admin:before {
+  background-image: url(../../../../misc/icons/bebebe/chevron-disc-right.svg);
+}
+/**
+ * Orientation toggle.
+ */
+.toolbar .toolbar-toggle-orientation button {
+  width: 39px;
+  height: 39px;
+  padding: 0;
+  text-indent: -999em;
+}
+.toolbar .toolbar-toggle-orientation button:before {
+  right: 0;
+  left: 0;
+  margin: 0 auto;
+}
+[dir="rtl"] .toolbar .toolbar-toggle-orientation .toolbar-icon {
+  padding: 0;
+}
+/**
+ * In order to support a hover effect on the SVG images, while also supporting
+ * RTL text direction and no SVG support, this little icon requires some very
+ * specific targeting, setting and unsetting.
+ */
+.toolbar .toolbar-toggle-orientation [value="vertical"]:before {
+  background-image: url(../../../../misc/icons/bebebe/push-left.svg); /* LTR */
+}
+.toolbar .toolbar-toggle-orientation [value="vertical"]:hover:before,
+.toolbar .toolbar-toggle-orientation [value="vertical"]:focus:before {
+  background-image: url(../../../../misc/icons/787878/push-left.svg); /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-toggle-orientation [value="vertical"]:before {
+  background-image: url(../../../../misc/icons/bebebe/push-right.svg);
+}
+[dir="rtl"] .toolbar .toolbar-toggle-orientation [value="vertical"]:hover:before,
+[dir="rtl"] .toolbar .toolbar-toggle-orientation [value="vertical"]:focus:before {
+  background-image: url(../../../../misc/icons/787878/push-right.svg);
+}
+.toolbar .toolbar-toggle-orientation [value="horizontal"]:before {
+  background-image: url(../../../../misc/icons/bebebe/push-up.svg);
+}
+.toolbar .toolbar-toggle-orientation [value="horizontal"]:hover:before,
+.toolbar .toolbar-toggle-orientation [value="horizontal"]:focus:before {
+  background-image: url(../../../../misc/icons/787878/push-up.svg);
+}
diff --git a/core/themes/stable9/css/toolbar/toolbar.menu.css b/core/themes/stable9/css/toolbar/toolbar.menu.css
new file mode 100644
index 0000000000000000000000000000000000000000..e35d0adc2dfda05da6798f1a324660e93f19ad31
--- /dev/null
+++ b/core/themes/stable9/css/toolbar/toolbar.menu.css
@@ -0,0 +1,118 @@
+/**
+ * @file toolbar.menu.css
+ */
+.toolbar .toolbar-menu,
+[dir="rtl"] .toolbar .toolbar-menu {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.toolbar .toolbar-box {
+  position: relative;
+  display: block;
+  width: auto;
+  line-height: 1em; /* this prevents the value "normal" from being returned as the line-height */
+}
+
+/**
+ * Hidden vertical toolbar sub-menus by default.
+ */
+.toolbar .toolbar-tray-vertical .toolbar-menu ul {
+  display: none;
+}
+
+/**
+ * Hidden horizontal toolbar handle icon.
+ */
+.toolbar .toolbar-tray-horizontal .toolbar-menu .toolbar-handle {
+  display: none;
+}
+/**
+ * Hidden toolbar sub-menus by default.
+ */
+.toolbar-tray-open .toolbar-menu .menu-item--expanded ul {
+  display: none;
+}
+.toolbar .toolbar-tray-vertical li.open > ul {
+  display: block; /* Show the sub-menus */
+}
+.toolbar .toolbar-tray-vertical .toolbar-handle + a {
+  margin-right: 3em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical .toolbar-handle + a {
+  margin-right: 0;
+  margin-left: 3em;
+}
+.toolbar .toolbar-tray .menu-item--active-trail > .toolbar-box a,
+.toolbar .toolbar-tray a.is-active {
+  color: #000;
+  font-weight: bold;
+}
+
+/* ----- Toolbar menu tray for viewports less than 320px ------ */
+@media screen and (max-width: 319px) {
+  .toolbar .toolbar-tray-vertical.is-active {
+    width: 100%;
+  }
+}
+
+/**
+ * Items.
+ */
+.toolbar .level-2 > ul {
+  border-top-color: #e5e5e5;
+  border-bottom-color: #ccc;
+  background-color: #fafafa;
+}
+.toolbar .level-3 > ul {
+  border-top-color: #ddd;
+  border-bottom-color: #c5c5c5;
+  background-color: #f5f5f5;
+}
+.toolbar .level-4 > ul {
+  border-top-color: #d5d5d5;
+  border-bottom-color: #bbb;
+  background-color: #eee;
+}
+.toolbar .level-5 > ul {
+  border-top-color: #ccc;
+  border-bottom-color: #b5b5b5;
+  background-color: #e5e5e5;
+}
+.toolbar .level-6 > ul {
+  border-top-color: #c5c5c5;
+  border-bottom-color: #aaa;
+  background-color: #eee;
+}
+.toolbar .level-7 > ul {
+  border-top-color: #ccc;
+  border-bottom-color: #b5b5b5;
+  background-color: #fafafa;
+}
+.toolbar .level-8 > ul {
+  border-top-color: #ddd;
+  border-bottom-color: #ccc;
+  background-color: #ddd;
+}
+
+/**
+ * Handle.
+ */
+.toolbar .toolbar-handle:hover {
+  cursor: pointer;
+}
+.toolbar .toolbar-icon.toolbar-handle {
+  position: absolute;
+  z-index: 1;
+  top: 0;
+  right: 0; /* LTR */
+  bottom: 0;
+  display: block;
+  height: 100%;
+  padding: 0;
+}
+[dir="rtl"] .toolbar .toolbar-icon.toolbar-handle {
+  right: auto;
+  left: 0;
+  padding: 0;
+}
diff --git a/core/themes/stable9/css/toolbar/toolbar.module.css b/core/themes/stable9/css/toolbar/toolbar.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..4f871ba89ffce06738e641932473f127970d0473
--- /dev/null
+++ b/core/themes/stable9/css/toolbar/toolbar.module.css
@@ -0,0 +1,298 @@
+/**
+ * @file toolbar.module.css
+ *
+ *
+ * Aggressive resets so we can achieve a consistent look in hostile CSS
+ * environments.
+ */
+#toolbar-administration,
+#toolbar-administration * {
+  box-sizing: border-box;
+}
+#toolbar-administration {
+  margin: 0;
+  padding: 0;
+  vertical-align: baseline;
+  font-size: small;
+  line-height: 1;
+}
+
+@media print {
+  #toolbar-administration {
+    display: none;
+  }
+}
+.toolbar-loading #toolbar-administration {
+  overflow: hidden;
+}
+/**
+ * Very specific overrides for Drupal system CSS.
+ */
+.toolbar li,
+.toolbar .item-list,
+.toolbar .item-list li,
+.toolbar .menu-item,
+.toolbar .menu-item--expanded {
+  list-style-type: none;
+  list-style-image: none;
+}
+.toolbar .menu-item {
+  padding-top: 0;
+}
+.toolbar .toolbar-bar .toolbar-tab,
+.toolbar .menu-item {
+  display: block;
+}
+.toolbar .toolbar-bar .toolbar-tab.hidden {
+  display: none;
+}
+.toolbar a {
+  display: block;
+  line-height: 1;
+}
+
+/**
+ * Administration menu.
+ */
+.toolbar .toolbar-bar,
+.toolbar .toolbar-tray {
+  position: relative;
+  z-index: 1250;
+}
+.toolbar-horizontal .toolbar-tray {
+  position: fixed;
+  left: 0;
+  width: 100%;
+}
+/* Position the admin toolbar absolutely when the configured standard breakpoint
+ * is active. The toolbar container, that contains the bar and the trays, is
+ * position absolutely so that it scrolls with the page. Otherwise, on smaller
+ * screens, the components of the admin toolbar are positioned statically. */
+.toolbar-oriented .toolbar-bar {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+}
+.toolbar-oriented .toolbar-tray {
+  position: absolute;
+  right: 0;
+  left: 0;
+}
+/* .toolbar-loading is required by Toolbar JavaScript to pre-render markup
+ * style to avoid extra reflow & flicker. */
+@media (min-width: 61em) {
+  .toolbar-loading.toolbar-horizontal .toolbar .toolbar-bar .toolbar-tab:last-child .toolbar-tray {
+    position: relative;
+    z-index: -999;
+    display: block;
+    visibility: hidden;
+    width: 1px;
+  }
+  .toolbar-loading.toolbar-horizontal .toolbar .toolbar-bar .toolbar-tab:last-child .toolbar-tray .toolbar-lining {
+    width: 999em;
+  }
+  .toolbar-loading.toolbar-horizontal .toolbar .toolbar-bar .home-toolbar-tab + .toolbar-tab .toolbar-tray {
+    display: block;
+  }
+}
+
+/* Layer the bar just above the trays and above contextual link triggers. */
+.toolbar-oriented .toolbar-bar {
+  z-index: 502;
+}
+/* Position the admin toolbar fixed when the configured standard breakpoint is
+ * active. */
+body.toolbar-fixed .toolbar-oriented .toolbar-bar {
+  position: fixed;
+}
+/* When the configured narrow breakpoint is active, the toolbar is sized to wrap
+ * around the trays in order to provide a context for scrolling tray content
+ * that is taller than the viewport. */
+body.toolbar-tray-open.toolbar-fixed.toolbar-vertical .toolbar-oriented {
+  bottom: 0;
+  width: 240px;
+  width: 15rem;
+}
+
+/* Present the admin toolbar tabs horizontally as a default on user agents that
+ * do not understand media queries or on user agents where JavaScript is
+ * disabled. */
+.toolbar-loading.toolbar-horizontal .toolbar .toolbar-tray .toolbar-menu > li,
+.toolbar .toolbar-bar .toolbar-tab,
+.toolbar .toolbar-tray-horizontal li {
+  float: left; /* LTR */
+}
+[dir="rtl"] .toolbar-loading.toolbar-horizontal .toolbar .toolbar-tray .toolbar-menu > li,
+[dir="rtl"] .toolbar .toolbar-bar .toolbar-tab,
+[dir="rtl"] .toolbar .toolbar-tray-horizontal li {
+  float: right;
+}
+/* Present the admin toolbar tabs vertically by default on user agents that
+ * that understand media queries. This will be the small screen default. */
+@media only screen {
+  .toolbar .toolbar-bar .toolbar-tab,
+  .toolbar .toolbar-tray-horizontal li {
+    float: none; /* LTR */
+  }
+  [dir="rtl"] .toolbar .toolbar-bar .toolbar-tab,
+  [dir="rtl"] .toolbar .toolbar-tray-horizontal li {
+    float: none;
+  }
+}
+/* This min-width media query is meant to provide basic horizontal layout to
+ * the main menu tabs when JavaScript is disabled on user agents that understand
+ * media queries. */
+@media (min-width: 16.5em) {
+  .toolbar .toolbar-bar .toolbar-tab,
+  .toolbar .toolbar-tray-horizontal li {
+    float: left; /* LTR */
+  }
+  [dir="rtl"] .toolbar .toolbar-bar .toolbar-tab,
+  [dir="rtl"] .toolbar .toolbar-tray-horizontal li {
+    float: right;
+  }
+}
+/* Present the admin toolbar tabs horizontally when the configured narrow
+ * breakpoint is active. */
+.toolbar-oriented .toolbar-bar .toolbar-tab,
+.toolbar-oriented .toolbar-tray-horizontal li {
+  float: left; /* LTR */
+}
+[dir="rtl"] .toolbar-oriented .toolbar-bar .toolbar-tab,
+[dir="rtl"] .toolbar-oriented .toolbar-tray-horizontal li {
+  float: right;
+}
+
+/**
+ * Toolbar tray.
+ */
+.toolbar .toolbar-tray {
+  z-index: 501;
+  display: none;
+}
+.toolbar-oriented .toolbar-tray-vertical {
+  position: absolute;
+  left: -100%; /* LTR */
+  width: 240px;
+  width: 15rem;
+}
+[dir="rtl"] .toolbar-oriented .toolbar-tray-vertical {
+  right: -100%;
+  left: auto;
+}
+.toolbar .toolbar-tray-vertical > .toolbar-lining {
+  min-height: 100%;
+}
+.toolbar .toolbar-tray-vertical > .toolbar-lining:before {
+  width: 100%;
+}
+.toolbar-oriented .toolbar-tray-vertical > .toolbar-lining:before {
+  position: fixed;
+  z-index: -1;
+  top: 0;
+  bottom: 0;
+  left: 0; /* LTR */
+  display: block;
+  width: 240px;
+  width: 14rem;
+  content: "";
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical > .toolbar-lining:before {
+  right: 0;
+  left: auto;
+}
+/* Layer the links just above the toolbar-tray. */
+.toolbar .toolbar-bar .toolbar-tab > .toolbar-icon {
+  position: relative;
+  z-index: 502;
+}
+/* Hide secondary menus when the tray is horizontal. */
+.toolbar-oriented .toolbar-tray-horizontal .menu-item ul {
+  display: none;
+}
+/* When the configured standard breakpoint is active and the tray is in a
+ * vertical position, the tray does not scroll with the page. The contents of
+ * the tray scroll within the confines of the viewport.
+ */
+.toolbar .toolbar-tray-vertical.is-active,
+body.toolbar-fixed .toolbar .toolbar-tray-vertical {
+  position: fixed;
+  overflow-x: hidden;
+  overflow-y: auto;
+  height: 100%;
+}
+.toolbar .toolbar-tray.is-active {
+  display: block;
+}
+/* Bring the tray into the viewport. By default it is just off-screen. */
+.toolbar-oriented .toolbar-tray-vertical.is-active {
+  left: 0; /* LTR */
+}
+[dir="rtl"] .toolbar-oriented .toolbar-tray-vertical.is-active {
+  right: 0;
+  left: auto;
+}
+/* When the configured standard breakpoint is active, the tray appears to push
+ * the page content away from the edge of the viewport. */
+body.toolbar-tray-open.toolbar-vertical.toolbar-fixed {
+  margin-left: 240px; /* LTR */
+  margin-left: 15rem; /* LTR */
+}
+
+@media print {
+  body.toolbar-tray-open.toolbar-vertical.toolbar-fixed {
+    margin-left: 0;
+  }
+}
+[dir="rtl"] body.toolbar-tray-open.toolbar-vertical.toolbar-fixed {
+  margin-right: 240px;
+  margin-right: 15rem;
+  margin-left: auto;
+}
+
+@media print {
+  [dir="rtl"] body.toolbar-tray-open.toolbar-vertical.toolbar-fixed {
+    margin-right: 0;
+  }
+}
+/**
+ * ToolBar tray orientation toggle.
+ */
+/* Hide the orientation toggle when the configured narrow breakpoint is not
+ * active. */
+.toolbar .toolbar-tray .toolbar-toggle-orientation {
+  display: none;
+}
+/* Show the orientation toggle when the configured narrow breakpoint is
+ * active. */
+.toolbar-oriented .toolbar-tray .toolbar-toggle-orientation {
+  display: block;
+}
+.toolbar-oriented .toolbar-tray-horizontal .toolbar-toggle-orientation {
+  position: absolute;
+  top: auto;
+  right: 0; /* LTR */
+  bottom: 0;
+}
+[dir="rtl"] .toolbar-oriented .toolbar-tray-horizontal .toolbar-toggle-orientation {
+  right: auto;
+  left: 0;
+}
+.toolbar-oriented .toolbar-tray-vertical .toolbar-toggle-orientation {
+  float: right; /* LTR */
+  width: 100%;
+}
+[dir="rtl"] .toolbar-oriented .toolbar-tray-vertical .toolbar-toggle-orientation {
+  float: left;
+}
+
+/**
+ * Toolbar home button toggle.
+ */
+.toolbar .toolbar-bar .home-toolbar-tab {
+  display: none;
+}
+.path-admin .toolbar-bar .home-toolbar-tab {
+  display: block;
+}
diff --git a/core/themes/stable9/css/toolbar/toolbar.theme.css b/core/themes/stable9/css/toolbar/toolbar.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..0416c056adb9ba321055c16a1c0997a1a9feb220
--- /dev/null
+++ b/core/themes/stable9/css/toolbar/toolbar.theme.css
@@ -0,0 +1,168 @@
+/**
+ * @file toolbar.theme.css
+ */
+.toolbar {
+  font-family: "Source Sans Pro", "Lucida Grande", Verdana, sans-serif;
+  /* Set base font size to 13px based on root ems. */
+  font-size: 0.8125rem;
+  -moz-tap-highlight-color: rgba(0, 0, 0, 0);
+  -o-tap-highlight-color: rgba(0, 0, 0, 0);
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  tap-highlight-color: rgba(0, 0, 0, 0);
+  -moz-touch-callout: none;
+  -o-touch-callout: none;
+  -webkit-touch-callout: none;
+  touch-callout: none;
+}
+.toolbar .toolbar-item {
+  padding: 1em 1.3333em;
+  cursor: pointer;
+  text-decoration: none;
+  line-height: 1em;
+}
+.toolbar .toolbar-item:hover,
+.toolbar .toolbar-item:focus {
+  text-decoration: underline;
+}
+
+/**
+ * Toolbar bar.
+ */
+.toolbar .toolbar-bar {
+  color: #ddd;
+  background-color: #0f0f0f;
+  box-shadow: -1px 0 3px 1px rgba(0, 0, 0, 0.3333); /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-bar {
+  box-shadow: 1px 0 3px 1px rgba(0, 0, 0, 0.3333);
+}
+.toolbar .toolbar-bar .toolbar-item {
+  color: #fff;
+}
+.toolbar .toolbar-bar .toolbar-tab > .toolbar-item {
+  font-weight: bold;
+}
+.toolbar .toolbar-bar .toolbar-tab > .toolbar-item:hover,
+.toolbar .toolbar-bar .toolbar-tab > .toolbar-item:focus {
+  background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.125) 20%, transparent 200%);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.125) 20%, transparent 200%);
+}
+.toolbar .toolbar-bar .toolbar-tab > .toolbar-item.is-active {
+  background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+}
+
+/**
+ * Toolbar tray.
+ */
+.toolbar .toolbar-tray {
+  background-color: #fff;
+}
+.toolbar-horizontal .toolbar-tray > .toolbar-lining {
+  padding-right: 5em; /* LTR */
+}
+[dir="rtl"] .toolbar-horizontal .toolbar-tray > .toolbar-lining {
+  padding-right: 0;
+  padding-left: 5em;
+}
+.toolbar .toolbar-tray-vertical {
+  border-right: 1px solid #aaa; /* LTR */
+  background-color: #f5f5f5;
+  box-shadow: -1px 0 5px 2px rgba(0, 0, 0, 0.3333); /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical {
+  border-right: 0 none;
+  border-left: 1px solid #aaa;
+  box-shadow: 1px 0 5px 2px rgba(0, 0, 0, 0.3333);
+}
+.toolbar-horizontal .toolbar-tray {
+  border-bottom: 1px solid #aaa;
+  box-shadow: -2px 1px 3px 1px rgba(0, 0, 0, 0.3333); /* LTR */
+}
+[dir="rtl"] .toolbar-horizontal .toolbar-tray {
+  box-shadow: 2px 1px 3px 1px rgba(0, 0, 0, 0.3333);
+}
+.toolbar .toolbar-tray-horizontal .toolbar-tray {
+  background-color: #f5f5f5;
+}
+.toolbar-tray a {
+  padding: 1em 1.3333em;
+  cursor: pointer;
+  text-decoration: none;
+  color: #565656;
+}
+.toolbar-tray a:hover,
+.toolbar-tray a:active,
+.toolbar-tray a:focus,
+.toolbar-tray a.is-active {
+  text-decoration: underline;
+  color: #000;
+}
+.toolbar .toolbar-menu {
+  background-color: #fff;
+}
+.toolbar-horizontal .toolbar-tray .menu-item + .menu-item {
+  border-left: 1px solid #ddd; /* LTR */
+}
+[dir="rtl"] .toolbar-horizontal .toolbar-tray .menu-item + .menu-item {
+  border-right: 1px solid #ddd;
+  border-left: 0 none;
+}
+.toolbar-horizontal .toolbar-tray .menu-item:last-child {
+  border-right: 1px solid #ddd; /* LTR */
+}
+[dir="rtl"] .toolbar-horizontal .toolbar-tray .menu-item:last-child {
+  border-left: 1px solid #ddd;
+}
+.toolbar .toolbar-tray-vertical .menu-item + .menu-item {
+  border-top: 1px solid #ddd;
+}
+.toolbar .toolbar-tray-vertical .menu-item:last-child {
+  border-bottom: 1px solid #ddd;
+}
+.toolbar .toolbar-tray-vertical .menu-item .menu-item {
+  border: 0 none;
+}
+.toolbar .toolbar-tray-vertical .toolbar-menu ul ul {
+  border-top: 1px solid #ddd;
+  border-bottom: 1px solid #ddd;
+}
+.toolbar .toolbar-tray-vertical .menu-item:last-child > ul {
+  border-bottom: 0;
+}
+.toolbar .toolbar-tray-vertical .toolbar-menu .toolbar-menu .toolbar-menu .toolbar-menu {
+  margin-left: 0.25em; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-tray-vertical .toolbar-menu .toolbar-menu .toolbar-menu .toolbar-menu {
+  margin-right: 0.25em;
+  margin-left: 0;
+}
+.toolbar .toolbar-menu .toolbar-menu a {
+  color: #434343;
+}
+
+/**
+ * Orientation toggle.
+ */
+.toolbar .toolbar-toggle-orientation {
+  height: 100%;
+  padding: 0;
+  background-color: #f5f5f5;
+}
+.toolbar-horizontal .toolbar-tray .toolbar-toggle-orientation {
+  border-left: 1px solid #c9c9c9; /* LTR */
+}
+[dir="rtl"] .toolbar-horizontal .toolbar-tray .toolbar-toggle-orientation {
+  border-right: 1px solid #c9c9c9;
+  border-left: 0 none;
+}
+.toolbar .toolbar-toggle-orientation > .toolbar-lining {
+  float: right; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-toggle-orientation > .toolbar-lining {
+  float: left;
+}
+.toolbar .toolbar-toggle-orientation button {
+  display: inline-block;
+  cursor: pointer;
+}
diff --git a/core/themes/stable9/css/tour/tour.module.css b/core/themes/stable9/css/tour/tour.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..16c849ab0480f21ef2b8bd8715e838bdcbd93e54
--- /dev/null
+++ b/core/themes/stable9/css/tour/tour.module.css
@@ -0,0 +1,143 @@
+/**
+ * @file
+ * Styling for tour module.
+ */
+
+/* Tab appearance. */
+.toolbar .toolbar-bar .tour-toolbar-tab.toolbar-tab {
+  float: right; /* LTR */
+}
+[dir="rtl"] .toolbar .toolbar-bar .tour-toolbar-tab.toolbar-tab {
+  float: left;
+}
+
+/* Override placement of the tour progress indicator. */
+.tour-progress {
+  position: absolute;
+  right: 20px; /* LTR */
+  bottom: 20px;
+}
+[dir="rtl"] .tour-progress {
+  right: auto;
+  left: 20px;
+}
+
+/* Default styles for the container */
+.joyride-tip-guide {
+  position: absolute;
+  z-index: 101;
+  top: 0;
+  left: 0;
+  display: none;
+  width: 300px;
+  background: #fff;
+}
+
+@media only screen and (max-width: 767px) {
+  .joyride-tip-guide {
+    left: 2.5%;
+    width: 85%;
+  }
+}
+
+.joyride-content-wrapper {
+  position: relative;
+  padding: 20px 50px 20px 20px;  /* LTR */
+}
+[dir="rtl"] .joyride-content-wrapper {
+  padding: 20px 20px 20px 50px;
+}
+
+/* Add a little css triangle pip, older browser just miss out on the fanciness of it. */
+.joyride-tip-guide .joyride-nub {
+  position: absolute;
+  left: 22px;
+  display: block;
+  width: 0;
+  height: 0;
+}
+
+.joyride-tip-guide .joyride-nub.top {
+  top: -28px;
+  bottom: auto;
+}
+
+.joyride-tip-guide .joyride-nub.bottom {
+  bottom: -28px;
+}
+
+.joyride-tip-guide .joyride-nub.right {
+  top: 22px;
+  right: -28px;
+  bottom: auto;
+  left: auto;
+}
+
+.joyride-tip-guide .joyride-nub.left {
+  top: 22px;
+  right: auto;
+  bottom: auto;
+  left: -28px;
+}
+
+.joyride-tip-guide .joyride-nub.top-right {
+  top: -28px;
+  right: 28px;
+  bottom: auto;
+  left: auto;
+}
+
+.joyride-tip-guide .tour-tip-label {
+  margin-top: 0;
+}
+
+.joyride-tip-guide p {
+  margin: 0 0 1.4em;
+}
+
+.joyride-timer-indicator-wrap {
+  position: absolute;
+  right: 17px;
+  bottom: 16px;
+  width: 50px;
+  height: 3px;
+}
+.joyride-timer-indicator {
+  display: block;
+  width: 0;
+  height: inherit;
+}
+
+.joyride-close-tip {
+  position: absolute;
+  top: 20px;
+  right: 20px; /* LTR */
+  line-height: 1em;
+}
+[dir="rtl"] .joyride-close-tip {
+  right: auto;
+  left: 20px;
+}
+
+.joyride-modal-bg {
+  position: fixed;
+  z-index: 100;
+  top: 0;
+  left: 0;
+  display: none;
+  width: 100%;
+  height: 100%;
+  cursor: pointer;
+}
+
+.joyride-expose-wrapper {
+  position: absolute;
+  z-index: 102;
+}
+
+.joyride-expose-cover {
+  position: absolute;
+  z-index: 10000;
+  top: 0;
+  left: 0;
+}
diff --git a/core/themes/stable9/css/update/update.admin.theme.css b/core/themes/stable9/css/update/update.admin.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..785da9a09d3ef367fbf0ecbbae924ead3d5578bc
--- /dev/null
+++ b/core/themes/stable9/css/update/update.admin.theme.css
@@ -0,0 +1,63 @@
+/**
+ * @file
+ * Styles used by the Update Manager module.
+ */
+
+.project-update__title {
+  font-size: 110%;
+  font-weight: bold;
+}
+.project-update__status {
+  float: right; /* LTR */
+  font-size: 110%;
+}
+[dir="rtl"] .project-update__status {
+  float: left;
+}
+.project-update__status--not-supported {
+  float: left; /* LTR */
+}
+[dir="rtl"] .project-update__status--not-supported {
+  float: right;
+}
+.project-update__status--security-error {
+  color: #970f00;
+  font-weight: bold;
+}
+
+.project-update__status-icon {
+  padding-left: 0.5em; /* LTR */
+}
+[dir="rtl"] .project-update__status-icon {
+  padding-right: 0.5em;
+  padding-left: 0;
+}
+.project-update__details {
+  padding: 1em 1em 0.25em 1em;
+}
+
+.project-update__version {
+  padding: 1em 0;
+}
+.project-update__version-date {
+  white-space: nowrap;
+}
+.project-update__version-details {
+  padding-right: 0.5em; /* LTR */
+}
+[dir="rtl"] .project-update__version-details {
+  padding-left: 0.5em;
+  direction: ltr; /* Version numbers should always be LTR. */
+}
+.project-update__version-links {
+  padding-right: 1em; /* LTR */
+  list-style-type: none;
+  text-align: right; /* LTR */
+}
+[dir="rtl"] .project-update__version-links {
+  padding-left: 1em;
+  text-align: left;
+}
+.project-update__version--recommended-strong .project-update__version-title {
+  font-weight: bold;
+}
diff --git a/core/themes/stable9/css/user/user.admin.css b/core/themes/stable9/css/user/user.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..ad5f95a59a7bebd9f6d94067a8ebd75ed4e57ad4
--- /dev/null
+++ b/core/themes/stable9/css/user/user.admin.css
@@ -0,0 +1,22 @@
+/**
+ * @file
+ * Admin styling for the User module.
+ */
+
+/* Permissions page */
+.permissions .module {
+  font-weight: bold;
+}
+.permissions .permission {
+  padding-left: 1.5em; /* LTR */
+}
+[dir="rtl"] .permissions .permission {
+  padding-right: 1.5em;
+  padding-left: 0;
+}
+
+/* Account settings */
+.user-admin-settings .details-description {
+  padding-bottom: 0.5em;
+  font-size: 0.85em;
+}
diff --git a/core/themes/stable9/css/user/user.icons.admin.css b/core/themes/stable9/css/user/user.icons.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..7df6ba25581649551d1fa2b5096ac4fb0fa45fb1
--- /dev/null
+++ b/core/themes/stable9/css/user/user.icons.admin.css
@@ -0,0 +1,15 @@
+/**
+ * @file
+ * Styling for the user module icons.
+ */
+
+/**
+ * Toolbar tab icon.
+ */
+.toolbar-bar .toolbar-icon-user:before {
+  background-image: url(../../../../misc/icons/bebebe/person.svg);
+}
+.toolbar-bar .toolbar-icon-user:active:before,
+.toolbar-bar .toolbar-icon-user.is-active:before {
+  background-image: url(../../../../misc/icons/ffffff/person.svg);
+}
diff --git a/core/themes/stable9/css/user/user.module.css b/core/themes/stable9/css/user/user.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..2a3e511d7b35b354930a684081b46a7b32bca52b
--- /dev/null
+++ b/core/themes/stable9/css/user/user.module.css
@@ -0,0 +1,21 @@
+/**
+ * @file
+ * Module styling for user module.
+ */
+.password-strength__title,
+.password-strength__text {
+  display: inline;
+}
+.password-strength__meter {
+  height: 0.75em;
+  margin-top: 0.5em;
+  background-color: lightgray;
+}
+.password-strength__indicator {
+  width: 0;
+  height: 100%;
+  background-color: gray;
+}
+.password-confirm-match {
+  visibility: hidden;
+}
diff --git a/core/themes/stable9/css/views/views.module.css b/core/themes/stable9/css/views/views.module.css
new file mode 100644
index 0000000000000000000000000000000000000000..1ffb3bdb3f21ac562df2b30b8f86fa3a4ddd95e9
--- /dev/null
+++ b/core/themes/stable9/css/views/views.module.css
@@ -0,0 +1,23 @@
+/* table style column align */
+.views-align-left {
+  text-align: left;
+}
+.views-align-right {
+  text-align: right;
+}
+.views-align-center {
+  text-align: center;
+}
+/* Grid style column align. */
+.views-view-grid .views-col {
+  float: left;
+}
+.views-view-grid .views-row {
+  float: left;
+  clear: both;
+  width: 100%;
+}
+/* Provide some space between display links. */
+.views-display-link + .views-display-link {
+  margin-left: 0.5em;
+}
diff --git a/core/themes/stable9/css/views_ui/views_ui.admin.css b/core/themes/stable9/css/views_ui/views_ui.admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..2507d306578a24111649bd9b903baf54ea416d11
--- /dev/null
+++ b/core/themes/stable9/css/views_ui/views_ui.admin.css
@@ -0,0 +1,208 @@
+/**
+ * @file
+ * The .admin.css file is intended to only contain positioning and size
+ * declarations. For example: display, position, float, clear, and overflow.
+ */
+
+.views-admin ul,
+.views-admin menu,
+.views-admin dir {
+  padding: 0;
+}
+.views-admin pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  white-space: pre-wrap;
+}
+.views-left-25 {
+  float: left; /* LTR */
+  width: 25%;
+}
+[dir="rtl"] .views-left-25 {
+  float: right;
+}
+.views-left-30 {
+  float: left; /* LTR */
+  width: 30%;
+}
+[dir="rtl"] .views-left-30 {
+  float: right;
+}
+.views-left-40 {
+  float: left; /* LTR */
+  width: 40%;
+}
+[dir="rtl"] .views-left-40 {
+  float: right;
+}
+.views-left-50 {
+  float: left; /* LTR */
+  width: 50%;
+}
+[dir="rtl"] .views-left-50 {
+  float: right;
+}
+.views-left-75 {
+  float: left; /* LTR */
+  width: 75%;
+}
+[dir="rtl"] .views-left-75 {
+  float: right;
+}
+.views-right-50 {
+  float: right; /* LTR */
+  width: 50%;
+}
+[dir="rtl"] .views-right-50 {
+  float: left;
+}
+.views-right-60 {
+  float: right; /* LTR */
+  width: 60%;
+}
+[dir="rtl"] .views-right-60 {
+  float: left;
+}
+.views-right-70 {
+  float: right; /* LTR */
+  width: 70%;
+}
+[dir="rtl"] .views-right-70 {
+  float: left;
+}
+.views-group-box .form-item {
+  margin-right: 3px;
+  margin-left: 3px;
+}
+
+/*
+ * The attachment details section, its tabs for each section and the buttons
+ * to add a new section
+ */
+.views-displays {
+  clear: both;
+}
+
+/* The tabs that switch between sections */
+.views-displays .tabs {
+  overflow: visible;
+  margin: 0;
+  padding: 0;
+  border-bottom: 0 none;
+}
+.views-displays .tabs > li {
+  float: left; /* LTR */
+  padding: 0;
+  border-right: 0 none; /* LTR */
+}
+[dir="rtl"] .views-displays .tabs > li {
+  float: right;
+  border-right: 1px solid #bfbfbf;
+  border-left: 0 none;
+}
+.views-displays .tabs .open > a {
+  position: relative;
+  z-index: 51;
+}
+.views-displays .tabs .views-display-deleted-link {
+  text-decoration: line-through;
+}
+.views-display-deleted > details > summary,
+.views-display-deleted .details-wrapper > .views-ui-display-tab-bucket > *,
+.views-display-deleted .views-display-columns {
+  opacity: 0.25;
+}
+.views-display-disabled > details > summary,
+.views-display-disabled .details-wrapper > .views-ui-display-tab-bucket > *,
+.views-display-disabled .views-display-columns {
+  opacity: 0.5;
+}
+.views-display-tab .details-wrapper > .views-ui-display-tab-bucket .actions {
+  opacity: 1;
+}
+.views-displays .tabs .add {
+  position: relative;
+}
+.views-displays .tabs .action-list {
+  position: absolute;
+  z-index: 50;
+  top: 23px;
+  left: 0; /* LTR */
+  margin: 0;
+}
+[dir="rtl"] .views-displays .tabs .action-list {
+  right: 0;
+  left: auto;
+}
+.views-displays .tabs .action-list li {
+  display: block;
+}
+.views-display-columns .details-wrapper {
+  padding: 0;
+}
+.views-display-column {
+  box-sizing: border-box;
+}
+.views-display-columns > * {
+  margin-bottom: 2em;
+}
+
+@media screen and (min-width: 45em) { /* 720px */
+  .views-display-columns > * {
+    float: left; /* LTR */
+    width: 32%;
+    margin-bottom: 0;
+    margin-left: 2%; /* LTR */
+  }
+  [dir="rtl"] .views-display-columns > * {
+    float: right;
+    margin-right: 2%;
+    margin-left: 0;
+  }
+  .views-display-columns > *:first-child {
+    margin-left: 0; /* LTR */
+  }
+  [dir="rtl"] .views-display-columns > *:first-child {
+    margin-right: 0;
+  }
+}
+
+.views-ui-dialog .scroll {
+  overflow: auto;
+  padding: 1em;
+}
+.views-filterable-options-controls {
+  display: none;
+}
+.views-ui-dialog .views-filterable-options-controls {
+  display: inline;
+}
+
+/* Don't let the messages overwhelm the modal */
+.views-ui-dialog .views-messages {
+  overflow: auto;
+  max-height: 200px;
+}
+.views-display-setting .label,
+.views-display-setting .views-ajax-link {
+  float: left; /* LTR */
+}
+[dir="rtl"] .views-display-setting .label,
+[dir="rtl"] .views-display-setting .views-ajax-link {
+  float: right;
+}
+.form-item-options-value-all {
+  display: none;
+}
+.js-only {
+  display: none;
+}
+html.js .js-only {
+  display: inherit;
+}
+html.js span.js-only {
+  display: inline;
+}
+.js .views-edit-view .dropbutton-wrapper {
+  width: auto;
+}
diff --git a/core/themes/stable9/css/views_ui/views_ui.admin.theme.css b/core/themes/stable9/css/views_ui/views_ui.admin.theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..dd988dfe99d22da98e85a5d00711b4e681e58ac6
--- /dev/null
+++ b/core/themes/stable9/css/views_ui/views_ui.admin.theme.css
@@ -0,0 +1,850 @@
+/**
+ * @file
+ * The .admin.theme.css file is intended to contain presentation declarations
+ * including images, borders, colors, and fonts.
+ */
+
+.views-admin .links {
+  margin: 0;
+  list-style: none outside none;
+}
+.views-admin a:hover {
+  text-decoration: none;
+}
+.box-padding {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+.box-margin {
+  margin: 12px 12px 0 12px;
+}
+.views-admin .icon {
+  width: 16px;
+  height: 16px;
+}
+.views-admin .icon,
+.views-admin .icon-text {
+  background-image: url(../../../../modules/views_ui/images/sprites.png);
+  background-repeat: no-repeat;
+  background-attachment: scroll;
+  background-position: left top; /* LTR */
+}
+[dir="rtl"] .views-admin .icon,
+[dir="rtl"] .views-admin .icon-text {
+  background-position: right top;
+}
+.views-admin a.icon {
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  background: linear-gradient(-90deg, #fff 0, #e8e8e8 100%) no-repeat, repeat-y;
+  box-shadow: 0 0 0 rgba(0, 0, 0, 0.3333) inset;
+}
+.views-admin a.icon:hover {
+  border-color: #d0d0d0;
+  box-shadow: 0 0 1px rgba(0, 0, 0, 0.3333) inset;
+}
+.views-admin a.icon:active {
+  border-color: #c0c0c0;
+}
+.views-admin span.icon {
+  position: relative;
+  float: left; /* LTR */
+}
+[dir="rtl"] .views-admin span.icon {
+  float: right;
+}
+.views-admin .icon.compact {
+  display: block;
+  overflow: hidden;
+  text-indent: -9999px;
+  direction: ltr;
+}
+
+/* Targets any element with an icon -> text combo */
+.views-admin .icon-text {
+  padding-left: 19px; /* LTR */
+}
+[dir="rtl"] .views-admin .icon-text {
+  padding-right: 19px;
+  padding-left: 0;
+}
+.views-admin .icon.linked {
+  background-position: center -153px;
+}
+.views-admin .icon.unlinked {
+  background-position: center -195px;
+}
+.views-admin .icon.add {
+  background-position: center 3px;
+}
+.views-admin a.icon.add {
+  background-position: center 3px, left top; /* LTR */
+}
+[dir="rtl"] .views-admin a.icon.add {
+  background-position: center 3px, right top;
+}
+.views-admin .icon.delete {
+  background-position: center -52px;
+}
+.views-admin a.icon.delete {
+  background-position: center -52px, left top; /* LTR */
+}
+[dir="rtl"] .views-admin a.icon.delete {
+  background-position: center -52px, right top;
+}
+.views-admin .icon.rearrange {
+  background-position: center -111px;
+}
+.views-admin a.icon.rearrange {
+  background-position: center -111px, left top; /* LTR */
+}
+[dir="rtl"] .views-admin a.icon.rearrange {
+  background-position: center -111px, right top;
+}
+.views-displays .tabs a:hover > .icon.add {
+  background-position: center -25px;
+}
+.views-displays .tabs .open a:hover > .icon.add {
+  background-position: center 3px;
+}
+details.box-padding {
+  border: none;
+}
+.views-admin details details {
+  margin-bottom: 0;
+}
+.form-item {
+  margin-top: 9px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.form-type-checkbox {
+  margin-top: 6px;
+}
+.form-checkbox,
+.form-radio {
+  vertical-align: baseline;
+}
+
+.container-inline {
+  padding-top: 15px;
+  padding-bottom: 15px;
+}
+.container-inline > * + *,
+.container-inline .details-wrapper > * + * {
+  padding-left: 4px; /* LTR */
+}
+[dir="rtl"] .container-inline > * + *,
+[dir="rtl"] .container-inline .details-wrapper > * + * {
+  padding-right: 4px;
+  padding-left: 0;
+}
+.views-admin details details.container-inline {
+  margin-top: 1em;
+  margin-bottom: 1em;
+  padding-top: 0;
+}
+.views-admin details details.container-inline > .details-wrapper {
+  padding-bottom: 0;
+}
+/* Indent form elements so they're directly underneath the label of the checkbox that reveals them */
+.views-admin .form-type-checkbox + .form-wrapper {
+  margin-left: 16px; /* LTR */
+}
+[dir="rtl"] .views-admin .form-type-checkbox + .form-wrapper {
+  margin-right: 16px;
+  margin-left: 0;
+}
+
+/* Hide 'remove' checkboxes. */
+.views-remove-checkbox {
+  display: none;
+}
+
+/* sizes the labels of checkboxes and radio button to the height of the text */
+.views-admin .form-type-checkbox label,
+.views-admin .form-type-radio label {
+  line-height: 2;
+}
+.views-admin-dependent .form-item {
+  margin-top: 6px;
+  margin-bottom: 6px;
+}
+.views-ui-view-name h3 {
+  margin: 0.25em 0;
+  font-weight: bold;
+}
+.view-changed {
+  margin-bottom: 21px;
+}
+.views-admin .unit-title {
+  margin-top: 18px;
+  margin-bottom: 0;
+  font-size: 15px;
+  line-height: 1.6154;
+}
+.views-ui-view-displays ul {
+  margin-left: 0; /* LTR */
+  padding-left: 0; /* LTR */
+  list-style: none;
+}
+[dir="rtl"] .views-ui-view-displays ul {
+  margin-right: 0;
+  margin-left: inherit;
+  padding-right: 0;
+  padding-left: inherit;
+}
+
+/* These header classes are ambiguous and should be scoped to th elements */
+.views-ui-name {
+  width: 20%;
+}
+.views-ui-description {
+  width: 30%;
+}
+.views-ui-machine-name {
+  width: 15%;
+}
+.views-ui-displays {
+  width: 25%;
+}
+.views-ui-operations {
+  width: 10%;
+}
+
+/**
+ * I wish this didn't have to be so specific
+ */
+.form-item-description-enable + .form-item-description {
+  margin-top: 0;
+}
+.form-item-description-enable label {
+  font-weight: bold;
+}
+.form-item-page-create,
+.form-item-block-create {
+  margin-top: 13px;
+}
+.form-item-page-create label,
+.form-item-block-create label,
+.form-item-rest-export-create label {
+  font-weight: bold;
+}
+
+/* This makes the form elements after the "Display Format" label flow underneath the label */
+.form-item-page-style-style-plugin > label,
+.form-item-block-style-style-plugin > label {
+  display: block;
+}
+.views-attachment .options-set label {
+  font-weight: normal;
+}
+
+/* Styling for the form that allows views filters to be rearranged. */
+.group-populated {
+  display: none;
+}
+td.group-title {
+  font-weight: bold;
+}
+.views-ui-dialog td.group-title {
+  margin: 0;
+  padding: 0;
+}
+.views-ui-dialog td.group-title span {
+  display: block;
+  overflow: hidden;
+  height: 1px;
+}
+.group-message .form-submit,
+.views-remove-group-link,
+.views-add-group {
+  float: right; /* LTR */
+  clear: both;
+}
+[dir="rtl"] .group-message .form-submit,
+[dir="rtl"] .views-remove-group-link,
+[dir="rtl"] .views-add-group {
+  float: left;
+}
+.views-operator-label {
+  padding-left: 0.5em; /* LTR */
+  text-transform: uppercase;
+  font-weight: bold;
+  font-style: italic;
+}
+[dir="rtl"] .views-operator-label {
+  padding-right: 0.5em;
+  padding-left: 0;
+}
+.grouped-description,
+.exposed-description {
+  float: left; /* LTR */
+  padding-top: 3px;
+  padding-right: 10px; /* LTR */
+}
+[dir="rtl"] .grouped-description,
+[dir="rtl"] .exposed-description {
+  float: right;
+  padding-right: 0;
+  padding-left: 10px;
+}
+.views-displays {
+  padding-bottom: 36px;
+  border: 1px solid #ccc;
+}
+.views-display-top {
+  position: relative;
+  padding: 8px 8px 3px;
+  border-bottom: 1px solid #ccc;
+  background-color: #e1e2dc;
+}
+.views-display-top .tabs {
+  margin-right: 18em; /* LTR */
+}
+[dir="rtl"] .views-display-top .tabs {
+  margin-right: 0;
+  margin-left: 18em;
+}
+.views-display-top .tabs > li {
+  margin-right: 6px; /* LTR */
+  padding-left: 0; /* LTR */
+}
+[dir="rtl"] .views-display-top .tabs > li {
+  margin-right: 0.3em;
+  margin-left: 6px;
+  padding-right: 0;
+}
+.views-display-top .tabs > li:last-child {
+  margin-right: 0; /* LTR */
+}
+[dir="rtl"] .views-display-top .tabs > li:last-child {
+  margin-right: 0.3em;
+  margin-left: 0;
+}
+.form-edit .form-actions {
+  margin-top: 0;
+  padding: 8px 12px;
+  border-right: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+  background-color: #e1e2dc;
+}
+.views-displays .tabs.secondary {
+  margin-right: 200px; /* LTR */
+  border: 0;
+}
+[dir="rtl"] .views-displays .tabs.secondary {
+  margin-right: 0;
+  margin-left: 200px;
+}
+.views-displays .tabs.secondary li,
+.views-displays .tabs.secondary li.is-active {
+  width: auto;
+  padding: 0;
+  border: 0;
+  background: transparent;
+}
+.views-displays .tabs li.add ul.action-list li {
+  margin: 0;
+}
+.views-displays .tabs.secondary li {
+  margin: 0 5px 5px 6px; /* LTR */
+}
+[dir="rtl"] .views-displays .tabs.secondary li {
+  margin-right: 6px;
+  margin-left: 5px;
+}
+.views-displays .tabs.secondary .tabs__tab + .tabs__tab {
+  border-top: 0;
+}
+.views-displays .tabs li.tabs__tab:hover {
+  padding-left: 0; /* LTR */
+  border: 0;
+}
+[dir="rtl"] .views-displays .tabs li.tabs__tab:hover {
+  padding-right: 0;
+}
+.views-displays .tabs.secondary a {
+  display: inline-block;
+  padding: 3px 7px;
+  border: 1px solid #cbcbcb;
+  border-radius: 7px;
+  font-size: small;
+  line-height: 1.3333;
+}
+
+/* Display a red border if the display doesn't validate. */
+.views-displays .tabs li.is-active a.is-active.error,
+.views-displays .tabs .error {
+  padding: 1px 6px;
+  border: 2px solid #ed541d;
+}
+.views-displays .tabs a:focus {
+  text-decoration: underline;
+  outline: none;
+}
+.views-displays .tabs.secondary li a {
+  background-color: #fff;
+}
+.views-displays .tabs li a:hover,
+.views-displays .tabs li.is-active a,
+.views-displays .tabs li.is-active a.is-active {
+  color: #fff;
+  background-color: #555;
+}
+.views-displays .tabs .open > a {
+  position: relative;
+  border-bottom: 1px solid transparent;
+  background-color: #f1f1f1;
+}
+.views-displays .tabs .open > a:hover {
+  color: #0074bd;
+  background-color: #f1f1f1;
+}
+.views-displays .tabs .action-list li {
+  padding: 2px 9px;
+  border-width: 0 1px;
+  border-style: solid;
+  border-color: #cbcbcb;
+  background-color: #f1f1f1;
+}
+.views-displays .tabs .action-list li:first-child {
+  border-width: 1px 1px 0;
+}
+.views-displays .action-list li:last-child {
+  border-width: 0 1px 1px;
+}
+.views-displays .tabs .action-list li:last-child {
+  border-width: 0 1px 1px;
+}
+.views-displays .tabs .action-list input.form-submit {
+  margin: 0;
+  padding: 0;
+  border: medium none;
+  background: none repeat scroll 0 0 transparent;
+}
+.views-displays .tabs .action-list input.form-submit:hover {
+  box-shadow: none;
+}
+.views-displays .tabs .action-list li:hover {
+  background-color: #ddd;
+}
+.edit-display-settings {
+  margin: 12px 12px 0 12px;
+}
+.edit-display-settings-top.views-ui-display-tab-bucket {
+  position: relative;
+  margin: 0 0 15px 0;
+  padding-top: 4px;
+  padding-bottom: 4px;
+  border: 1px solid #f3f3f3;
+  line-height: 20px;
+}
+.views-display-column {
+  border: 1px solid #f3f3f3;
+}
+.views-display-column + .views-display-column {
+  margin-top: 0;
+}
+.view-preview-form .form-item-view-args,
+.view-preview-form .form-actions {
+  margin-top: 5px;
+}
+.view-preview-form .arguments-preview {
+  font-size: 1em;
+}
+.view-preview-form .arguments-preview,
+.view-preview-form .form-item-view-args {
+  margin-left: 10px; /* LTR */
+}
+[dir="rtl"] .view-preview-form .arguments-preview,
+[dir="rtl"] .view-preview-form .form-item-view-args {
+  margin-right: 10px;
+  margin-left: 0;
+}
+.view-preview-form .form-item-view-args label {
+  float: left; /* LTR */
+  height: 6ex;
+  margin-right: 0.75em; /* LTR */
+  font-weight: normal;
+}
+[dir="rtl"] .view-preview-form .form-item-view-args label {
+  float: right;
+  margin-right: 0.2em;
+  margin-left: 0.75em;
+}
+.form-item-live-preview,
+.form-item-view-args,
+.preview-submit-wrapper {
+  display: inline-block;
+}
+.form-item-live-preview,
+.view-preview-form .form-actions {
+  vertical-align: top;
+}
+
+@media screen and (min-width: 45em) { /* 720px */
+  .view-preview-form .form-type-textfield .description {
+    white-space: nowrap;
+  }
+}
+
+/* These are the individual "buckets," or boxes, inside the display settings area */
+.views-ui-display-tab-bucket {
+  position: relative;
+  margin: 0;
+  padding-top: 4px;
+  border-bottom: 1px solid #f3f3f3;
+  line-height: 20px;
+}
+.views-ui-display-tab-bucket:last-of-type {
+  border-bottom: none;
+}
+.views-ui-display-tab-bucket + .views-ui-display-tab-bucket {
+  border-top: medium none;
+}
+.views-ui-display-tab-bucket__title,
+.views-ui-display-tab-bucket > .views-display-setting {
+  padding: 2px 6px 4px;
+}
+.views-ui-display-tab-bucket__title {
+  margin: 0;
+  font-size: small;
+}
+.views-ui-display-tab-bucket.access {
+  padding-top: 0;
+}
+.views-ui-display-tab-bucket.page-settings {
+  border-bottom: medium none;
+}
+.views-display-setting .views-ajax-link {
+  margin-right: 0.2083em;
+  margin-left: 0.2083em;
+}
+
+.views-ui-display-tab-setting > span {
+  margin-left: 0.5em; /* LTR */
+}
+[dir="rtl"] .views-ui-display-tab-setting > span {
+  margin-right: 0.5em;
+  margin-left: 0;
+}
+
+/** Applies an overridden(italics) font style to overridden buckets.
+ * The better way to implement this would be to add the overridden class
+ * to the bucket header when the bucket is overridden and style it as a
+ * generic icon classed element. For the moment, we'll style the bucket
+ * header specifically with the overridden font style.
+ */
+.views-ui-display-tab-setting.overridden,
+.views-ui-display-tab-bucket.overridden .views-ui-display-tab-bucket__title {
+  font-style: italic;
+}
+
+/* This is each row within one of the "boxes." */
+.views-ui-display-tab-bucket .views-display-setting {
+  padding-bottom: 2px;
+  color: #666;
+  font-size: 12px;
+}
+.views-ui-display-tab-bucket .views-display-setting:nth-of-type(even) {
+  background-color: #f3f5ee;
+}
+.views-ui-display-tab-actions.views-ui-display-tab-bucket .views-display-setting {
+  background-color: transparent;
+}
+.views-ui-display-tab-bucket .views-group-text {
+  margin-top: 6px;
+  margin-bottom: 6px;
+}
+.views-display-setting .label {
+  margin-right: 3px; /* LTR */
+}
+[dir="rtl"] .views-display-setting .label {
+  margin-right: 0;
+  margin-left: 3px;
+}
+.views-edit-view {
+  margin-bottom: 15px;
+}
+
+/* The contents of the popup dialog on the views edit form. */
+.views-filterable-options .form-type-checkbox {
+  padding: 5px 8px;
+  border-top: none;
+}
+.views-filterable-options {
+  border-top: 1px solid #ccc;
+}
+.filterable-option .form-item {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.views-filterable-options .filterable-option .title {
+  cursor: pointer;
+  font-weight: bold;
+}
+.views-filterable-options .form-type-checkbox .description {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.views-filterable-options-controls .form-item {
+  width: 30%;
+  margin: 0 0 0 2%; /* LTR */
+}
+[dir="rtl"] .views-filterable-options-controls .form-item {
+  margin: 0 2% 0 0;
+}
+.views-filterable-options-controls input,
+.views-filterable-options-controls select {
+  width: 100%;
+}
+.views-ui-dialog .ui-dialog-content {
+  padding: 0;
+}
+.views-ui-dialog .views-filterable-options {
+  margin-bottom: 10px;
+}
+.views-ui-dialog .views-add-form-selected.container-inline {
+  padding: 0;
+}
+.views-ui-dialog .views-add-form-selected.container-inline > div {
+  display: block;
+}
+.views-ui-dialog .form-item-selected {
+  margin: 0;
+  padding: 6px 16px;
+}
+.views-ui-dialog .views-override:not(:empty) {
+  padding: 8px 13px;
+  background-color: #f3f4ee;
+}
+.views-ui-dialog.views-ui-dialog-scroll .ui-dialog-titlebar {
+  border: none;
+}
+.views-ui-dialog .views-offset-top {
+  border-bottom: 1px solid #ccc;
+}
+.views-ui-dialog .views-offset-bottom {
+  border-top: 1px solid #ccc;
+}
+.views-ui-dialog .views-override > * {
+  margin: 0;
+}
+.views-ui-dialog .views-progress-indicator {
+  position: absolute;
+  top: 32px;
+  right: 10px; /* LTR */
+  color: #fff;
+  font-size: 11px;
+}
+[dir="rtl"] .views-ui-dialog .views-progress-indicator {
+  right: auto;
+  left: 10px;
+}
+.views-ui-dialog .views-progress-indicator:before {
+  content: "\003C\00A0";
+}
+.views-ui-dialog .views-progress-indicator:after {
+  content: "\00A0\003E";
+}
+.views-ui-dialog details .item-list {
+  padding-left: 2em; /* LTR */
+}
+[dir="rtl"] .views-ui-dialog details .item-list {
+  padding-right: 2em;
+  padding-left: 0;
+}
+.views-ui-rearrange-filter-form table {
+  border-collapse: collapse;
+}
+.views-ui-rearrange-filter-form tr td[rowspan] {
+  border-width: 0 1px 1px 1px;
+  border-style: solid;
+  border-color: #cdcdcd;
+}
+.views-ui-rearrange-filter-form tr[id^="views-row"] {
+  border-right: 1px solid #cdcdcd; /* LTR */
+}
+[dir="rtl"] .views-ui-rearrange-filter-form tr[id^="views-row"] {
+  border-right: 0;
+  border-left: 1px solid #cdcdcd;
+}
+.views-ui-rearrange-filter-form .even td {
+  background-color: #f3f4ed;
+}
+.views-ui-rearrange-filter-form .views-group-title {
+  border-top: 1px solid #cdcdcd;
+}
+.views-ui-rearrange-filter-form .group-empty {
+  border-bottom: 1px solid #cdcdcd;
+}
+.form-item-options-expose-required,
+.form-item-options-expose-label,
+.form-item-options-expose-description {
+  margin-top: 6px;
+  margin-bottom: 6px;
+  margin-left: 18px; /* LTR */
+}
+[dir="rtl"] .form-item-options-expose-required,
+[dir="rtl"] .form-item-options-expose-label,
+[dir="rtl"] .form-item-options-expose-description {
+  margin-right: 18px;
+  margin-left: 0;
+}
+.views-preview-wrapper {
+  border: 1px solid #ccc;
+}
+.view-preview-form {
+  position: relative;
+}
+.view-preview-form__title {
+  margin-top: 0;
+  padding: 8px 12px;
+  border-bottom: 1px solid #ccc;
+  background-color: #e1e2dc;
+}
+.view-preview-form .form-item-live-preview {
+  position: absolute;
+  top: 3px;
+  right: 12px;
+  margin-top: 2px;
+  margin-left: 2px; /* LTR */
+}
+[dir="rtl"] .view-preview-form .form-item-live-preview {
+  right: auto;
+  left: 12px;
+  margin-right: 2px;
+  margin-left: 0;
+}
+.views-live-preview {
+  padding: 12px;
+}
+.views-live-preview .views-query-info {
+  overflow: auto;
+}
+.views-live-preview .section-title {
+  display: inline-block;
+  margin-top: 0;
+  margin-bottom: 0;
+  color: #818181;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1.6154;
+}
+.views-live-preview .view > * {
+  margin-top: 18px;
+}
+.views-live-preview .preview-section {
+  margin: 0 -5px;
+  padding: 3px 5px;
+  border: 1px dashed #dedede;
+}
+.views-live-preview li.views-row + li.views-row {
+  margin-top: 18px;
+}
+
+/* The div.views-row is intentional and excludes li.views-row, for example */
+.views-live-preview div.views-row + div.views-row {
+  margin-top: 36px;
+}
+.views-query-info table {
+  margin: 10px 0;
+  border-spacing: 0;
+  border-collapse: separate;
+  border-color: #ddd;
+}
+.views-query-info table tr {
+  background-color: #f9f9f9;
+}
+.views-query-info table th,
+.views-query-info table td {
+  padding: 4px 10px;
+  color: #666;
+}
+.messages {
+  margin-bottom: 18px;
+  line-height: 1.4555;
+}
+.dropbutton-multiple {
+  position: absolute;
+}
+.dropbutton-widget {
+  position: relative;
+}
+.js .views-edit-view .dropbutton-wrapper .dropbutton .dropbutton-action > * {
+  font-size: 10px;
+}
+.js .dropbutton-wrapper .dropbutton .dropbutton-action > .ajax-progress-throbber {
+  position: absolute;
+  z-index: 2;
+  top: -1px;
+  right: -5px; /* LTR */
+}
+[dir="rtl"].js .dropbutton-wrapper .dropbutton .dropbutton-action > .ajax-progress-throbber {
+  right: auto;
+  left: -5px;
+}
+.js .dropbutton-wrapper.dropbutton-multiple.open .dropbutton-action:first-child a {
+  border-radius: 1.1em 0 0 0; /* LTR */
+}
+[dir="rtl"].js .dropbutton-wrapper.dropbutton-multiple.open .dropbutton-action:first-child a {
+  border-radius: 0 1.1em 0 0;
+}
+.js .dropbutton-wrapper.dropbutton-multiple.open .dropbutton-action:last-child a {
+  border-radius: 0 0 0 1.1em; /* LTR */
+}
+[dir="rtl"].js .dropbutton-wrapper.dropbutton-multiple.open .dropbutton-action:last-child a {
+  border-radius: 0 0 1.1em 0;
+}
+.views-display-top .dropbutton-wrapper {
+  position: absolute;
+  top: 7px;
+  right: 12px; /* LTR */
+}
+[dir="rtl"] .views-display-top .dropbutton-wrapper {
+  right: auto;
+  left: 12px;
+}
+.views-display-top .dropbutton-wrapper .dropbutton-widget .dropbutton-action a {
+  width: auto;
+}
+
+.views-ui-display-tab-bucket .dropbutton-wrapper {
+  position: absolute;
+  top: 4px;
+  right: 5px; /* LTR */
+}
+[dir="rtl"] .views-ui-display-tab-bucket .dropbutton-wrapper {
+  right: auto;
+  left: 5px;
+}
+.views-ui-display-tab-bucket .dropbutton-wrapper .dropbutton-widget .dropbutton-action a {
+  width: auto;
+}
+.views-ui-display-tab-actions .dropbutton-wrapper li a,
+.views-ui-display-tab-actions .dropbutton-wrapper input {
+  margin-bottom: 0;
+  padding-left: 12px; /* LTR */
+  border: medium;
+  background: none;
+  font-family: inherit;
+  font-size: 12px;
+}
+[dir="rtl"] .views-ui-display-tab-actions .dropbutton-wrapper li a,
+[dir="rtl"] .views-ui-display-tab-actions .dropbutton-wrapper input {
+  padding-right: 12px;
+  padding-left: 0.5em;
+}
+.views-ui-display-tab-actions .dropbutton-wrapper input:hover {
+  border: none;
+  background: none;
+}
+.views-list-section {
+  margin-bottom: 2em;
+}
+.form-textarea-wrapper,
+.form-item-options-content {
+  width: 100%;
+}
diff --git a/core/themes/stable9/css/views_ui/views_ui.contextual.css b/core/themes/stable9/css/views_ui/views_ui.contextual.css
new file mode 100644
index 0000000000000000000000000000000000000000..35c0d166cd70c39d344f28902282b6c53cb8e614
--- /dev/null
+++ b/core/themes/stable9/css/views_ui/views_ui.contextual.css
@@ -0,0 +1,57 @@
+/**
+ * @file
+ * The .contextual.css file is intended to contain styles that override declarations
+ * in the Contextual module.
+ */
+
+.views-live-preview .contextual-region-active {
+  outline: medium none;
+}
+.views-live-preview .contextual {
+  top: auto;
+  right: auto; /* LTR */
+}
+[dir="rtl"] .views-live-preview .contextual {
+  left: auto;
+}
+.js .views-live-preview .contextual {
+  display: inline;
+}
+.views-live-preview .contextual-links-trigger {
+  display: block;
+}
+.contextual .contextual-links {
+  right: auto; /* LTR */
+  min-width: 10em;
+  padding: 6px 6px 9px 6px;
+  border-radius: 0 4px 4px 4px; /* LTR */
+}
+[dir="rtl"] .contextual .contextual-links {
+  left: auto;
+  border-radius: 4px 0 4px 4px;
+}
+.contextual-links li a,
+.contextual-links li span {
+  padding-top: 0.25em;
+  padding-right: 0.1667em; /* LTR */
+  padding-bottom: 0.25em;
+}
+[dir="rtl"] .contextual-links li a,
+[dir="rtl"] .contextual-links li span {
+  padding-right: 0;
+  padding-left: 0.1667em;
+}
+.contextual-links li span {
+  font-weight: bold;
+}
+.contextual-links li a {
+  margin: 0.25em 0;
+  padding-left: 1em; /* LTR */
+}
+[dir="rtl"] .contextual-links li a {
+  padding-right: 1em;
+  padding-left: 0.1667em;
+}
+.contextual-links li a:hover {
+  background-color: #badbec;
+}
diff --git a/core/themes/stable9/images/README.txt b/core/themes/stable9/images/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3a817fa2ed37fe923138bd72539da9068c12b150
--- /dev/null
+++ b/core/themes/stable9/images/README.txt
@@ -0,0 +1,6 @@
+WHAT IS THIS DIRECTORY FOR?
+--------------------------------
+To provide backwards compatibility support for images used by Stable. If an
+image consumed by Stable changes, the original version of the image is copied
+to this directory. Any Stable CSS files referencing the image will be refactored
+to request the original version copied here.
diff --git a/core/themes/stable9/layouts/layout_builder/fourcol_section/fourcol_section.css b/core/themes/stable9/layouts/layout_builder/fourcol_section/fourcol_section.css
new file mode 100644
index 0000000000000000000000000000000000000000..de1f3f87f39625074f3af7435faa07680d966a9d
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_builder/fourcol_section/fourcol_section.css
@@ -0,0 +1,19 @@
+/*
+ * @file
+ * Provides the layout styles for four-column layout section.
+ */
+
+.layout--fourcol-section {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--fourcol-section > .layout__region {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--fourcol-section > .layout__region {
+    flex: 0 1 25%;
+  }
+}
diff --git a/core/themes/stable9/layouts/layout_builder/fourcol_section/layout--fourcol-section.html.twig b/core/themes/stable9/layouts/layout_builder/fourcol_section/layout--fourcol-section.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e610278c45e09482feffbc73bb81d2c54b384a8b
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_builder/fourcol_section/layout--fourcol-section.html.twig
@@ -0,0 +1,45 @@
+{#
+/**
+ * @file
+ * Theme override for a four-column 25%-25%-25%-25% layout.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--fourcol-section',
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+
+    {% if content.first %}
+      <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}>
+        {{ content.first }}
+      </div>
+    {% endif %}
+
+    {% if content.second %}
+      <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}>
+        {{ content.second }}
+      </div>
+    {% endif %}
+
+    {% if content.third %}
+      <div {{ region_attributes.third.addClass('layout__region', 'layout__region--third') }}>
+        {{ content.third }}
+      </div>
+    {% endif %}
+
+    {% if content.fourth %}
+      <div {{ region_attributes.fourth.addClass('layout__region', 'layout__region--fourth') }}>
+        {{ content.fourth }}
+      </div>
+    {% endif %}
+
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_builder/threecol_section/layout--threecol-section.html.twig b/core/themes/stable9/layouts/layout_builder/threecol_section/layout--threecol-section.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..123acfec3e6009225b117493350bacf3b21634c7
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_builder/threecol_section/layout--threecol-section.html.twig
@@ -0,0 +1,33 @@
+{#
+/**
+ * @file
+ * Theme override for a three-column layout.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+
+    {% if content.first %}
+      <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}>
+        {{ content.first }}
+      </div>
+    {% endif %}
+
+    {% if content.second %}
+      <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}>
+        {{ content.second }}
+      </div>
+    {% endif %}
+
+    {% if content.third %}
+      <div {{ region_attributes.third.addClass('layout__region', 'layout__region--third') }}>
+        {{ content.third }}
+      </div>
+    {% endif %}
+
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_builder/threecol_section/threecol_section.css b/core/themes/stable9/layouts/layout_builder/threecol_section/threecol_section.css
new file mode 100644
index 0000000000000000000000000000000000000000..49b5578bfc3cab7492a084d98599b394d14b4a11
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_builder/threecol_section/threecol_section.css
@@ -0,0 +1,36 @@
+/*
+ * @file
+ * Provides the layout styles for three-column layout section.
+ */
+
+.layout--threecol-section {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--threecol-section > .layout__region {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--threecol-section--25-50-25 > .layout__region--first,
+  .layout--threecol-section--25-50-25 > .layout__region--third,
+  .layout--threecol-section--25-25-50 > .layout__region--first,
+  .layout--threecol-section--25-25-50 > .layout__region--second,
+  .layout--threecol-section--50-25-25 > .layout__region--second,
+  .layout--threecol-section--50-25-25 > .layout__region--third {
+    flex: 0 1 25%;
+  }
+  .layout--threecol-section--25-50-25 > .layout__region--second,
+  .layout--threecol-section--25-25-50 > .layout__region--third,
+  .layout--threecol-section--50-25-25 > .layout__region--first {
+    flex: 0 1 50%;
+  }
+  .layout--threecol-section--33-34-33 > .layout__region--first,
+  .layout--threecol-section--33-34-33 > .layout__region--third {
+    flex: 0 1 33%;
+  }
+  .layout--threecol-section--33-34-33 > .layout__region--second {
+    flex: 0 1 34%;
+  }
+}
diff --git a/core/themes/stable9/layouts/layout_builder/twocol_section/layout--twocol-section.html.twig b/core/themes/stable9/layouts/layout_builder/twocol_section/layout--twocol-section.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d047debe53c34da45207f691b24d67c6d01795a7
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_builder/twocol_section/layout--twocol-section.html.twig
@@ -0,0 +1,27 @@
+{#
+/**
+ * @file
+ * Theme override to display a two-column layout.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{% if content %}
+  <div{{ attributes }}>
+
+    {% if content.first %}
+      <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}>
+        {{ content.first }}
+      </div>
+    {% endif %}
+
+    {% if content.second %}
+      <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}>
+        {{ content.second }}
+      </div>
+    {% endif %}
+
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_builder/twocol_section/twocol_section.css b/core/themes/stable9/layouts/layout_builder/twocol_section/twocol_section.css
new file mode 100644
index 0000000000000000000000000000000000000000..0d212233508e58adab640bf0531e68ed1a8f811c
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_builder/twocol_section/twocol_section.css
@@ -0,0 +1,40 @@
+/*
+ * @file
+ * Provides the layout styles for two-column layout section.
+ */
+
+.layout--twocol-section {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--twocol-section > .layout__region {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--twocol-section.layout--twocol-section--50-50 > .layout__region--first,
+  .layout--twocol-section.layout--twocol-section--50-50 > .layout__region--second {
+    flex: 0 1 50%;
+  }
+
+  .layout--twocol-section.layout--twocol-section--33-67 > .layout__region--first,
+  .layout--twocol-section.layout--twocol-section--67-33 > .layout__region--second {
+    flex: 0 1 33%;
+  }
+
+  .layout--twocol-section.layout--twocol-section--33-67 > .layout__region--second,
+  .layout--twocol-section.layout--twocol-section--67-33 > .layout__region--first {
+    flex: 0 1 67%;
+  }
+
+  .layout--twocol-section.layout--twocol-section--25-75 > .layout__region--first,
+  .layout--twocol-section.layout--twocol-section--75-25 > .layout__region--second {
+    flex: 0 1 25%;
+  }
+
+  .layout--twocol-section.layout--twocol-section--25-75 > .layout__region--second,
+  .layout--twocol-section.layout--twocol-section--75-25 > .layout__region--first {
+    flex: 0 1 75%;
+  }
+}
diff --git a/core/themes/stable9/layouts/layout_discovery/onecol/layout--onecol.html.twig b/core/themes/stable9/layouts/layout_discovery/onecol/layout--onecol.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7fe5b121ca8f82b6b6cbe5097fec58fb74202877
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/onecol/layout--onecol.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override to display a one-column layout.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--onecol',
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+    <div {{ region_attributes.content.addClass('layout__region', 'layout__region--content') }}>
+      {{ content.content }}
+    </div>
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_discovery/onecol/onecol.css b/core/themes/stable9/layouts/layout_discovery/onecol/onecol.css
new file mode 100644
index 0000000000000000000000000000000000000000..e2283c5888777d1cf83450173b73ddc4c0d1f73a
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/onecol/onecol.css
@@ -0,0 +1,7 @@
+/*
+ * @file
+ * Provides the layout styles for layout_onecol.
+ */
+.layout--onecol .layout__region {
+  width: 100%;
+}
diff --git a/core/themes/stable9/layouts/layout_discovery/threecol_25_50_25/layout--threecol-25-50-25.html.twig b/core/themes/stable9/layouts/layout_discovery/threecol_25_50_25/layout--threecol-25-50-25.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..715470bd061a21c101cbf0250fa6d099a128b306
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/threecol_25_50_25/layout--threecol-25-50-25.html.twig
@@ -0,0 +1,52 @@
+{#
+/**
+ * @file
+ * Theme override for a three column layout.
+ *
+ * This template provides a three column 25%-50%-25% display layout, with
+ * additional areas for the top and the bottom.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--threecol-25-50-25',
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if content.top %}
+      <div {{ region_attributes.top.addClass('layout__region', 'layout__region--top') }}>
+        {{ content.top }}
+      </div>
+    {% endif %}
+
+    {% if content.first %}
+      <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}>
+        {{ content.first }}
+      </div>
+    {% endif %}
+
+    {% if content.second %}
+      <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}>
+        {{ content.second }}
+      </div>
+    {% endif %}
+
+    {% if content.third %}
+      <div {{ region_attributes.third.addClass('layout__region', 'layout__region--third') }}>
+        {{ content.third }}
+      </div>
+    {% endif %}
+
+    {% if content.bottom %}
+      <div {{ region_attributes.bottom.addClass('layout__region', 'layout__region--bottom') }}>
+        {{ content.bottom }}
+      </div>
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_discovery/threecol_25_50_25/threecol_25_50_25.css b/core/themes/stable9/layouts/layout_discovery/threecol_25_50_25/threecol_25_50_25.css
new file mode 100644
index 0000000000000000000000000000000000000000..bcbf766bb44b13f3e1fc9eff631889f7d03edcfb
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/threecol_25_50_25/threecol_25_50_25.css
@@ -0,0 +1,23 @@
+/*
+ * @file
+ * Provides the layout styles for layout_threecol_25_50_25.
+ */
+.layout--threecol-25-50-25 {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--threecol-25-50-25 > .layout__region,
+.layout--threecol-25-50-25 > .layout__region--second {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--threecol-25-50-25 > .layout__region--first,
+  .layout--threecol-25-50-25 > .layout__region--third {
+    flex: 0 1 25%;
+  }
+  .layout--threecol-25-50-25 > .layout__region--second {
+    flex: 0 1 50%;
+  }
+}
diff --git a/core/themes/stable9/layouts/layout_discovery/threecol_33_34_33/layout--threecol-33-34-33.html.twig b/core/themes/stable9/layouts/layout_discovery/threecol_33_34_33/layout--threecol-33-34-33.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f0a541d495818427b593345729133cab82d91b12
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/threecol_33_34_33/layout--threecol-33-34-33.html.twig
@@ -0,0 +1,52 @@
+{#
+/**
+ * @file
+ * Theme override for a three column layout.
+ *
+ * This template provides a three column 33%-34%-33% display layout, with
+ * additional areas for the top and the bottom.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--threecol-33-34-33',
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if content.top %}
+      <div {{ region_attributes.top.addClass('layout__region', 'layout__region--top') }}>
+        {{ content.top }}
+      </div>
+    {% endif %}
+
+    {% if content.first %}
+      <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}>
+        {{ content.first }}
+      </div>
+    {% endif %}
+
+    {% if content.second %}
+      <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}>
+        {{ content.second }}
+      </div>
+    {% endif %}
+
+    {% if content.third %}
+      <div {{ region_attributes.third.addClass('layout__region', 'layout__region--third') }}>
+        {{ content.third }}
+      </div>
+    {% endif %}
+
+    {% if content.bottom %}
+      <div {{ region_attributes.bottom.addClass('layout__region', 'layout__region--bottom') }}>
+        {{ content.bottom }}
+      </div>
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_discovery/threecol_33_34_33/threecol_33_34_33.css b/core/themes/stable9/layouts/layout_discovery/threecol_33_34_33/threecol_33_34_33.css
new file mode 100644
index 0000000000000000000000000000000000000000..afca9c33f5a945b04120895cbb4b07fce4670b8f
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/threecol_33_34_33/threecol_33_34_33.css
@@ -0,0 +1,23 @@
+/*
+ * @file
+ * Provides the layout styles for layout_threecol_33_34_33.
+ */
+
+.layout--threecol-33-34-33 {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--threecol-33-34-33 > .layout__region {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--threecol-33-34-33 > .layout__region--first,
+  .layout--threecol-33-34-33 > .layout__region--third {
+    flex: 0 1 33%;
+  }
+  .layout--threecol-33-34-33 > .layout__region--second {
+    flex: 0 1 34%;
+  }
+}
diff --git a/core/themes/stable9/layouts/layout_discovery/twocol/layout--twocol.html.twig b/core/themes/stable9/layouts/layout_discovery/twocol/layout--twocol.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4de66f048958db290f59738738fb1755d44b5230
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/twocol/layout--twocol.html.twig
@@ -0,0 +1,43 @@
+{#
+/**
+ * @file
+ * Theme override to display a two-column layout.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--twocol',
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if content.top %}
+      <div {{ region_attributes.top.addClass('layout__region', 'layout__region--top') }}>
+        {{ content.top }}
+      </div>
+    {% endif %}
+
+    {% if content.first %}
+      <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}>
+        {{ content.first }}
+      </div>
+    {% endif %}
+
+    {% if content.second %}
+      <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}>
+        {{ content.second }}
+      </div>
+    {% endif %}
+
+    {% if content.bottom %}
+      <div {{ region_attributes.bottom.addClass('layout__region', 'layout__region--bottom') }}>
+        {{ content.bottom }}
+      </div>
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_discovery/twocol/twocol.css b/core/themes/stable9/layouts/layout_discovery/twocol/twocol.css
new file mode 100644
index 0000000000000000000000000000000000000000..c554c9716eb515a76cb533cfe3c469d052bceac2
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/twocol/twocol.css
@@ -0,0 +1,20 @@
+/*
+ * @file
+ * Provides the layout styles for layout_twocol.
+ */
+
+.layout--twocol {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--twocol > .layout__region {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--twocol > .layout__region--first,
+  .layout--twocol > .layout__region--second {
+    flex: 0 1 50%;
+  }
+}
diff --git a/core/themes/stable9/layouts/layout_discovery/twocol_bricks/layout--twocol-bricks.html.twig b/core/themes/stable9/layouts/layout_discovery/twocol_bricks/layout--twocol-bricks.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..08a0b47920618873e49008f826a0c930e31c0d47
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/twocol_bricks/layout--twocol-bricks.html.twig
@@ -0,0 +1,64 @@
+{#
+/**
+ * @file
+ * Theme override for a two column layout.
+ *
+ * This template provides a two column display layout with full width areas at
+ * the top, bottom and in the middle.
+ *
+ * Available variables:
+ * - content: The content for this layout.
+ * - attributes: HTML attributes for the layout <div>.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--twocol-bricks',
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+    {% if content.top %}
+      <div {{ region_attributes.top.addClass('layout__region', 'layout__region--top') }}>
+        {{ content.top }}
+      </div>
+    {% endif %}
+
+    {% if content.first_above %}
+      <div {{ region_attributes.first_above.addClass('layout__region', 'layout__region--first-above') }}>
+        {{ content.first_above }}
+      </div>
+    {% endif %}
+
+    {% if content.second_above %}
+      <div {{ region_attributes.second_above.addClass('layout__region', 'layout__region--second-above') }}>
+        {{ content.second_above }}
+      </div>
+    {% endif %}
+
+    {% if content.middle %}
+      <div {{ region_attributes.middle.addClass('layout__region', 'layout__region--middle') }}>
+        {{ content.middle }}
+      </div>
+    {% endif %}
+
+    {% if content.first_below %}
+      <div {{ region_attributes.first_below.addClass('layout__region', 'layout__region--first-below') }}>
+        {{ content.first_below }}
+      </div>
+    {% endif %}
+
+    {% if content.second_below %}
+      <div {{ region_attributes.second_below.addClass('layout__region', 'layout__region--second-below') }}>
+        {{ content.second_below }}
+      </div>
+    {% endif %}
+
+    {% if content.bottom %}
+      <div {{ region_attributes.bottom.addClass('layout__region', 'layout__region--bottom') }}>
+        {{ content.bottom }}
+      </div>
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/layouts/layout_discovery/twocol_bricks/twocol_bricks.css b/core/themes/stable9/layouts/layout_discovery/twocol_bricks/twocol_bricks.css
new file mode 100644
index 0000000000000000000000000000000000000000..bb0bf3d64177382ebc4c03bc49aba6c42c352e94
--- /dev/null
+++ b/core/themes/stable9/layouts/layout_discovery/twocol_bricks/twocol_bricks.css
@@ -0,0 +1,22 @@
+/*
+ * @file
+ * Provides the layout styles for layout_twocol_bricks.
+ */
+
+.layout--twocol-bricks {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.layout--twocol-bricks > .layout__region {
+  flex: 0 1 100%;
+}
+
+@media screen and (min-width: 40em) {
+  .layout--twocol-bricks > .layout__region--first-above,
+  .layout--twocol-bricks > .layout__region--second-above,
+  .layout--twocol-bricks > .layout__region--first-below,
+  .layout--twocol-bricks > .layout__region--second-below {
+    flex: 0 1 50%;
+  }
+}
diff --git a/core/themes/stable9/stable9.info.yml b/core/themes/stable9/stable9.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a07fdd7d203be5eb78f07d9131000d75b233ea31
--- /dev/null
+++ b/core/themes/stable9/stable9.info.yml
@@ -0,0 +1,322 @@
+name: Stable 9
+type: theme
+description: A base theme using Drupal 9.0.0's core markup and CSS.
+package: Core
+version: VERSION
+base theme: false
+hidden: true
+
+libraries-override:
+  block/drupal.block.admin:
+    css:
+      theme:
+        css/block.admin.css: css/block/block.admin.css
+
+  ckeditor/drupal.ckeditor:
+    css:
+      state:
+        css/ckeditor.css: css/ckeditor/ckeditor.css
+  ckeditor/drupal.ckeditor.plugins.drupalimagecaption:
+    css:
+      component:
+        css/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css: css/ckeditor/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css
+  ckeditor/drupal.ckeditor.plugins.language:
+    css:
+      component:
+        css/plugins/language/ckeditor.language.css: css/ckeditor/plugins/language/ckeditor.language.css
+  ckeditor/drupal.ckeditor.admin:
+    css:
+      theme:
+        css/ckeditor.admin.css: css/ckeditor/ckeditor.admin.css
+
+  color/admin:
+    css:
+      theme:
+        css/color.admin.css: css/color/color.admin.css
+
+  config_translation/drupal.config_translation.admin:
+    css:
+      theme:
+        css/config_translation.admin.css: css/config_translation/config_translation.admin.css
+
+  content_translation/drupal.content_translation.admin:
+    css:
+      theme:
+        css/content_translation.admin.css: css/content_translation/content_translation.admin.css
+
+  content_moderation/content_moderation:
+    css:
+      component:
+        css/content_moderation.module.css: css/content_moderation/content_moderation.module.css
+      theme:
+        css/content_moderation.theme.css: css/content_moderation/content_moderation.theme.css
+
+  contextual/drupal.contextual-links:
+    css:
+      component:
+        css/contextual.module.css: css/contextual/contextual.module.css
+      theme:
+        css/contextual.theme.css: css/contextual/contextual.theme.css
+        css/contextual.icons.theme.css: css/contextual/contextual.icons.theme.css
+  contextual/drupal.contextual-toolbar:
+    css:
+      component:
+        css/contextual.toolbar.css: css/contextual/contextual.toolbar.css
+
+  core/drupal.dialog.off_canvas:
+    css:
+      base:
+        misc/dialog/off-canvas.reset.css: css/core/dialog/off-canvas.reset.css
+        misc/dialog/off-canvas.base.css: css/core/dialog/off-canvas.base.css
+        misc/dialog/off-canvas.css: css/core/dialog/off-canvas.css
+        misc/dialog/off-canvas.theme.css: css/core/dialog/off-canvas.theme.css
+      component:
+        misc/dialog/off-canvas.motion.css: css/core/dialog/off-canvas.motion.css
+        misc/dialog/off-canvas.button.css: css/core/dialog/off-canvas.button.css
+        misc/dialog/off-canvas.form.css: css/core/dialog/off-canvas.form.css
+        misc/dialog/off-canvas.table.css: css/core/dialog/off-canvas.table.css
+        misc/dialog/off-canvas.details.css: css/core/dialog/off-canvas.details.css
+        misc/dialog/off-canvas.tabledrag.css: css/core/dialog/off-canvas.tabledrag.css
+        misc/dialog/off-canvas.dropbutton.css: css/core/dialog/off-canvas.dropbutton.css
+        misc/dialog/off-canvas.layout.css: css/core/dialog/off-canvas.layout.css
+
+  core/drupal.dropbutton:
+    css:
+      component:
+        misc/dropbutton/dropbutton.css: css/core/dropbutton/dropbutton.css
+  core/drupal.vertical-tabs:
+    css:
+      component:
+        misc/vertical-tabs.css: css/core/vertical-tabs.css
+
+  # Load version 3.0.3 of normalize.css for backwards compatibility.
+  core/normalize: stable/normalize
+
+  dblog/drupal.dblog:
+    css:
+      component:
+        css/dblog.module.css: css/dblog/dblog.module.css
+
+  field_ui/drupal.field_ui:
+    css:
+      theme:
+        css/field_ui.admin.css: css/field_ui/field_ui.admin.css
+
+  filter/caption:
+    css:
+      component:
+        css/filter.caption.css: css/filter/filter.caption.css
+
+  image/admin:
+    css:
+      theme:
+        css/image.admin.css: css/image/image.admin.css
+  image/quickedit.inPlaceEditor.image:
+    css:
+      component:
+        css/editors/image.css: css/image/editors/image.css
+      theme:
+        css/editors/image.theme.css: css/image/editors/image.theme.css
+
+  language/drupal.language.admin:
+    css:
+      theme:
+        css/language.admin.css: css/language/language.admin.css
+
+  layout_discovery/onecol:
+    css:
+      theme:
+        layouts/onecol/onecol.css: layouts/layout_discovery/onecol/onecol.css
+  layout_discovery/twocol_bricks:
+    css:
+      theme:
+        layouts/twocol_bricks/twocol_bricks.css: layouts/layout_discovery/twocol_bricks/twocol_bricks.css
+  layout_discovery/twocol:
+    css:
+      theme:
+        layouts/twocol/twocol.css: layouts/layout_discovery/twocol/twocol.css
+  layout_discovery/threecol_25_50_25:
+    css:
+      theme:
+        layouts/threecol_25_50_25/threecol_25_50_25.css: layouts/layout_discovery/threecol_25_50_25/threecol_25_50_25.css
+  layout_discovery/threecol_33_34_33:
+    css:
+      theme:
+        layouts/threecol_33_34_33/threecol_33_34_33.css: layouts/layout_discovery/threecol_33_34_33/threecol_33_34_33.css
+
+  layout_builder/drupal.layout_builder:
+    css:
+      theme:
+        css/layout-builder.css: css/layout_builder/layout-builder.css
+  layout_builder/twocol_section:
+    css:
+      theme:
+        layouts/twocol_section/twocol_section.css:  layouts/layout_builder/twocol_section/twocol_section.css
+  layout_builder/threecol_section:
+    css:
+      theme:
+        layouts/threecol_section/threecol_section.css: layouts/layout_builder/threecol_section/threecol_section.css
+  layout_builder/fourcol_section:
+    css:
+      theme:
+        layouts/fourcol_section/fourcol_section.css: layouts/layout_builder/fourcol_section/fourcol_section.css
+
+  locale/drupal.locale.admin:
+    css:
+      component:
+        css/locale.admin.css: css/locale/locale.admin.css
+
+  media/filter.caption:
+    css:
+      component:
+        css/filter.caption.css: css/media/filter.caption.css
+
+  media/oembed.formatter:
+    css:
+      component:
+        css/oembed.formatter.css: css/media/oembed.formatter.css
+  media/oembed.frame:
+    css:
+      component:
+        css/oembed.frame.css: css/media/oembed.frame.css
+
+  menu_ui/drupal.menu_ui.adminforms:
+    css:
+      theme:
+        css/menu_ui.admin.css: css/menu_ui/menu_ui.admin.css
+
+  migrate_drupal_ui/base:
+    css:
+      component:
+        css/components/upgrade-analysis-report-tables.css: css/migrate_drupal_ui/components/upgrade-analysis-report-tables.css
+
+  node/drupal.node:
+    css:
+      layout:
+        css/node.module.css: css/node/node.module.css
+  node/drupal.node.preview:
+    css:
+      theme:
+        css/node.preview.css: css/node/node.preview.css
+  node/form:
+    css:
+      layout:
+        css/node.module.css: css/node/node.module.css
+  node/drupal.node.admin:
+    css:
+      theme:
+        css/node.admin.css: css/node/node.admin.css
+
+  quickedit/quickedit:
+    css:
+      component:
+        css/quickedit.module.css: css/quickedit/quickedit.module.css
+      theme:
+        css/quickedit.theme.css: css/quickedit/quickedit.theme.css
+        css/quickedit.icons.theme.css: css/quickedit/quickedit.icons.theme.css
+
+  settings_tray/drupal.settings_tray:
+    css:
+      component:
+        css/settings_tray.module.css: css/settings_tray/settings_tray.module.css
+        css/settings_tray.motion.css: css/settings_tray/settings_tray.motion.css
+        css/settings_tray.toolbar.css: css/settings_tray/settings_tray.toolbar.css
+      theme:
+        css/settings_tray.theme.css: css/settings_tray/settings_tray.theme.css
+
+  shortcut/drupal.shortcut:
+    css:
+      theme:
+        css/shortcut.theme.css: css/shortcut/shortcut.theme.css
+        css/shortcut.icons.theme.css: css/shortcut/shortcut.icons.theme.css
+
+  system/base:
+    css:
+      component:
+        css/components/ajax-progress.module.css: css/system/components/ajax-progress.module.css
+        css/components/align.module.css: css/system/components/align.module.css
+        css/components/autocomplete-loading.module.css: css/system/components/autocomplete-loading.module.css
+        css/components/fieldgroup.module.css: css/system/components/fieldgroup.module.css
+        css/components/container-inline.module.css: css/system/components/container-inline.module.css
+        css/components/clearfix.module.css: css/system/components/clearfix.module.css
+        css/components/details.module.css: css/system/components/details.module.css
+        css/components/hidden.module.css: css/system/components/hidden.module.css
+        css/components/item-list.module.css: css/system/components/item-list.module.css
+        css/components/js.module.css: css/system/components/js.module.css
+        css/components/nowrap.module.css: css/system/components/nowrap.module.css
+        css/components/position-container.module.css: css/system/components/position-container.module.css
+        css/components/progress.module.css: css/system/components/progress.module.css
+        css/components/reset-appearance.module.css: css/system/components/reset-appearance.module.css
+        css/components/resize.module.css: css/system/components/resize.module.css
+        css/components/sticky-header.module.css: css/system/components/sticky-header.module.css
+        css/components/system-status-counter.css: css/system/components/system-status-counter.css
+        css/components/system-status-report-counters.css: css/system/components/system-status-report-counters.css
+        css/components/system-status-report-general-info.css: css/system/components/system-status-report-general-info.css
+        css/components/tabledrag.module.css: css/system/components/tabledrag.module.css
+        css/components/tablesort.module.css: css/system/components/tablesort.module.css
+        css/components/tree-child.module.css: css/system/components/tree-child.module.css
+  system/admin:
+    css:
+      theme:
+        css/system.admin.css: css/system/system.admin.css
+  system/maintenance:
+    css:
+      theme:
+        css/system.maintenance.css: css/system/system.maintenance.css
+  system/diff:
+    css:
+      component:
+        css/system.diff.css: css/system/system.diff.css
+
+  taxonomy/drupal.taxonomy:
+    css:
+      component:
+        css/taxonomy.theme.css: css/taxonomy/taxonomy.theme.css
+
+  toolbar/toolbar:
+    css:
+      component:
+        css/toolbar.module.css: css/toolbar/toolbar.module.css
+      theme:
+        css/toolbar.theme.css: css/toolbar/toolbar.theme.css
+        css/toolbar.icons.theme.css: css/toolbar/toolbar.icons.theme.css
+  toolbar/toolbar.menu:
+    css:
+      state:
+        css/toolbar.menu.css: css/toolbar/toolbar.menu.css
+
+  tour/tour-styling:
+    css:
+      component:
+        css/tour.module.css: css/tour/tour.module.css
+
+  update/drupal.update.admin:
+    css:
+      theme:
+        css/update.admin.theme.css: css/update/update.admin.theme.css
+
+  user/drupal.user:
+    css:
+      component:
+        css/user.module.css: css/user/user.module.css
+  user/drupal.user.admin:
+    css:
+      theme:
+        css/user.admin.css: css/user/user.admin.css
+  user/drupal.user.icons:
+    css:
+      theme:
+        css/user.icons.admin.css: css/user/user.icons.admin.css
+
+  views/views.module:
+    css:
+      component:
+        css/views.module.css: css/views/views.module.css
+
+  views_ui/admin.styling:
+    css:
+      component:
+        css/views_ui.admin.css: css/views_ui/views_ui.admin.css
+      theme:
+        css/views_ui.admin.theme.css: css/views_ui/views_ui.admin.theme.css
+        css/views_ui.contextual.css: css/views_ui/views_ui.contextual.css
diff --git a/core/themes/stable9/stable9.libraries.yml b/core/themes/stable9/stable9.libraries.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3da52842e029cf0cd0be2268e828747ef483e3bc
--- /dev/null
+++ b/core/themes/stable9/stable9.libraries.yml
@@ -0,0 +1,11 @@
+normalize:
+  remote: https://github.com/necolas/normalize.css
+  version: "8.0.1"
+  license:
+    name: MIT
+    url: https://github.com/necolas/normalize.css/blob/8.0.1/LICENSE.md
+    gpl-compatible: true
+  css:
+    base:
+      css/core/assets/vendor/normalize-css/normalize.css: { weight: -20 }
+      css/core/normalize-fixes.css: { weight: -19 }
diff --git a/core/themes/stable9/templates/admin/admin-block-content.html.twig b/core/themes/stable9/templates/admin/admin-block-content.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b59cc85a3ad1194dab17f72ed4bdb834f2665917
--- /dev/null
+++ b/core/themes/stable9/templates/admin/admin-block-content.html.twig
@@ -0,0 +1,32 @@
+{#
+/**
+ * @file
+ * Theme override for the content of an administrative block.
+ *
+ * Available variables:
+ * - content: A list containing information about the block. Each element
+ *   of the array represents an administrative menu item, and must at least
+ *   contain the keys 'title', 'link_path', and 'localized_options', which are
+ *   passed to l(). A 'description' key may also be provided.
+ * - attributes: HTML attributes to be added to the element.
+ * - compact: Boolean indicating whether compact mode is turned on or not.
+ *
+ * @see template_preprocess_admin_block_content()
+ */
+#}
+{%
+  set classes = [
+    'list-group',
+    compact ? 'compact',
+  ]
+%}
+{% if content %}
+  <dl{{ attributes.addClass(classes) }}>
+    {% for item in content %}
+      <dt class="list-group__link">{{ item.link }}</dt>
+      {% if item.description %}
+        <dd class="list-group__description">{{ item.description }}</dd>
+      {% endif %}
+    {% endfor %}
+  </dl>
+{% endif %}
diff --git a/core/themes/stable9/templates/admin/admin-block.html.twig b/core/themes/stable9/templates/admin/admin-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7401695766505d50664c87a26f5cd358ec8120cb
--- /dev/null
+++ b/core/themes/stable9/templates/admin/admin-block.html.twig
@@ -0,0 +1,30 @@
+{#
+/**
+ * @file
+ * Theme override for an administrative block.
+ *
+ * Available variables:
+ * - block: An array of information about the block, including:
+ *   - show: A flag indicating if the block should be displayed.
+ *   - title: The block title.
+ *   - content: (optional) The content of the block.
+ *   - description: (optional) A description of the block.
+ *     (Description should only be output if content is not available).
+ * - attributes: HTML attributes for the containing div element.
+ */
+#}
+{%
+  set classes = [
+    'panel',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if block.title %}
+    <h3 class="panel__title">{{ block.title }}</h3>
+  {% endif %}
+  {% if block.content %}
+    <div class="panel__content">{{ block.content }}</div>
+  {% elseif block.description %}
+    <div class="panel__description">{{ block.description }}</div>
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/admin/admin-page.html.twig b/core/themes/stable9/templates/admin/admin-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..106876f730a9a0446746ec42de2a6c7812198a09
--- /dev/null
+++ b/core/themes/stable9/templates/admin/admin-page.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @file
+ * Theme override for an administrative page.
+ *
+ * Available variables:
+ * - system_compact_link: Themed link to toggle compact view.
+ * - containers: An list of administrative blocks keyed by position: left or
+ *   right. Contains:
+ *   - blocks: A list of blocks within a container.
+ *
+ * @see template_preprocess_admin_page()
+ */
+#}
+
+<div class="clearfix">
+  {{ system_compact_link }}
+  {% for container in containers %}
+    <div class="layout-column layout-column--half">
+      {% for block in container.blocks %}
+        {{ block }}
+      {% endfor %}
+    </div>
+  {% endfor %}
+</div>
diff --git a/core/themes/stable9/templates/admin/authorize-report.html.twig b/core/themes/stable9/templates/admin/authorize-report.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2e5a59c0c03bc093c0ac61fc80b0b03febea0eb7
--- /dev/null
+++ b/core/themes/stable9/templates/admin/authorize-report.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for authorize.php operation report templates.
+ *
+ * This report displays the results of an operation run via authorize.php.
+ *
+ * Available variables:
+ * - messages: A list of result messages.
+ * - attributes: HTML attributes for the element.
+ *
+ * @see template_preprocess_authorize_report()
+ */
+#}
+{% if messages %}
+  <div{{ attributes.addClass('authorize-results') }}>
+    {% for message_group in messages %}
+      {{ message_group }}
+    {% endfor %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/admin/block-content-add-list.html.twig b/core/themes/stable9/templates/admin/block-content-add-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..23717f2fac90202e0adac4ebc30c8a419c6d4313
--- /dev/null
+++ b/core/themes/stable9/templates/admin/block-content-add-list.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme override to present a list of custom block types.
+ *
+ * Available variables:
+ * - types: A collection of all the available custom block types.
+ *   Each block type contains the following:
+ *   - link: A link to add a block of this type.
+ *   - description: A description of this custom block type.
+ *
+ * @see template_preprocess_block_content_add_list()
+ */
+#}
+{% apply spaceless %}
+  <dl>
+    {% for type in types %}
+      <dt>{{ type.link }}</dt>
+      <dd>{{ type.description }}</dd>
+    {% endfor %}
+  </dl>
+{% endapply %}
diff --git a/core/themes/stable9/templates/admin/ckeditor-settings-toolbar.html.twig b/core/themes/stable9/templates/admin/ckeditor-settings-toolbar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c5e87e0fb96cef81de90d4d2bbaa79f410c76bab
--- /dev/null
+++ b/core/themes/stable9/templates/admin/ckeditor-settings-toolbar.html.twig
@@ -0,0 +1,73 @@
+{#
+/**
+ * @file
+ * Theme override for the CKEditor settings toolbar.
+ *
+ * Available variables:
+ * - multiple_buttons: A list of buttons that may be added multiple times.
+ * - disabled_buttons: A list of disabled buttons.
+ * - active_buttons: A list of active button rows.
+ *
+ * @see template_preprocess_ckeditor_settings_toolbar()
+ */
+#}
+{% apply spaceless %}
+  <fieldset role="form" aria-labelledby="ckeditor-button-configuration ckeditor-button-description">
+    <legend id="ckeditor-button-configuration">{{ 'Toolbar configuration'|t }}</legend>
+    <div class="fieldset-wrapper">
+      <div id="ckeditor-button-description" class="fieldset-description">
+      {%- trans -%}
+        Move a button into the <em>Active toolbar</em> to enable it, or into the list of <em>Available buttons</em> to disable it. Buttons may be moved with the mouse or keyboard arrow keys. Toolbar group names are provided to support screen reader users. Empty toolbar groups will be removed upon save.
+      {%- endtrans -%}
+      </div>
+      <div class="ckeditor-toolbar-disabled clearfix">
+        {# Available buttons. #}
+        <div class="ckeditor-toolbar-available">
+          <label for="ckeditor-available-buttons">{{ 'Available buttons'|t }}</label>
+          <ul id="ckeditor-available-buttons" class="ckeditor-buttons clearfix" role="form" data-drupal-ckeditor-button-sorting="source">
+          {% for disabled_button in disabled_buttons %}
+             <li{{ disabled_button.attributes.addClass('ckeditor-button') }}>{{ disabled_button.value }}</li>
+          {% endfor %}
+          </ul>
+        </div>
+        {# Dividers. #}
+        <div class="ckeditor-toolbar-dividers">
+          <label for="ckeditor-multiple-buttons">{{ 'Button divider'|t }}</label>
+          <ul id="ckeditor-multiple-buttons" class="ckeditor-multiple-buttons" role="form" data-drupal-ckeditor-button-sorting="dividers">
+          {% for multiple_button in multiple_buttons %}
+            <li{{ multiple_button.attributes.addClass('ckeditor-multiple-button') }}>{{ multiple_button.value }}</li>
+          {% endfor %}
+          </ul>
+        </div>
+      </div>
+      {# Active toolbar. #}
+      <div class="clearfix">
+        <label id="ckeditor-active-toolbar">{{ 'Active toolbar'|t }}</label>
+      </div>
+      <div data-toolbar="active" role="form" class="ckeditor-toolbar ckeditor-toolbar-active clearfix">
+        <ul class="ckeditor-active-toolbar-configuration" role="presentation" aria-label="{{ 'CKEditor toolbar and button configuration.'|t }}">
+        {% for button_row in active_buttons %}
+          <li class="ckeditor-row" role="group" aria-labelledby="ckeditor-active-toolbar">
+            <ul class="ckeditor-toolbar-groups clearfix">
+            {% for group_name, button_group in button_row %}
+              <li class="ckeditor-toolbar-group" role="presentation" data-drupal-ckeditor-type="group" data-drupal-ckeditor-toolbar-group-name="{{ group_name }}" tabindex="0">
+                <h3 class="ckeditor-toolbar-group-name" id="ckeditor-toolbar-group-aria-label-for-{{ button_group.group_name_class }}">{{ group_name }}</h3>
+                <ul class="ckeditor-buttons ckeditor-toolbar-group-buttons" role="toolbar" data-drupal-ckeditor-button-sorting="target" aria-labelledby="ckeditor-toolbar-group-aria-label-for-{{ button_group.group_name_class }}">
+                {% for active_button in button_group.buttons %}
+                  <li{{ active_button.attributes.addClass(active_button.multiple ? 'ckeditor-multiple-button' : 'ckeditor-button') }}>{{ active_button.value }}</li>
+                {% endfor %}
+                </ul>
+              </li>
+            {% endfor %}
+            </ul>
+          </li>
+        {% else %}
+          <li>
+            <ul class="ckeditor-buttons"></ul>
+          </li>
+        {% endfor %}
+        </ul>
+      </div>
+    </div>
+  </fieldset>
+{% endapply %}
diff --git a/core/themes/stable9/templates/admin/color-scheme-form.html.twig b/core/themes/stable9/templates/admin/color-scheme-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c7328afd2d21235380ae0ed2ff24604a2a62615d
--- /dev/null
+++ b/core/themes/stable9/templates/admin/color-scheme-form.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme override for a theme's color form.
+ *
+ * Available variables:
+ * - form: Form elements for the color scheme form, including:
+ *   - scheme: A color scheme form element. For example: a select element with
+ *     color theme presets, or a color picker widget.
+ *   - palette: Color fields that can be changed by entering in a new hex value.
+ * - html_preview: A HTML preview of the theme's current color scheme.
+ *
+ * @see template_preprocess_color_scheme_form()
+ */
+#}
+<div class="color-form clearfix">
+  {{ form.scheme }}
+  <div class="clearfix color-palette js-color-palette">
+    {{ form.palette }}
+  </div>
+  {{ form|without('scheme', 'palette') }}
+  <h2>{{ 'Preview'|t }}</h2>
+  {{ html_preview }}
+</div>
diff --git a/core/themes/stable9/templates/admin/config_translation_manage_form_element.html.twig b/core/themes/stable9/templates/admin/config_translation_manage_form_element.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e7eecfce31dfacc8a1b97d61d641da9832750498
--- /dev/null
+++ b/core/themes/stable9/templates/admin/config_translation_manage_form_element.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for a form element in config_translation.
+ *
+ * Available variables:
+ * - element: Array that represents the element shown in the form.
+ *   - source: The source of the translation.
+ *   - translation: The translation for the target language.
+ *
+ * @see template_preprocess()
+ */
+#}
+<div class="translation-set clearfix">
+  <div class="layout-column layout-column--half translation-set__source">
+    {{ element.source }}
+  </div>
+  <div class="layout-column layout-column--half translation-set__translated">
+    {{ element.translation }}
+  </div>
+</div>
diff --git a/core/themes/stable9/templates/admin/field-ui-table.html.twig b/core/themes/stable9/templates/admin/field-ui-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..72523f60fd7c06f4abfc21ef7a1b5aff6733ae6a
--- /dev/null
+++ b/core/themes/stable9/templates/admin/field-ui-table.html.twig
@@ -0,0 +1,45 @@
+{#
+/**
+ * @file
+ * Theme override to display a Field UI table.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to apply to the <table> tag.
+ * - caption: A localized string for the <caption> tag.
+ * - colgroups: Column groups. Each group contains the following properties:
+ *   - attributes: HTML attributes to apply to the <col> tag.
+ *     Note: Drupal currently supports only one table header row, see
+ *     https://www.drupal.org/node/893530 and
+ *     http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_table/7#comment-5109.
+ * - header: Table header cells. Each cell contains the following properties:
+ *   - tag: The HTML tag name to use; either 'th' or 'td'.
+ *   - attributes: HTML attributes to apply to the tag.
+ *   - content: A localized string for the title of the column.
+ *   - field: Field name (required for column sorting).
+ *   - sort: Default sort order for this column ("asc" or "desc").
+ * - sticky: A flag indicating whether to use a "sticky" table header.
+ * - rows: Table rows. Each row contains the following properties:
+ *   - attributes: HTML attributes to apply to the <tr> tag.
+ *   - data: Table cells.
+ *   - no_striping: A flag indicating that the row should receive no
+ *     'even / odd' styling. Defaults to FALSE.
+ *   - cells: Table cells of the row. Each cell contains the following keys:
+ *     - tag: The HTML tag name to use; either 'th' or 'td'.
+ *     - attributes: Any HTML attributes, such as "colspan", to apply to the
+ *       table cell.
+ *     - content: The string to display in the table cell.
+ *     - active_table_sort: A boolean indicating whether the cell is the active
+         table sort.
+ * - footer: Table footer rows, in the same format as the rows variable.
+ * - empty: The message to display in an extra row if table does not have
+ *   any rows.
+ * - no_striping: A boolean indicating that the row should receive no striping.
+ * - header_columns: The number of columns in the header.
+ *
+ * @see template_preprocess_field_ui_table()
+ */
+#}
+{# Add Ajax wrapper. #}
+<div id="field-display-overview-wrapper">
+  {% include 'table.html.twig' %}
+</div>
diff --git a/core/themes/stable9/templates/admin/help-section.html.twig b/core/themes/stable9/templates/admin/help-section.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4b0d7bd84b07421fc2669754df6d0e5a37862b26
--- /dev/null
+++ b/core/themes/stable9/templates/admin/help-section.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override for a section of the help page.
+ *
+ * Available variables:
+ * - title: The section title.
+ * - description: The description text for the section.
+ * - links: Links to display in the section.
+ * - empty: Text to display if there are no links.
+ */
+#}
+<h2>{{ title }}</h2>
+<p>{{ description }}</p>
+{% if links %}
+  <ul>
+  {% for link in links %}
+    <li>{{ link }}</li>
+  {% endfor %}
+  </ul>
+{% else %}
+  <p>{{ empty }}</p>
+{% endif %}
diff --git a/core/themes/stable9/templates/admin/image-anchor.html.twig b/core/themes/stable9/templates/admin/image-anchor.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1d709dd8feac4423a72d0a4b94cf17933fc77849
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-anchor.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Theme override for a 3x3 grid of checkboxes for image anchors.
+ *
+ * Available variables:
+ * - table: HTML for the table of image anchors.
+ *
+ * @see template_preprocess_image_anchor()
+ */
+#}
+{{ table }}
diff --git a/core/themes/stable9/templates/admin/image-crop-summary.html.twig b/core/themes/stable9/templates/admin/image-crop-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e401f24233839a263bd750f3814f3c909683a0ba
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-crop-summary.html.twig
@@ -0,0 +1,30 @@
+{#
+/**
+ * @file
+ * Theme override for a summary of an image crop effect.
+ *
+ * Available variables:
+ * - data: The current configuration for this resize effect, including:
+ *   - width: The width of the resized image.
+ *   - height: The height of the resized image.
+ *   - anchor: The part of the image that will be retained after cropping.
+ *   - anchor_label: The translated label of the crop anchor.
+ * - effect: The effect information, including:
+ *   - id: The effect identifier.
+ *   - label: The effect name.
+ *   - description: The effect description.
+ */
+#}
+{% if data.width and data.height -%}
+  {{ data.width }}×{{ data.height }}
+{%- else -%}
+  {% if data.width %}
+    {% trans %}
+      width {{ data.width }}
+    {% endtrans %}
+  {% elseif data.height %}
+    {% trans %}
+      height {{ data.height }}
+    {% endtrans %}
+  {% endif %}
+{%- endif %}
diff --git a/core/themes/stable9/templates/admin/image-resize-summary.html.twig b/core/themes/stable9/templates/admin/image-resize-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dc0ba198fd9683a0d24e77c56f4b01e2186be0ae
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-resize-summary.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override for a summary of an image resize effect.
+ *
+ * Available variables:
+ * - data: The current configuration for this resize effect, including:
+ *   - width: The width of the resized image.
+ *   - height: The height of the resized image.
+ * - effect: The effect information, including:
+ *   - id: The effect identifier.
+ *   - label: The effect name.
+ *   - description: The effect description.
+ */
+#}
+{% if data.width and data.height -%}
+  {{ data.width }}×{{ data.height }}
+{%- else -%}
+  {% if data.width %}
+    {% trans %}
+      width {{ data.width }}
+    {% endtrans %}
+  {% elseif data.height %}
+    {% trans %}
+      height {{ data.height }}
+    {% endtrans %}
+  {% endif %}
+{%- endif %}
diff --git a/core/themes/stable9/templates/admin/image-rotate-summary.html.twig b/core/themes/stable9/templates/admin/image-rotate-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c3f446e52147a8e86a806aacbf1ceed8d7efe4d3
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-rotate-summary.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Theme override for a summary of an image rotate effect.
+ *
+ * Available variables:
+ * - data: The current configuration for this resize effect, including:
+ *   - degrees: Degrees to rotate the image, positive values will rotate the
+ *     image clockwise, negative values counter-clockwise.
+ *   - bgcolor: The hex background color of the new areas created as consequence
+ *     of rotation.
+ *   - random: If the rotation angle is randomized.
+ * - effect: The effect information, including:
+ *   - id: The effect identifier.
+ *   - label: The effect name.
+ *   - description: The effect description.
+ */
+#}
+{% if data.random %}
+  {% set degrees = data.degrees|abs %}
+  {% trans %}
+    random between -{{ degrees }}° and {{ degrees }}°
+  {% endtrans %}
+{% else %}
+  {{ data.degrees }}°
+{% endif %}
diff --git a/core/themes/stable9/templates/admin/image-scale-and-crop-summary.html.twig b/core/themes/stable9/templates/admin/image-scale-and-crop-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f5d5654a701e40da4bab302faddd7ae854c00de9
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-scale-and-crop-summary.html.twig
@@ -0,0 +1,30 @@
+{#
+/**
+ * @file
+ * Theme override for a summary of an image scale and crop effect.
+ *
+ * Available variables:
+ * - data: The current configuration for this resize effect, including:
+ *   - width: The width of the resized image.
+ *   - height: The height of the resized image.
+ *   - anchor: The part of the image that will be retained after cropping.
+ *   - anchor_label: The translated label of the crop anchor.
+ * - effect: The effect information, including:
+ *   - id: The effect identifier.
+ *   - label: The effect name.
+ *   - description: The effect description.
+ */
+#}
+{% if data.width and data.height -%}
+  {{ data.width }}×{{ data.height }}
+{%- else -%}
+  {% if data.width %}
+    {% trans %}
+      width {{ data.width }}
+    {% endtrans %}
+  {% elseif data.height %}
+    {% trans %}
+      height {{ data.height }}
+    {% endtrans %}
+  {% endif %}
+{%- endif %}
diff --git a/core/themes/stable9/templates/admin/image-scale-summary.html.twig b/core/themes/stable9/templates/admin/image-scale-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5b7c6864c54845746827d77d2446ba4efdc80848
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-scale-summary.html.twig
@@ -0,0 +1,35 @@
+{#
+/**
+ * @file
+ * Theme override for a summary of an image scale effect.
+ *
+ * Available variables:
+ * - data: The current configuration for this resize effect, including:
+ *   - width: The width of the resized image.
+ *   - height: The height of the resized image.
+ *   - upscale: If images larger than their original size can scale.
+ * - effect: The effect information, including:
+ *   - id: The effect identifier.
+ *   - label: The effect name.
+ *   - description: The effect description.
+ */
+#}
+{% if data.width and data.height -%}
+  {{ data.width }}×{{ data.height }}
+{%- else -%}
+  {% if data.width %}
+    {% trans %}
+      width {{ data.width }}
+    {% endtrans %}
+  {% elseif data.height %}
+    {% trans %}
+      height {{ data.height }}
+    {% endtrans %}
+  {% endif %}
+{%- endif %}
+
+{% if data.upscale %}
+  {% trans %}
+    (upscaling allowed)
+  {% endtrans %}
+{% endif %}
diff --git a/core/themes/stable9/templates/admin/image-style-preview.html.twig b/core/themes/stable9/templates/admin/image-style-preview.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3517b2cd82c6c6cedb1341f1fcd82c62394be64a
--- /dev/null
+++ b/core/themes/stable9/templates/admin/image-style-preview.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override to display a preview of an image style.
+ *
+ * Available variables:
+ * - style_id: The ID of the image style.
+ * - style_name: The name of the image style.
+ * - cache_bypass: A timestamp token used to avoid browser caching of images.
+ * - original: An associative array containing:
+ *   - url: The URL of the original image.
+ *   - width: The width in pixels of the original image.
+ *   - height: The height in pixels of the original image.
+ *   - rendered: The render array for the original image.
+ * - derivative: An associative array containing:
+ *   - url: The URL of the derivative image.
+ *   - width: The width in pixels of the derivative image.
+ *   - height: The height in pixels of the derivative image.
+ *   - rendered:  The rendered derivative image.
+ * - preview: An associative array containing:
+ *   - original: An associative array containing:
+ *     - width: The width in pixels of the original image in the preview.
+ *     - height: The height in pixels of the original image in the preview.
+ *   - derivative: An associative array containing:
+ *     - width: The width in pixels of the derivative image in the preview.
+ *     - height: The height in pixels of the derivative image in the preview.
+ *
+ * @see template_preprocess_image_style_preview()
+ */
+#}
+<div class="image-style-preview preview clearfix">
+  {# Preview of the original image. #}
+  <div class="preview-image-wrapper">
+      {{ 'original'|t }} (<a href="{{ original.url }}">{{ 'view actual size'|t }}</a>)
+      <div class="preview-image original-image" style="width: {{ preview.original.width }}px; height: {{ preview.original.height }}px;">
+        <a href="{{ original.url }}">
+          {{ original.rendered }}
+        </a>
+      <div class="height" style="height: {{ preview.original.height }}px"><span>{{ original.height }}px</span></div>
+      <div class="width" style="width: {{ preview.original.width }}px"><span>{{ original.width }}px</span></div>
+    </div>
+  </div>
+
+  {# Derivative of the image style. #}
+  <div class="preview-image-wrapper">
+    {{ style_name }} (<a href="{{ derivative.url }}?{{ cache_bypass }}">{{ 'view actual size'|t }}</a>)
+    <div class="preview-image modified-image" style="width: {{ preview.derivative.width }}px; height: {{ preview.derivative.height }}px;">
+      <a href="{{ derivative.url }}?{{ cache_bypass }}">
+        {{ derivative.rendered }}
+      </a>
+      <div class="height" style="height: {{ preview.derivative.height }}px"><span>{{ derivative.height }}px</span></div>
+      <div class="width" style="width: {{ preview.derivative.width }}px"><span>{{ derivative.width }}px</span></div>
+    </div>
+  </div>
+</div>
diff --git a/core/themes/stable9/templates/admin/indentation.html.twig b/core/themes/stable9/templates/admin/indentation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..591933de0714d3eb3a54cdc41573d5049df604d4
--- /dev/null
+++ b/core/themes/stable9/templates/admin/indentation.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Theme override for a set of indentation divs.
+ *
+ * These <div> tags are used for drag and drop tables.
+ *
+ * Available variables:
+ * - size: Optional. The number of indentations to create.
+ */
+#}
+{% if size > 0 %}{% for i in 1..size %}<div class="js-indentation indentation">&nbsp;</div>{% endfor %}{% endif %}
diff --git a/core/themes/stable9/templates/admin/language-content-settings-table.html.twig b/core/themes/stable9/templates/admin/language-content-settings-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5a8ba8c0033cd9b7f291e98d45bd33c4bafcaa27
--- /dev/null
+++ b/core/themes/stable9/templates/admin/language-content-settings-table.html.twig
@@ -0,0 +1,14 @@
+{#
+/**
+ * @file
+ * Theme override to display a language content settings table.
+ *
+ * Available variables:
+ * - title: The title of the table.
+ * - build: Table of content language settings.
+ *
+ * @see template_preprocess_language_content_settings_table()
+ */
+#}
+<h4>{{ title }}</h4>
+{{ build }}
diff --git a/core/themes/stable9/templates/admin/language-negotiation-configure-form.html.twig b/core/themes/stable9/templates/admin/language-negotiation-configure-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ae46f50f7a0251000fe69eb7f11a80e76cc6dd3f
--- /dev/null
+++ b/core/themes/stable9/templates/admin/language-negotiation-configure-form.html.twig
@@ -0,0 +1,39 @@
+{#
+/**
+ * @file
+ * Theme override for a language negotiation configuration form.
+ *
+ * Available variables:
+ * - language_types: A list of language negotiation types. Each language type
+ *   contains the following:
+ *   - type: The machine name for the negotiation type.
+ *   - title: The language negotiation type name.
+ *   - description: A description for how the language negotiation type
+ *     operates.
+ *   - configurable: A radio element to toggle the table.
+ *   - table: A draggable table for the language detection methods of this type.
+ *   - children: Remaining form items for the group.
+ *   - attributes: A list of HTML attributes for the wrapper element.
+ * - children: Remaining form items for all groups.
+ *
+ * @see template_preprocess_language_negotiation_configure_form()
+ */
+#}
+{% for language_type in language_types %}
+  {%
+    set language_classes = [
+      'js-form-item',
+      'form-item',
+      'table-language-group',
+      'table-' ~ language_type.type ~ '-wrapper',
+    ]
+  %}
+  <div{{ language_type.attributes.addClass(language_classes) }}>
+    <h2>{{ language_type.title }}</h2>
+    <div class="description">{{ language_type.description }}</div>
+    {{ language_type.configurable }}
+    {{ language_type.table }}
+    {{ language_type.children }}
+  </div>
+{% endfor %}
+{{ children }}
diff --git a/core/themes/stable9/templates/admin/locale-translation-last-check.html.twig b/core/themes/stable9/templates/admin/locale-translation-last-check.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1c5ebd059e405343adb44b2bd64e4eab087c814f
--- /dev/null
+++ b/core/themes/stable9/templates/admin/locale-translation-last-check.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override for the last time we checked for update data.
+ *
+ * Available variables:
+ * - last_checked: Whether or not locale updates have been checked before.
+ * - time: The formatted time ago when the site last checked for available
+ *   updates.
+ * - link: A link to manually check available updates.
+ *
+ * @see template_preprocess_locale_translation_last_check()
+ */
+#}
+<div class="locale checked">
+  <p>
+  {% if last_checked %}
+    {% trans %} Last checked: {{ time }} ago {% endtrans %}
+  {% else %}
+    {{ 'Last checked: never'|t }}
+  {% endif %}
+  <span class="check-manually">({{ link }})</span></p>
+</div>
diff --git a/core/themes/stable9/templates/admin/locale-translation-update-info.html.twig b/core/themes/stable9/templates/admin/locale-translation-update-info.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8e2bedeec2190bb7ea395c61c76101c91d571ba4
--- /dev/null
+++ b/core/themes/stable9/templates/admin/locale-translation-update-info.html.twig
@@ -0,0 +1,57 @@
+{#
+/**
+ * @file
+ * Theme override for displaying translation status information.
+ *
+ * Displays translation status information per language.
+ *
+ * Available variables:
+ * - modules: A list of modules names that have available translation updates.
+ * - updates: A list of available translation updates.
+ * - not_found: A list of modules missing translation updates.
+ *
+ * @see template_preprocess_locale_translation_update_info()
+ */
+#}
+<div class="locale-translation-update__wrapper" tabindex="0" role="button">
+  <span class="locale-translation-update__prefix visually-hidden">Show description</span>
+  {% if modules %}
+    {% set module_list = modules|safe_join(', ') %}
+    <span class="locale-translation-update__message">{% trans %}Updates for: {{ module_list }}{% endtrans %}</span>
+  {% elseif not_found %}
+    <span class="locale-translation-update__message">
+      {%- trans -%}
+        Missing translations for one project
+      {%- plural not_found|length -%}
+        Missing translations for @count projects
+      {%- endtrans -%}
+    </span>
+  {% endif %}
+  {% if updates or not_found %}
+    <div class="locale-translation-update__details">
+      {% if updates %}
+        <ul>
+          {% for update in updates %}
+            <li>{{ update.name }} ({{ update.timestamp|format_date('html_date') }})</li>
+          {% endfor %}
+        </ul>
+      {% endif %}
+      {% if not_found %}
+        {#
+          Prefix the missing updates list if there is an available updates lists
+          before it.
+        #}
+        {% if updates %}
+          {{ 'Missing translations for:'|t }}
+        {% endif %}
+        {% if not_found %}
+          <ul>
+            {% for update in not_found %}
+              <li>{{ update.name }} ({{ update.version|default('no version'|t) }}). {{ update.info }}</li>
+            {% endfor %}
+          </ul>
+        {% endif %}
+      {% endif %}
+    </div>
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/admin/maintenance-task-list.html.twig b/core/themes/stable9/templates/admin/maintenance-task-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0fbeff947446138b958154b7c987d66587270b7f
--- /dev/null
+++ b/core/themes/stable9/templates/admin/maintenance-task-list.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override for a list of maintenance tasks to perform.
+ *
+ * Available variables:
+ * - tasks: A list of maintenance tasks to perform. Each item in the list has
+ *   the following variables:
+ *   - item: The maintenance task.
+ *   - attributes: HTML attributes for the maintenance task.
+ *   - status: (optional) Text describing the status of the maintenance task,
+ *     'active' or 'done'.
+ */
+#}
+<h2 class="visually-hidden">{{ 'Installation tasks'|t }}</h2>
+<ol class="task-list">
+{% for task in tasks %}
+  <li{{ task.attributes }}>
+    {{ task.item }}
+    {% if task.status %}<span class="visually-hidden"> ({{ task.status }})</span>{% endif %}
+  </li>
+{% endfor %}
+</ol>
diff --git a/core/themes/stable9/templates/admin/status-report-counter.html.twig b/core/themes/stable9/templates/admin/status-report-counter.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..88cd45c75ab2440ac4590a307696a976ca78abb9
--- /dev/null
+++ b/core/themes/stable9/templates/admin/status-report-counter.html.twig
@@ -0,0 +1,14 @@
+{#
+/**
+ * @file
+ * Theme override for the status report counter.
+ *
+ * Available variables:
+ * - amount: The number shown on counter.
+ * - text: The text shown on counter.
+ * - severity: The severity of the counter.
+ */
+#}
+<span class="system-status-counter__status-icon system-status-counter__status-icon--{{ severity }}"></span>
+<span>{{ amount }} {{ text }}</span>
+<a href="#{{ severity }}"><span class="visually-hidden">{{ text }} </span>Details</a>
diff --git a/core/themes/stable9/templates/admin/status-report-general-info.html.twig b/core/themes/stable9/templates/admin/status-report-general-info.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e11a2b3d4de1d8495c49565ec94e6d0a4f5d7a4e
--- /dev/null
+++ b/core/themes/stable9/templates/admin/status-report-general-info.html.twig
@@ -0,0 +1,81 @@
+{#
+/**
+ * @file
+ * Theme override for the status report general info.
+ *
+ * Available variables:
+ * - drupal: The status of Drupal installation:
+ *   - value: The current status of Drupal installation.
+ *   - description: The description for current status of Drupal installation.
+ * - cron: The status of cron:
+ *   - value: The current status of cron.
+ *   - description: The description for current status of cron.
+ *   - cron.run_cron: An array to render a button for running cron.
+ * - database_system: The status of database system:
+ *   - value: The current status of database sytem.
+ *   - description: The description for current status of cron.
+ * - database_system_version: The info about current database version:
+ *   - value: The current version of database.
+ *   - description: The description for current version of database.
+ * - php: The current version of PHP:
+ *   - value: The status of currently installed PHP version.
+ *   - description: The description for current installed PHP version.
+ * - php_memory_limit: The info about current PHP memory limit:
+ *   - value: The status of currently set PHP memory limit.
+ *   - description: The description for currently set PHP memory limit.
+ * - webserver: The info about currently installed web server:
+ *   - value: The status of currently installed web server.
+ *   - description: The description for the status of currently installed web
+ *     server.
+ */
+#}
+
+<h2>{{ 'General System Information'|t }}</h2>
+<div class="system-status-general-info__item">
+  <h3 class="system-status-general-info__item-title">{{ 'Drupal Version'|t }}</h3>
+  {{ drupal.value }}
+  {% if drupal.description %}
+    {{ drupal.description }}
+  {% endif %}
+</div>
+<div class="system-status-general-info__item">
+  <h3 class="system-status-general-info__item-title">{{ 'Last Cron Run'|t }}</h3>
+  {{ cron.value }}
+  {% if cron.run_cron %}
+    {{ cron.run_cron }}
+  {% endif %}
+  {% if cron.description %}
+    {{ cron.description }}
+  {% endif %}
+</div>
+<div class="system-status-general-info__item">
+  <h3 class="system-status-general-info__item-title">{{ 'Web Server'|t }}</h3>
+  {{ webserver.value }}
+  {% if webserver.description %}
+    {{ webserver.description }}
+  {% endif %}
+</div>
+<div class="system-status-general-info__item">
+  <h3 class="system-status-general-info__item-title">{{ 'PHP'|t }}</h3>
+  <h4>{{ 'Version'|t }}</h4> {{ php.value }}
+  {% if php.description %}
+    {{ php.description }}
+  {% endif %}
+
+  <h4>{{ 'Memory limit'|t }}</h4>{{ php_memory_limit.value }}
+  {% if php_memory_limit.description %}
+    {{ php_memory_limit.description }}
+  {% endif %}
+</div>
+<div class="system-status-general-info__item">
+  <h3 class="system-status-general-info__item-title">{{ 'Database'|t }}</h3>
+  <h4>{{ 'Version'|t }}</h4>{{ database_system_version.value }}
+  {% if database_system_version.description %}
+    {{ database_system_version.description }}
+  {% endif %}
+
+  <h4>{{ 'System'|t }}</h4>{{ database_system.value }}
+  {% if database_system.description %}
+    {{ database_system.description }}
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/admin/status-report-grouped.html.twig b/core/themes/stable9/templates/admin/status-report-grouped.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1914c169fc5bdfcd3935fc93b42e89e289ddd062
--- /dev/null
+++ b/core/themes/stable9/templates/admin/status-report-grouped.html.twig
@@ -0,0 +1,49 @@
+{#
+/**
+ * @file
+ * Theme override of grouped status report requirements.
+ *
+ * - grouped_requirements: Contains grouped requirements.
+ *   Each group contains:
+ *   - title: The title of the group.
+ *   - type: The severity of the group.
+ *   - items: The requirement instances.
+ *     Each requirement item contains:
+ *     - title: The title of the requirement.
+ *     - value: (optional) The requirement's status.
+ *     - description: (optional) The requirement's description.
+ *     - severity_title: The title of the severity.
+ *     - severity_status: Indicates the severity status.
+ */
+#}
+{{ attach_library('core/drupal.collapse') }}
+
+<div>
+  {% for group in grouped_requirements %}
+    <div>
+      <h3 id="{{ group.type }}">{{ group.title }}</h3>
+      {% for requirement in group.items %}
+        <details class="system-status-report__entry" open>
+          {%
+            set summary_classes = [
+              'system-status-report__status-title',
+              group.type in ['warning', 'error'] ? 'system-status-report__status-icon system-status-report__status-icon--' ~ group.type
+            ]
+          %}
+          <summary{{ create_attribute({'class': summary_classes}) }} role="button">
+            {% if requirement.severity_title  %}
+              <span class="visually-hidden">{{ requirement.severity_title }}</span>
+            {% endif %}
+            {{ requirement.title }}
+          </summary>
+          <div class="system-status-report__entry__value">
+            {{ requirement.value }}
+            {% if requirement.description %}
+              <div class="description">{{ requirement.description }}</div>
+            {% endif %}
+          </div>
+        </details>
+      {% endfor %}
+    </div>
+  {% endfor %}
+</div>
diff --git a/core/themes/stable9/templates/admin/status-report-page.html.twig b/core/themes/stable9/templates/admin/status-report-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..27e0d1576e24f37191e88926a806dd449bf30750
--- /dev/null
+++ b/core/themes/stable9/templates/admin/status-report-page.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override for the status report page.
+ *
+ * Available variables:
+ * - counters: The list of counter elements.
+ * - general_info: A render array to create general info element.
+ * - requirements: A render array to create requirements table.
+ *
+ * @see template_preprocess_status_report()
+ */
+#}
+{% if counters|length == 3 %}
+  {% set element_width_class = ' system-status-report-counters__item--third-width' %}
+{% elseif counters|length == 2 %}
+  {% set element_width_class = ' system-status-report-counters__item--half-width' %}
+{% endif %}
+<div class="system-status-report-counters">
+  {% for counter in counters %}
+    <div class="system-status-report-counters__item{{ element_width_class }}">
+      {{ counter }}
+    </div>
+  {% endfor %}
+</div>
+
+{{ general_info }}
+{{ requirements }}
diff --git a/core/themes/stable9/templates/admin/status-report.html.twig b/core/themes/stable9/templates/admin/status-report.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..39f87db353c34fa86e32e07c4a4c851ee716e1c0
--- /dev/null
+++ b/core/themes/stable9/templates/admin/status-report.html.twig
@@ -0,0 +1,37 @@
+{#
+/**
+ * @file
+ * Theme override for the status report.
+  *
+  * Available variables:
+  * - grouped_requirements: Contains grouped requirements.
+  *   Each group contains:
+  *   - title: The title of the group.
+  *   - type: The severity of the group.
+  *   - items: The requirement instances.
+  *     Each requirement item contains:
+  *     - title: The title of the requirement.
+  *     - value: (optional) The requirement's status.
+  *     - description: (optional) The requirement's description.
+  *     - severity_title: The title of the severity.
+  *     - severity_status: Indicates the severity status.
+  * - requirements: Ungrouped requirements
+  */
+ #}
+{% for group in grouped_requirements %}
+  <h3 id="{{ group.type }}">{{ group.title }}</h3>
+  {% for requirement in group.items %}
+    <details>
+      <summary role="button">
+        {% if requirement.severity_title  %}
+          <span class="visually-hidden">{{ requirement.severity_title }}</span>
+        {% endif %}
+        {{ requirement.title }}
+      </summary>
+      {{ requirement.value }}
+      {% if requirement.description %}
+        <div>{{ requirement.description }}</div>
+      {% endif %}
+    </details>
+  {% endfor %}
+{% endfor %}
diff --git a/core/themes/stable9/templates/admin/system-admin-index.html.twig b/core/themes/stable9/templates/admin/system-admin-index.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..23178ee05b001ad6a83f84210333de221965b2c3
--- /dev/null
+++ b/core/themes/stable9/templates/admin/system-admin-index.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @file
+ * Theme override for the admin index page.
+ *
+ * Available variables:
+ * - system_compact_link: Themed link to toggle compact view.
+ * - containers: A list of administrative containers keyed by position: left or
+ *   right. Each container in the list contains:
+ *   - blocks: A list of administrative blocks, rendered
+ *     through admin-block.html.twig.
+ *
+ * @see template_preprocess_system_admin_index()
+ */
+#}
+<div class="admin clearfix">
+  {{ system_compact_link }}
+  {% for position, blocks in containers %}
+    <div class="{{ position }} clearfix">
+      {% for block in blocks %}
+        {{ block }}
+      {% endfor %}
+    </div>
+  {% endfor %}
+</div>
diff --git a/core/themes/stable9/templates/admin/system-config-form.html.twig b/core/themes/stable9/templates/admin/system-config-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..92cc71b70c3824e21319b718a682ad4163d67f57
--- /dev/null
+++ b/core/themes/stable9/templates/admin/system-config-form.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override for a system settings form.
+ *
+ * This template will be used when a system config form specifies 'config_form'
+ * as its #theme callback.  Otherwise, by default, system config forms will be
+ * themed by form.html.twig. This does not alter the appearance of a form at
+ * all, but is provided as a convenience for themers.
+ *
+ * Available variables:
+ * - form: The confirm form.
+ */
+#}
+{{ form }}
diff --git a/core/themes/stable9/templates/admin/system-modules-details.html.twig b/core/themes/stable9/templates/admin/system-modules-details.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..21397f6e36314f7a82d2e01ad8d4e0e9d7e534df
--- /dev/null
+++ b/core/themes/stable9/templates/admin/system-modules-details.html.twig
@@ -0,0 +1,74 @@
+{#
+/**
+ * @file
+ * Theme override for the modules listing page.
+ *
+ * Displays a list of all packages in a project.
+ *
+ * Available variables:
+ * - modules: Contains multiple module instances. Each module contains:
+ *   - attributes: Attributes on the row.
+ *   - checkbox: A checkbox for enabling the module.
+ *   - name: The human-readable name of the module.
+ *   - id: A unique identifier for interacting with the details element.
+ *   - enable_id: A unique identifier for interacting with the checkbox element.
+ *   - description: The description of the module.
+ *   - machine_name: The module's machine name.
+ *   - version: Information about the module version.
+ *   - requires: A list of modules that this module requires.
+ *   - required_by: A list of modules that require this module.
+ *   - links: A list of administration links provided by the module.
+ *
+ * @see template_preprocess_system_modules_details()
+ */
+#}
+<table class="responsive-enabled">
+  <thead>
+    <tr>
+      <th class="checkbox visually-hidden">{{ 'Installed'|t }}</th>
+      <th class="name visually-hidden">{{ 'Name'|t }}</th>
+      <th class="description visually-hidden priority-low">{{ 'Description'|t }}</th>
+    </tr>
+  </thead>
+  <tbody>
+    {% for module in modules %}
+      {% set zebra = cycle(['odd', 'even'], loop.index0) %}
+      <tr{{ module.attributes.addClass(zebra) }}>
+        <td class="checkbox">
+          {{ module.checkbox }}
+        </td>
+        <td class="module">
+          <label id="{{ module.id }}" for="{{ module.enable_id }}" class="module-name table-filter-text-source">{{ module.name }}</label>
+        </td>
+        <td class="description expand priority-low">
+          <details class="js-form-wrapper form-wrapper" id="{{ module.enable_id }}-description">
+            <summary aria-controls="{{ module.enable_id }}-description" role="button" aria-expanded="false"><span class="text module-description">{{ module.description }}</span></summary>
+            <div class="details-wrapper">
+              <div class="details-description">
+                <div class="requirements">
+                  <div class="admin-requirements">{{ 'Machine name: <span dir="ltr" class="table-filter-text-source">@machine-name</span>'|t({'@machine-name': module.machine_name }) }}</div>
+                  {% if module.version %}
+                    <div class="admin-requirements">{{ 'Version: @module-version'|t({'@module-version': module.version }) }}</div>
+                  {% endif %}
+                  {% if module.requires %}
+                    <div class="admin-requirements">{{ 'Requires: @module-list'|t({'@module-list': module.requires }) }}</div>
+                  {% endif %}
+                  {% if module.required_by %}
+                    <div class="admin-requirements">{{ 'Required by: @module-list'|t({'@module-list': module.required_by }) }}</div>
+                  {% endif %}
+                </div>
+                {% if module.links %}
+                  <div class="links">
+                    {% for link_type in ['help', 'permissions', 'configure'] %}
+                      {{ module.links[link_type] }}
+                    {% endfor %}
+                  </div>
+                {% endif %}
+              </div>
+            </div>
+          </details>
+        </td>
+      </tr>
+    {% endfor %}
+  </tbody>
+</table>
diff --git a/core/themes/stable9/templates/admin/system-modules-uninstall.html.twig b/core/themes/stable9/templates/admin/system-modules-uninstall.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bf8ad1f314eb17b9a81f3e90f4827dd5f3f742b8
--- /dev/null
+++ b/core/themes/stable9/templates/admin/system-modules-uninstall.html.twig
@@ -0,0 +1,73 @@
+{#
+/**
+ * @file
+ * Theme override for the modules uninstall page.
+ *
+ * Available variables:
+ * - form: The modules uninstall form.
+ * - modules: Contains multiple module instances. Each module contains:
+ *   - attributes: Attributes on the row.
+ *   - module_name: The name of the module.
+ *   - checkbox: A checkbox for uninstalling the module.
+ *   - checkbox_id: A unique identifier for interacting with the checkbox
+ *     element.
+ *   - name: The human-readable name of the module.
+ *   - description: The description of the module.
+ *   - disabled_reasons: (optional) A list of reasons why this module cannot be
+ *     uninstalled.
+ *
+ * @see template_preprocess_system_modules_uninstall()
+ */
+#}
+{{ form.filters }}
+
+<table class="responsive-enabled">
+  <thead>
+    <tr>
+      <th>{{ 'Uninstall'|t }}</th>
+      <th>{{ 'Name'|t }}</th>
+      <th>{{ 'Description'|t }}</th>
+    </tr>
+  </thead>
+  <tbody>
+    {% for module in modules %}
+      {% set zebra = cycle(['odd', 'even'], loop.index0) -%}
+      <tr{{ module.attributes.addClass(zebra) }}>
+        <td align="center">
+          {{- module.checkbox -}}
+        </td>
+        <td>
+          <label for="{{ module.checkbox_id }}" class="module-name table-filter-text-source">{{ module.name }}</label>
+        </td>
+        <td class="description">
+          <span class="text module-description">{{ module.description }}</span>
+          {% if module.reasons_count > 0 %}
+            <div class="admin-requirements">
+              {%- trans -%}
+                The following reason prevents {{ module.module_name }} from being uninstalled:
+              {%- plural module.reasons_count -%}
+                The following reasons prevent {{ module.module_name }} from being uninstalled:
+              {%- endtrans %}
+              <div class="item-list">
+                <ul>
+                  {%- for reason in module.validation_reasons -%}
+                    <li>{{ reason }}</li>
+                  {%- endfor -%}
+                  {%- if module.required_by -%}
+                    <li>{{ 'Required by: @module-list'|t({'@module-list': module.required_by|safe_join(', ') }) }}</li>
+                  {%- endif -%}
+                </ul>
+              </div>
+            </div>
+          {% endif %}
+        </td>
+      </tr>
+    {% else %}
+      <tr class="odd">
+        <td colspan="3" class="empty message">{{ 'No modules are available to uninstall.'|t }}</td>
+      </tr>
+    {% endfor %}
+  </tbody>
+</table>
+
+{{ form|without('filters', 'modules', 'uninstall') }}
diff --git a/core/themes/stable9/templates/admin/system-themes-page.html.twig b/core/themes/stable9/templates/admin/system-themes-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5a23f1a14c54f1f300c9a4bbe73d31f82ffb3ef3
--- /dev/null
+++ b/core/themes/stable9/templates/admin/system-themes-page.html.twig
@@ -0,0 +1,74 @@
+{#
+/**
+ * @file
+ * Theme override for the Appearance page.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the main container.
+ * - theme_groups: A list of theme groups. Each theme group contains:
+ *   - attributes: HTML attributes specific to this theme group.
+ *   - title: Title for the theme group.
+ *   - state: State of the theme group, e.g. installed or uninstalled.
+ *   - themes: A list of themes within the theme group. Each theme contains:
+ *     - attributes: HTML attributes specific to this theme.
+ *     - screenshot: A screenshot representing the theme.
+ *     - description: Description of the theme.
+ *     - name: Theme name.
+ *     - version: The theme's version number.
+ *     - is_default: Boolean indicating whether the theme is the default theme
+ *       or not.
+ *     - is_admin: Boolean indicating whether the theme is the admin theme or
+ *       not.
+ *     - notes: Identifies what context this theme is being used in, e.g.,
+ *       default theme, admin theme.
+ *     - incompatible: Text describing any compatibility issues.
+ *     - operations: A list of operation links, e.g., Settings, Enable, Disable,
+ *       etc. these links should only be displayed if the theme is compatible.
+ *
+ * @see template_preprocess_system_themes_page()
+ */
+#}
+<div{{ attributes }}>
+  {% for theme_group in theme_groups %}
+    {%
+      set theme_group_classes = [
+        'system-themes-list',
+        'system-themes-list-' ~ theme_group.state,
+        'clearfix',
+      ]
+    %}
+    <div{{ theme_group.attributes.addClass(theme_group_classes) }}>
+      <h2 class="system-themes-list__header">{{ theme_group.title }}</h2>
+      {% for theme in theme_group.themes %}
+        {%
+          set theme_classes = [
+            theme.is_default ? 'theme-default',
+            theme.is_admin ? 'theme-admin',
+            'theme-selector',
+            'clearfix',
+          ]
+        %}
+        <div{{ theme.attributes.addClass(theme_classes) }}>
+          {% if theme.screenshot %}
+            {{ theme.screenshot }}
+          {% endif %}
+          <div class="theme-info">
+            <h3 class="theme-info__header">
+              {{- theme.name }} {{ theme.version -}}
+              {% if theme.notes %}
+                ({{ theme.notes|safe_join(', ') }})
+              {%- endif -%}
+            </h3>
+            <div class="theme-info__description">{{ theme.description }}</div>
+            {# Display operation links if the theme is compatible. #}
+            {% if theme.incompatible %}
+              <div class="incompatible">{{ theme.incompatible }}</div>
+            {% else %}
+              {{ theme.operations }}
+            {% endif %}
+          </div>
+        </div>
+      {% endfor %}
+    </div>
+  {% endfor %}
+</div>
diff --git a/core/themes/stable9/templates/admin/tablesort-indicator.html.twig b/core/themes/stable9/templates/admin/tablesort-indicator.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..135a76c2c447403ddaecf83456f43979a260d669
--- /dev/null
+++ b/core/themes/stable9/templates/admin/tablesort-indicator.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme override for displaying a tablesort indicator.
+ *
+ * Available variables:
+ * - style: Either 'asc' or 'desc', indicating the sorting direction.
+ */
+#}
+{%
+  set classes = [
+    'tablesort',
+    'tablesort--' ~ style,
+  ]
+%}
+<span{{ attributes.addClass(classes) }}>
+  <span class="visually-hidden">
+    {% if style == 'asc' -%}
+      {{ 'Sort ascending'|t }}
+    {% else -%}
+      {{ 'Sort descending'|t }}
+    {% endif %}
+  </span>
+</span>
diff --git a/core/themes/stable9/templates/admin/update-last-check.html.twig b/core/themes/stable9/templates/admin/update-last-check.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b94d6dceac7c8d353aa9f7b8c02b5e0a8a605f08
--- /dev/null
+++ b/core/themes/stable9/templates/admin/update-last-check.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for the last time update data was checked.
+ *
+ * Available variables:
+ * - last: The timestamp that the site was last checked for updates.
+ * - time: The formatted time since the site last checked for updates.
+ * - link: A link to check for updates manually.
+ *
+ * @see template_preprocess_update_last_check()
+ */
+#}
+<p>
+  {% if last %}
+    {{ 'Last checked: @time ago'|t({'@time': time}) }}
+  {% else %}
+    {{ 'Last checked: never'|t }}
+  {% endif %}
+  ({{ link }})
+</p>
diff --git a/core/themes/stable9/templates/admin/update-project-status.html.twig b/core/themes/stable9/templates/admin/update-project-status.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..db681b59eea0290d1c8c4514373d784732180d71
--- /dev/null
+++ b/core/themes/stable9/templates/admin/update-project-status.html.twig
@@ -0,0 +1,104 @@
+{#
+/**
+ * @file
+ * Theme override for the project status report.
+ *
+ * Available variables:
+ * - title: The project title.
+ * - url: The project url.
+ * - status: The project status.
+ *   - label: The project status label.
+ *   - attributes: HTML attributes for the project status.
+ *   - reason: The reason you should update the project.
+ *   - icon: The project status version indicator icon.
+ * - existing_version: The version of the installed project.
+ * - versions: The available versions of the project.
+ * - install_type: The type of project (e.g., dev).
+ * - datestamp: The date/time of a project version's release.
+ * - extras: HTML attributes and additional information about the project.
+ *   - attributes: HTML attributes for the extra item.
+ *   - label: The label for an extra item.
+ *   - data: The data about an extra item.
+ * - includes: The projects within the project.
+ * - disabled: The currently disabled projects in the project.
+ *
+ * @see template_preprocess_update_project_status()
+ */
+#}
+{%
+  set status_classes = [
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::NOT_SECURE') ? 'project-update__status--security-error',
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::REVOKED') ? 'project-update__status--revoked',
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::NOT_SUPPORTED') ? 'project-update__status--not-supported',
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::NOT_CURRENT') ? 'project-update__status--not-current',
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::CURRENT') ? 'project-update__status--current',
+  ]
+%}
+<div{{ status.attributes.addClass('project-update__status', status_classes) }}>
+  {%- if status.label -%}
+    <span>{{ status.label }}</span>
+  {%- else -%}
+    {{ status.reason }}
+  {%- endif %}
+  <span class="project-update__status-icon">
+    {{ status.icon }}
+  </span>
+</div>
+
+<div class="project-update__title">
+  {%- if url -%}
+    <a href="{{ url }}">{{ title }}</a>
+  {%- else -%}
+    {{ title }}
+  {%- endif %}
+  {{ existing_version }}
+  {% if install_type == 'dev' and datestamp %}
+    <span class="project-update__version-date">({{ datestamp }})</span>
+  {% endif %}
+</div>
+
+{% if versions %}
+  {% for version in versions %}
+    {{ version }}
+  {% endfor %}
+{% endif %}
+
+{%
+  set extra_classes = [
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::NOT_SECURE') ? 'project-not-secure',
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::REVOKED') ? 'project-revoked',
+    project.status == constant('Drupal\\update\\UpdateManagerInterface::NOT_SUPPORTED') ? 'project-not-supported',
+  ]
+%}
+<div class="project-updates__details">
+  {% if extras %}
+    <div class="extra">
+      {% for extra in extras %}
+        <div{{ extra.attributes.addClass(extra_classes) }}>
+          {{ extra.label }}: {{ extra.data }}
+        </div>
+      {% endfor %}
+    </div>
+  {% endif %}
+  {% set includes = includes|join(', ') %}
+  {% if disabled %}
+    {{ 'Includes:'|t }}
+    <ul>
+      <li>
+        {% trans %}
+          Enabled: {{ includes|placeholder }}
+        {% endtrans %}
+      </li>
+      <li>
+        {% set disabled = disabled|join(', ') %}
+        {% trans %}
+          Disabled: {{ disabled|placeholder }}
+        {% endtrans %}
+      </li>
+    </ul>
+  {% else %}
+    {% trans %}
+      Includes: {{ includes|placeholder }}
+    {% endtrans %}
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/admin/update-report.html.twig b/core/themes/stable9/templates/admin/update-report.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9efebc06aec95f6a94d2fae9fd2e40bb766facd3
--- /dev/null
+++ b/core/themes/stable9/templates/admin/update-report.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override for the project status report.
+ *
+ * Available variables:
+ * - last_checked: Themed last time update data was checked.
+ * - no_updates_message: Message when there are no project updates.
+ * - project_types: A list of project types.
+ *   - label: The project type label.
+ *   - table: The project status table.
+ *
+ * @see template_preprocess_update_report()
+ */
+#}
+{{ last_checked }}
+
+{% for project_type in project_types %}
+  <h3>{{ project_type.label }}</h3>
+  {{ project_type.table }}
+{% else %}
+  <p>{{ no_updates_message }}</p>
+{% endfor %}
diff --git a/core/themes/stable9/templates/admin/update-version.html.twig b/core/themes/stable9/templates/admin/update-version.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4b0389ea60ce156df304386f9232043a5f6bc54a
--- /dev/null
+++ b/core/themes/stable9/templates/admin/update-version.html.twig
@@ -0,0 +1,51 @@
+{#
+/**
+ * @file
+ * Theme override for the version display of a project.
+ *
+ * Available variables:
+ * - attributes: HTML attributes suitable for a container element.
+ * - title: The title of the project.
+ * - core_compatibility_details: Render array of core compatibility details.
+ * - version:  A list of data about the latest released version, containing:
+ *   - version: The version number.
+ *   - date: The date of the release.
+ *   - download_link: The URL for the downloadable file.
+ *   - release_link: The URL for the release notes.
+ *   - core_compatible: A flag indicating whether the project is compatible
+ *     with the currently installed version of Drupal core. This flag is not
+ *     set for the Drupal core project itself.
+ *   - core_compatibility_message: A message indicating the versions of Drupal
+ *     core with which this project is compatible. This message is also
+ *     contained within the 'core_compatibility_details' variable documented
+ *     above. This message is not set for the Drupal core project itself.
+ *
+ * @see template_preprocess_update_version()
+ */
+#}
+<div class="{{ attributes.class }} project-update__version"{{ attributes|without('class') }}>
+  <div class="clearfix">
+    <div class="project-update__version-title layout-column layout-column--quarter">{{ title }}</div>
+    <div class="project-update__version-details layout-column layout-column--quarter">
+      <a href="{{ version.release_link }}">{{ version.version }}</a>
+      <span class="project-update__version-date">({{ version.date|date('Y-M-d') }})</span>
+    </div>
+    <div class="layout-column layout-column--half">
+      <ul class="project-update__version-links">
+        {% if version.core_compatible is not defined or version.core_compatible %}
+          <li class="project-update__download-link">
+            <a href="{{ version.download_link }}">{{ 'Download'|t }}</a>
+          </li>
+        {% endif %}
+        <li class="project-update__release-notes-link">
+          <a href="{{ version.release_link }}">{{ 'Release notes'|t }}</a>
+        </li>
+        {% if core_compatibility_details %}
+          <li class="project-update__compatibility-details">
+            {{ core_compatibility_details }}
+          </li>
+        {% endif %}
+      </ul>
+    </div>
+  </div>
+</div>
diff --git a/core/themes/stable9/templates/admin/views-ui-build-group-filter-form.html.twig b/core/themes/stable9/templates/admin/views-ui-build-group-filter-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..69e32cab3bae3df42b24e5187b99204ff505a847
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-build-group-filter-form.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override for Views UI build group filter form.
+ *
+ * Available variables:
+ * - form: A render element representing the form. Contains the following:
+ *   - form_description: The exposed filter's description.
+ *   - expose_button: The button to toggle the expose filter form.
+ *   - group_button: Toggle options between single and grouped filters.
+ *   - label: A filter label input field.
+ *   - description: A filter description field.
+ *   - value: The filters available values.
+ *   - optional: A checkbox to require this filter or not.
+ *   - remember: A checkbox to remember selected filter value(s) (per user).
+ *   - widget: Radio Buttons to select the filter widget.
+ *   - add_group: A button to add another row to the table.
+ *   - more: A details element for additional field exposed filter fields.
+ * - table: A rendered table element of the group filter form.
+ *
+ * @see template_preprocess_views_ui_build_group_filter_form()
+ */
+#}
+{{ form.form_description }}
+{{ form.expose_button }}
+{{ form.group_button }}
+<div class="views-left-40">
+  {{ form.optional }}
+  {{ form.remember }}
+</div>
+<div class="views-right-60">
+  {{ form.widget }}
+  {{ form.label }}
+  {{ form.description }}
+</div>
+{#
+  Render the rest of the form elements excluding elements that are rendered
+  elsewhere.
+#}
+{{ form|without(
+    'form_description',
+    'expose_button',
+    'group_button',
+    'optional',
+    'remember',
+    'widget',
+    'label',
+    'description',
+    'add_group',
+    'more'
+  )
+}}
+{{ table }}
+{{ form.add_group }}
+{{ form.more }}
diff --git a/core/themes/stable9/templates/admin/views-ui-container.html.twig b/core/themes/stable9/templates/admin/views-ui-container.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ed719e44cb43a259f270ab3929cc3e5639283f48
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-container.html.twig
@@ -0,0 +1,11 @@
+{#
+/**
+ * @file
+ * Theme override for a generic views UI container/wrapper.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to apply to the container element.
+ * - children: The remaining elements such as dropbuttons and tabs.
+ */
+#}
+<div{{ attributes }}>{{ children }}</div>
diff --git a/core/themes/stable9/templates/admin/views-ui-display-tab-bucket.html.twig b/core/themes/stable9/templates/admin/views-ui-display-tab-bucket.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..32dbdd7e24877ac2ddc8e9dc31f03829d117146d
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-display-tab-bucket.html.twig
@@ -0,0 +1,33 @@
+{#
+/**
+ * @file
+ * Theme override for each "box" on the display query edit screen.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to apply to the container element.
+ * - actions: Action links such as "Add", "And/Or, Rearrange" for the content.
+ * - title: The title of the bucket, e.g. "Fields", "Filter Criteria", etc.
+ * - content: Content items such as fields or settings in this container.
+ * - name: The name of the bucket, e.g. "Fields", "Filter Criteria", etc.
+ * - overridden: A boolean indicating the setting has been overridden from the
+ *   default.
+ *
+ * @see template_preprocess_views_ui_display_tab_bucket()
+ */
+#}
+{%
+  set classes = [
+    'views-ui-display-tab-bucket',
+    name ? name|clean_class,
+    overridden ? 'overridden',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if title -%}
+    <h3 class="views-ui-display-tab-bucket__title">{{ title }}</h3>
+  {%- endif %}
+  {% if actions -%}
+    {{ actions }}
+  {%- endif %}
+  {{ content }}
+</div>
diff --git a/core/themes/stable9/templates/admin/views-ui-display-tab-setting.html.twig b/core/themes/stable9/templates/admin/views-ui-display-tab-setting.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..77d659f31487acdd77ec0edaa5ff0c69388a3ed9
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-display-tab-setting.html.twig
@@ -0,0 +1,35 @@
+{#
+/**
+ * @file
+ * Theme override for Views UI display tab settings.
+ *
+ * Template for each row inside the "boxes" on the display query edit screen.
+ *
+ * Available variables:
+ * - attributes: HTML attributes such as class for the container.
+ * - description: The description or label for this setting.
+ * - settings_links: A list of links for this setting.
+ * - defaulted: A boolean indicating the setting is in its default state.
+ * - overridden: A boolean indicating the setting has been overridden from the
+ *   default.
+ *
+ * @see template_preprocess_views_ui_display_tab_setting()
+ */
+#}
+{%
+  set classes = [
+    'views-display-setting',
+    'clearfix',
+    'views-ui-display-tab-setting',
+    defaulted ? 'defaulted',
+    overridden ? 'overridden',
+]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if description -%}
+    <span class="label">{{ description }}</span>
+  {%- endif %}
+  {% if settings_links %}
+    {{ settings_links|safe_join('<span class="label">&nbsp;|&nbsp;</span>') }}
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/admin/views-ui-expose-filter-form.html.twig b/core/themes/stable9/templates/admin/views-ui-expose-filter-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a23b6e22dea81d3ca1093e0acf6fbdfe596c65ac
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-expose-filter-form.html.twig
@@ -0,0 +1,65 @@
+{#
+/**
+ * @file
+ * Theme override for exposed filter form.
+ *
+ * Available variables:
+ * - form_description: The exposed filter's description.
+ * - expose_button: The button to toggle the expose filter form.
+ * - group_button: Toggle options between single and grouped filters.
+ * - required: A checkbox to require this filter or not.
+ * - label: A filter label input field.
+ * - description: A filter description field.
+ * - operator: The operators for how the filters value should be treated.
+ *   - #type: The operator type.
+ * - value: The filters available values.
+ * - use_operator: Checkbox to allow the user to expose the operator.
+ * - more: A details element for additional field exposed filter fields.
+ */
+#}
+{{ form.form_description }}
+{{ form.expose_button }}
+{{ form.group_button }}
+{{ form.required }}
+{{ form.label }}
+{{ form.description }}
+
+{{ form.operator }}
+{{ form.value }}
+
+{% if form.use_operator %}
+  <div class="views-left-40">
+  {{ form.use_operator }}
+  </div>
+{% endif %}
+
+{#
+  Collect a list of elements printed to exclude when printing the
+  remaining elements.
+#}
+{% set remaining_form = form|without(
+  'form_description',
+  'expose_button',
+  'group_button',
+  'required',
+  'label',
+  'description',
+  'operator',
+  'value',
+  'use_operator',
+  'more'
+  )
+%}
+
+{#
+  Only output the right column markup if there's a left column to begin with.
+#}
+{% if form.operator['#type'] %}
+  <div class="views-right-60">
+  {{ remaining_form }}
+  </div>
+{% else %}
+  {{ remaining_form }}
+{% endif %}
+
+{{ form.more }}
diff --git a/core/themes/stable9/templates/admin/views-ui-rearrange-filter-form.html.twig b/core/themes/stable9/templates/admin/views-ui-rearrange-filter-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e38d132318cb465bb396bd0161673daa003bf33e
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-rearrange-filter-form.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @file
+ * Theme override for Views UI rearrange filter form.
+ *
+ * Available variables:
+ * - form: A render element representing the form.
+ * - grouping: A flag whether or not there is more than one group.
+ * - ungroupable_table: The ungroupable filter table.
+ * - table: The groupable filter table.
+ *
+ * @see template_preprocess_views_ui_rearrange_filter_form()
+ */
+#}
+{{ form.override }}
+<div class="scroll" data-drupal-views-scroll>
+  {% if grouping %}
+    {{ form.filter_groups.operator }}
+  {% else %}
+    {{ form.filter_groups.groups.0 }}
+  {% endif %}
+  {{ ungroupable_table }}
+  {{ table }}
+</div>
+{{ form|without('override', 'filter_groups', 'remove_groups', 'filters') }}
diff --git a/core/themes/stable9/templates/admin/views-ui-style-plugin-table.html.twig b/core/themes/stable9/templates/admin/views-ui-style-plugin-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2295390c13b833360b616dc5a3a254f77bd143bc
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-style-plugin-table.html.twig
@@ -0,0 +1,16 @@
+{#
+/**
+ * @file
+ * Theme override for the settings of a table style views display.
+ *
+ * Available variables:
+ * - table: A table of options for each field in this display.
+ * - form: Any remaining form fields not included in the table.
+ *   - description_markup: An overview for the settings of this display.
+ *
+ * @see template_preprocess_views_ui_style_plugin_table()
+ */
+#}
+{{ form.description_markup }}
+{{ table }}
+{{ form }}
diff --git a/core/themes/stable9/templates/admin/views-ui-view-displays-list.html.twig b/core/themes/stable9/templates/admin/views-ui-view-displays-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e6e5b021270a47ca3afea904722e1e197b617805
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-view-displays-list.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme override for views displays on the views listing page.
+ *
+ * Available variables:
+ * - displays: Contains multiple display instances. Each display contains:
+ *   - display: Display name.
+ *   - path: Path to display, if any.
+ */
+#}
+<ul>
+  {% for display in displays %}
+    <li>
+      {% if display.path %}
+        {{ display.display }} <span data-drupal-selector="views-table-filter-text-source">({{ display.path }})</span>
+      {% else %}
+        {{ display.display }}
+      {% endif %}
+    </li>
+  {% endfor %}
+</ul>
diff --git a/core/themes/stable9/templates/admin/views-ui-view-info.html.twig b/core/themes/stable9/templates/admin/views-ui-view-info.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dc8f7609fe9c1c38ec0b33fd5109a382fa397a99
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-view-info.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Theme override for basic administrative info about a View.
+ *
+ * Available variables:
+ * - displays: List of displays.
+ */
+#}
+<h3 class="views-ui-view-title" data-drupal-selector="views-table-filter-text-source">{{ view.label }}</h3>
+<div class="views-ui-view-displays">
+  {% if displays %}
+    {% trans %}
+      Display
+    {% plural displays %}
+      Displays
+    {% endtrans %}:
+    <em>{{ displays|safe_join(', ') }}</em>
+  {% else %}
+    {{ 'None'|t }}
+  {% endif %}
+</div>
+<div class="views-ui-view-machine-name">
+  {{ 'Machine name:'|t }}
+  <span data-drupal-selector="views-table-filter-text-source">{{ view.id }}</span>
+</div>
diff --git a/core/themes/stable9/templates/admin/views-ui-view-preview-section.html.twig b/core/themes/stable9/templates/admin/views-ui-view-preview-section.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c2c83bd1cebdcf69359b2dd6ce3ca43d5859d64f
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-view-preview-section.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override for a views UI preview section.
+ *
+ * Available variables:
+ * - title: The human readable section title.
+ * - links: A list of contextual links.
+ * - content: The content for this section preview.
+ *
+ * @see template_preprocess_views_ui_view_preview_section()
+ */
+#}
+<h1 class="section-title">{{ title }}</h1>
+{% if links %}
+  <div class="contextual">{{ links }}</div>
+{% endif %}
+<div class="preview-section">{{ content }}</div>
diff --git a/core/themes/stable9/templates/admin/views-ui-views-listing-table.html.twig b/core/themes/stable9/templates/admin/views-ui-views-listing-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e1d0c1cf34ab0593ce152c4d616a9ac2eecd2249
--- /dev/null
+++ b/core/themes/stable9/templates/admin/views-ui-views-listing-table.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Theme override for views listing table.
+ *
+ * Available variables:
+ * - headers: Contains table headers.
+ * - rows: Contains multiple rows. Each row contains:
+ *   - view_name: The human-readable name of the view.
+ *   - machine_name: Machine name of the view.
+ *   - description: The description of the view.
+ *   - displays: List of displays attached to the view.
+ *   - operations: List of available operations.
+ *
+ * @see template_preprocess_views_ui_views_listing_table()
+ */
+#}
+<table{{ attributes.addClass('responsive-enabled') }}>
+  <thead>
+    <tr>
+      {% for header in headers %}
+        <th{{ header.attributes }}>{{ header.data }}</th>
+      {% endfor %}
+    </tr>
+  </thead>
+  <tbody>
+    {% for row in rows %}
+      <tr{{ row.attributes }}>
+        <td class="views-ui-view-name">
+          <strong data-drupal-selector="views-table-filter-text-source">{{ row.data.view_name.data }}</strong>
+        </td>
+        <td class="views-ui-view-machine-name" data-drupal-selector="views-table-filter-text-source">
+          {{ row.data.machine_name.data }}
+        </td>
+        <td class="views-ui-view-description" data-drupal-selector="views-table-filter-text-source">
+          {{ row.data.description.data }}
+        </td>
+        <td class="views-ui-view-displays">
+          {{ row.data.displays.data }}
+        </td>
+        <td class="views-ui-view-operations">
+          {{ row.data.operations.data }}
+        </td>
+      </tr>
+    {% endfor %}
+  </tbody>
+</table>
diff --git a/core/themes/stable9/templates/block/block--local-actions-block.html.twig b/core/themes/stable9/templates/block/block--local-actions-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3e660c514500f6618039194277e93abfbf249e3e
--- /dev/null
+++ b/core/themes/stable9/templates/block/block--local-actions-block.html.twig
@@ -0,0 +1,12 @@
+{% extends "block.html.twig" %}
+{#
+/**
+ * @file
+ * Theme override for local actions (primary admin actions.)
+ */
+#}
+{% block content %}
+  {% if content %}
+    <nav>{{ content }}</nav>
+  {% endif %}
+{% endblock %}
diff --git a/core/themes/stable9/templates/block/block--system-branding-block.html.twig b/core/themes/stable9/templates/block/block--system-branding-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9604361dab062700df52189852ba30b2eb54aeb9
--- /dev/null
+++ b/core/themes/stable9/templates/block/block--system-branding-block.html.twig
@@ -0,0 +1,26 @@
+{% extends "block.html.twig" %}
+{#
+/**
+ * @file
+ * Theme override for a branding block.
+ *
+ * Each branding element variable (logo, name, slogan) is only available if
+ * enabled in the block configuration.
+ *
+ * Available variables:
+ * - site_logo: Logo for site as defined in Appearance or theme settings.
+ * - site_name: Name for site as defined in Site information settings.
+ * - site_slogan: Slogan for site as defined in Site information settings.
+ */
+#}
+{% block content %}
+  {% if site_logo %}
+    <a href="{{ path('<front>') }}" rel="home">
+      <img src="{{ site_logo }}" alt="{{ 'Home'|t }}" />
+    </a>
+  {% endif %}
+  {% if site_name %}
+    <a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
+  {% endif %}
+  {{ site_slogan }}
+{% endblock %}
diff --git a/core/themes/stable9/templates/block/block--system-menu-block.html.twig b/core/themes/stable9/templates/block/block--system-menu-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e78e1de7f66c984ba0be4ed30d766431b9d33a5f
--- /dev/null
+++ b/core/themes/stable9/templates/block/block--system-menu-block.html.twig
@@ -0,0 +1,48 @@
+{#
+/**
+ * @file
+ * Theme override for a menu block.
+ *
+ * Available variables:
+ * - plugin_id: The ID of the block implementation.
+ * - label: The configured label of the block if visible.
+ * - configuration: A list of the block's configuration values.
+ *   - label: The configured label for the block.
+ *   - label_display: The display settings for the label.
+ *   - provider: The module or other provider that provided this block plugin.
+ *   - Block plugin specific settings will also be stored here.
+ * - content: The content of this block.
+ * - attributes: HTML attributes for the containing element.
+ *   - id: A valid HTML ID and guaranteed unique.
+ * - title_attributes: HTML attributes for the title element.
+ * - content_attributes: HTML attributes for the content element.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * Headings should be used on navigation menus that consistently appear on
+ * multiple pages. When this menu block's label is configured to not be
+ * displayed, it is automatically made invisible using the 'visually-hidden' CSS
+ * class, which still keeps it visible for screen-readers and assistive
+ * technology. Headings allow screen-reader and keyboard only users to navigate
+ * to or skip the links.
+ * See http://juicystudio.com/article/screen-readers-display-none.php and
+ * http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
+ */
+#}
+{% set heading_id = attributes.id ~ '-menu'|clean_id %}
+<nav role="navigation" aria-labelledby="{{ heading_id }}"{{ attributes|without('role', 'aria-labelledby') }}>
+  {# Label. If not displayed, we still provide it for screen readers. #}
+  {% if not configuration.label_display %}
+    {% set title_attributes = title_attributes.addClass('visually-hidden') %}
+  {% endif %}
+  {{ title_prefix }}
+  <h2{{ title_attributes.setAttribute('id', heading_id) }}>{{ configuration.label }}</h2>
+  {{ title_suffix }}
+
+  {# Menu. #}
+  {% block content %}
+    {{ content }}
+  {% endblock %}
+</nav>
diff --git a/core/themes/stable9/templates/block/block--system-messages-block.html.twig b/core/themes/stable9/templates/block/block--system-messages-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ef2e3ac78fd415ba5dc73f8b3f248076b1f51d3f
--- /dev/null
+++ b/core/themes/stable9/templates/block/block--system-messages-block.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override for the messages block.
+ *
+ * Removes wrapper elements from block so that empty block does not appear when
+ * there are no messages.
+ *
+ * Available variables:
+ * - content: The content of this block.
+ */
+#}
+{{ content }}
diff --git a/core/themes/stable9/templates/block/block.html.twig b/core/themes/stable9/templates/block/block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dca6f48fb319e26ad0cb19d31c349915a98535e7
--- /dev/null
+++ b/core/themes/stable9/templates/block/block.html.twig
@@ -0,0 +1,37 @@
+{#
+/**
+ * @file
+ * Theme override to display a block.
+ *
+ * Available variables:
+ * - plugin_id: The ID of the block implementation.
+ * - label: The configured label of the block if visible.
+ * - configuration: A list of the block's configuration values.
+ *   - label: The configured label for the block.
+ *   - label_display: The display settings for the label.
+ *   - provider: The module or other provider that provided this block plugin.
+ *   - Block plugin specific settings will also be stored here.
+ * - content: The content of this block.
+ * - attributes: array of HTML attributes populated by modules, intended to
+ *   be added to the main container tag of this template.
+ *   - id: A valid HTML ID and guaranteed unique.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @see template_preprocess_block()
+ */
+#}
+<div{{ attributes }}>
+  {{ title_prefix }}
+  {% if label %}
+    <h2{{ title_attributes }}>{{ label }}</h2>
+  {% endif %}
+  {{ title_suffix }}
+  {% block content %}
+    {{ content }}
+  {% endblock %}
+</div>
diff --git a/core/themes/stable9/templates/content-edit/entity-add-list.html.twig b/core/themes/stable9/templates/content-edit/entity-add-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..815f5d61da7e51cdfa9c8c8997aa2a36950cd654
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/entity-add-list.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override to present a list of available bundles.
+ *
+ * Available variables:
+ *   - bundles: A list of bundles, each with the following properties:
+ *     - label: Bundle label.
+ *     - description: Bundle description.
+ *     - add_link: Link to create an entity of this bundle.
+ *   - add_bundle_message: The message shown when there are no bundles. Only
+ *                         available if the entity type uses bundle entities.
+ *
+ * @see template_preprocess_entity_add_list()
+ */
+#}
+{% if bundles is not empty %}
+  <dl>
+    {% for bundle in bundles %}
+      <dt>{{ bundle.add_link }}</dt>
+      <dd>{{ bundle.description }}</dd>
+    {% endfor %}
+  </dl>
+{% elseif add_bundle_message is not empty %}
+  <p>
+    {{ add_bundle_message }}
+  </p>
+{% endif %}
diff --git a/core/themes/stable9/templates/content-edit/entity-moderation-form.html.twig b/core/themes/stable9/templates/content-edit/entity-moderation-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bae2fc953739314aef5f07bbe2e55b4ceaa4def3
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/entity-moderation-form.html.twig
@@ -0,0 +1,7 @@
+<ul class="entity-moderation-form">
+  <li class="entity-moderation-form__item">{{ form.current }}</li>
+  <li class="entity-moderation-form__item">{{ form.new_state }}</li>
+  <li class="entity-moderation-form__item">{{ form.revision_log }}</li>
+  <li class="entity-moderation-form__item">{{ form.submit }}</li>
+</ul>
+{{ form|without('current', 'new_state', 'revision_log', 'submit') }}
diff --git a/core/themes/stable9/templates/content-edit/file-managed-file.html.twig b/core/themes/stable9/templates/content-edit/file-managed-file.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..f639237d2a0f4a3f851ba2fb4d82af5315304dbb
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/file-managed-file.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override to display a file form widget.
+ *
+ * Available variables:
+ * - element: Form element for the file upload.
+ * - attributes: HTML attributes for the containing element.
+ *
+ * @see template_preprocess_file_managed_file()
+ */
+#}
+{%
+  set classes = [
+    'js-form-managed-file',
+    'form-managed-file',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {{ element }}
+</div>
diff --git a/core/themes/stable9/templates/content-edit/file-upload-help.html.twig b/core/themes/stable9/templates/content-edit/file-upload-help.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d05822ebcbd49870cfa8e590fd467c04475778d5
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/file-upload-help.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Theme override to display help text for file fields.
+ *
+ * Available variables:
+ * - descriptions: Lines of help text for uploading a file.
+ *
+ * @see template_preprocess_file_upload_help()
+ */
+#}
+{{ descriptions|safe_join('<br />') }}
diff --git a/core/themes/stable9/templates/content-edit/file-widget-multiple.html.twig b/core/themes/stable9/templates/content-edit/file-widget-multiple.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..34646fe7796b1204850362dd07b1970f1c933327
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/file-widget-multiple.html.twig
@@ -0,0 +1,14 @@
+{#
+/**
+ * @file
+ * Theme override to display a multi file form widget.
+ *
+ * Available variables:
+ * - table: Table of previously uploaded files.
+ * - element: The form element for uploading another file.
+ *
+ * @see template_preprocess_file_widget_multiple()
+ */
+#}
+{{ table }}
+{{ element }}
diff --git a/core/themes/stable9/templates/content-edit/filter-caption.html.twig b/core/themes/stable9/templates/content-edit/filter-caption.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..246cf0f95504e8d27288b9471c77159c66feb085
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/filter-caption.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override for a filter caption.
+ *
+ * Returns HTML for a captioned image, audio, video or other tag.
+ *
+ * Available variables
+ * - string node: The complete HTML tag whose contents are being captioned.
+ * - string tag: The name of the HTML tag whose contents are being captioned.
+ * - string caption: The caption text.
+ * - string classes: The classes of the captioned HTML tag.
+ */
+#}
+<figure role="group"{%- if classes %} class="{{ classes }}"{%- endif %}>
+{{ node }}
+<figcaption>{{ caption }}</figcaption>
+</figure>
diff --git a/core/themes/stable9/templates/content-edit/filter-guidelines.html.twig b/core/themes/stable9/templates/content-edit/filter-guidelines.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4cd6706f2d3d701458778f760aab777a47bad95c
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/filter-guidelines.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override for guidelines for a text format.
+ *
+ * Available variables:
+ * - format: Contains information about the current text format, including the
+ *   following:
+ *   - name: The name of the text format, potentially unsafe and needs to be
+ *     escaped.
+ *   - format: The machine name of the text format, e.g. 'basic_html'.
+ * - attributes: HTML attributes for the containing element.
+ * - tips: Descriptions and a CSS ID in the form of 'module-name/filter-id'
+ *   (only used when 'long' is TRUE) for each filter in one or more text
+ *   formats.
+ *
+ * @see template_preprocess_filter_tips()
+ */
+#}
+<div{{ attributes }}>
+  <h4>{{ format.label }}</h4>
+  {{ tips }}
+</div>
diff --git a/core/themes/stable9/templates/content-edit/filter-tips.html.twig b/core/themes/stable9/templates/content-edit/filter-tips.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5163eda636696a86939cd9249ff7bfb0708ed09c
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/filter-tips.html.twig
@@ -0,0 +1,44 @@
+{#
+/**
+ * @file
+ * Theme override for a set of filter tips.
+ *
+ * Available variables:
+ * - tips: Descriptions and a CSS ID in the form of 'module-name/filter-id'
+ *   (only used when 'long' is TRUE) for each filter in one or more text
+ *   formats.
+ * - long: A flag indicating whether the passed-in filter tips contain extended
+ *   explanations, i.e. intended to be output on the path 'filter/tips'
+ *   (TRUE), or are in a short format, i.e. suitable to be displayed below a
+ *   form element. Defaults to FALSE.
+ * - multiple: A flag indicating there is more than one filter tip.
+ *
+ * @see template_preprocess_filter_tips()
+ */
+#}
+{% if multiple %}
+  <h2>{{ 'Text Formats'|t }}</h2>
+{% endif %}
+
+{% if tips|length %}
+  {% for name, tip in tips %}
+
+    {% if multiple %}
+      <div{{ attributes }}>
+      <h3>{{ tip.name }}</h3>
+    {% endif %}
+
+    {% if tip.list|length %}
+      <ul>
+      {% for item in tip.list %}
+        <li{{ tip.attributes }}>{{ item.tip }}</li>
+      {% endfor %}
+      </ul>
+    {% endif %}
+
+    {% if multiple %}
+      </div>
+    {% endif %}
+
+  {% endfor %}
+{% endif %}
diff --git a/core/themes/stable9/templates/content-edit/image-widget.html.twig b/core/themes/stable9/templates/content-edit/image-widget.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..cd3f60dc4675f6c28943366eedffe06d387b2114
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/image-widget.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Theme override for an image field widget.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - data: Render elements of the image widget.
+ *
+ * @see template_preprocess_image_widget()
+ */
+#}
+<div{{ attributes }}>
+  {{ data.preview }}
+  {# Render widget data without the image preview that was output already. #}
+  {{ data|without('preview') }}
+</div>
diff --git a/core/themes/stable9/templates/content-edit/node-add-list.html.twig b/core/themes/stable9/templates/content-edit/node-add-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..560b9e329f510e99b1e60dc7a263170cae7cde6b
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/node-add-list.html.twig
@@ -0,0 +1,30 @@
+{#
+/**
+ * @file
+ * Theme override to list node types available for adding content.
+ *
+ * This list is displayed on the Add content admin page.
+ *
+ * Available variables:
+ * - types: A list of content types, each with the following properties:
+ *   - add_link: Link to create a piece of content of this type.
+ *   - description: Description of this type of content.
+ *
+ * @see template_preprocess_node_add_list()
+ */
+#}
+{% if types is not empty %}
+  <dl>
+    {% for type in types %}
+      <dt>{{ type.add_link }}</dt>
+      <dd>{{ type.description }}</dd>
+    {% endfor %}
+  </dl>
+{% else %}
+  <p>
+    {% set create_content = path('node.type_add') %}
+    {% trans %}
+      You have not created any content types yet. Go to the <a href="{{ create_content }}">content type creation page</a> to add a new content type.
+    {% endtrans %}
+  </p>
+{% endif %}
diff --git a/core/themes/stable9/templates/content-edit/node-edit-form.html.twig b/core/themes/stable9/templates/content-edit/node-edit-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..db74a20dda3ccf67762f8afda038a0bebba04f5b
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/node-edit-form.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override for a node edit form.
+ *
+ * Two column template for the node add/edit form.
+ *
+ * This template will be used when a node edit form specifies 'node_edit_form'
+ * as its #theme callback.  Otherwise, by default, node add/edit forms will be
+ * themed by form.html.twig.
+ *
+ * Available variables:
+ * - form: The node add/edit form.
+ *
+ * @see seven_form_node_form_alter()
+ */
+#}
+{{ form }}
diff --git a/core/themes/stable9/templates/content-edit/text-format-wrapper.html.twig b/core/themes/stable9/templates/content-edit/text-format-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..33ca7ce14f020e576580c1e673c99545fd46d713
--- /dev/null
+++ b/core/themes/stable9/templates/content-edit/text-format-wrapper.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for a text format-enabled form element.
+ *
+ * Available variables:
+ * - children: Text format element children.
+ * - description: Text format element description.
+ * - attributes: HTML attributes for the containing element.
+ * - aria_description: Flag for whether or not an ARIA description has been
+ *   added to the description container.
+ *
+ * @see template_preprocess_text_format_wrapper()
+ */
+#}
+<div class="js-text-format-wrapper js-form-item form-item">
+  {{ children }}
+  {% if description %}
+    <div{{ attributes }}>{{ description }}</div>
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/content/aggregator-item.html.twig b/core/themes/stable9/templates/content/aggregator-item.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2085dc9b0b3721367a7d9935463ed64b949aa2df
--- /dev/null
+++ b/core/themes/stable9/templates/content/aggregator-item.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @file
+ * Theme override to present a feed item in an aggregator page.
+ *
+ * Available variables:
+ * - url: URL to the originating feed item.
+ * - title: (optional) Title of the feed item.
+ * - content: All field items. Use {{ content }} to print them all,
+ *   or print a subset such as {{ content.field_example }}. Use
+ *   {{ content|without('field_example') }} to temporarily suppress the printing
+ *   of a given element.
+ * - attributes: HTML attributes for the wrapper.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @see template_preprocess_aggregator_item()
+ */
+#}
+<article{{ attributes }}>
+  {{ title_prefix }}
+  {% if title %}
+    <h3>
+      <a href="{{ url }}">{{ title }}</a>
+    </h3>
+  {% endif %}
+  {{ title_suffix }}
+  {{ content }}
+</article>
diff --git a/core/themes/stable9/templates/content/book-node-export-html.html.twig b/core/themes/stable9/templates/content/book-node-export-html.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ff1114903d81df677854edbc8640b3969f5f208d
--- /dev/null
+++ b/core/themes/stable9/templates/content/book-node-export-html.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override for a single node in a printer-friendly outline.
+ *
+ * Available variables:
+ * - node: Fully loaded node.
+ * - depth: Depth of the current node inside the outline.
+ * - title: Node title.
+ * - content: Node content.
+ * - children: All the child nodes recursively rendered through this file.
+ *
+ * @see template_preprocess_book_node_export_html()
+ */
+#}
+<article>
+  <h1>{{ title }}</h1>
+  {{ content }}
+  {{ children }}
+</article>
diff --git a/core/themes/stable9/templates/content/comment.html.twig b/core/themes/stable9/templates/content/comment.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..db870d8f4be329cd59b8b50c5899f48f96966b81
--- /dev/null
+++ b/core/themes/stable9/templates/content/comment.html.twig
@@ -0,0 +1,100 @@
+{#
+/**
+ * @file
+ * Theme override for comments.
+ *
+ * Available variables:
+ * - author: Comment author. Can be a link or plain text.
+ * - content: The content-related items for the comment display. Use
+ *   {{ content }} to print them all, or print a subset such as
+ *   {{ content.field_example }}. Use the following code to temporarily suppress
+ *   the printing of a given child element:
+ *   @code
+ *   {{ content|without('field_example') }}
+ *   @endcode
+ * - created: Formatted date and time for when the comment was created.
+ *   Preprocess functions can reformat it by calling DateFormatter::format()
+ *   with the desired parameters on the 'comment.created' variable.
+ * - changed: Formatted date and time for when the comment was last changed.
+ *   Preprocess functions can reformat it by calling DateFormatter::format()
+ *   with the desired parameters on the 'comment.changed' variable.
+ * - permalink: Comment permalink.
+ * - submitted: Submission information created from author and created
+ *   during template_preprocess_comment().
+ * - user_picture: The comment author's profile picture.
+ * - status: Comment status. Possible values are:
+ *   unpublished, published, or preview.
+ * - title: Comment title, linked to the comment.
+ * - attributes: HTML attributes for the containing element.
+ *   The attributes.class may contain one or more of the following classes:
+ *   - comment: The current template type; for instance, 'theming hook'.
+ *   - by-anonymous: Comment by an unregistered user.
+ *   - by-{entity-type}-author: Comment by the author of the parent entity,
+ *     eg. by-node-author.
+ *   - preview: When previewing a new or edited comment.
+ *   The following applies only to viewers who are registered users:
+ *   - unpublished: An unpublished comment visible only to administrators.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - content_attributes: List of classes for the styling of the comment content.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - threaded: A flag indicating whether the comments are threaded or not.
+ *
+ * These variables are provided to give context about the parent comment (if
+ * any):
+ * - parent_comment: Full parent comment entity (if any).
+ * - parent_author: Equivalent to author for the parent comment.
+ * - parent_created: Equivalent to created for the parent comment.
+ * - parent_changed: Equivalent to changed for the parent comment.
+ * - parent_title: Equivalent to title for the parent comment.
+ * - parent_permalink: Equivalent to permalink for the parent comment.
+ * - parent: A text string of parent comment submission information created from
+ *   'parent_author' and 'parent_created' during template_preprocess_comment().
+ *   This information is presented to help screen readers follow lengthy
+ *   discussion threads. You can hide this from sighted users using the class
+ *   visually-hidden.
+ *
+ * These two variables are provided for context:
+ * - comment: Full comment object.
+ * - entity: Entity the comments are attached to.
+ *
+ * @see template_preprocess_comment()
+ */
+#}
+
+<article{{ attributes.addClass('js-comment') }}>
+  {#
+    Hide the "new" indicator by default, let a piece of JavaScript ask the
+    server which comments are new for the user. Rendering the final "new"
+    indicator here would break the render cache.
+  #}
+  <mark class="hidden" data-comment-timestamp="{{ new_indicator_timestamp }}"></mark>
+
+  <footer>
+    {{ user_picture }}
+    <p>{{ submitted }}</p>
+
+    {#
+      Indicate the semantic relationship between parent and child comments for
+      accessibility. The list is difficult to navigate in a screen reader
+      without this information.
+    #}
+    {% if parent %}
+      <p class="visually-hidden">{{ parent }}</p>
+    {% endif %}
+
+    {{ permalink }}
+  </footer>
+
+  <div{{ content_attributes }}>
+    {% if title %}
+      {{ title_prefix }}
+      <h3{{ title_attributes }}>{{ title }}</h3>
+      {{ title_suffix }}
+    {% endif %}
+    {{ content }}
+  </div>
+</article>
diff --git a/core/themes/stable9/templates/content/mark.html.twig b/core/themes/stable9/templates/content/mark.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..bc70b5c78c0a93d00b7734e71389842d8f5563a7
--- /dev/null
+++ b/core/themes/stable9/templates/content/mark.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override for a marker for new or updated content.
+ *
+ * Available variables:
+ * - status: Number representing the marker status to display. Use the constants
+ *   below for comparison:
+ *   - MARK_NEW
+ *   - MARK_UPDATED
+ *   - MARK_READ
+ */
+#}
+{% if logged_in %}
+  {% if status is constant('MARK_NEW') %}
+    {{ 'New'|t }}
+  {% elseif status is constant('MARK_UPDATED') %}
+    {{ 'Updated'|t }}
+  {% endif %}
+{% endif %}
diff --git a/core/themes/stable9/templates/content/media-embed-error.html.twig b/core/themes/stable9/templates/content/media-embed-error.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b54c8a798f3a0251534d2dfa3d345a3aa8f9345a
--- /dev/null
+++ b/core/themes/stable9/templates/content/media-embed-error.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override for a missing media error.
+ *
+ * Available variables
+ * - message: The message text.
+ * - attributes: HTML attributes for the containing element.
+ *
+ * When a response from the back end can't be returned, a related error message
+ * is displayed from JavaScript.
+ *
+ * @see Drupal.theme.mediaEmbedPreviewError
+ */
+#}
+<div{{ attributes }}>
+  {{ message }}
+</div>
diff --git a/core/themes/stable9/templates/content/media-oembed-iframe.html.twig b/core/themes/stable9/templates/content/media-oembed-iframe.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..fbc43e8b4f955804bedf79d0b257837013fcd528
--- /dev/null
+++ b/core/themes/stable9/templates/content/media-oembed-iframe.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override to display an oEmbed resource in an iframe.
+ */
+#}
+<!DOCTYPE html>
+<html>
+  <head>
+    <css-placeholder token="{{ placeholder_token }}">
+  </head>
+  <body style="margin: 0">
+    {{ media|raw }}
+  </body>
+</html>
diff --git a/core/themes/stable9/templates/content/media-reference-help.html.twig b/core/themes/stable9/templates/content/media-reference-help.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9243c5d4fde6a61e2d296998fcc7244ef0b2e9b7
--- /dev/null
+++ b/core/themes/stable9/templates/content/media-reference-help.html.twig
@@ -0,0 +1,66 @@
+{#
+/**
+ * @file
+ * Theme override for media reference fields.
+ *
+ * @see template_preprocess_field_multiple_value_form()
+ * @see core/themes/classy/templates/form/fieldset.html.twig
+ */
+#}
+{%
+  set classes = [
+    'js-form-item',
+    'form-item',
+    'js-form-wrapper',
+    'form-wrapper',
+  ]
+%}
+<fieldset{{ attributes.addClass(classes) }}>
+  {%
+    set legend_span_classes = [
+      'fieldset-legend',
+      required ? 'js-form-required',
+      required ? 'form-required',
+    ]
+  %}
+  {#  Always wrap fieldset legends in a <span> for CSS positioning. #}
+  <legend{{ legend_attributes }}>
+    <span{{ legend_span_attributes.addClass(legend_span_classes) }}>{{ original_label }}</span>
+  </legend>
+
+  <div class="js-form-item form-item">
+    {% if media_add_help %}
+      <h4{{ header_attributes.addClass('label') }}>
+        {% trans %}
+          Create new media
+        {% endtrans %}
+      </h4><br />
+      <div class="description">
+        {{ media_add_help }}
+      </div>
+    {% endif %}
+
+    {% if multiple %}
+      {{ table }}
+    {% else %}
+      {% for element in elements %}
+        {{ element }}
+      {% endfor %}
+    {% endif %}
+
+    <div{{ description.attributes.addClass('description') }}>
+      {% if multiple and description.content %}
+        <ul>
+          <li>{{ media_list_help }} {{ media_list_link }} {{ allowed_types_help }}</li>
+          <li>{{ description.content }}</li>
+        </ul>
+      {% else %}
+        {{ media_list_help }} {{ media_list_link }} {{ allowed_types_help }}
+      {% endif %}
+      {% if multiple and button %}
+        <div class="clearfix">{{ button }}</div>
+      {% endif %}
+    </div>
+
+  </div>
+</fieldset>
diff --git a/core/themes/stable9/templates/content/media.html.twig b/core/themes/stable9/templates/content/media.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8776f77e975e4c50fea2c3a14d75627f61c8144b
--- /dev/null
+++ b/core/themes/stable9/templates/content/media.html.twig
@@ -0,0 +1,35 @@
+{#
+/**
+ * @file
+ * Theme override to present a media item.
+ *
+ * Available variables:
+ * - media: The media item, with limited access to object properties and
+ *   methods. Only method names starting with "get", "has", or "is" and
+ *   a few common methods such as "id", "label", and "bundle" are available.
+ *   For example:
+ *   - entity.getEntityTypeId() will return the entity type ID.
+ *   - entity.hasField('field_example') returns TRUE if the entity includes
+ *     field_example. (This does not indicate the presence of a value in this
+ *     field.)
+ *   Calling other methods, such as entity.delete(), will result in
+ *   an exception.
+ *   See \Drupal\Core\Entity\EntityInterface for a full list of methods.
+ * - name: Name of the media item.
+ * - content: Media content.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - view_mode: View mode; for example, "teaser" or "full".
+ * - attributes: HTML attributes for the containing element.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ *
+ * @see template_preprocess_media()
+ */
+#}
+<div{{ attributes }}>
+  {{ title_suffix.contextual_links }}
+  {{ content }}
+</div>
diff --git a/core/themes/stable9/templates/content/node.html.twig b/core/themes/stable9/templates/content/node.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..86f901cb76d499cb670883a66d4090d715c4e043
--- /dev/null
+++ b/core/themes/stable9/templates/content/node.html.twig
@@ -0,0 +1,97 @@
+{#
+/**
+ * @file
+ * Theme override to display a node.
+ *
+ * Available variables:
+ * - node: The node entity with limited access to object properties and methods.
+ *   Only method names starting with "get", "has", or "is" and a few common
+ *   methods such as "id", "label", and "bundle" are available. For example:
+ *   - node.getCreatedTime() will return the node creation timestamp.
+ *   - node.hasField('field_example') returns TRUE if the node bundle includes
+ *     field_example. (This does not indicate the presence of a value in this
+ *     field.)
+ *   - node.isPublished() will return whether the node is published or not.
+ *   Calling other methods, such as node.delete(), will result in an exception.
+ *   See \Drupal\node\Entity\Node for a full list of public properties and
+ *   methods for the node object.
+ * - label: (optional) The title of the node.
+ * - content: All node items. Use {{ content }} to print them all,
+ *   or print a subset such as {{ content.field_example }}. Use
+ *   {{ content|without('field_example') }} to temporarily suppress the printing
+ *   of a given child element.
+ * - author_picture: The node author user entity, rendered using the "compact"
+ *   view mode.
+ * - metadata: Metadata for this node.
+ * - date: (optional) Themed creation date field.
+ * - author_name: (optional) Themed author name field.
+ * - url: Direct URL of the current node.
+ * - display_submitted: Whether submission information should be displayed.
+ * - attributes: HTML attributes for the containing element.
+ *   The attributes.class element may contain one or more of the following
+ *   classes:
+ *   - node: The current template type (also known as a "theming hook").
+ *   - node--type-[type]: The current node type. For example, if the node is an
+ *     "Article" it would result in "node--type-article". Note that the machine
+ *     name will often be in a short form of the human readable label.
+ *   - node--view-mode-[view_mode]: The View Mode of the node; for example, a
+ *     teaser would result in: "node--view-mode-teaser", and
+ *     full: "node--view-mode-full".
+ *   The following are controlled through the node publishing options.
+ *   - node--promoted: Appears on nodes promoted to the front page.
+ *   - node--sticky: Appears on nodes ordered above other non-sticky nodes in
+ *     teaser listings.
+ *   - node--unpublished: Appears on unpublished nodes visible only to site
+ *     admins.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - content_attributes: Same as attributes, except applied to the main
+ *   content tag that appears in the template.
+ * - author_attributes: Same as attributes, except applied to the author of
+ *   the node tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - view_mode: View mode; for example, "teaser" or "full".
+ * - teaser: Flag for the teaser state. Will be true if view_mode is 'teaser'.
+ * - page: Flag for the full page state. Will be true if view_mode is 'full'.
+ * - readmore: Flag for more state. Will be true if the teaser content of the
+ *   node cannot hold the main body content.
+ * - logged_in: Flag for authenticated user status. Will be true when the
+ *   current user is a logged-in member.
+ * - is_admin: Flag for admin user status. Will be true when the current user
+ *   is an administrator.
+ *
+ * @see template_preprocess_node()
+ *
+ * @todo Remove the id attribute (or make it a class), because if that gets
+ *   rendered twice on a page this is invalid CSS for example: two lists
+ *   in different view modes.
+ */
+#}
+<article{{ attributes }}>
+
+  {{ title_prefix }}
+  {% if label and not page %}
+    <h2{{ title_attributes }}>
+      <a href="{{ url }}" rel="bookmark">{{ label }}</a>
+    </h2>
+  {% endif %}
+  {{ title_suffix }}
+
+  {% if display_submitted %}
+    <footer>
+      {{ author_picture }}
+      <div{{ author_attributes }}>
+        {% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %}
+        {{ metadata }}
+      </div>
+    </footer>
+  {% endif %}
+
+  <div{{ content_attributes }}>
+    {{ content }}
+  </div>
+
+</article>
diff --git a/core/themes/stable9/templates/content/off-canvas-page-wrapper.html.twig b/core/themes/stable9/templates/content/off-canvas-page-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..04a80b188edaf6ef635322cd729a57e7d1137e3d
--- /dev/null
+++ b/core/themes/stable9/templates/content/off-canvas-page-wrapper.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme override for a page wrapper.
+ *
+ * For consistent wrapping to {{ page }} render in all themes. The
+ * "data-off-canvas-main-canvas" attribute is required by the off-canvas dialog.
+ * This is used by the core/drupal.dialog.off_canvas library to select the
+ * "main canvas" page element as opposed to the "off canvas" which is the dialog
+ * itself. The "main canvas" element must be resized according to the width of
+ * the "off canvas" dialog so that no portion of the "main canvas" is obstructed
+ * by the off-canvas dialog. The off-canvas dialog can vary in width when opened
+ * and can be resized by the user. The "data-off-canvas-main-canvas" attribute
+ * cannot be removed without breaking the off-canvas dialog functionality.
+ *
+ * Available variables:
+ * - children: Contains the child elements of the page.
+ */
+#}
+{% if children %}
+  <div class="dialog-off-canvas-main-canvas" data-off-canvas-main-canvas>
+    {{ children }}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/content/page-title.html.twig b/core/themes/stable9/templates/content/page-title.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4bd0ca26f0d2f08722044cc956da25b97252bbec
--- /dev/null
+++ b/core/themes/stable9/templates/content/page-title.html.twig
@@ -0,0 +1,19 @@
+{#
+/**
+ * @file
+ * Theme override for page titles.
+ *
+ * Available variables:
+ * - title_attributes: HTML attributes for the page title element.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title: The page title, for use in the actual content.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ */
+#}
+{{ title_prefix }}
+{% if title %}
+  <h1{{ title_attributes }}>{{ title }}</h1>
+{% endif %}
+{{ title_suffix }}
diff --git a/core/themes/stable9/templates/content/search-result.html.twig b/core/themes/stable9/templates/content/search-result.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..adf813444f988b138d7e585ad1340d89bba95bea
--- /dev/null
+++ b/core/themes/stable9/templates/content/search-result.html.twig
@@ -0,0 +1,69 @@
+{#
+/**
+ * @file
+ * Theme override for displaying a single search result.
+ *
+ * This template renders a single search result. The list of results is
+ * rendered using '#theme' => 'item_list', with suggestions of:
+ * - item_list__search_results__(plugin_id)
+ * - item_list__search_results
+ *
+ * Available variables:
+ * - url: URL of the result.
+ * - title: Title of the result.
+ * - snippet: A small preview of the result. Does not apply to user searches.
+ * - info: String of all the meta information ready for print. Does not apply
+ *   to user searches.
+ * - plugin_id: The machine-readable name of the plugin being executed,such
+ *   as "node_search" or "user_search".
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - info_split: Contains same data as info, but split into separate parts.
+ *   - info_split.type: Node type (or item type string supplied by module).
+ *   - info_split.user: Author of the node linked to users profile. Depends
+ *     on permission.
+ *   - info_split.date: Last update of the node. Short formatted.
+ *   - info_split.comment: Number of comments output as "% comments", %
+ *     being the count. (Depends on comment.module).
+ * @todo The info variable needs to be made drillable and each of these sub
+ *   items should instead be within info and renamed info.foo, info.bar, etc.
+ *
+ * Other variables:
+ * - title_attributes: HTML attributes for the title.
+ * - content_attributes: HTML attributes for the content.
+ *
+ * Since info_split is keyed, a direct print of the item is possible.
+ * This array does not apply to user searches so it is recommended to check
+ * for its existence before printing. The default keys of 'type', 'user' and
+ * 'date' always exist for node searches. Modules may provide other data.
+ * @code
+ *   {% if (info_split.comment) %}
+ *     <span class="info-comment">
+ *       {{ info_split.comment }}
+ *     </span>
+ *   {% endif %}
+ * @endcode
+ *
+ * To check for all available data within info_split, use the code below.
+ * @code
+ *   <pre>
+ *     {{ dump(info_split) }}
+ *   </pre>
+ * @endcode
+ *
+ * @see template_preprocess_search_result()
+ */
+#}
+{{ title_prefix }}
+<h3{{ title_attributes }}>
+  <a href="{{ url }}">{{ title }}</a>
+</h3>
+{{ title_suffix }}
+{% if snippet %}
+  <p{{ content_attributes }}>{{ snippet }}</p>
+{% endif %}
+{% if info %}
+  <p>{{ info }}</p>
+{% endif %}
diff --git a/core/themes/stable9/templates/content/taxonomy-term.html.twig b/core/themes/stable9/templates/content/taxonomy-term.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..458c055f1859836903796d484b7b8a645bd454cb
--- /dev/null
+++ b/core/themes/stable9/templates/content/taxonomy-term.html.twig
@@ -0,0 +1,33 @@
+{#
+/**
+ * @file
+ * Theme override to display a taxonomy term.
+ *
+ * Available variables:
+ * - url: URL of the current term.
+ * - name: (optional) Name of the current term.
+ * - content: Items for the content of the term (fields and description).
+ *   Use 'content' to print them all, or print a subset such as
+ *   'content.description'. Use the following code to exclude the
+ *   printing of a given child element:
+ *   @code
+ *   {{ content|without('description') }}
+ *   @endcode
+ * - attributes: HTML attributes for the wrapper.
+ * - page: Flag for the full page state.
+ * - term: The taxonomy term entity, including:
+ *   - id: The ID of the taxonomy term.
+ *   - bundle: Machine name of the current vocabulary.
+ * - view_mode: View mode, e.g. 'full', 'teaser', etc.
+ *
+ * @see template_preprocess_taxonomy_term()
+ */
+#}
+<div{{ attributes }}>
+  {{ title_prefix }}
+  {% if name and not page %}
+    <h2><a href="{{ url }}">{{ name }}</a></h2>
+  {% endif %}
+  {{ title_suffix }}
+  {{ content }}
+</div>
diff --git a/core/themes/stable9/templates/dataset/aggregator-feed.html.twig b/core/themes/stable9/templates/dataset/aggregator-feed.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..dba9eb090bc75f5c7bf1fcabe7d99f47f102e7da
--- /dev/null
+++ b/core/themes/stable9/templates/dataset/aggregator-feed.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @file
+ * Theme override to present an aggregator feed.
+ *
+ * The contents are rendered above feed listings when browsing source feeds.
+ * For example, "example.com/aggregator/sources/1".
+ *
+ * Available variables:
+ * - title: (optional) Title of the feed item.
+ * - content: All field items. Use {{ content }} to print them all,
+ *   or print a subset such as {{ content.field_example }}. Use
+ *   {{ content|without('field_example') }} to temporarily suppress the printing
+ *   of a given element.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @see template_preprocess_aggregator_feed()
+ */
+#}
+{{ title_prefix }}
+{% if title and not full %}
+  <h2{{ title_attributes }}>{{ title }}</h2>
+{% endif %}
+{{ title_suffix }}
+
+{{ content }}
diff --git a/core/themes/stable9/templates/dataset/forum-icon.html.twig b/core/themes/stable9/templates/dataset/forum-icon.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..37a970e17aceaf68d9269ac83ad217563339f7ef
--- /dev/null
+++ b/core/themes/stable9/templates/dataset/forum-icon.html.twig
@@ -0,0 +1,24 @@
+{#
+/**
+ * @file
+ * Theme override to display a status icon for a forum post.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to be applied to the wrapper element.
+ *   - class: HTML classes that determine which icon to display. May be one of
+ *     'hot', 'hot-new', 'new', 'default', 'closed', or 'sticky'.
+ *   - title: Text alternative for the forum icon.
+ * - icon_title: Text alternative for the forum icon, same as above.
+ * - new_posts: '1' when this topic contains new posts, otherwise '0'.
+ * - first_new: '1' when this is the first topic with new posts, otherwise '0'.
+ * - icon_status: Indicates which status icon should be used.
+ *
+ * @see template_preprocess_forum_icon()
+ */
+#}
+<div{{ attributes }}>
+  {% if first_new -%}
+    <a id="new"></a>
+  {%- endif %}
+  <span class="visually-hidden">{{ icon_title }}</span>
+</div>
diff --git a/core/themes/stable9/templates/dataset/forum-list.html.twig b/core/themes/stable9/templates/dataset/forum-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..892c59156a0b5949a8d5c3e968a87e446dc99a91
--- /dev/null
+++ b/core/themes/stable9/templates/dataset/forum-list.html.twig
@@ -0,0 +1,75 @@
+{#
+/**
+ * @file
+ * Theme override to display a list of forums and containers.
+ *
+ * Available variables:
+ * - forums: A collection of forums and containers to display. It is keyed to
+ *   the numeric IDs of all child forums and containers. Each forum in forums
+ *   contains:
+ *   - is_container: A flag indicating if the forum can contain other
+ *     forums. Otherwise, the forum can only contain topics.
+ *   - depth: How deep the forum is in the current hierarchy.
+ *   - zebra: 'even' or 'odd', used for row class.
+ *   - icon_class: 'default' or 'new', used for forum icon class.
+ *   - icon_title: Text alternative for the forum icon.
+ *   - name: The name of the forum.
+ *   - link: The URL to link to this forum.
+ *   - description: The description field for the forum, containing:
+ *     - value: The descriptive text for the forum.
+ *   - new_topics: A flag indicating if the forum contains unread posts.
+ *   - new_url: A URL to the forum's unread posts.
+ *   - new_text: Text for the above URL, which tells how many new posts.
+ *   - old_topics: A count of posts that have already been read.
+ *   - num_posts: The total number of posts in the forum.
+ *   - last_reply: Text representing the last time a forum was posted or
+ *     commented in.
+ * - forum_id: Forum ID for the current forum. Parent to all items within the
+ *   forums array.
+ *
+ * @see template_preprocess_forum_list()
+ */
+#}
+<table>
+  <thead>
+    <tr>
+      <th>{{ 'Forum'|t }}</th>
+      <th>{{ 'Topics'|t }}</th>
+      <th>{{ 'Posts'|t }}</th>
+      <th>{{ 'Last post'|t }}</th>
+    </tr>
+  </thead>
+  <tbody>
+  {% for child_id, forum in forums %}
+    <tr>
+      <td{% if forum.is_container == true %} colspan="4"{% endif %}>
+        {#
+          Enclose the contents of this cell with X divs, where X is the
+          depth this forum resides at. This will allow us to use CSS
+          left-margin for indenting.
+        #}
+        {% if forum.depth > 0 %}{% for i in 1..forum.depth %}<div class="indent">{% endfor %}{% endif %}
+          <div title="{{ forum.icon_title }}">
+            <span class="visually-hidden">{{ forum.icon_title }}</span>
+          </div>
+          <div><a href="{{ forum.link }}">{{ forum.label }}</a></div>
+          {% if forum.description.value %}
+            <div>{{ forum.description.value }}</div>
+          {% endif %}
+        {% if forum.depth > 0 %}{% for i in 1..forum.depth %}</div>{% endfor %}{% endif %}
+      </td>
+      {% if forum.is_container == false %}
+        <td>
+          {{ forum.num_topics }}
+          {% if forum.new_topics == true %}
+            <br />
+            <a href="{{ forum.new_url }}">{{ forum.new_text }}</a>
+          {% endif %}
+        </td>
+        <td>{{ forum.num_posts }}</td>
+        <td>{{ forum.last_reply }}</td>
+      {% endif %}
+    </tr>
+  {% endfor %}
+  </tbody>
+</table>
diff --git a/core/themes/stable9/templates/dataset/forums.html.twig b/core/themes/stable9/templates/dataset/forums.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..af67b30dde77a143a711cd866a5e39d235c70a7c
--- /dev/null
+++ b/core/themes/stable9/templates/dataset/forums.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme override to display a forum.
+ *
+ * May contain forum containers as well as forum topics.
+ *
+ * Available variables:
+ * - forums: The forums to display (as processed by forum-list.html.twig).
+ * - topics: The topics to display.
+ * - topics_original: Original topics data before modification.
+ * - topics_pager: The topics pager.
+ * - forums_defined: A flag to indicate that the forums are configured.
+ *
+ * @see template_preprocess_forums()
+ */
+#}
+{% if forums_defined %}
+  {{ forums }}
+  {{ topics }}
+  {{ topics_pager }}
+{% endif %}
diff --git a/core/themes/stable9/templates/dataset/item-list.html.twig b/core/themes/stable9/templates/dataset/item-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..86cc63670c9281f6c0a2cc4f6d1ddf469e3677c1
--- /dev/null
+++ b/core/themes/stable9/templates/dataset/item-list.html.twig
@@ -0,0 +1,39 @@
+{#
+/**
+ * @file
+ * Theme override for an item list.
+ *
+ * Available variables:
+ * - items: A list of items. Each item contains:
+ *   - attributes: HTML attributes to be applied to each list item.
+ *   - value: The content of the list element.
+ * - title: The title of the list.
+ * - list_type: The tag for list element ("ul" or "ol").
+ * - wrapper_attributes: HTML attributes to be applied to the list wrapper.
+ * - attributes: HTML attributes to be applied to the list.
+ * - empty: A message to display when there are no items. Allowed value is a
+ *   string or render array.
+ * - context: A list of contextual data associated with the list. May contain:
+ *   - list_style: The custom list style.
+ *
+ * @see template_preprocess_item_list()
+ */
+#}
+{% if context.list_style %}
+  {%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
+{% endif %}
+{% if items or empty %}
+  {%- 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/themes/stable9/templates/dataset/table.html.twig b/core/themes/stable9/templates/dataset/table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..231ada2b38b8281eb6a31a0a08588fef69aa2063
--- /dev/null
+++ b/core/themes/stable9/templates/dataset/table.html.twig
@@ -0,0 +1,103 @@
+{#
+/**
+ * @file
+ * Theme override to display a table.
+ *
+ * Available variables:
+ * - attributes: HTML attributes to apply to the <table> tag.
+ * - caption: A localized string for the <caption> tag.
+ * - colgroups: Column groups. Each group contains the following properties:
+ *   - attributes: HTML attributes to apply to the <col> tag.
+ *     Note: Drupal currently supports only one table header row, see
+ *     https://www.drupal.org/node/893530 and
+ *     http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_table/7#comment-5109.
+ * - header: Table header cells. Each cell contains the following properties:
+ *   - tag: The HTML tag name to use; either 'th' or 'td'.
+ *   - attributes: HTML attributes to apply to the tag.
+ *   - content: A localized string for the title of the column.
+ *   - field: Field name (required for column sorting).
+ *   - sort: Default sort order for this column ("asc" or "desc").
+ * - sticky: A flag indicating whether to use a "sticky" table header.
+ * - rows: Table rows. Each row contains the following properties:
+ *   - attributes: HTML attributes to apply to the <tr> tag.
+ *   - data: Table cells.
+ *   - no_striping: A flag indicating that the row should receive no
+ *     'even / odd' styling. Defaults to FALSE.
+ *   - cells: Table cells of the row. Each cell contains the following keys:
+ *     - tag: The HTML tag name to use; either 'th' or 'td'.
+ *     - attributes: Any HTML attributes, such as "colspan", to apply to the
+ *       table cell.
+ *     - content: The string to display in the table cell.
+ *     - active_table_sort: A boolean indicating whether the cell is the active
+         table sort.
+ * - footer: Table footer rows, in the same format as the rows variable.
+ * - empty: The message to display in an extra row if table does not have
+ *   any rows.
+ * - no_striping: A boolean indicating that the row should receive no striping.
+ * - header_columns: The number of columns in the header.
+ *
+ * @see template_preprocess_table()
+ */
+#}
+<table{{ attributes }}>
+  {% if caption %}
+    <caption>{{ caption }}</caption>
+  {% endif %}
+
+  {% for colgroup in colgroups %}
+    {% if colgroup.cols %}
+      <colgroup{{ colgroup.attributes }}>
+        {% for col in colgroup.cols %}
+          <col{{ col.attributes }} />
+        {% endfor %}
+      </colgroup>
+    {% else %}
+      <colgroup{{ colgroup.attributes }} />
+    {% endif %}
+  {% endfor %}
+
+  {% if header %}
+    <thead>
+      <tr>
+        {% for cell in header %}
+          <{{ cell.tag }}{{ cell.attributes }}>
+            {{- cell.content -}}
+          </{{ cell.tag }}>
+        {% endfor %}
+      </tr>
+    </thead>
+  {% endif %}
+
+  {% if rows %}
+    <tbody>
+      {% for row in rows %}
+        <tr{{ row.attributes }}>
+          {% for cell in row.cells %}
+            <{{ cell.tag }}{{ cell.attributes }}>
+              {{- cell.content -}}
+            </{{ cell.tag }}>
+          {% endfor %}
+        </tr>
+      {% endfor %}
+    </tbody>
+  {% elseif empty %}
+    <tbody>
+      <tr>
+        <td colspan="{{ header_columns }}">{{ empty }}</td>
+      </tr>
+    </tbody>
+  {% endif %}
+  {% if footer %}
+    <tfoot>
+      {% for row in footer %}
+        <tr{{ row.attributes }}>
+          {% for cell in row.cells %}
+            <{{ cell.tag }}{{ cell.attributes }}>
+              {{- cell.content -}}
+            </{{ cell.tag }}>
+          {% endfor %}
+        </tr>
+      {% endfor %}
+    </tfoot>
+  {% endif %}
+</table>
diff --git a/core/themes/stable9/templates/field/field--comment.html.twig b/core/themes/stable9/templates/field/field--comment.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..33a60ae0bdcbe06e1f92357a2ba6dc86eefe52a9
--- /dev/null
+++ b/core/themes/stable9/templates/field/field--comment.html.twig
@@ -0,0 +1,43 @@
+{#
+/**
+ * @file
+ * Theme override for comment fields.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - label_hidden: Whether to show the field label or not.
+ * - title_attributes: HTML attributes for the title.
+ * - label: The label for the field.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional title output populated by modules, intended to
+ *   be displayed after the main title tag that appears in the template.
+ * - comments: List of comments rendered through comment.html.twig.
+ * - content_attributes: HTML attributes for the form title.
+ * - comment_form: The 'Add new comment' form.
+ * - comment_display_mode: Is the comments are threaded.
+ * - comment_type: The comment type bundle ID for the comment field.
+ * - entity_type: The entity type to which the field belongs.
+ * - field_name: The name of the field.
+ * - field_type: The type of the field.
+ * - label_display: The display settings for the label.
+ *
+ * @see template_preprocess_field()
+ * @see comment_preprocess_field()
+ */
+#}
+<section{{ attributes }}>
+  {% if comments and not label_hidden %}
+    {{ title_prefix }}
+    <h2{{ title_attributes }}>{{ label }}</h2>
+    {{ title_suffix }}
+  {% endif %}
+
+  {{ comments }}
+
+  {% if comment_form %}
+    <h2{{ content_attributes }}>{{ 'Add new comment'|t }}</h2>
+    {{ comment_form }}
+  {% endif %}
+
+</section>
diff --git a/core/themes/stable9/templates/field/field--node--created.html.twig b/core/themes/stable9/templates/field/field--node--created.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e00837d3e08b5f8e3e66a9ccaaeaefc1b69a2145
--- /dev/null
+++ b/core/themes/stable9/templates/field/field--node--created.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Theme override for the node created field.
+ *
+ * This is an override of field.html.twig for the node created field. See that
+ * template for documentation about its details and overrides.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing span element.
+ * - items: List of all the field items. Each item contains:
+ *   - attributes: List of HTML attributes for each item.
+ *   - content: The field item content.
+ * - entity_type: The entity type to which the field belongs.
+ * - field_name: The name of the field.
+ * - field_type: The type of the field.
+ * - label_display: The display settings for the label.
+ *
+ * @see field.html.twig
+ */
+#}
+<span{{ attributes }}>
+  {%- for item in items -%}
+    {{ item.content }}
+  {%- endfor -%}
+</span>
diff --git a/core/themes/stable9/templates/field/field--node--title.html.twig b/core/themes/stable9/templates/field/field--node--title.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5ab974f2ddb1a1114908def085233577ca2bd3c1
--- /dev/null
+++ b/core/themes/stable9/templates/field/field--node--title.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Theme override for the node title field.
+ *
+ * This is an override of field.html.twig for the node title field. See that
+ * template for documentation about its details and overrides.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing span element.
+ * - items: List of all the field items. Each item contains:
+ *   - attributes: List of HTML attributes for each item.
+ *   - content: The field item content.
+ * - entity_type: The entity type to which the field belongs.
+ * - field_name: The name of the field.
+ * - field_type: The type of the field.
+ * - label_display: The display settings for the label.
+ *
+ * @see field.html.twig
+ */
+#}
+<span{{ attributes }}>
+  {%- for item in items -%}
+    {{ item.content }}
+  {%- endfor -%}
+</span>
diff --git a/core/themes/stable9/templates/field/field--node--uid.html.twig b/core/themes/stable9/templates/field/field--node--uid.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..af730dc02b5deefc9e21efd13bf4e5904ed91da6
--- /dev/null
+++ b/core/themes/stable9/templates/field/field--node--uid.html.twig
@@ -0,0 +1,26 @@
+{#
+/**
+ * @file
+ * Theme override for the node user field.
+ *
+ * This is an override of field.html.twig for the node user field. See that
+ * template for documentation about its details and overrides.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing span element.
+ * - items: List of all the field items. Each item contains:
+ *   - attributes: List of HTML attributes for each item.
+ *   - content: The field item content.
+ * - entity_type: The entity type to which the field belongs.
+ * - field_name: The name of the field.
+ * - field_type: The type of the field.
+ * - label_display: The display settings for the label.
+ *
+ * @see field.html.twig
+ */
+#}
+<span{{ attributes }}>
+  {%- for item in items -%}
+    {{ item.content }}
+  {%- endfor -%}
+</span>
diff --git a/core/themes/stable9/templates/field/field.html.twig b/core/themes/stable9/templates/field/field.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a10384dd6e4abf4cc02aa7f933b95e51906d1858
--- /dev/null
+++ b/core/themes/stable9/templates/field/field.html.twig
@@ -0,0 +1,70 @@
+{#
+/**
+ * @file
+ * Theme override for a field.
+ *
+ * To override output, copy the "field.html.twig" from the templates directory
+ * to your theme's directory and customize it, just like customizing other
+ * Drupal templates such as page.html.twig or node.html.twig.
+ *
+ * Instead of overriding the theming for all fields, you can also just override
+ * theming for a subset of fields using
+ * @link themeable Theme hook suggestions. @endlink For example,
+ * here are some theme hook suggestions that can be used for a field_foo field
+ * on an article node type:
+ * - field--node--field-foo--article.html.twig
+ * - field--node--field-foo.html.twig
+ * - field--node--article.html.twig
+ * - field--field-foo.html.twig
+ * - field--text-with-summary.html.twig
+ * - field.html.twig
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - label_hidden: Whether to show the field label or not.
+ * - title_attributes: HTML attributes for the title.
+ * - label: The label for the field.
+ * - multiple: TRUE if a field can contain multiple items.
+ * - items: List of all the field items. Each item contains:
+ *   - attributes: List of HTML attributes for each item.
+ *   - content: The field item's content.
+ * - entity_type: The entity type to which the field belongs.
+ * - field_name: The name of the field.
+ * - field_type: The type of the field.
+ * - label_display: The display settings for the label.
+ *
+ * @see template_preprocess_field()
+ */
+#}
+{%
+  set title_classes = [
+    label_display == 'visually_hidden' ? 'visually-hidden',
+  ]
+%}
+
+{% if label_hidden %}
+  {% if multiple %}
+    <div{{ attributes }}>
+      {% for item in items %}
+        <div{{ item.attributes }}>{{ item.content }}</div>
+      {% endfor %}
+    </div>
+  {% else %}
+    {% for item in items %}
+      <div{{ attributes }}>{{ item.content }}</div>
+    {% endfor %}
+  {% endif %}
+{% else %}
+  <div{{ attributes }}>
+    <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
+    {% if multiple %}
+      <div>
+    {% endif %}
+    {% for item in items %}
+      <div{{ item.attributes }}>{{ item.content }}</div>
+    {% endfor %}
+    {% if multiple %}
+      </div>
+    {% endif %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/field/file-audio.html.twig b/core/themes/stable9/templates/field/file-audio.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d93f81e7287f36a5178337869b71ab6d032a78da
--- /dev/null
+++ b/core/themes/stable9/templates/field/file-audio.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+* @file
+* Theme override to display the file entity as an audio tag.
+*
+* Available variables:
+* - attributes: An array of HTML attributes, intended to be added to the
+*   audio tag.
+* - files: And array of files to be added as sources for the audio tag. Each
+*   element is an array with the following elements:
+*   - file: The full file object.
+*   - source_attributes: An array of HTML attributes for to be added to the
+*     source tag.
+*/
+#}
+<audio {{ attributes }}>
+  {% for file in files %}
+    <source {{ file.source_attributes }} />
+  {% endfor %}
+</audio>
diff --git a/core/themes/stable9/templates/field/file-link.html.twig b/core/themes/stable9/templates/field/file-link.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c34de40ce2feed2962b6e4816c836cc986c770c1
--- /dev/null
+++ b/core/themes/stable9/templates/field/file-link.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Theme override for a link to a file.
+ *
+ * Available variables:
+ * - attributes: The HTML attributes for the containing element.
+ * - link: A link to the file.
+ * - file_size: The size of the file.
+ *
+ * @see template_preprocess_file_link()
+ */
+#}
+<span{{ attributes }}>{{ link }}</span>
+{% if file_size %}
+  <span>({{ file_size }})</span>
+{% endif %}
diff --git a/core/themes/stable9/templates/field/file-video.html.twig b/core/themes/stable9/templates/field/file-video.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..93568fcbadd4329471e7a97f9ced16a2b4a59a63
--- /dev/null
+++ b/core/themes/stable9/templates/field/file-video.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+* @file
+* Theme override to display the file entity as a video tag.
+*
+* Available variables:
+* - attributes: An array of HTML attributes, intended to be added to the
+*   video tag.
+* - files: And array of files to be added as sources for the video tag. Each
+*   element is an array with the following elements:
+*   - file: The full file object.
+*   - source_attributes: An array of HTML attributes for to be added to the
+*     source tag.
+*/
+#}
+<video {{ attributes }}>
+  {% for file in files %}
+    <source {{ file.source_attributes }} />
+  {% endfor %}
+</video>
diff --git a/core/themes/stable9/templates/field/image-formatter.html.twig b/core/themes/stable9/templates/field/image-formatter.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..512d7588e0fd92bb0539a2aa29c2e5cc5580f45f
--- /dev/null
+++ b/core/themes/stable9/templates/field/image-formatter.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override to display a formatted image field.
+ *
+ * Available variables:
+ * - image: A collection of image data.
+ * - image_style: An optional image style.
+ * - url: An optional URL the image can be linked to.
+ *
+ * @see template_preprocess_image_formatter()
+ */
+#}
+{% if url %}
+  {{ link(image, url) }}
+{% else %}
+  {{ image }}
+{% endif %}
diff --git a/core/themes/stable9/templates/field/image-style.html.twig b/core/themes/stable9/templates/field/image-style.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..039089a3ecb5f1f2bf233fc9261c97d0a9c48093
--- /dev/null
+++ b/core/themes/stable9/templates/field/image-style.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override for an image using a specific image style.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the image, including the following:
+ *   - src: Full URL or relative path to the image file.
+ *   - class: One or more classes to be applied to the image.
+ *   - width: The width of the image (if known).
+ *   - height: The height of the image (if known).
+ *   - title: The title of the image.
+ *   - alt: The alternative text for the image.
+ *
+ * @see template_preprocess_image_style()
+ */
+#}
+{{ image }}
diff --git a/core/themes/stable9/templates/field/image.html.twig b/core/themes/stable9/templates/field/image.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b342eee6dada08d853efc6ce9afd12f4268b3f0d
--- /dev/null
+++ b/core/themes/stable9/templates/field/image.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override of an image.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the img tag.
+ * - style_name: (optional) The name of the image style applied.
+ *
+ * @see template_preprocess_image()
+ */
+#}
+<img{{ attributes }} />
diff --git a/core/themes/stable9/templates/field/link-formatter-link-separate.html.twig b/core/themes/stable9/templates/field/link-formatter-link-separate.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b75457b412c6469edbb3d40a18a5ed930e4f3fb6
--- /dev/null
+++ b/core/themes/stable9/templates/field/link-formatter-link-separate.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override of a link with separate title and URL elements.
+ *
+ * Available variables:
+ * - link: The link that has already been formatted by l().
+ * - title: (optional) A descriptive or alternate title for the link, which may
+ *   be different than the actual link text.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_link_formatter_link_separate()
+ */
+#}
+{% apply spaceless %}
+  {{ title }}
+  {{ link }}
+{% endapply %}
diff --git a/core/themes/stable9/templates/field/responsive-image-formatter.html.twig b/core/themes/stable9/templates/field/responsive-image-formatter.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3f30260697f5759f0756e6d60c653c5f5b0a64ad
--- /dev/null
+++ b/core/themes/stable9/templates/field/responsive-image-formatter.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Theme override to display a formatted responsive image field.
+ *
+ * Available variables:
+ * - responsive_image: A collection of responsive image data.
+ * - url: An optional URL the image can be linked to.
+ *
+ * @see template_preprocess_responsive_image_formatter()
+ */
+#}
+{% if url %}
+  <a href="{{ url }}">{{ responsive_image }}</a>
+{% else %}
+  {{ responsive_image }}
+{% endif %}
diff --git a/core/themes/stable9/templates/field/responsive-image.html.twig b/core/themes/stable9/templates/field/responsive-image.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9fe132a43a425a6b4e566967b87a619c2f9add1a
--- /dev/null
+++ b/core/themes/stable9/templates/field/responsive-image.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override of a responsive image.
+ *
+ * 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()
+ */
+#}
+{% if output_image_tag %}
+  {{ img_element }}
+{% else %}
+  <picture>
+    {% if sources %}
+      {% for source_attributes in sources %}
+        <source{{ source_attributes }}/>
+      {% endfor %}
+    {% endif %}
+    {# The controlling image, with the fallback image in srcset. #}
+    {{ img_element }}
+  </picture>
+{% endif %}
diff --git a/core/themes/stable9/templates/field/time.html.twig b/core/themes/stable9/templates/field/time.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6dba1d7b7581fef7013eb6d043afd2aef5adac5b
--- /dev/null
+++ b/core/themes/stable9/templates/field/time.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme override for a date / time element.
+ *
+ * Available variables
+ * - timestamp: (optional) A UNIX timestamp for the datetime attribute. If the
+ *   datetime cannot be represented as a UNIX timestamp, use a valid datetime
+ *   attribute value in attributes.datetime.
+ * - text: (optional) The content to display within the <time> element.
+ *   Defaults to a human-readable representation of the timestamp value or the
+ *   datetime attribute value using DateFormatter::format().
+ * - attributes: (optional) HTML attributes to apply to the <time> element.
+ *   A datetime attribute in 'attributes' overrides the 'timestamp'. To
+ *   create a valid datetime attribute value from a UNIX timestamp, use
+ *   DateFormatter::format() with one of the predefined 'html_*' formats.
+ *
+ * @see template_preprocess_time()
+ * @see http://www.w3.org/TR/html5-author/the-time-element.html#attr-time-datetime
+ */
+#}
+<time{{ attributes }}>{{ text }}</time>
diff --git a/core/themes/stable9/templates/form/checkboxes.html.twig b/core/themes/stable9/templates/form/checkboxes.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9199f7e4c4564eab9b0495eaaa43e8240d23bbe1
--- /dev/null
+++ b/core/themes/stable9/templates/form/checkboxes.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override for a 'checkboxes' #type form element.
+ *
+ * Available variables
+ * - attributes: A list of HTML attributes for the wrapper element.
+ * - children: The rendered checkboxes.
+ *
+ * @see template_preprocess_checkboxes()
+ */
+ @todo: remove this file once https://www.drupal.org/node/1819284 is resolved.
+ This is identical to core/modules/system/templates/container.html.twig
+#}
+<div{{ attributes.addClass('form-checkboxes') }}>{{ children }}</div>
diff --git a/core/themes/stable9/templates/form/confirm-form.html.twig b/core/themes/stable9/templates/form/confirm-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..725f7f4df2cd2eab53fdef412d1719d96595cc90
--- /dev/null
+++ b/core/themes/stable9/templates/form/confirm-form.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override for confirm form.
+ *
+ * By default this does not alter the appearance of a form at all,
+ * but is provided as a convenience for themers.
+ *
+ * Available variables:
+ * - form: The confirm form.
+ */
+#}
+{{ form }}
diff --git a/core/themes/stable9/templates/form/container.html.twig b/core/themes/stable9/templates/form/container.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0da6c388d02271e901ef2f452791b6d3264063d6
--- /dev/null
+++ b/core/themes/stable9/templates/form/container.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override of a container used to wrap child elements.
+ *
+ * Used for grouped form items. Can also be used as a theme wrapper for any
+ * renderable element, to surround it with a <div> and HTML attributes.
+ * See \Drupal\Core\Render\Element\RenderElement for more
+ * information on the #theme_wrappers render array property, and
+ * \Drupal\Core\Render\Element\container for usage of the container render
+ * element.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - children: The rendered child elements of the container.
+ * - has_parent: A flag to indicate that the container has one or more parent
+     containers.
+ *
+ * @see template_preprocess_container()
+ */
+#}
+{%
+  set classes = [
+    has_parent ? 'js-form-wrapper',
+    has_parent ? 'form-wrapper',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>{{ children }}</div>
diff --git a/core/themes/stable9/templates/form/datetime-form.html.twig b/core/themes/stable9/templates/form/datetime-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1a26f111c587703edf6139b57893ed4ee00c63f6
--- /dev/null
+++ b/core/themes/stable9/templates/form/datetime-form.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override of a datetime form element.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the datetime form element.
+ * - content: The datelist form element to be output.
+ *
+ * @see template_preprocess_datetime_form()
+ */
+#}
+<div{{ attributes }}>
+  {{ content }}
+</div>
diff --git a/core/themes/stable9/templates/form/datetime-wrapper.html.twig b/core/themes/stable9/templates/form/datetime-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e30d448a2abb1a6a3fe42eed2dc6ceacea7aa101
--- /dev/null
+++ b/core/themes/stable9/templates/form/datetime-wrapper.html.twig
@@ -0,0 +1,35 @@
+{#
+/**
+ * @file
+ * Theme override of a datetime form wrapper.
+ *
+ * Available variables:
+ * - content: The form element to be output, usually a datelist, or datetime.
+ * - title: The title of the form element.
+ * - title_attributes: HTML attributes for the title wrapper.
+ * - description: Description text for the form element.
+ * - required: An indicator for whether the associated form element is required.
+ *
+ * @see template_preprocess_datetime_wrapper()
+ */
+#}
+{%
+  set title_classes = [
+    required ? 'js-form-required',
+    required ? 'form-required',
+  ]
+%}
+{% if title %}
+  <h4{{ title_attributes.addClass(title_classes) }}>{{ title }}</h4>
+{% endif %}
+{{ content }}
+{% if errors %}
+  <div>
+    {{ errors }}
+  </div>
+{% endif %}
+{% if description %}
+  <div{{ description_attributes }}>
+    {{ description }}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/form/details.html.twig b/core/themes/stable9/templates/form/details.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..19879959273d62c9821f9b7cad0f723f16a62e17
--- /dev/null
+++ b/core/themes/stable9/templates/form/details.html.twig
@@ -0,0 +1,38 @@
+{#
+/**
+ * @file
+ * Theme override for a details element.
+ *
+ * Available variables
+ * - attributes: A list of HTML attributes for the details element.
+ * - errors: (optional) Any errors for this details element, may not be set.
+ * - title: (optional) The title of the element, may not be set.
+ * - summary_attributes: A list of HTML attributes for the summary element.
+ * - description: (optional) The description of the element, may not be set.
+ * - children: (optional) The children of the element, may not be set.
+ * - value: (optional) The value of the element, may not be set.
+ *
+ * @see template_preprocess_details()
+ */
+#}
+<details{{ attributes }}>
+  {%
+    set summary_classes = [
+      required ? 'js-form-required',
+      required ? 'form-required',
+    ]
+  %}
+  {%- if title -%}
+    <summary{{ summary_attributes.addClass(summary_classes) }}>{{ title }}</summary>
+  {%- endif -%}
+
+  {% if errors %}
+    <div>
+      {{ errors }}
+    </div>
+  {% endif %}
+
+  {{ description }}
+  {{ children }}
+  {{ value }}
+</details>
diff --git a/core/themes/stable9/templates/form/dropbutton-wrapper.html.twig b/core/themes/stable9/templates/form/dropbutton-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a2bdc21d67492b7e772e5a43549a937c6dae40da
--- /dev/null
+++ b/core/themes/stable9/templates/form/dropbutton-wrapper.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override for a dropbutton wrapper.
+ *
+ * Available variables:
+ * - children: Contains the child elements of the dropbutton menu.
+ *
+ * @see template_preprocess()
+ */
+#}
+{% if children %}
+  {% apply spaceless %}
+    <div class="dropbutton-wrapper">
+      <div class="dropbutton-widget">
+        {{ children }}
+      </div>
+    </div>
+  {% endapply %}
+{% endif %}
diff --git a/core/themes/stable9/templates/form/field-multiple-value-form.html.twig b/core/themes/stable9/templates/form/field-multiple-value-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..246ac41bfdca66fe6b4a9f678fb393a0c7265a2a
--- /dev/null
+++ b/core/themes/stable9/templates/form/field-multiple-value-form.html.twig
@@ -0,0 +1,42 @@
+{#
+/**
+ * @file
+ * Theme override for an individual form element.
+ *
+ * Available variables for all fields:
+ * - multiple: Whether there are multiple instances of the field.
+ *
+ * Available variables for single cardinality fields:
+ * - elements: Form elements to be rendered.
+ *
+ * Available variables when there are multiple fields.
+ * - table: Table of field items.
+ * - description: The description element containing the following properties:
+ *   - content: The description content of the form element.
+ *   - attributes: HTML attributes to apply to the description container.
+ * - button: "Add another item" button.
+ *
+ * @see template_preprocess_field_multiple_value_form()
+ */
+#}
+{% if multiple %}
+  {%
+    set classes = [
+      'js-form-item',
+      'form-item'
+    ]
+  %}
+  <div{{ attributes.addClass(classes) }}>
+    {{ table }}
+    {% if description.content %}
+      <div{{ description.attributes.addClass('description') }} >{{ description.content }}</div>
+    {% endif %}
+    {% if button %}
+      <div class="clearfix">{{ button }}</div>
+    {% endif %}
+  </div>
+{% else %}
+  {% for element in elements %}
+    {{ element }}
+  {% endfor %}
+{% endif %}
diff --git a/core/themes/stable9/templates/form/fieldset.html.twig b/core/themes/stable9/templates/form/fieldset.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..59200e779310d56ababe0d8f7717ffa6a8d0e987
--- /dev/null
+++ b/core/themes/stable9/templates/form/fieldset.html.twig
@@ -0,0 +1,61 @@
+{#
+/**
+ * @file
+ * Theme override for a fieldset element and its children.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the <fieldset> element.
+ * - errors: (optional) Any errors for this <fieldset> element, may not be set.
+ * - required: Boolean indicating whether the <fieldeset> element is required.
+ * - legend: The <legend> element containing the following properties:
+ *   - title: Title of the <fieldset>, intended for use as the text
+       of the <legend>.
+ *   - attributes: HTML attributes to apply to the <legend> element.
+ * - description: The description element containing the following properties:
+ *   - content: The description content of the <fieldset>.
+ *   - attributes: HTML attributes to apply to the description container.
+ * - children: The rendered child elements of the <fieldset>.
+ * - prefix: The content to add before the <fieldset> children.
+ * - suffix: The content to add after the <fieldset> children.
+ *
+ * @see template_preprocess_fieldset()
+ */
+#}
+{%
+  set classes = [
+    'js-form-item',
+    'form-item',
+    'js-form-wrapper',
+    'form-wrapper',
+  ]
+%}
+<fieldset{{ attributes.addClass(classes) }}>
+  {%
+    set legend_span_classes = [
+      'fieldset-legend',
+      required ? 'js-form-required',
+      required ? 'form-required',
+    ]
+  %}
+  {#  Always wrap fieldset legends in a <span> for CSS positioning. #}
+  <legend{{ legend.attributes }}>
+    <span{{ legend_span.attributes.addClass(legend_span_classes) }}>{{ legend.title }}</span>
+  </legend>
+  <div class="fieldset-wrapper">
+    {% if errors %}
+      <div>
+        {{ errors }}
+      </div>
+    {% endif %}
+    {% if prefix %}
+      <span class="field-prefix">{{ prefix }}</span>
+    {% endif %}
+    {{ children }}
+    {% if suffix %}
+      <span class="field-suffix">{{ suffix }}</span>
+    {% endif %}
+    {% if description.content %}
+      <div{{ description.attributes.addClass('description') }}>{{ description.content }}</div>
+    {% endif %}
+  </div>
+</fieldset>
diff --git a/core/themes/stable9/templates/form/form-element-label.html.twig b/core/themes/stable9/templates/form/form-element-label.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7c2f8f222340cda34c7a3f5d66b469730e8cad60
--- /dev/null
+++ b/core/themes/stable9/templates/form/form-element-label.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @file
+ * Theme override for a form element label.
+ *
+ * Available variables:
+ * - title: The label's text.
+ * - title_display: Elements title_display setting.
+ * - required: An indicator for whether the associated form element is required.
+ * - attributes: A list of HTML attributes for the label.
+ *
+ * @see template_preprocess_form_element_label()
+ */
+#}
+{%
+  set classes = [
+    title_display == 'after' ? 'option',
+    title_display == 'invisible' ? 'visually-hidden',
+    required ? 'js-form-required',
+    required ? 'form-required',
+  ]
+%}
+{% if title is not empty or required -%}
+  <label{{ attributes.addClass(classes) }}>{{ title }}</label>
+{%- endif %}
diff --git a/core/themes/stable9/templates/form/form-element.html.twig b/core/themes/stable9/templates/form/form-element.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9e87a1b6da3d6f50ae9023d31f3d89ea4babb821
--- /dev/null
+++ b/core/themes/stable9/templates/form/form-element.html.twig
@@ -0,0 +1,94 @@
+{#
+/**
+ * @file
+ * Theme override for a form element.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - errors: (optional) Any errors for this form element, may not be set.
+ * - prefix: (optional) The form element prefix, may not be set.
+ * - suffix: (optional) The form element suffix, may not be set.
+ * - required: The required marker, or empty if the associated form element is
+ *   not required.
+ * - type: The type of the element.
+ * - name: The name of the element.
+ * - label: A rendered label element.
+ * - label_display: Label display setting. It can have these values:
+ *   - before: The label is output before the element. This is the default.
+ *     The label includes the #title and the required marker, if #required.
+ *   - after: The label is output after the element. For example, this is used
+ *     for radio and checkbox #type elements. If the #title is empty but the
+ *     field is #required, the label will contain only the required marker.
+ *   - invisible: Labels are critical for screen readers to enable them to
+ *     properly navigate through forms but can be visually distracting. This
+ *     property hides the label for everyone except screen readers.
+ *   - attribute: Set the title attribute on the element to create a tooltip but
+ *     output no label element. This is supported only for checkboxes and radios
+ *     in \Drupal\Core\Render\Element\CompositeFormElementTrait::preRenderCompositeFormElement().
+ *     It is used where a visual label is not needed, such as a table of
+ *     checkboxes where the row and column provide the context. The tooltip will
+ *     include the title and required marker.
+ * - description: (optional) A list of description properties containing:
+ *    - content: A description of the form element, may not be set.
+ *    - attributes: (optional) A list of HTML attributes to apply to the
+ *      description content wrapper. Will only be set when description is set.
+ * - description_display: Description display setting. It can have these values:
+ *   - before: The description is output before the element.
+ *   - after: The description is output after the element. This is the default
+ *     value.
+ *   - invisible: The description is output after the element, hidden visually
+ *     but available to screen readers.
+ * - disabled: True if the element is disabled.
+ * - title_display: Title display setting.
+ *
+ * @see template_preprocess_form_element()
+ */
+#}
+{%
+  set classes = [
+    'js-form-item',
+    'form-item',
+    'js-form-type-' ~ type|clean_class,
+    'form-item-' ~ name|clean_class,
+    'js-form-item-' ~ name|clean_class,
+    title_display not in ['after', 'before'] ? 'form-no-label',
+    disabled == 'disabled' ? 'form-disabled',
+    errors ? 'form-item--error',
+  ]
+%}
+{%
+  set description_classes = [
+    'description',
+    description_display == 'invisible' ? 'visually-hidden',
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {% if label_display in ['before', 'invisible'] %}
+    {{ label }}
+  {% endif %}
+  {% if prefix is not empty %}
+    <span class="field-prefix">{{ prefix }}</span>
+  {% endif %}
+  {% if description_display == 'before' and description.content %}
+    <div{{ description.attributes }}>
+      {{ description.content }}
+    </div>
+  {% endif %}
+  {{ children }}
+  {% if suffix is not empty %}
+    <span class="field-suffix">{{ suffix }}</span>
+  {% endif %}
+  {% if label_display == 'after' %}
+    {{ label }}
+  {% endif %}
+  {% if errors %}
+    <div class="form-item--error-message">
+      {{ errors }}
+    </div>
+  {% endif %}
+  {% if description_display in ['after', 'invisible'] and description.content %}
+    <div{{ description.attributes.addClass(description_classes) }}>
+      {{ description.content }}
+    </div>
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/form/form.html.twig b/core/themes/stable9/templates/form/form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..97b4b7a3de207fc82d768ad3ce77da4379d4ff76
--- /dev/null
+++ b/core/themes/stable9/templates/form/form.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override for a 'form' element.
+ *
+ * Available variables
+ * - attributes: A list of HTML attributes for the wrapper element.
+ * - children: The child elements of the form.
+ *
+ * @see template_preprocess_form()
+ */
+#}
+<form{{ attributes }}>
+  {{ children }}
+</form>
diff --git a/core/themes/stable9/templates/form/input.html.twig b/core/themes/stable9/templates/form/input.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d5cac386e006f7b7e4e2dec206efe1fcaed8a413
--- /dev/null
+++ b/core/themes/stable9/templates/form/input.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override for an 'input' #type form element.
+ *
+ * Available variables:
+ * - attributes: A list of HTML attributes for the input element.
+ * - children: Optional additional rendered elements.
+ *
+ * @see template_preprocess_input()
+ */
+#}
+<input{{ attributes }} />{{ children }}
diff --git a/core/themes/stable9/templates/form/radios.html.twig b/core/themes/stable9/templates/form/radios.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6e9a9d795b69faf9e74b08340836edb88e2f52db
--- /dev/null
+++ b/core/themes/stable9/templates/form/radios.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override for a 'radios' #type form element.
+ *
+ * Available variables
+ * - attributes: A list of HTML attributes for the wrapper element.
+ * - children: The rendered radios.
+ *
+ * @see template_preprocess_radios()
+ */
+#}
+<div{{ attributes }}>{{ children }}</div>
diff --git a/core/themes/stable9/templates/form/select.html.twig b/core/themes/stable9/templates/form/select.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9c8a97c058977793d4fed3ed5f2ef32b5abe2190
--- /dev/null
+++ b/core/themes/stable9/templates/form/select.html.twig
@@ -0,0 +1,27 @@
+{#
+/**
+ * @file
+ * Theme override for a select element.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the <select> tag.
+ * - options: The <option> element children.
+ *
+ * @see template_preprocess_select()
+ */
+#}
+{% apply spaceless %}
+  <select{{ attributes }}>
+    {% for option in options %}
+      {% if option.type == 'optgroup' %}
+        <optgroup label="{{ option.label }}">
+          {% for sub_option in option.options %}
+            <option value="{{ sub_option.value }}"{{ sub_option.selected ? ' selected="selected"' }}>{{ sub_option.label }}</option>
+          {% endfor %}
+        </optgroup>
+      {% elseif option.type == 'option' %}
+        <option value="{{ option.value }}"{{ option.selected ? ' selected="selected"' }}>{{ option.label }}</option>
+      {% endif %}
+    {% endfor %}
+  </select>
+{% endapply %}
diff --git a/core/themes/stable9/templates/form/textarea.html.twig b/core/themes/stable9/templates/form/textarea.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..96ddfc90e8680f6e2dd425d65c3aa367bf47efe2
--- /dev/null
+++ b/core/themes/stable9/templates/form/textarea.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override for a 'textarea' #type form element.
+ *
+ * Available variables
+ * - wrapper_attributes: A list of HTML attributes for the wrapper element.
+ * - attributes: A list of HTML attributes for the <textarea> element.
+ * - resizable: An indicator for whether the textarea is resizable.
+ * - required: An indicator for whether the textarea is required.
+ * - value: The textarea content.
+ *
+ * @see template_preprocess_textarea()
+ */
+#}
+<div{{ wrapper_attributes }}>
+  <textarea{{ attributes }}>{{ value }}</textarea>
+</div>
diff --git a/core/themes/stable9/templates/layout/book-export-html.html.twig b/core/themes/stable9/templates/layout/book-export-html.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..951ec4e9b7a4fb45cfee417076f2f18ab9d2aa12
--- /dev/null
+++ b/core/themes/stable9/templates/layout/book-export-html.html.twig
@@ -0,0 +1,45 @@
+{#
+/**
+ * @file
+ * Theme override for printed version of book outline.
+ *
+ * Available variables:
+ * - title: Top level node title.
+ * - head: Header tags.
+ * - language: Language object.
+ * - language_rtl: A flag indicating whether the current display language is a
+ *   right to left language.
+ * - base_url: URL to the home page.
+ * - contents: Nodes within the current outline rendered through
+ *   book-node-export-html.html.twig.
+ *
+ * @see template_preprocess_book_export_html()
+ */
+#}
+<!DOCTYPE html>
+<html{{ html_attributes }}>
+  <head>
+    <title>{{ title }}</title>
+    {{ page.head }}
+    <base href="{{ base_url }}" />
+    <link type="text/css" rel="stylesheet" href="/core/themes/stable9/css/core/print.css" />
+  </head>
+  <body>
+    {#
+      The given node is embedded to its absolute depth in a top level section.
+      For example, a child node with depth 2 in the hierarchy is contained in
+      (otherwise empty) div elements corresponding to depth 0 and depth 1. This
+      is intended to support WYSIWYG output - e.g., level 3 sections always look
+      like level 3 sections, no matter their depth relative to the node selected
+      to be exported as printer-friendly HTML.
+    #}
+
+  {% if depth > 1 %}{% for i in 1..depth-1 %}
+    <div>
+  {% endfor %}{% endif %}
+  {{ contents }}
+  {% if depth > 1 %}{% for i in 1..depth-1 %}
+    </div>
+  {% endfor %}{% endif %}
+  </body>
+</html>
diff --git a/core/themes/stable9/templates/layout/html.html.twig b/core/themes/stable9/templates/layout/html.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0b3abc01cf614d817f04de3ea29d5fea27652b5e
--- /dev/null
+++ b/core/themes/stable9/templates/layout/html.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Theme override for the basic structure of a single Drupal page.
+ *
+ * Variables:
+ * - logged_in: A flag indicating if user is logged in.
+ * - root_path: The root path of the current page (e.g., node, admin, user).
+ * - node_type: The content type for the current node, if the page is a node.
+ * - head_title: List of text elements that make up the head_title variable.
+ *   May contain one or more of the following:
+ *   - title: The title of the page.
+ *   - name: The name of the site.
+ *   - slogan: The slogan of the site.
+ * - page_top: Initial rendered markup. This should be printed before 'page'.
+ * - page: The rendered page markup.
+ * - page_bottom: Closing rendered markup. This variable should be printed after
+ *   'page'.
+ * - db_offline: A flag indicating if the database is offline.
+ * - placeholder_token: The token for generating head, css, js and js-bottom
+ *   placeholders.
+ *
+ * @see template_preprocess_html()
+ */
+#}
+<!DOCTYPE html>
+<html{{ html_attributes }}>
+  <head>
+    <head-placeholder token="{{ placeholder_token }}">
+    <title>{{ head_title|safe_join(' | ') }}</title>
+    <css-placeholder token="{{ placeholder_token }}">
+    <js-placeholder token="{{ placeholder_token }}">
+  </head>
+  <body{{ attributes }}>
+    {#
+      Keyboard navigation/accessibility link to main content section in
+      page.html.twig.
+    #}
+    <a href="#main-content" class="visually-hidden focusable">
+      {{ 'Skip to main content'|t }}
+    </a>
+    {{ page_top }}
+    {{ page }}
+    {{ page_bottom }}
+    <js-bottom-placeholder token="{{ placeholder_token }}">
+  </body>
+</html>
diff --git a/core/themes/stable9/templates/layout/install-page.html.twig b/core/themes/stable9/templates/layout/install-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e2d3381e4858513a3b0e990482fd5c826136bb39
--- /dev/null
+++ b/core/themes/stable9/templates/layout/install-page.html.twig
@@ -0,0 +1,53 @@
+{#
+/**
+ * @file
+ * Theme override to display a Drupal installation page.
+ *
+ * All available variables are mirrored in page.html.twig.
+ * Some may be blank but they are provided for consistency.
+ *
+ * @see template_preprocess_install_page()
+ */
+#}
+  <div class="layout-container">
+
+    <header role="banner">
+      {% if site_name or site_slogan %}
+        <div class="name-and-slogan">
+          {% if site_name %}
+            <h1>{{ site_name }}</h1>
+          {% endif %}
+          {% if site_slogan %}
+            <div class="site-slogan">{{ site_slogan }}</div>
+          {% endif %}
+        </div>{# /.name-and-slogan #}
+      {% endif %}
+    </header>
+
+    <main role="main">
+      {% if title %}
+        <h2>{{ title }}</h2>
+      {% endif %}
+      {{ page.highlighted }}
+      {{ page.content }}
+    </main>
+
+    {% if page.sidebar_first %}
+      <aside class="layout-sidebar-first" role="complementary">
+        {{ page.sidebar_first }}
+      </aside>{# /.layout-sidebar-first #}
+    {% endif %}
+
+    {% if page.sidebar_second %}
+      <aside class="layout-sidebar-second" role="complementary">
+        {{ page.sidebar_second }}
+      </aside>{# /.layout-sidebar-second #}
+    {% endif %}
+
+    {% if page.footer %}
+      <footer role="contentinfo">
+        {{ page.footer }}
+      </footer>
+    {% endif %}
+
+  </div>{# /.layout-container #}
diff --git a/core/themes/stable9/templates/layout/layout.html.twig b/core/themes/stable9/templates/layout/layout.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..59df5c6404153f38b8c2af13ecb6610729d4e634
--- /dev/null
+++ b/core/themes/stable9/templates/layout/layout.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Template for a generic layout.
+ */
+#}
+{%
+  set classes = [
+    'layout',
+    'layout--' ~ layout.id|clean_class,
+  ]
+%}
+{% if content %}
+  <div{{ attributes.addClass(classes) }}>
+    {% for region in layout.getRegionNames %}
+      {% if content[region] %}
+        <div {{ region_attributes[region].addClass('layout__region', 'layout__region--' ~ region|clean_class) }}>
+          {{ content[region] }}
+        </div>
+      {% endif %}
+    {% endfor %}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/layout/maintenance-page.html.twig b/core/themes/stable9/templates/layout/maintenance-page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..de0acaabbbb427e09cbe2454719a33daccb7b3c4
--- /dev/null
+++ b/core/themes/stable9/templates/layout/maintenance-page.html.twig
@@ -0,0 +1,58 @@
+{#
+/**
+ * @file
+ * Theme override to display a single Drupal page while offline.
+ *
+ * All available variables are mirrored in page.html.twig.
+ * Some may be blank but they are provided for consistency.
+ *
+ * @see template_preprocess_maintenance_page()
+ */
+#}
+<header role="banner">
+  {% if logo %}
+    <a href="{{ front_page }}" title="{{ 'Home'|t }}" rel="home">
+      <img src="{{ logo }}" alt="{{ 'Home'|t }}"/>
+    </a>
+  {% endif %}
+
+  {% if site_name or site_slogan %}
+    {% if site_name %}
+      <h1>
+        <a href="{{ front_page }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
+      </h1>
+    {% endif %}
+
+    {% if site_slogan %}
+      <div>{{ site_slogan }}</div>
+    {% endif %}
+  {% endif %}
+</header>
+
+<main role="main">
+  {% if title %}
+    <h1>{{ title }}</h1>
+  {% endif %}
+
+  {{ page.highlighted }}
+
+  {{ page.content }}
+</main>
+
+{% if page.sidebar_first %}
+  <aside role="complementary">
+    {{ page.sidebar_first }}
+  </aside>
+{% endif %}
+
+{% if page.sidebar_second %}
+  <aside role="complementary">
+    {{ page.sidebar_second }}
+  </aside>
+{% endif %}
+
+{% if page.footer %}
+  <footer role="contentinfo">
+    {{ page.footer }}
+  </footer>
+{% endif %}
diff --git a/core/themes/stable9/templates/layout/page.html.twig b/core/themes/stable9/templates/layout/page.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..669a1c658ef596564cfa0470174e016d0335013d
--- /dev/null
+++ b/core/themes/stable9/templates/layout/page.html.twig
@@ -0,0 +1,88 @@
+{#
+/**
+ * @file
+ * Theme override to display a single page.
+ *
+ * The doctype, html, head and body tags are not in this template. Instead they
+ * can be found in the html.html.twig template in this directory.
+ *
+ * Available variables:
+ *
+ * General utility variables:
+ * - base_path: The base URL path of the Drupal installation. Will usually be
+ *   "/" unless you have installed Drupal in a sub-directory.
+ * - is_front: A flag indicating if the current page is the front page.
+ * - logged_in: A flag indicating if the user is registered and signed in.
+ * - is_admin: A flag indicating if the user has permission to access
+ *   administration pages.
+ *
+ * Site identity:
+ * - front_page: The URL of the front page. Use this instead of base_path when
+ *   linking to the front page. This includes the language domain or prefix.
+ *
+ * Page content (in order of occurrence in the default page.html.twig):
+ * - messages: Status and error messages. Should be displayed prominently.
+ * - node: Fully loaded node, if there is an automatically-loaded node
+ *   associated with the page and the node ID is the second argument in the
+ *   page's path (e.g. node/12345 and node/12345/revisions, but not
+ *   comment/reply/12345).
+ *
+ * Regions:
+ * - page.header: Items for the header region.
+ * - page.primary_menu: Items for the primary menu region.
+ * - page.secondary_menu: Items for the secondary menu region.
+ * - page.highlighted: Items for the highlighted content region.
+ * - page.help: Dynamic help text, mostly for admin pages.
+ * - page.content: The main content of the current page.
+ * - page.sidebar_first: Items for the first sidebar.
+ * - page.sidebar_second: Items for the second sidebar.
+ * - page.footer: Items for the footer region.
+ * - page.breadcrumb: Items for the breadcrumb region.
+ *
+ * @see template_preprocess_page()
+ * @see html.html.twig
+ */
+#}
+<div class="layout-container">
+
+  <header role="banner">
+    {{ page.header }}
+  </header>
+
+  {{ page.primary_menu }}
+  {{ page.secondary_menu }}
+
+  {{ page.breadcrumb }}
+
+  {{ page.highlighted }}
+
+  {{ page.help }}
+
+  <main role="main">
+    <a id="main-content" tabindex="-1"></a>{# link is in html.html.twig #}
+
+    <div class="layout-content">
+      {{ page.content }}
+    </div>{# /.layout-content #}
+
+    {% if page.sidebar_first %}
+      <aside class="layout-sidebar-first" role="complementary">
+        {{ page.sidebar_first }}
+      </aside>
+    {% endif %}
+
+    {% if page.sidebar_second %}
+      <aside class="layout-sidebar-second" role="complementary">
+        {{ page.sidebar_second }}
+      </aside>
+    {% endif %}
+
+  </main>
+
+  {% if page.footer %}
+    <footer role="contentinfo">
+      {{ page.footer }}
+    </footer>
+  {% endif %}
+
+</div>{# /.layout-container #}
diff --git a/core/themes/stable9/templates/layout/region.html.twig b/core/themes/stable9/templates/layout/region.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..e5e36d07410b8fb7be5b57e43e6d3880f3793d01
--- /dev/null
+++ b/core/themes/stable9/templates/layout/region.html.twig
@@ -0,0 +1,19 @@
+{#
+/**
+ * @file
+ * Theme override to display a region.
+ *
+ * Available variables:
+ * - content: The content for this region, typically blocks.
+ * - attributes: HTML attributes for the region <div>.
+ * - region: The name of the region variable as defined in the theme's
+ *   .info.yml file.
+ *
+ * @see template_preprocess_region()
+ */
+#}
+{% if content %}
+  <div{{ attributes }}>
+    {{ content }}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/media-library/feed-icon.html.twig b/core/themes/stable9/templates/media-library/feed-icon.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c7cb9a37ed4c5a6f24ebb42f4f53f6757f3cb788
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/feed-icon.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Theme override for a feed icon.
+ *
+ * Available variables:
+ * - url: An internal system path or a fully qualified external URL of the feed.
+ * - attributes: Remaining HTML attributes for the feed link.
+ *   - title: A descriptive title of the feed link.
+ *   - class: HTML classes to be applied to the feed link.
+ */
+#}
+<a href="{{ url }}"{{ attributes.addClass('feed-icon') }}>
+  {{ 'Subscribe to @title'|t({'@title': title}) }}
+</a>
diff --git a/core/themes/stable9/templates/media-library/media--media-library.html.twig b/core/themes/stable9/templates/media-library/media--media-library.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4c5a5a70970941d0a6a53b8463ae0752d5c5c0c5
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/media--media-library.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Theme override to present a media entity in the media library.
+ *
+ * Available variables:
+ * - media: The entity with limited access to object properties and methods.
+ *   Only method names starting with "get", "has", or "is" and a few common
+ *   methods such as "id", "label", and "bundle" are available. For example:
+ *   - entity.getEntityTypeId() will return the entity type ID.
+ *   - entity.hasField('field_example') returns TRUE if the entity includes
+ *     field_example. (This does not indicate the presence of a value in this
+ *     field.)
+ *   Calling other methods, such as entity.delete(), will result in an exception.
+ *   See \Drupal\Core\Entity\EntityInterface for a full list of methods.
+ * - name: Name of the media.
+ * - content: Media content.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ * - view_mode: View mode; for example, "teaser" or "full".
+ * - attributes: HTML attributes for the containing element.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - url: Direct URL of the media.
+ * - preview_attributes: HTML attributes for the preview wrapper.
+ * - metadata_attributes: HTML attributes for the expandable metadata area.
+ * - status: Whether or not the Media is published.
+ *
+ * @see template_preprocess_media()
+ * @see media_library_preprocess_media()
+ */
+#}
+<article{{ attributes }}>
+  {% if content %}
+    <div{{ preview_attributes.addClass('js-media-library-item-preview') }}>
+      {{ content|without('name') }}
+    </div>
+    {% if not status %}
+      {{ "unpublished" | t }}
+    {% endif %}
+    <div{{ metadata_attributes }}>
+      {{ name }}
+    </div>
+  {% endif %}
+</article>
diff --git a/core/themes/stable9/templates/media-library/media-library-item.html.twig b/core/themes/stable9/templates/media-library/media-library-item.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..372b71c88b1f0273c420308031ddf5c07cc443f3
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/media-library-item.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override of a media library item.
+ *
+ * This is used when displaying selected media items, either in the field
+ * widget or in the "Additional selected media" area when adding new
+ * media items in the media library modal dialog.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - content: The content of the media library item, plus any additional
+ *   fields or elements surrounding it.
+ *
+ * @see template_preprocess_media_library_item()
+ */
+#}
+<div{{ attributes }}>
+  {{ content }}
+</div>
diff --git a/core/themes/stable9/templates/media-library/media-library-wrapper.html.twig b/core/themes/stable9/templates/media-library/media-library-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c3cf2d65b9a32c684b6414756071bb58f8fe7d7e
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/media-library-wrapper.html.twig
@@ -0,0 +1,19 @@
+{#
+/**
+ * @file
+ * Theme override of a container used to wrap the media library's
+ * modal dialog interface.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the containing element.
+ * - menu: The menu of availble media types to choose from.
+ * - content: The form to add new media items, followed by the grid or table of
+ *   existing media items to choose from.
+ *
+ * @see template_preprocess_media_library_wrapper()
+ */
+#}
+<div{{ attributes }}>
+  {{ menu }}
+  {{ content }}
+</div>
diff --git a/core/themes/stable9/templates/media-library/progress-bar.html.twig b/core/themes/stable9/templates/media-library/progress-bar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7b67afec8f14f2fc41396a97c9093212bb933c02
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/progress-bar.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for a progress bar.
+ *
+ * Note that the core Batch API uses this only for non-JavaScript batch jobs.
+ *
+ * Available variables:
+ * - label: The label of the working task.
+ * - percent: The percentage of the progress.
+ * - message: A string containing information to be displayed.
+ */
+#}
+<div class="progress" data-drupal-progress>
+  {% if label %}
+    <div class="progress__label">{{ label }}</div>
+  {% endif %}
+  <div class="progress__track"><div class="progress__bar" style="width: {{ percent }}%"></div></div>
+  <div class="progress__percentage">{{ percent }}%</div>
+  <div class="progress__description">{{ message }}</div>
+</div>
diff --git a/core/themes/stable9/templates/media-library/rdf-metadata.html.twig b/core/themes/stable9/templates/media-library/rdf-metadata.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..81d91728240cbff5dcad3464874de1be0b821c8c
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/rdf-metadata.html.twig
@@ -0,0 +1,20 @@
+{#
+/**
+ * @file
+ * Theme override for empty spans with RDF attributes.
+ *
+ * The XHTML+RDFa doctype allows either <span></span> or <span /> syntax to
+ * be used, but for maximum browser compatibility, W3C recommends the
+ * former when serving pages using the text/html media type, see
+ * http://www.w3.org/TR/xhtml1/#C_3.
+ *
+ * Available variables:
+ * - metadata: Each item within corresponds to its own set of attributes,
+ *   and therefore, needs its own 'attributes' element.
+ *
+ * @see template_preprocess_rdf_metadata()
+ */
+#}
+{% for attributes in metadata %}
+  <span{{ attributes.addClass('hidden') }}></span>
+{% endfor %}
diff --git a/core/themes/stable9/templates/media-library/rdf-wrapper.html.twig b/core/themes/stable9/templates/media-library/rdf-wrapper.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..90f50f4ae50027637930e93048b629c8229d823a
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/rdf-wrapper.html.twig
@@ -0,0 +1,11 @@
+{#
+/**
+ * @file
+ * Theme override for wrapping content with RDF attributes.
+ *
+ * Available variables:
+ * - content: The content being wrapped with RDF attributes.
+ * - attributes: HTML attributes, including RDF attributes for wrapper element.
+ */
+#}
+<span{{ attributes }}>{{ content }}</span>
diff --git a/core/themes/stable9/templates/media-library/status-messages.html.twig b/core/themes/stable9/templates/media-library/status-messages.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9866f27401c69a162c17ecb9bdb803e43f4b0c5d
--- /dev/null
+++ b/core/themes/stable9/templates/media-library/status-messages.html.twig
@@ -0,0 +1,45 @@
+{#
+/**
+ * @file
+ * Theme override for status messages.
+ *
+ * Displays status, error, and warning messages, grouped by type.
+ *
+ * An invisible heading identifies the messages for assistive technology.
+ * Sighted users see a colored box. See http://www.w3.org/TR/WCAG-TECHS/H69.html
+ * for info.
+ *
+ * Add an ARIA label to the contentinfo area so that assistive technology
+ * user agents will better describe this landmark.
+ *
+ * Available variables:
+ * - message_list: List of messages to be displayed, grouped by type.
+ * - status_headings: List of all status types.
+ * - attributes: HTML attributes for the element, including:
+ *   - class: HTML classes.
+ */
+#}
+<div data-drupal-messages>
+{% for type, messages in message_list %}
+  <div role="contentinfo" aria-label="{{ status_headings[type] }}"{{ attributes|without('role', 'aria-label') }}>
+    {% if type == 'error' %}
+      <div role="alert">
+    {% endif %}
+    {% if status_headings[type] %}
+      <h2 class="visually-hidden">{{ status_headings[type] }}</h2>
+    {% endif %}
+    {% if messages|length > 1 %}
+      <ul>
+        {% for message in messages %}
+          <li>{{ message }}</li>
+        {% endfor %}
+      </ul>
+    {% else %}
+      {{ messages|first }}
+    {% endif %}
+    {% if type == 'error' %}
+      </div>
+    {% endif %}
+  </div>
+{% endfor %}
+</div>
diff --git a/core/themes/stable9/templates/navigation/book-all-books-block.html.twig b/core/themes/stable9/templates/navigation/book-all-books-block.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..2eafa8e0c321b5db5b30f5276abb8e258bf89265
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/book-all-books-block.html.twig
@@ -0,0 +1,22 @@
+{#
+/**
+ * @file
+ * Theme override for rendering book outlines within a block.
+ *
+ * This template is used only when the block is configured to "show block on all
+ * pages", which presents multiple independent books on all pages.
+ *
+ * Available variables:
+ * - book_menus: Book outlines.
+ *   - id: The parent book ID.
+ *   - title: The parent book title.
+ *   - menu: The top-level book links.
+ *
+ * @see template_preprocess_book_all_books_block()
+ */
+#}
+{% for book in book_menus %}
+  <nav role="navigation" aria-label="{% trans %}Book outline for {{ book.title }}{% endtrans %}">
+    {{ book.menu }}
+  </nav>
+{% endfor %}
diff --git a/core/themes/stable9/templates/navigation/book-navigation.html.twig b/core/themes/stable9/templates/navigation/book-navigation.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..28a797a12a99821210d4bcd01631affc6188cca4
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/book-navigation.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override to navigate books.
+ *
+ * Presented under nodes that are a part of book outlines.
+ *
+ * Available variables:
+ * - tree: The immediate children of the current node rendered as an unordered
+ *   list.
+ * - current_depth: Depth of the current node within the book outline. Provided
+ *   for context.
+ * - prev_url: URL to the previous node.
+ * - prev_title: Title of the previous node.
+ * - parent_url: URL to the parent node.
+ * - parent_title: Title of the parent node. Not printed by default. Provided
+ *   as an option.
+ * - next_url: URL to the next node.
+ * - next_title: Title of the next node.
+ * - has_links: Flags TRUE whenever the previous, parent or next data has a
+ *   value.
+ * - book_id: The book ID of the current outline being viewed. Same as the node
+ *   ID containing the entire outline. Provided for context.
+ * - book_url: The book/node URL of the current outline being viewed. Provided
+ *   as an option. Not used by default.
+ * - book_title: The book/node title of the current outline being viewed.
+ *
+ * @see template_preprocess_book_navigation()
+ */
+#}
+{% if tree or has_links %}
+  <nav role="navigation" aria-labelledby="book-label-{{ book_id }}">
+    {{ tree }}
+    {% if has_links %}
+      <h2>{{ 'Book traversal links for'|t }} {{ book_title }}</h2>
+      <ul>
+      {% if prev_url %}
+        <li>
+          <a href="{{ prev_url }}" rel="prev" title="{{ 'Go to previous page'|t }}"><b>{{ '‹'|t }}</b> {{ prev_title }}</a>
+        </li>
+      {% endif %}
+      {% if parent_url %}
+        <li>
+          <a href="{{ parent_url }}" title="{{ 'Go to parent page'|t }}">{{ 'Up'|t }}</a>
+        </li>
+      {% endif %}
+      {% if next_url %}
+        <li>
+          <a href="{{ next_url }}" rel="next" title="{{ 'Go to next page'|t }}">{{ next_title }} <b>{{ '›'|t }}</b></a>
+        </li>
+      {% endif %}
+    </ul>
+    {% endif %}
+  </nav>
+{% endif %}
diff --git a/core/themes/stable9/templates/navigation/book-tree.html.twig b/core/themes/stable9/templates/navigation/book-tree.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6f4d3ad0a796ece0a6882270509308a71f2f9bb2
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/book-tree.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Theme override to display a book tree.
+ *
+ * Returns HTML for a wrapper for a book sub-tree.
+ *
+ * Available variables:
+ * - items: A nested list of book items. Each book item contains:
+ *   - attributes: HTML attributes for the book item.
+ *   - 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 %}
+
+{#
+  We call a macro which calls itself to render the full tree.
+  @see https://twig.symfony.com/doc/1.x/tags/macro.html
+#}
+{{ book_tree.book_links(items, attributes, 0) }}
+
+{% macro book_links(items, attributes, menu_level) %}
+  {% import _self as book_tree %}
+  {% if items %}
+    {% if menu_level == 0 %}
+      <ul{{ attributes }}>
+    {% 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 %}
+    </ul>
+  {% endif %}
+{% endmacro %}
diff --git a/core/themes/stable9/templates/navigation/breadcrumb.html.twig b/core/themes/stable9/templates/navigation/breadcrumb.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..109768322444d340ea0493a0ef74745bc12d1f19
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/breadcrumb.html.twig
@@ -0,0 +1,25 @@
+{#
+/**
+ * @file
+ * Theme override for a breadcrumb trail.
+ *
+ * Available variables:
+ * - breadcrumb: Breadcrumb trail items.
+ */
+#}
+{% if breadcrumb %}
+  <nav role="navigation" aria-labelledby="system-breadcrumb">
+    <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
+    <ol>
+    {% for item in breadcrumb %}
+      <li>
+        {% if item.url %}
+          <a href="{{ item.url }}">{{ item.text }}</a>
+        {% else %}
+          {{ item.text }}
+        {% endif %}
+      </li>
+    {% endfor %}
+    </ol>
+  </nav>
+{% endif %}
diff --git a/core/themes/stable9/templates/navigation/links.html.twig b/core/themes/stable9/templates/navigation/links.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8eb003355eb37a99af14833a25eb8b9b302f19c8
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/links.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override for a set of links.
+ *
+ * Available variables:
+ * - attributes: Attributes for the UL containing the list of links.
+ * - links: Links to be output.
+ *   Each link will have the following elements:
+ *   - link: (optional) A render array that returns a link. See
+ *     template_preprocess_links() for details how it is generated.
+ *   - text: The link text.
+ *   - attributes: HTML attributes for the list item element.
+ *   - text_attributes: (optional) HTML attributes for the span element if no
+ *     'url' was supplied.
+ * - heading: (optional) A heading to precede the links.
+ *   - text: The heading text.
+ *   - level: The heading level (e.g. 'h2', 'h3').
+ *   - attributes: (optional) A keyed list of attributes for the heading.
+ *   If the heading is a string, it will be used as the text of the heading and
+ *   the level will default to 'h2'.
+ *
+ *   Headings should be used on navigation menus and any list of links that
+ *   consistently appears on multiple pages. To make the heading invisible use
+ *   the 'visually-hidden' CSS class. Do not use 'display:none', which
+ *   removes it from screen readers and assistive technology. Headings allow
+ *   screen reader and keyboard only users to navigate to or skip the links.
+ *   See http://juicystudio.com/article/screen-readers-display-none.php and
+ *   http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
+ *
+ * @see template_preprocess_links()
+ */
+#}
+{% if links -%}
+  {%- if heading -%}
+    {%- if heading.level -%}
+      <{{ heading.level }}{{ heading.attributes }}>{{ heading.text }}</{{ heading.level }}>
+    {%- else -%}
+      <h2{{ heading.attributes }}>{{ heading.text }}</h2>
+    {%- endif -%}
+  {%- endif -%}
+  <ul{{ attributes }}>
+    {%- for item in links -%}
+      <li{{ item.attributes }}>
+        {%- if item.link -%}
+          {{ item.link }}
+        {%- elseif item.text_attributes -%}
+          <span{{ item.text_attributes }}>{{ item.text }}</span>
+        {%- else -%}
+          {{ item.text }}
+        {%- endif -%}
+      </li>
+    {%- endfor -%}
+  </ul>
+{%- endif %}
diff --git a/core/themes/stable9/templates/navigation/menu--toolbar.html.twig b/core/themes/stable9/templates/navigation/menu--toolbar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..c9702f5c06e505f5554b59c6547303a8d8cfdab7
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/menu--toolbar.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Theme override to display a toolbar menu.
+ *
+ * Available variables:
+ * - menu_name: The machine name of the menu.
+ * - items: A nested list of menu items. Each menu item contains:
+ *   - attributes: HTML attributes for the menu item.
+ *   - below: The menu item child items.
+ *   - 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 %}
+
+{#
+  We call a macro which calls itself to render the full tree.
+  @see https://twig.symfony.com/doc/1.x/tags/macro.html
+#}
+{{ menus.menu_links(items, attributes, 0) }}
+
+{% macro menu_links(items, attributes, menu_level) %}
+  {% import _self as menus %}
+  {% if items %}
+    {% if menu_level == 0 %}
+      <ul{{ attributes.addClass('toolbar-menu') }}>
+    {% 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 %}
+    </ul>
+  {% endif %}
+{% endmacro %}
diff --git a/core/themes/stable9/templates/navigation/menu-local-action.html.twig b/core/themes/stable9/templates/navigation/menu-local-action.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..27872837abdca839f016b791feb731656f653108
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/menu-local-action.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override for a single local action link.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the wrapper element.
+ * - link: A rendered link element.
+ *
+ * @see template_preprocess_menu_local_action()
+ */
+#}
+<li{{ attributes }}>{{ link }}</li>
diff --git a/core/themes/stable9/templates/navigation/menu-local-task.html.twig b/core/themes/stable9/templates/navigation/menu-local-task.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..b6c3ca2419130ba26197feb806f24c927366ae3f
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/menu-local-task.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Theme override for a local task link.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the wrapper element.
+ * - is_active: Whether the task item is an active tab.
+ * - link: A rendered link element.
+ *
+ * Note: This template renders the content for each task item in
+ * menu-local-tasks.html.twig.
+ *
+ * @see template_preprocess_menu_local_task()
+ */
+#}
+<li{{ attributes }}>{{ link }}</li>
diff --git a/core/themes/stable9/templates/navigation/menu-local-tasks.html.twig b/core/themes/stable9/templates/navigation/menu-local-tasks.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3874add990a88917025a759cff3fffa5496ef44b
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/menu-local-tasks.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override to display primary and secondary local tasks.
+ *
+ * Available variables:
+ * - primary: HTML list items representing primary tasks.
+ * - secondary: HTML list items representing primary tasks.
+ *
+ * Each item in these variables (primary and secondary) can be individually
+ * themed in menu-local-task.html.twig.
+ */
+#}
+{% if primary %}
+  <h2 class="visually-hidden">{{ 'Primary tabs'|t }}</h2>
+  <ul>{{ primary }}</ul>
+{% endif %}
+{% if secondary %}
+  <h2 class="visually-hidden">{{ 'Secondary tabs'|t }}</h2>
+  <ul>{{ secondary }}</ul>
+{% endif %}
diff --git a/core/themes/stable9/templates/navigation/menu.html.twig b/core/themes/stable9/templates/navigation/menu.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..9ad847475446c0b2d4d56a9b145a24845363ea77
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/menu.html.twig
@@ -0,0 +1,47 @@
+{#
+/**
+ * @file
+ * Theme override to display a menu.
+ *
+ * Available variables:
+ * - menu_name: The machine name of the menu.
+ * - items: A nested list of menu items. Each menu item contains:
+ *   - attributes: HTML attributes for the menu item.
+ *   - below: The menu item child items.
+ *   - 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 %}
+
+{#
+  We call a macro which calls itself to render the full tree.
+  @see https://twig.symfony.com/doc/1.x/tags/macro.html
+#}
+{{ menus.menu_links(items, attributes, 0) }}
+
+{% macro menu_links(items, attributes, menu_level) %}
+  {% import _self as menus %}
+  {% if items %}
+    {% if menu_level == 0 %}
+      <ul{{ attributes }}>
+    {% 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 %}
+    </ul>
+  {% endif %}
+{% endmacro %}
diff --git a/core/themes/stable9/templates/navigation/pager.html.twig b/core/themes/stable9/templates/navigation/pager.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..6f863faaf91206bd7e563c9dde65327b4645ccfa
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/pager.html.twig
@@ -0,0 +1,99 @@
+{#
+/**
+ * @file
+ * Theme override to display a pager.
+ *
+ * Available variables:
+ * - heading_id: Pagination heading ID.
+ * - items: List of pager items.
+ *   The list is keyed by the following elements:
+ *   - first: Item for the first page; not present on the first page of results.
+ *   - previous: Item for the previous page; not present on the first page
+ *     of results.
+ *   - next: Item for the next page; not present on the last page of results.
+ *   - last: Item for the last page; not present on the last page of results.
+ *   - pages: List of pages, keyed by page number.
+ *   Sub-sub elements:
+ *   items.first, items.previous, items.next, items.last, and each item inside
+ *   items.pages contain the following elements:
+ *   - href: URL with appropriate query parameters for the item.
+ *   - attributes: A keyed list of HTML attributes for the item.
+ *   - text: The visible text used for the item link, such as "‹ Previous"
+ *     or "Next ›".
+ * - current: The page number of the current page.
+ * - ellipses: If there are more pages than the quantity allows, then an
+ *   ellipsis before or after the listed pages may be present.
+ *   - previous: Present if the currently visible list of pages does not start
+ *     at the first page.
+ *   - next: Present if the visible list of pages ends before the last page.
+ *
+ * @see template_preprocess_pager()
+ */
+#}
+{% if items %}
+  <nav class="pager" role="navigation" aria-labelledby="{{ heading_id }}">
+    <h4 id="{{ heading_id }}" class="visually-hidden">{{ 'Pagination'|t }}</h4>
+    <ul class="pager__items js-pager__items">
+      {# Print first item if we are not on the first page. #}
+      {% if items.first %}
+        <li class="pager__item pager__item--first">
+          <a href="{{ items.first.href }}" title="{{ 'Go to first page'|t }}"{{ items.first.attributes|without('href', 'title') }}>
+            <span class="visually-hidden">{{ 'First page'|t }}</span>
+            <span aria-hidden="true">{{ items.first.text|default('« First'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {# Print previous item if we are not on the first page. #}
+      {% if items.previous %}
+        <li class="pager__item pager__item--previous">
+          <a href="{{ items.previous.href }}" title="{{ 'Go to previous page'|t }}" rel="prev"{{ items.previous.attributes|without('href', 'title', 'rel') }}>
+            <span class="visually-hidden">{{ 'Previous page'|t }}</span>
+            <span aria-hidden="true">{{ items.previous.text|default('‹ Previous'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {# Add an ellipsis if there are further previous pages. #}
+      {% if ellipses.previous %}
+        <li class="pager__item pager__item--ellipsis" role="presentation">&hellip;</li>
+      {% endif %}
+      {# Now generate the actual pager piece. #}
+      {% for key, item in items.pages %}
+        <li class="pager__item{{ current == key ? ' is-active' : '' }}">
+          {% if current == key %}
+            {% set title = 'Current page'|t %}
+          {% else %}
+            {% set title = 'Go to page @key'|t({'@key': key}) %}
+          {% endif %}
+          <a href="{{ item.href }}" title="{{ title }}"{{ item.attributes|without('href', 'title') }}>
+            <span class="visually-hidden">
+              {{ current == key ? 'Current page'|t : 'Page'|t }}
+            </span>
+            {{- key -}}
+          </a>
+        </li>
+      {% endfor %}
+      {# Add an ellipsis if there are further next pages. #}
+      {% if ellipses.next %}
+        <li class="pager__item pager__item--ellipsis" role="presentation">&hellip;</li>
+      {% endif %}
+      {# Print next item if we are not on the last page. #}
+      {% if items.next %}
+        <li class="pager__item pager__item--next">
+          <a href="{{ items.next.href }}" title="{{ 'Go to next page'|t }}" rel="next"{{ items.next.attributes|without('href', 'title', 'rel') }}>
+            <span class="visually-hidden">{{ 'Next page'|t }}</span>
+            <span aria-hidden="true">{{ items.next.text|default('Next ›'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {# Print last item if we are not on the last page. #}
+      {% if items.last %}
+        <li class="pager__item pager__item--last">
+          <a href="{{ items.last.href }}" title="{{ 'Go to last page'|t }}"{{ items.last.attributes|without('href', 'title') }}>
+            <span class="visually-hidden">{{ 'Last page'|t }}</span>
+            <span aria-hidden="true">{{ items.last.text|default('Last »'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+    </ul>
+  </nav>
+{% endif %}
diff --git a/core/themes/stable9/templates/navigation/toolbar.html.twig b/core/themes/stable9/templates/navigation/toolbar.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..efbe00c2db416a734aa9925be5349bfe62f27902
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/toolbar.html.twig
@@ -0,0 +1,46 @@
+{#
+/**
+ * @file
+ * Theme override for the administrative toolbar.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the wrapper.
+ * - toolbar_attributes: HTML attributes to apply to the toolbar.
+ * - toolbar_heading: The heading or label for the toolbar.
+ * - tabs: List of tabs for the toolbar.
+ *   - attributes: HTML attributes for the tab container.
+ *   - link: Link or button for the menu tab.
+ * - trays: Toolbar tray list, each associated with a tab. Each tray in trays
+ *   contains:
+ *   - attributes: HTML attributes to apply to the tray.
+ *   - label: The tray's label.
+ *   - links: The tray menu links.
+ * - remainder: Any non-tray, non-tab elements left to be rendered.
+ *
+ * @see template_preprocess_toolbar()
+ */
+#}
+<div{{ attributes.addClass('toolbar') }}>
+  <nav{{ toolbar_attributes.addClass('toolbar-bar') }}>
+    <h2 class="visually-hidden">{{ toolbar_heading }}</h2>
+    {% for key, tab in tabs %}
+      {% set tray = trays[key] %}
+      <div{{ tab.attributes.addClass('toolbar-tab') }}>
+        {{ tab.link }}
+        {% apply spaceless %}
+          <div{{ tray.attributes }}>
+            {% if tray.label %}
+              <nav class="toolbar-lining clearfix" role="navigation" aria-label="{{ tray.label }}">
+                <h3 class="toolbar-tray-name visually-hidden">{{ tray.label }}</h3>
+            {% else %}
+              <nav class="toolbar-lining clearfix" role="navigation">
+            {% endif %}
+            {{ tray.links }}
+            </nav>
+          </div>
+        {% endapply %}
+      </div>
+    {% endfor %}
+  </nav>
+  {{ remainder }}
+</div>
diff --git a/core/themes/stable9/templates/navigation/vertical-tabs.html.twig b/core/themes/stable9/templates/navigation/vertical-tabs.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5872220b2a751dfeb132901e1b8e0c9c0f09284b
--- /dev/null
+++ b/core/themes/stable9/templates/navigation/vertical-tabs.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Theme override for vertical tabs.
+ *
+ * Available variables
+ * - attributes: A list of HTML attributes for the wrapper element.
+ * - children: The rendered tabs.
+ *
+ * @see template_preprocess_vertical_tabs()
+ */
+#}
+<div{{ attributes.setAttribute('data-vertical-tabs-panes', TRUE) }}>{{ children }}</div>
diff --git a/core/themes/stable9/templates/user/forum-submitted.html.twig b/core/themes/stable9/templates/user/forum-submitted.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..65680cef1b59b4ffa5b862ed1de78bad6fa42a3b
--- /dev/null
+++ b/core/themes/stable9/templates/user/forum-submitted.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for a forum post submission string.
+ *
+ * The submission string indicates when and by whom a topic was submitted.
+ *
+ * Available variables:
+ * - author: The author of the post.
+ * - time: How long ago the post was created.
+ * - topic: An object with the raw data of the post. Potentially unsafe. Be
+ *   sure to clean this data before printing.
+ *
+ * @see template_preprocess_forum_submitted()
+ */
+#}
+{% if time %}
+  <span>{% trans %}By {{ author }} {{ time }} ago{% endtrans %}</span>
+{% else %}
+  {{ 'n/a'|t }}
+{% endif %}
diff --git a/core/themes/stable9/templates/user/user.html.twig b/core/themes/stable9/templates/user/user.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..99e94726377d780bad26073d93145d3f17e942b1
--- /dev/null
+++ b/core/themes/stable9/templates/user/user.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override to present all user data.
+ *
+ * This template is used when viewing a registered user's page,
+ * e.g., example.com/user/123. 123 being the user's ID.
+ *
+ * Available variables:
+ * - content: A list of content items. Use 'content' to print all content, or
+ *   print a subset such as 'content.field_example'. Fields attached to a user
+ *   such as 'user_picture' are available as 'content.user_picture'.
+ * - attributes: HTML attributes for the container element.
+ * - user: A Drupal User entity.
+ *
+ * @see template_preprocess_user()
+ */
+#}
+<article{{ attributes }}>
+  {% if content %}
+    {{- content -}}
+  {% endif %}
+</article>
diff --git a/core/themes/stable9/templates/user/username.html.twig b/core/themes/stable9/templates/user/username.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..7f62f9b450d0a093682aa1d203b35071da751fdd
--- /dev/null
+++ b/core/themes/stable9/templates/user/username.html.twig
@@ -0,0 +1,29 @@
+{#
+/**
+ * @file
+ * Theme override for displaying a username.
+ *
+ * Available variables:
+ * - account: The full account information for the user.
+ * - uid: The user ID, or zero if not a user. As used in anonymous comments.
+ * - name: The user's name, sanitized, and optionally truncated.
+ * - name_raw: The user's name, un-truncated.
+ * - truncated: Whether the user's name was truncated.
+ * - extra: Additional text to append to the user's name, sanitized.
+ * - profile_access: Whether the current user has permission to access this
+     users profile page.
+ * - link_path: The path or URL of the user's profile page, home page,
+ *   or other desired page to link to for more information about the user.
+ * - homepage: (optional) The home page of the account, only set for non users.
+ * - link_options: Options to set on the \Drupal\Core\Url object if linking the
+ *   user's name to the user's page.
+ * - attributes: HTML attributes for the containing element.
+ *
+ * @see template_preprocess_username()
+ */
+#}
+{% if link_path -%}
+  <a{{ attributes }}>{{ name }}{{ extra }}</a>
+{%- else -%}
+  <span{{ attributes }}>{{ name }}{{ extra }}</span>
+{%- endif -%}
diff --git a/core/themes/stable9/templates/views/views-exposed-form.html.twig b/core/themes/stable9/templates/views/views-exposed-form.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0d34594d495c8d6beb3eb92b963e3a2f95361f58
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-exposed-form.html.twig
@@ -0,0 +1,19 @@
+{#
+/**
+ * @file
+ * Theme override of a views exposed form.
+ *
+ * Available variables:
+ * - form: A render element representing the form.
+ *
+ * @see template_preprocess_views_exposed_form()
+ */
+#}
+{% if q is not empty %}
+  {#
+    This ensures that, if clean URLs are off, the 'q' is added first,
+    as a hidden form element, so that it shows up first in the POST URL.
+  #}
+{{ q }}
+{% endif %}
+{{ form }}
diff --git a/core/themes/stable9/templates/views/views-mini-pager.html.twig b/core/themes/stable9/templates/views/views-mini-pager.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..24f8f7aa994eb2067f0ec5f6550e13eed6634f6b
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-mini-pager.html.twig
@@ -0,0 +1,42 @@
+{#
+/**
+ * @file
+ * Theme override for a views mini-pager.
+ *
+ * Available variables:
+ * - heading_id: Pagination heading ID.
+ * - items: List of pager items.
+ *
+ * @see template_preprocess_views_mini_pager()
+ */
+#}
+{% if items.previous or items.next %}
+  <nav role="navigation" aria-labelledby="{{ heading_id }}">
+    <h4 id="{{ heading_id }}" class="visually-hidden">{{ 'Pagination'|t }}</h4>
+    <ul class="js-pager__items">
+      {% if items.previous %}
+        <li>
+          <a href="{{ items.previous.href }}" title="{{ 'Go to previous page'|t }}" rel="prev"{{ items.previous.attributes|without('href', 'title', 'rel') }}>
+            <span class="visually-hidden">{{ 'Previous page'|t }}</span>
+            <span aria-hidden="true">{{ items.previous.text|default('‹‹'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+      {% if items.current %}
+        <li>
+          {% trans %}
+            Page {{ items.current }}
+          {% endtrans %}
+        </li>
+      {% endif %}
+      {% if items.next %}
+        <li>
+          <a href="{{ items.next.href }}" title="{{ 'Go to next page'|t }}" rel="next"{{ items.next.attributes|without('href', 'title', 'rel') }}>
+            <span class="visually-hidden">{{ 'Next page'|t }}</span>
+            <span aria-hidden="true">{{ items.next.text|default('››'|t) }}</span>
+          </a>
+        </li>
+      {% endif %}
+    </ul>
+  </nav>
+{% endif %}
diff --git a/core/themes/stable9/templates/views/views-view-field.html.twig b/core/themes/stable9/templates/views/views-view-field.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..514b121dd821825c6f6ef3409a62e4e1dd7d5da6
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-field.html.twig
@@ -0,0 +1,21 @@
+{#
+/**
+ * @file
+ * Theme override for a single field in a view.
+ *
+ * Available variables:
+ * - view: The view that the field belongs to.
+ * - field: The field handler that can process the input.
+ * - row: The raw result of the database query that generated this field.
+ * - output: The processed output that will normally be used.
+ *
+ * When fetching output from the row this construct should be used:
+ * data = row[field.field_alias]
+ *
+ * The above will guarantee that you'll always get the correct data, regardless
+ * of any changes in the aliasing that might happen if the view is modified.
+ *
+ * @see template_preprocess_views_view_field()
+ */
+#}
+{{ output -}}
diff --git a/core/themes/stable9/templates/views/views-view-fields.html.twig b/core/themes/stable9/templates/views/views-view-fields.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1370b3979d14e7c19bfae342a4b653a543d39551
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-fields.html.twig
@@ -0,0 +1,52 @@
+{#
+/**
+ * @file
+ * Theme override to display all the fields in a row.
+ *
+ * Available variables:
+ * - view: The view in use.
+ * - fields: A list of fields, each one contains:
+ *   - content: The output of the field.
+ *   - raw: The raw data for the field, if it exists. This is NOT output safe.
+ *   - class: The safe class ID to use.
+ *   - handler: The Views field handler controlling this field.
+ *   - inline: Whether or not the field should be inline.
+ *   - wrapper_element: An HTML element for a wrapper.
+ *   - wrapper_attributes: List of attributes for wrapper element.
+ *   - separator: An optional separator that may appear before a field.
+ *   - label: The field's label text.
+ *   - label_element: An HTML element for a label wrapper.
+ *   - label_attributes: List of attributes for label wrapper.
+ *   - label_suffix: Colon after the label.
+ *   - element_type: An HTML element for the field content.
+ *   - element_attributes: List of attributes for HTML element for field content.
+ *   - has_label_colon: A boolean indicating whether to display a colon after
+ *     the label.
+ *   - element_type: An HTML element for the field content.
+ *   - element_attributes: List of attributes for HTML element for field content.
+ * - row: The raw result from the query, with all data it fetched.
+ *
+ * @see template_preprocess_views_view_fields()
+ */
+#}
+{% for field in fields -%}
+  {{ field.separator }}
+  {%- if field.wrapper_element -%}
+    <{{ field.wrapper_element }}{{ field.wrapper_attributes }}>
+  {%- endif %}
+  {%- if field.label -%}
+    {%- if field.label_element -%}
+      <{{ field.label_element }}{{ field.label_attributes }}>{{ field.label }}{{ field.label_suffix }}</{{ field.label_element }}>
+    {%- else -%}
+      {{ field.label }}{{ field.label_suffix }}
+    {%- endif %}
+  {%- endif %}
+  {%- if field.element_type -%}
+    <{{ field.element_type }}{{ field.element_attributes }}>{{ field.content }}</{{ field.element_type }}>
+  {%- else -%}
+    {{ field.content }}
+  {%- endif %}
+  {%- if field.wrapper_element -%}
+    </{{ field.wrapper_element }}>
+  {%- endif %}
+{%- endfor %}
diff --git a/core/themes/stable9/templates/views/views-view-grid.html.twig b/core/themes/stable9/templates/views/views-view-grid.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..8a3a20bbfbcb33eeee42a8d220e12435574df08f
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-grid.html.twig
@@ -0,0 +1,76 @@
+{#
+/**
+ * @file
+ * Theme override for views to display rows in a grid.
+ *
+ * Available variables:
+ * - attributes: HTML attributes for the wrapping element.
+ * - title: The title of this group of rows.
+ * - view: The view object.
+ * - rows: The rendered view results.
+ * - options: The view plugin style options.
+ *   - row_class_default: A flag indicating whether default classes should be
+ *     used on rows.
+ *   - col_class_default: A flag indicating whether default classes should be
+ *     used on columns.
+ * - items: A list of grid items. Each item contains a list of rows or columns.
+ *   The order in what comes first (row or column) depends on which alignment
+ *   type is chosen (horizontal or vertical).
+ *   - attributes: HTML attributes for each row or column.
+ *   - content: A list of columns or rows. Each row or column contains:
+ *     - attributes: HTML attributes for each row or column.
+ *     - content: The row or column contents.
+ *
+ * @see template_preprocess_views_view_grid()
+ */
+#}
+{%
+  set classes = [
+    'views-view-grid',
+    options.alignment,
+    'cols-' ~ options.columns,
+    'clearfix',
+  ]
+%}
+{% if options.row_class_default %}
+  {%
+    set row_classes = [
+      'views-row',
+      options.alignment == 'horizontal' ? 'clearfix',
+    ]
+  %}
+{% endif %}
+{% if options.col_class_default %}
+  {%
+    set col_classes = [
+      'views-col',
+      options.alignment == 'vertical' ? 'clearfix',
+    ]
+  %}
+{% endif %}
+{% if title %}
+  <h3>{{ title }}</h3>
+{% endif %}
+<div{{ attributes.addClass(classes) }}>
+  {% if options.alignment == 'horizontal' %}
+    {% for row in items %}
+      <div{{ row.attributes.addClass(row_classes, options.row_class_default ? 'row-' ~ loop.index) }}>
+        {% for column in row.content %}
+          <div{{ column.attributes.addClass(col_classes, options.col_class_default ? 'col-' ~ loop.index) }}>
+            {{- column.content -}}
+          </div>
+        {% endfor %}
+      </div>
+    {% endfor %}
+  {% else %}
+    {% for column in items %}
+      <div{{ column.attributes.addClass(col_classes, options.col_class_default ? 'col-' ~ loop.index) }}>
+        {% for row in column.content %}
+          <div{{ row.attributes.addClass(row_classes, options.row_class_default ? 'row-' ~ loop.index) }}>
+            {{- row.content -}}
+          </div>
+        {% endfor %}
+      </div>
+    {% endfor %}
+  {% endif %}
+</div>
diff --git a/core/themes/stable9/templates/views/views-view-grouping.html.twig b/core/themes/stable9/templates/views/views-view-grouping.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..319607c076c682b6a58b2d7c3dd73fc17c7b22e1
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-grouping.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Theme override to display a single views grouping.
+ *
+ * Available variables:
+ * - view: The view object.
+ * - grouping: The grouping instruction.
+ * - grouping_level: A number indicating the hierarchical level of the grouping.
+ * - title: The group heading.
+ * - content: The content to be grouped.
+ * - rows: The rows returned from the view.
+ *
+ * @see template_preprocess_views_view_grouping()
+ */
+#}
+{{ title }}
+{{ content }}
diff --git a/core/themes/stable9/templates/views/views-view-list.html.twig b/core/themes/stable9/templates/views/views-view-list.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..50cc74ba13fb0a8f922c2471cdce7c98246c9c01
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-list.html.twig
@@ -0,0 +1,38 @@
+{#
+/**
+ * @file
+ * Theme override 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.
+ * - title: The title of this group of rows. May be empty.
+ * - list: @todo.
+ *   - type: Starting tag will be either a ul or ol.
+ *   - attributes: HTML attributes for the list element.
+ *
+ * @see template_preprocess_views_view_list()
+ */
+#}
+{% if attributes -%}
+  <div{{ attributes }}>
+{% endif %}
+  {% if title %}
+    <h3>{{ title }}</h3>
+  {% endif %}
+
+  <{{ list.type }}{{ list.attributes }}>
+
+    {% for row in rows %}
+      <li{{ row.attributes }}>
+        {{- row.content -}}
+      </li>
+    {% endfor %}
+
+  </{{ list.type }}>
+
+{% if attributes -%}
+  </div>
+{% endif %}
diff --git a/core/themes/stable9/templates/views/views-view-mapping-test.html.twig b/core/themes/stable9/templates/views/views-view-mapping-test.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..26d06692967bbab306b00f42cd88b1f862d2e82e
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-mapping-test.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Theme override for testing the mapping row style.
+ *
+ * Available variables:
+ * - element: The view content.
+ *
+ * @see template_preprocess_views_view_mapping_test()
+ */
+#}
+{{ element }}
diff --git a/core/themes/stable9/templates/views/views-view-opml.html.twig b/core/themes/stable9/templates/views/views-view-opml.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4165ccf4dfbd3f6c7b4a8cb4c5d845daa6a661df
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-opml.html.twig
@@ -0,0 +1,23 @@
+{#
+/**
+ * @file
+ * Theme override for feed displays that use the OPML style.
+ *
+ * Available variables:
+ * - title: The title of the feed (as set in the view).
+ * - updated: The modified date of the feed.
+ * - items: The feed items themselves.
+ *
+ * @see template_preprocess_views_view_opml()
+ */
+#}
+<?xml version="1.0" encoding="utf-8"?>
+<opml version="2.0">
+  <head>
+    <title>{{ title }}</title>
+    <dateModified>{{ updated }}</dateModified>
+  </head>
+  <body>
+    {{ items }}
+  </body>
+</opml>
diff --git a/core/themes/stable9/templates/views/views-view-row-opml.html.twig b/core/themes/stable9/templates/views/views-view-row-opml.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3316b1a3d7e9daa5e8fc80055028a7c511d21ef0
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-row-opml.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Theme override to display an item in a views OPML feed.
+ *
+ * Available variables:
+ * - attributes: Attributes for outline element.
+ *
+ * @see template_preprocess_views_view_row_opml()
+ */
+#}
+    <outline{{ attributes }}/>
diff --git a/core/themes/stable9/templates/views/views-view-row-rss.html.twig b/core/themes/stable9/templates/views/views-view-row-rss.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..4cdeba842c49f6606a3e8d437eec763024b602d3
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-row-rss.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override to display an item in a views RSS feed.
+ *
+ * Available variables:
+ * - title: RSS item title.
+ * - link: RSS item link.
+ * - description: RSS body text.
+ * - item_elements: RSS item elements to be rendered as XML (pubDate, creator,
+ *   guid).
+ *
+ * @see template_preprocess_views_view_row_rss()
+ */
+#}
+<item>
+  <title>{{ title }}</title>
+  <link>{{ link }}</link>
+  <description>{{ description }}</description>
+  {% for item in item_elements -%}
+    <{{ item.key }}{{ item.attributes -}}
+    {% if item.value -%}
+      >{{ item.value }}</{{ item.key }}>
+    {% else -%}
+      {{ ' />' }}
+    {% endif %}
+  {%- endfor %}
+</item>
diff --git a/core/themes/stable9/templates/views/views-view-rss.html.twig b/core/themes/stable9/templates/views/views-view-rss.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..0800237e39dc95490900eae930e12be3c4dfe11f
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-rss.html.twig
@@ -0,0 +1,28 @@
+{#
+/**
+ * @file
+ * Theme override for feed displays that use the RSS style.
+ *
+ * Available variables:
+ * - link: The link to the feed (the view path).
+ * - namespaces: The XML namespaces (added automatically).
+ * - title: The title of the feed (as set in the view).
+ * - description: The feed description (from feed settings).
+ * - langcode: The language encoding.
+ * - channel_elements: The formatted channel elements.
+ * - items: The feed items themselves.
+ *
+ * @see template_preprocess_views_view_rss()
+ */
+#}
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xml:base="{{ link }}"{{ namespaces }}>
+  <channel>
+    <title>{{ title }}</title>
+    <link>{{ link }}</link>
+    <description>{{ description }}</description>
+    <language>{{ langcode }}</language>
+    {{ channel_elements }}
+    {{ items }}
+  </channel>
+</rss>
diff --git a/core/themes/stable9/templates/views/views-view-summary-unformatted.html.twig b/core/themes/stable9/templates/views/views-view-summary-unformatted.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..d9ff9958b23cf15a7350e559482844ba771f1097
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-summary-unformatted.html.twig
@@ -0,0 +1,31 @@
+{#
+/**
+ * @file
+ * Theme override for unformatted summary links.
+ *
+ * Available variables:
+ * - rows: The rows contained in this view.
+ *   - url: The URL to this row's content.
+ *   - count: The number of items this summary item represents.
+ *   - separator: A separator between each row.
+ *   - attributes: HTML attributes for a row.
+ *   - active: A flag indicating whether the row is active.
+ * - options: Flags indicating how each row should be displayed. This contains:
+ *   - count: A flag indicating whether the row's 'count' should be displayed.
+ *   - inline: A flag indicating whether the item should be wrapped in an inline
+ *     or block level HTML element.
+ *
+ * @see template_preprocess_views_view_summary_unformatted()
+ */
+#}
+{% for row in rows  %}
+  {{ options.inline ? '<span' : '<div' }} >
+  {% if row.separator -%}
+    {{ row.separator }}
+  {%- endif %}
+  <a href="{{ row.url }}"{{ row.attributes.addClass(row.active ? 'is-active')|without('href') }}>{{ row.link }}</a>
+  {% if options.count %}
+    ({{ row.count }})
+  {% endif %}
+  {{ options.inline ? '</span>' : '</div>' }}
+{% endfor %}
diff --git a/core/themes/stable9/templates/views/views-view-summary.html.twig b/core/themes/stable9/templates/views/views-view-summary.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..55cce72a24dec78df60c7a0956eadf1b65c9a0a5
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-summary.html.twig
@@ -0,0 +1,29 @@
+{#
+/**
+ * @file
+ * Theme override to display a list of summary lines.
+ *
+ * Available variables:
+ * - rows: The rows contained in this view.
+ *   Each row contains:
+ *   - url: The summary link URL.
+ *   - link: The summary link text.
+ *   - count: The number of items under this grouping.
+ *   - attributes: HTML attributes to apply to each row.
+ *   - active: A flag indicating whether the row is active.
+ * - options: Flags indicating how the summary should be displayed.
+ *   This contains:
+ *   - count: A flag indicating whether the count should be displayed.
+ *
+ * @see template_preprocess_views_view_summary()
+ */
+#}
+<ul>
+  {% for row in rows %}
+    <li><a href="{{ row.url }}"{{ row.attributes.addClass(row.active ? 'is-active')|without('href') }}>{{ row.link }}</a>
+      {% if options.count %}
+        ({{ row.count }})
+      {% endif %}
+    </li>
+  {% endfor %}
+</ul>
diff --git a/core/themes/stable9/templates/views/views-view-table.html.twig b/core/themes/stable9/templates/views/views-view-table.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..1f4910ab48f61944e0aa6d3b219a28db10a46951
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-table.html.twig
@@ -0,0 +1,124 @@
+{#
+/**
+ * @file
+ * Theme override for displaying a view as a table.
+ *
+ * Available variables:
+ * - attributes: Remaining HTML attributes for the element.
+ *   - class: HTML classes that can be used to style contextually through CSS.
+ * - title : The title of this group of rows.
+ * - header: The table header columns.
+ *   - attributes: Remaining HTML attributes for the element.
+ *   - content: HTML classes to apply to each header cell, indexed by
+ *   the header's key.
+ *   - default_classes: A flag indicating whether default classes should be
+ *     used.
+ * - caption_needed: Is the caption tag needed.
+ * - caption: The caption for this table.
+ * - accessibility_description: Extended description for the table details.
+ * - accessibility_summary: Summary for the table details.
+ * - rows: Table row items. Rows are keyed by row number.
+ *   - attributes: HTML classes to apply to each row.
+ *   - columns: Row column items. Columns are keyed by column number.
+ *     - attributes: HTML classes to apply to each column.
+ *     - content: The column content.
+ *   - default_classes: A flag indicating whether default classes should be
+ *     used.
+ * - responsive: A flag indicating whether table is responsive.
+ * - sticky: A flag indicating whether table header is sticky.
+ *
+ * @see template_preprocess_views_view_table()
+ */
+#}
+{%
+  set classes = [
+    'cols-' ~ header|length,
+    responsive ? 'responsive-enabled',
+    sticky ? 'sticky-enabled',
+  ]
+%}
+<table{{ attributes.addClass(classes) }}>
+  {% if caption_needed %}
+    <caption>
+    {% if caption %}
+      {{ caption }}
+    {% else %}
+      {{ title }}
+    {% endif %}
+    {% if (summary is not empty) or (description is not empty) %}
+      <details>
+        {% if summary is not empty %}
+          <summary>{{ summary }}</summary>
+        {% endif %}
+        {% if description is not empty %}
+          {{ description }}
+        {% endif %}
+      </details>
+    {% endif %}
+    </caption>
+  {% endif %}
+  {% if header %}
+    <thead>
+      <tr>
+        {% for key, column in header %}
+          {% if column.default_classes %}
+            {%
+              set column_classes = [
+                'views-field',
+                'views-field-' ~ fields[key],
+              ]
+            %}
+          {% endif %}
+          <th{{ column.attributes.addClass(column_classes).setAttribute('scope', 'col') }}>
+            {%- if column.wrapper_element -%}
+              <{{ column.wrapper_element }}>
+                {%- if column.url -%}
+                  <a href="{{ column.url }}" title="{{ column.title }}" rel="nofollow">{{ column.content }}{{ column.sort_indicator }}</a>
+                {%- else -%}
+                  {{ column.content }}{{ column.sort_indicator }}
+                {%- endif -%}
+              </{{ column.wrapper_element }}>
+            {%- else -%}
+              {%- if column.url -%}
+                <a href="{{ column.url }}" title="{{ column.title }}" rel="nofollow">{{ column.content }}{{ column.sort_indicator }}</a>
+              {%- else -%}
+                {{- column.content }}{{ column.sort_indicator }}
+              {%- endif -%}
+            {%- endif -%}
+          </th>
+        {% endfor %}
+      </tr>
+    </thead>
+  {% endif %}
+  <tbody>
+    {% for row in rows %}
+      <tr{{ row.attributes }}>
+        {% for key, column in row.columns %}
+          {% if column.default_classes %}
+            {%
+              set column_classes = [
+                'views-field'
+              ]
+            %}
+            {% for field in column.fields %}
+              {% set column_classes = column_classes|merge(['views-field-' ~ field]) %}
+            {% endfor %}
+          {% endif %}
+          <td{{ column.attributes.addClass(column_classes) }}>
+            {%- if column.wrapper_element -%}
+              <{{ column.wrapper_element }}>
+              {% for content in column.content %}
+                {{ content.separator }}{{ content.field_output }}
+              {% endfor %}
+              </{{ column.wrapper_element }}>
+            {%- else -%}
+              {% for content in column.content %}
+                {{- content.separator }}{{ content.field_output -}}
+              {% endfor %}
+            {%- endif %}
+          </td>
+        {% endfor %}
+      </tr>
+    {% endfor %}
+  </tbody>
+</table>
diff --git a/core/themes/stable9/templates/views/views-view-unformatted.html.twig b/core/themes/stable9/templates/views/views-view-unformatted.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..534ac9a95520d850af5b49adbc8c53124ffa11a5
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view-unformatted.html.twig
@@ -0,0 +1,30 @@
+{#
+/**
+ * @file
+ * Theme override to display a view of unformatted rows.
+ *
+ * Available variables:
+ * - title: The title of this group of rows. May be empty.
+ * - rows: A list of the view's row items.
+ *   - attributes: The row's HTML attributes.
+ *   - content: The row's content.
+ * - view: The view object.
+ * - default_row_class: A flag indicating whether default classes should be
+ *   used on rows.
+ *
+ * @see template_preprocess_views_view_unformatted()
+ */
+#}
+{% if title %}
+  <h3>{{ title }}</h3>
+{% endif %}
+{% for row in rows %}
+  {%
+    set row_classes = [
+      default_row_class ? 'views-row',
+    ]
+  %}
+  <div{{ row.attributes.addClass(row_classes) }}>
+    {{- row.content -}}
+  </div>
+{% endfor %}
diff --git a/core/themes/stable9/templates/views/views-view.html.twig b/core/themes/stable9/templates/views/views-view.html.twig
new file mode 100644
index 0000000000000000000000000000000000000000..a1dc03a0563ef0b36b486b83494d365d0aa6d522
--- /dev/null
+++ b/core/themes/stable9/templates/views/views-view.html.twig
@@ -0,0 +1,69 @@
+{#
+/**
+ * @file
+ * Theme override for main view template.
+ *
+ * Available variables:
+ * - attributes: Remaining HTML attributes for the element.
+ * - css_name: A CSS-safe version of the view name.
+ * - css_class: The user-specified classes names, if any.
+ * - header: The optional header.
+ * - footer: The optional footer.
+ * - rows: The results of the view query, if any.
+ * - empty: The content to display if there are no rows.
+ * - pager: The optional pager next/prev links to display.
+ * - exposed: Exposed widget form/info to display.
+ * - feed_icons: Optional feed icons to display.
+ * - more: An optional link to the next page of results.
+ * - title: Title of the view, only used when displaying in the admin preview.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the view title.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the view title.
+ * - attachment_before: An optional attachment view to be displayed before the
+ *   view content.
+ * - attachment_after: An optional attachment view to be displayed after the
+ *   view content.
+ * - dom_id: Unique id for every view being printed to give unique class for
+ *   Javascript.
+ *
+ * @see template_preprocess_views_view()
+ */
+#}
+{%
+  set classes = [
+    dom_id ? 'js-view-dom-id-' ~ dom_id,
+  ]
+%}
+<div{{ attributes.addClass(classes) }}>
+  {{ title_prefix }}
+  {{ title }}
+  {{ title_suffix }}
+
+  {% if header %}
+    <header>
+      {{ header }}
+    </header>
+  {% endif %}
+
+  {{ exposed }}
+  {{ attachment_before }}
+
+  {% if rows -%}
+    {{ rows }}
+  {% elseif empty -%}
+    {{ empty }}
+  {% endif %}
+  {{ pager }}
+
+  {{ attachment_after }}
+  {{ more }}
+
+  {% if footer %}
+    <footer>
+      {{ footer }}
+    </footer>
+  {% endif %}
+
+  {{ feed_icons }}
+</div>