diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index 9dbbc20..56566e1 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -93,7 +93,7 @@ function menu_list_system_menus() {
 }
 
 /**
- * Collects the local tasks (tabs) for the current route.
+ * Collects the local tasks (tabs), action links, and the root path.
  *
  * @param int $level
  *   The level of tasks you ask for. Primary tasks are 0, secondary are 1.
@@ -101,46 +101,96 @@ function menu_list_system_menus() {
  * @return array
  *   An array containing
  *   - tabs: Local tasks for the requested level.
- *   - route_name: The route name for the current page used to collect the local
- *     tasks.
+ *   - actions: Action links for the requested level.
+ *   - root_path: The router path for the current page. If the current page is
+ *     a default local task, then this corresponds to the parent tab.
  *
+ * @see hook_menu_local_tasks()
  * @see hook_menu_local_tasks_alter()
- *
- * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
  */
 function menu_local_tasks($level = 0) {
-  /** @var \Drupal\Core\Menu\LocalTaskManagerInterface $manager */
-  $manager = \Drupal::service('plugin.manager.menu.local_task');
-  return $manager->getLocalTasks(\Drupal::routeMatch()->getRouteName(), $level);
+  $data = &drupal_static(__FUNCTION__);
+  $root_path = &drupal_static(__FUNCTION__ . ':root_path', '');
+  $empty = array(
+    'tabs' => array(),
+    'actions' => array(),
+    'root_path' => &$root_path,
+  );
+
+  if (!isset($data)) {
+    // Look for route-based tabs.
+    $data['tabs'] = array();
+    $data['actions'] = array();
+
+    $route_name = \Drupal::routeMatch()->getRouteName();
+    if (!\Drupal::request()->attributes->has('exception') && !empty($route_name)) {
+      $manager = \Drupal::service('plugin.manager.menu.local_task');
+      $local_tasks = $manager->getTasksBuild($route_name);
+      foreach ($local_tasks as $level => $items) {
+        $data['tabs'][$level] = empty($data['tabs'][$level]) ? $items : array_merge($data['tabs'][$level], $items);
+      }
+    }
+
+    // Allow modules to dynamically add further tasks.
+    $module_handler = \Drupal::moduleHandler();
+    foreach ($module_handler->getImplementations('menu_local_tasks') as $module) {
+      $function = $module . '_menu_local_tasks';
+      $function($data, $route_name);
+    }
+    // Allow modules to alter local tasks.
+    $module_handler->alter('menu_local_tasks', $data, $route_name);
+  }
+
+  if (isset($data['tabs'][$level])) {
+    return array(
+      'tabs' => $data['tabs'][$level],
+      'actions' => $data['actions'],
+      'root_path' => $root_path,
+    );
+  }
+  elseif (!empty($data['actions'])) {
+    return array('actions' => $data['actions']) + $empty;
+  }
+  return $empty;
 }
 
 /**
  * Returns the rendered local tasks at the top level.
- *
- * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
  */
 function menu_primary_local_tasks() {
-  /** @var \Drupal\Core\Menu\LocalTaskManagerInterface $manager */
-  $manager = \Drupal::service('plugin.manager.menu.local_task');
-  $links = $manager->getLocalTasks(\Drupal::routeMatch()->getRouteName(), 0);
+  $links = menu_local_tasks(0);
   // Do not display single tabs.
   return count(Element::getVisibleChildren($links['tabs'])) > 1 ? $links['tabs'] : '';
 }
 
 /**
  * Returns the rendered local tasks at the second level.
- *
- * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
  */
 function menu_secondary_local_tasks() {
-  /** @var \Drupal\Core\Menu\LocalTaskManagerInterface $manager */
-  $manager = \Drupal::service('plugin.manager.menu.local_task');
-  $links = $manager->getLocalTasks(\Drupal::routeMatch()->getRouteName(), 1);
+  $links = menu_local_tasks(1);
   // Do not display single tabs.
   return count(Element::getVisibleChildren($links['tabs'])) > 1 ? $links['tabs'] : '';
 }
 
 /**
+ * Returns the rendered local actions at the current level.
+ */
+function menu_get_local_actions() {
+  $links = menu_local_tasks();
+  $route_name = Drupal::routeMatch()->getRouteName();
+  $manager = \Drupal::service('plugin.manager.menu.local_action');
+  return $manager->getActionsForRoute($route_name) + $links['actions'];
+}
+
+/**
+ * Returns the router path, or the path for a default local task's parent.
+ */
+function menu_tab_root_path() {
+  $links = menu_local_tasks();
+  return $links['root_path'];
+}
+
+/**
  * Returns a renderable element for the primary and secondary tabs.
  */
 function menu_local_tabs() {
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 329ff58..b3deb32 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1322,6 +1322,14 @@ function template_preprocess_page(&$variables) {
     $variables['is_front'] = FALSE;
     $variables['db_is_active'] = FALSE;
   }
+  if (!defined('MAINTENANCE_MODE')) {
+    $variables['action_links']   = menu_get_local_actions();
+    $variables['tabs']           = menu_local_tabs();
+  }
+  else {
+    $variables['action_links']   = array();
+    $variables['tabs']           = array();
+  }
 
   if ($node = \Drupal::routeMatch()->getParameter('node')) {
     $variables['node'] = $node;
diff --git a/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php b/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php
new file mode 100644
index 0000000..60e6066
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Component\Plugin\PluginDefinitionInterface.
+ */
+
+namespace Drupal\Component\Plugin\Definition;
+
+/**
+ * Defines a plugin definition.
+ *
+ * Object-based plugin definitions MUST implement this interface.
+ *
+ * @ingroup Plugin
+ */
+interface PluginDefinitionInterface {
+
+  /**
+   * Sets the class.
+   *
+   * @param string $class
+   *   A fully qualified class name.
+   *
+   * @return $this
+   *
+   * @throws \InvalidArgumentException
+   *   If the class is invalid.
+   */
+  public function setClass($class);
+
+  /**
+   * Gets the class.
+   *
+   * @return string
+   *   A fully qualified class name.
+   */
+  public function getClass();
+
+}
diff --git a/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php b/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
index 1902b56..69aa895 100644
--- a/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
+++ b/core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php
@@ -6,6 +6,7 @@
 
 namespace Drupal\Component\Plugin\Factory;
 
+use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Component\Plugin\Exception\PluginException;
 
@@ -63,7 +64,7 @@ public function createInstance($plugin_id, array $configuration = array()) {
    *
    * @param string $plugin_id
    *   The id of a plugin.
-   * @param mixed $plugin_definition
+   * @param \Drupal\Component\Plugin\Definition\PluginDefinitionInterface|mixed[] $plugin_definition
    *   The plugin definition associated with the plugin ID.
    * @param string $required_interface
    *   (optional) THe required plugin interface.
@@ -77,18 +78,32 @@ public function createInstance($plugin_id, array $configuration = array()) {
    *
    */
   public static function getPluginClass($plugin_id, $plugin_definition = NULL, $required_interface = NULL) {
-    if (empty($plugin_definition['class'])) {
-      throw new PluginException(sprintf('The plugin (%s) did not specify an instance class.', $plugin_id));
+    $missing_class_message = sprintf('The plugin (%s) did not specify an instance class.', $plugin_id);
+    if (is_array($plugin_definition)) {
+      if (empty($plugin_definition['class'])) {
+        throw new PluginException($missing_class_message);
+      }
+
+      $class = $plugin_definition['class'];
     }
+    elseif ($plugin_definition instanceof PluginDefinitionInterface) {
+      if (!$plugin_definition->getClass()) {
+        throw new PluginException($missing_class_message);
+      }
 
-    $class = $plugin_definition['class'];
+      $class = $plugin_definition->getClass();
+    }
+    else {
+      $plugin_definition_type = is_object($plugin_definition) ? get_class($plugin_definition) : gettype($plugin_definition);
+      throw new PluginException(sprintf('%s can only handle plugin definitions that are arrays or that implement %s, but %s given.', __CLASS__, PluginDefinitionInterface::class, $plugin_definition_type));
+    }
 
     if (!class_exists($class)) {
       throw new PluginException(sprintf('Plugin (%s) instance class "%s" does not exist.', $plugin_id, $class));
     }
 
-    if ($required_interface && !is_subclass_of($plugin_definition['class'], $required_interface)) {
-      throw new PluginException(sprintf('Plugin "%s" (%s) must implement interface %s.', $plugin_id, $plugin_definition['class'], $required_interface));
+    if ($required_interface && !is_subclass_of($class, $required_interface)) {
+      throw new PluginException(sprintf('Plugin "%s" (%s) must implement interface %s.', $plugin_id, $class, $required_interface));
     }
 
     return $class;
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 0c8ca7a..3a32d4a 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -233,13 +233,6 @@ class EntityType implements EntityTypeInterface {
   protected $constraints = array();
 
   /**
-   * Any additional properties and values.
-   *
-   * @var array
-   */
-  protected $additional = [];
-
-  /**
    * Constructs a new EntityType.
    *
    * @param array $definition
@@ -255,7 +248,7 @@ public function __construct($definition) {
     }
 
     foreach ($definition as $property => $value) {
-      $this->set($property, $value);
+      $this->{$property} = $value;
     }
 
     // Ensure defaults.
@@ -286,25 +279,14 @@ public function __construct($definition) {
    * {@inheritdoc}
    */
   public function get($property) {
-    if (property_exists($this, $property)) {
-      $value = isset($this->{$property}) ? $this->{$property} : NULL;
-    }
-    else {
-      $value = isset($this->additional[$property]) ? $this->additional[$property] : NULL;
-    }
-    return $value;
+    return isset($this->{$property}) ? $this->{$property} : NULL;
   }
 
   /**
    * {@inheritdoc}
    */
   public function set($property, $value) {
-    if (property_exists($this, $property)) {
-      $this->{$property} = $value;
-    }
-    else {
-      $this->additional[$property] = $value;
-    }
+    $this->{$property} = $value;
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
index 1a3805e..59808a8 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Core\Entity;
 
+use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
+
 /**
  * Provides an interface for an entity type and its metadata.
  *
@@ -15,7 +17,7 @@
  * implemented to alter existing data and fill-in defaults. Module-specific
  * properties should be documented in the hook implementations defining them.
  */
-interface EntityTypeInterface {
+interface EntityTypeInterface extends PluginDefinitionInterface {
 
   /**
    * The maximum length of ID, in characters.
@@ -67,14 +69,6 @@ public function id();
   public function getProvider();
 
   /**
-   * Gets the name of the entity type class.
-   *
-   * @return string
-   *   The name of the entity type class.
-   */
-  public function getClass();
-
-  /**
    * Gets the name of the original entity type class.
    *
    * In case the class name was changed with setClass(), this will return
@@ -171,16 +165,6 @@ public function isRenderCacheable();
   public function isPersistentlyCacheable();
 
   /**
-   * Sets the name of the entity type class.
-   *
-   * @param string $class
-   *   The name of the entity type class.
-   *
-   * @return $this
-   */
-  public function setClass($class);
-
-  /**
    * Determines if there is a handler for a given type.
    *
    * @param string $handler_type
diff --git a/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php b/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php
index 751693d..ecf7665 100644
--- a/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php
+++ b/core/lib/Drupal/Core/Field/Entity/BaseFieldOverride.php
@@ -20,7 +20,7 @@
  * @ConfigEntityType(
  *   id = "base_field_override",
  *   label = @Translation("Base field override"),
- *   handlers = {
+ *   controllers = {
  *     "storage" = "Drupal\Core\Field\BaseFieldOverrideStorage"
  *   },
  *   config_prefix = "base_field_override",
diff --git a/core/lib/Drupal/Core/Menu/LocalActionManager.php b/core/lib/Drupal/Core/Menu/LocalActionManager.php
index eb1e2d0..c387b15 100644
--- a/core/lib/Drupal/Core/Menu/LocalActionManager.php
+++ b/core/lib/Drupal/Core/Menu/LocalActionManager.php
@@ -191,11 +191,10 @@ public function getActionsForRoute($route_appears) {
           'url' => Url::fromRoute($route_name, $route_parameters),
           'localized_options' => $plugin->getOptions($this->routeMatch),
         ),
-        '#access' => $this->accessManager->checkNamedRoute($route_name, $route_parameters, $this->account, TRUE),
+        '#access' => $this->accessManager->checkNamedRoute($route_name, $route_parameters, $this->account),
         '#weight' => $plugin->getWeight(),
       );
     }
-
     return $links;
   }
 
diff --git a/core/lib/Drupal/Core/Menu/LocalTaskManager.php b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
index 7055628..5b12ac8 100644
--- a/core/lib/Drupal/Core/Menu/LocalTaskManager.php
+++ b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
@@ -82,13 +82,6 @@ class LocalTaskManager extends DefaultPluginManager implements LocalTaskManagerI
   protected $instances = array();
 
   /**
-   * The local task render arrays for the current route.
-   *
-   * @var array
-   */
-  protected $taskData;
-
-  /**
    * The route provider to load routes by name.
    *
    * @var \Drupal\Core\Routing\RouteProviderInterface
@@ -303,73 +296,38 @@ public function getTasksBuild($current_route_name) {
     // of SQL queries that would otherwise be triggered by the access manager.
     $routes = $route_names ? $this->routeProvider->getRoutesByNames($route_names) : array();
 
-    // @todo add cacheability data in https://www.drupal.org/node/2511516 so
-    // that we are not re-building inaccessible links on every page request.
     foreach ($tree as $level => $instances) {
       /** @var $instances \Drupal\Core\Menu\LocalTaskInterface[] */
       foreach ($instances as $plugin_id => $child) {
         $route_name = $child->getRouteName();
         $route_parameters = $child->getRouteParameters($this->routeMatch);
 
-        $active = $this->isRouteActive($current_route_name, $route_name, $route_parameters);
-
-        // The plugin may have been set active in getLocalTasksForRoute() if
-        // one of its child tabs is the active tab.
-        $active = $active || $child->getActive();
-        // @todo It might make sense to use link render elements instead.
-
-        $link = [
-          'title' => $this->getTitle($child),
-          'url' => Url::fromRoute($route_name, $route_parameters),
-          'localized_options' => $child->getOptions($this->routeMatch),
-        ];
-        $build[$level][$plugin_id] = [
-          '#theme' => 'menu_local_task',
-          '#link' => $link,
-          '#active' => $active,
-          '#weight' => $child->getWeight(),
-          '#access' => $this->accessManager->checkNamedRoute($route_name, $route_parameters, $this->account, TRUE),
-        ];
-      }
-    }
-
-    return $build;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getLocalTasks($route_name, $level = 0) {
-    if (!isset($this->taskData[$route_name])) {
-      // Look for route-based tabs.
-      $this->taskData[$route_name] = [
-        'tabs' => [],
-      ];
-
-      if (!$this->requestStack->getCurrentRequest()->attributes->has('exception')) {
-        // Safe to build tasks only when no exceptions raised.
-        $data = [];
-        $local_tasks = $this->getTasksBuild($route_name);
-        foreach ($local_tasks as $tab_level => $items) {
-          $data[$tab_level] = empty($data[$tab_level]) ? $items : array_merge($data[$tab_level], $items);
+        // Find out whether the user has access to the task.
+        $access = $this->accessManager->checkNamedRoute($route_name, $route_parameters, $this->account);
+        if ($access) {
+          $active = $this->isRouteActive($current_route_name, $route_name, $route_parameters);
+
+          // The plugin may have been set active in getLocalTasksForRoute() if
+          // one of its child tabs is the active tab.
+          $active = $active || $child->getActive();
+          // @todo It might make sense to use link render elements instead.
+
+          $link = array(
+            'title' => $this->getTitle($child),
+            'url' => Url::fromRoute($route_name, $route_parameters),
+            'localized_options' => $child->getOptions($this->routeMatch),
+          );
+          $build[$level][$plugin_id] = array(
+            '#theme' => 'menu_local_task',
+            '#link' => $link,
+            '#active' => $active,
+            '#weight' => $child->getWeight(),
+            '#access' => $access,
+          );
         }
-        $this->taskData[$route_name]['tabs'] = $data;
-        // Allow modules to alter local tasks.
-        $this->moduleHandler->alter('menu_local_tasks', $this->taskData[$route_name], $route_name);
       }
     }
-
-    if (isset($this->taskData[$route_name]['tabs'][$level])) {
-      return [
-        'tabs' => $this->taskData[$route_name]['tabs'][$level],
-        'route_name' => $route_name,
-      ];
-    }
-
-    return [
-      'tabs' => [],
-      'route_name' => $route_name,
-    ];
+    return $build;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Menu/LocalTaskManagerInterface.php b/core/lib/Drupal/Core/Menu/LocalTaskManagerInterface.php
index 1f8d3d2..e75307d 100644
--- a/core/lib/Drupal/Core/Menu/LocalTaskManagerInterface.php
+++ b/core/lib/Drupal/Core/Menu/LocalTaskManagerInterface.php
@@ -53,22 +53,4 @@ public function getLocalTasksForRoute($route_name);
    */
   public function getTasksBuild($current_route_name);
 
-  /**
-   * Collects the local tasks (tabs) for the current route.
-   *
-   * @param string $route_name
-   *   The route for which to make renderable local tasks.
-   * @param int $level
-   *   The level of tasks you ask for. Primary tasks are 0, secondary are 1.
-   *
-   * @return array
-   *   An array containing
-   *   - tabs: Local tasks render array for the requested level.
-   *   - route_name: The route name for the current page used to collect the
-   *     local tasks.
-   *
-   * @see hook_menu_local_tasks_alter()
-   */
-  public function getLocalTasks($route_name, $level = 0);
-
 }
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkDefault.php b/core/lib/Drupal/Core/Menu/MenuLinkDefault.php
index 295ac92..c17fe79 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkDefault.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkDefault.php
@@ -96,7 +96,7 @@ public function updateLink(array $new_definition_values, $persist) {
     if ($persist) {
       // Always save the menu name as an override to avoid defaulting to tools.
       $overrides['menu_name'] = $this->pluginDefinition['menu_name'];
-      $this->staticOverride->saveOverride($this->getPluginId(), $this->pluginDefinition);
+      $this->staticOverride->saveOverride($this->getPluginId(), $overrides);
     }
     return $this->pluginDefinition;
   }
diff --git a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php b/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php
deleted file mode 100644
index c8348e0..0000000
--- a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Plugin\Block\LocalActionsBlock.
- */
-
-namespace Drupal\Core\Menu\Plugin\Block;
-
-use Drupal\Core\Block\BlockBase;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Menu\LocalActionManagerInterface;
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-use Drupal\Core\Routing\RouteMatchInterface;
-
-/**
- * Provides a block to display the local actions.
- *
- * @Block(
- *   id = "local_actions_block",
- *   admin_label = @Translation("Primary admin actions")
- * )
- */
-class LocalActionsBlock extends BlockBase implements ContainerFactoryPluginInterface {
-
-  /**
-   * The local action manager.
-   *
-   * @var \Drupal\Core\Menu\LocalActionManagerInterface
-   */
-  protected $localActionManager;
-
-  /**
-   * The route match.
-   *
-   * @var \Drupal\Core\Routing\RouteMatchInterface
-   */
-  protected $routeMatch;
-
-  /**
-   * Creates a LocalActionsBlock instance.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Menu\LocalActionManagerInterface $local_action_manager
-   *   A local action manager.
-   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
-   *   The route match.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, LocalActionManagerInterface $local_action_manager, RouteMatchInterface $route_match) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->localActionManager = $local_action_manager;
-    $this->routeMatch = $route_match;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('plugin.manager.menu.local_action'),
-      $container->get('current_route_match')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return ['label_display' => FALSE];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function build() {
-    $route_name = $this->routeMatch->getRouteName();
-    $local_actions = $this->localActionManager->getActionsForRoute($route_name);
-    if (empty($local_actions)) {
-      return [];
-    }
-
-    return $local_actions;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // The "Primary admin actions" block is never cacheable because hooks creating local
-    // actions don't provide cacheability metadata.
-    // @todo Remove after https://www.drupal.org/node/2511516 has landed.
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['#description'] = $this->t('This block is never cacheable.');
-    $form['cache']['max_age']['#value'] = 0;
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheMaxAge() {
-    // @todo Remove after https://www.drupal.org/node/2511516 has landed.
-    return 0;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheContexts() {
-    return ['route.name'];
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php b/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php
deleted file mode 100644
index 6edfc6b..0000000
--- a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Menu\Plugin\Block\LocalTasksBlock.
- */
-
-namespace Drupal\Core\Menu\Plugin\Block;
-
-use Drupal\Core\Block\BlockBase;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Menu\LocalTaskManagerInterface;
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Core\Render\Element;
-use Drupal\Core\Routing\RouteMatchInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Provides a "Tabs" block to display the local tasks.
- *
- * @Block(
- *   id = "local_tasks_block",
- *   admin_label = @Translation("Tabs"),
- * )
- */
-class LocalTasksBlock extends BlockBase implements ContainerFactoryPluginInterface {
-
-  /**
-   * The local task manager.
-   *
-   * @var \Drupal\Core\Menu\LocalTaskManagerInterface
-   */
-  protected $localTaskManager;
-
-  /**
-   * The route match.
-   *
-   * @var \Drupal\Core\Routing\RouteMatchInterface
-   */
-  protected $routeMatch;
-
-  /**
-   * Creates a LocalTasksBlock instance.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Menu\LocalTaskManagerInterface $local_task_manager
-   *   The local task manager.
-   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
-   *   The route match.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, LocalTaskManagerInterface $local_task_manager, RouteMatchInterface $route_match) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->localTaskManager = $local_task_manager;
-    $this->routeMatch = $route_match;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('plugin.manager.menu.local_task'),
-      $container->get('current_route_match')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [
-      'label_display' => FALSE,
-      'primary' => TRUE,
-      'secondary' => TRUE,
-    ];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function build() {
-    $config = $this->configuration;
-
-    $tabs = [
-      '#theme' => 'menu_local_tasks',
-    ];
-
-    // Add only selected levels for the printed output.
-    if ($config['primary']) {
-      $links = $this->localTaskManager->getLocalTasks($this->routeMatch->getRouteName(), 0);
-      // Do not display single tabs.
-      $tabs += [
-        '#primary' => count(Element::getVisibleChildren($links['tabs'])) > 1 ? $links['tabs'] : [],
-      ];
-    }
-    if ($config['secondary']) {
-      $links = $this->localTaskManager->getLocalTasks($this->routeMatch->getRouteName(), 1);
-      // Do not display single tabs.
-      $tabs += [
-        '#secondary' => count(Element::getVisibleChildren($links['tabs'])) > 1 ? $links['tabs'] : [],
-      ];
-    }
-
-    if (empty($tabs['#primary']) && empty($tabs['#secondary'])) {
-      return [];
-    }
-
-    return $tabs;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // The "Page actions" block is never cacheable because of hooks creating
-    // local tasks doesn't provide cacheability metadata.
-    // @todo Remove after https://www.drupal.org/node/2511516 has landed.
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['#description'] = $this->t('This block is never cacheable.');
-    $form['cache']['max_age']['#value'] = 0;
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheMaxAge() {
-    // @todo Remove after https://www.drupal.org/node/2511516 has landed.
-    return 0;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheContexts() {
-    return ['route.name'];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function blockForm($form, FormStateInterface $form_state) {
-    $config = $this->configuration;
-    $defaults = $this->defaultConfiguration();
-
-    $form['levels'] = [
-      '#type' => 'details',
-      '#title' => $this->t('Shown tabs'),
-      '#description' => $this->t('Select tabs being shown in the block'),
-      // Open if not set to defaults.
-      '#open' => $defaults['primary'] !== $config['primary'] || $defaults['secondary'] !== $config['secondary'],
-    ];
-    $form['levels']['primary'] = [
-      '#type' => 'checkbox',
-      '#title' => $this->t('Show primary tabs'),
-      '#default_value' => $config['primary'],
-    ];
-    $form['levels']['secondary'] = [
-      '#type' => 'checkbox',
-      '#title' => $this->t('Show secondary tabs'),
-      '#default_value' => $config['secondary'],
-    ];
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function blockSubmit($form, FormStateInterface $form_state) {
-    $levels = $form_state->getValue('levels');
-    $this->configuration['primary'] = $levels['primary'];
-    $this->configuration['secondary'] = $levels['secondary'];
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Menu/menu.api.php b/core/lib/Drupal/Core/Menu/menu.api.php
index 971a193..e68b795 100644
--- a/core/lib/Drupal/Core/Menu/menu.api.php
+++ b/core/lib/Drupal/Core/Menu/menu.api.php
@@ -393,35 +393,48 @@ function hook_menu_links_discovered_alter(&$links) {
 }
 
 /**
- * Alter local tasks displayed on the page before they are rendered.
+ * Alter tabs and actions displayed on the page before they are rendered.
  *
  * This hook is invoked by menu_local_tasks(). The system-determined tabs and
- * actions are passed in by reference. Additional tabs may be added.
+ * actions are passed in by reference. Additional tabs or actions may be added.
  *
- * The local tasks are under the 'tabs' element and keyed by plugin ID.
- *
- * Each local task is an associative array containing:
+ * Each tab or action is an associative array containing:
  * - #theme: The theme function to use to render.
  * - #link: An associative array containing:
  *   - title: The localized title of the link.
- *   - url: a Url object.
+ *   - href: The system path to link to.
  *   - localized_options: An array of options to pass to _l().
  * - #weight: The link's weight compared to other links.
  * - #active: Whether the link should be marked as 'active'.
  *
  * @param array $data
- *   An associative array containing list of (up to 2) tab levels that contain a
- *   list of of tabs keyed by their href, each one being an associative array
- *   as described above.
+ *   An associative array containing:
+ *   - actions: A list of of actions keyed by their href, each one being an
+ *     associative array as described above.
+ *   - tabs: A list of (up to 2) tab levels that contain a list of of tabs keyed
+ *     by their href, each one being an associative array as described above.
  * @param string $route_name
  *   The route name of the page.
  *
  * @ingroup menu
  */
-function hook_menu_local_tasks_alter(&$data, $route_name) {
+function hook_menu_local_tasks(&$data, $route_name) {
+  // Add an action linking to node/add to all pages.
+  $data['actions']['node/add'] = array(
+      '#theme' => 'menu_local_action',
+      '#link' => array(
+          'title' => t('Add content'),
+          'url' => Url::fromRoute('node.add_page'),
+          'localized_options' => array(
+              'attributes' => array(
+                  'title' => t('Add content'),
+              ),
+          ),
+      ),
+  );
 
   // Add a tab linking to node/add to all pages.
-  $data['tabs'][0]['node.add_page'] = array(
+  $data['tabs'][0]['node/add'] = array(
       '#theme' => 'menu_local_task',
       '#link' => array(
           'title' => t('Example tab'),
@@ -436,6 +449,25 @@ function hook_menu_local_tasks_alter(&$data, $route_name) {
 }
 
 /**
+ * Alter tabs and actions displayed on the page before they are rendered.
+ *
+ * This hook is invoked by menu_local_tasks(). The system-determined tabs and
+ * actions are passed in by reference. Existing tabs or actions may be altered.
+ *
+ * @param array $data
+ *   An associative array containing tabs and actions. See
+ *   hook_menu_local_tasks() for details.
+ * @param string $route_name
+ *   The route name of the page.
+ *
+ * @see hook_menu_local_tasks()
+ *
+ * @ingroup menu
+ */
+function hook_menu_local_tasks_alter(&$data, $route_name) {
+}
+
+/**
  * Alter local actions plugins.
  *
  * @param array $local_actions
diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php
index b06f66b..7edc7c4 100644
--- a/core/lib/Drupal/Core/Template/TwigExtension.php
+++ b/core/lib/Drupal/Core/Template/TwigExtension.php
@@ -455,7 +455,11 @@ public function renderVar($arg) {
       return NULL;
     }
 
-    // Optimize for scalars as it is likely they come from the escape filter.
+    // Optimize for strings as it is likely they come from the escape filter.
+    if (is_string($arg)) {
+      return $arg;
+    }
+
     if (is_scalar($arg)) {
       return $arg;
     }
diff --git a/core/lib/Drupal/Core/Update/UpdateKernel.php b/core/lib/Drupal/Core/Update/UpdateKernel.php
old mode 100644
new mode 100755
index 80f243c..6c5de73
--- a/core/lib/Drupal/Core/Update/UpdateKernel.php
+++ b/core/lib/Drupal/Core/Update/UpdateKernel.php
@@ -29,35 +29,6 @@ class UpdateKernel extends DrupalKernel {
   /**
    * {@inheritdoc}
    */
-  public function discoverServiceProviders() {
-    parent::discoverServiceProviders();
-
-    $this->serviceProviderClasses['app']['update_kernel'] = 'Drupal\Core\Update\UpdateServiceProvider';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function initializeContainer() {
-    // Always force a container rebuild, in order to be able to override some
-    // services, see \Drupal\Core\Update\UpdateServiceProvider.
-    $this->containerNeedsRebuild = TRUE;
-    $container = parent::initializeContainer();
-    return $container;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function cacheDrupalContainer(array $container_definition) {
-    // Don't save this particular container to cache, so it does not leak into
-    // the main site at all.
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
     try {
       static::bootEnvironment();
diff --git a/core/lib/Drupal/Core/Update/UpdateServiceProvider.php b/core/lib/Drupal/Core/Update/UpdateServiceProvider.php
deleted file mode 100644
index 510080a..0000000
--- a/core/lib/Drupal/Core/Update/UpdateServiceProvider.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Update\UpdateServiceProvider.
- */
-
-namespace Drupal\Core\Update;
-
-use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\DependencyInjection\ServiceModifierInterface;
-use Drupal\Core\DependencyInjection\ServiceProviderInterface;
-use Symfony\Component\DependencyInjection\Definition;
-use Symfony\Component\DependencyInjection\Reference;
-
-/**
- * Ensures for some services that they don't cache.
- */
-class UpdateServiceProvider implements ServiceProviderInterface, ServiceModifierInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function register(ContainerBuilder $container) {
-    $definition = new Definition('Drupal\Core\Cache\NullBackend', ['null']);
-    $container->setDefinition('cache.null', $definition);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function alter(ContainerBuilder $container) {
-    $definition = $container->getDefinition('asset.resolver');
-    $argument = new Reference('cache.null');
-    $definition->replaceArgument(5, $argument);
-
-    $definition = $container->getDefinition('library.discovery.collector');
-    $argument = new Reference('cache.null');
-    $definition->replaceArgument(0, $argument);
-  }
-
-}
diff --git a/core/modules/aggregator/src/Tests/AggregatorTestBase.php b/core/modules/aggregator/src/Tests/AggregatorTestBase.php
index 08c0c23..312a0b1 100644
--- a/core/modules/aggregator/src/Tests/AggregatorTestBase.php
+++ b/core/modules/aggregator/src/Tests/AggregatorTestBase.php
@@ -29,7 +29,7 @@
    *
    * @var array
    */
-  public static $modules = ['block', 'node', 'aggregator', 'aggregator_test', 'views'];
+  public static $modules = array('node', 'aggregator', 'aggregator_test', 'views');
 
   /**
    * {@inheritdoc}
@@ -44,7 +44,6 @@ protected function setUp() {
 
     $this->adminUser = $this->drupalCreateUser(array('access administration pages', 'administer news feeds', 'access news feeds', 'create article content'));
     $this->drupalLogin($this->adminUser);
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/block/src/Tests/BlockHiddenRegionTest.php b/core/modules/block/src/Tests/BlockHiddenRegionTest.php
index a6af2ce..347cdaf 100644
--- a/core/modules/block/src/Tests/BlockHiddenRegionTest.php
+++ b/core/modules/block/src/Tests/BlockHiddenRegionTest.php
@@ -42,7 +42,6 @@ protected function setUp() {
 
     $this->drupalLogin($this->adminUser);
     $this->drupalPlaceBlock('search_form_block');
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/block/src/Tests/BlockTest.php b/core/modules/block/src/Tests/BlockTest.php
index bd360f6..cff4a24 100644
--- a/core/modules/block/src/Tests/BlockTest.php
+++ b/core/modules/block/src/Tests/BlockTest.php
@@ -222,7 +222,6 @@ public function testBlockThemeSelector() {
   function testThemeName() {
     // Enable the help block.
     $this->drupalPlaceBlock('help_block', array('region' => 'help'));
-    $this->drupalPlaceBlock('local_tasks_block');
     // Explicitly set the default and admin themes.
     $theme = 'block_test_specialchars_theme';
     \Drupal::service('theme_handler')->install(array($theme));
diff --git a/core/modules/block/src/Tests/NonDefaultBlockAdminTest.php b/core/modules/block/src/Tests/NonDefaultBlockAdminTest.php
index a2bfddc..bc55ab2 100644
--- a/core/modules/block/src/Tests/NonDefaultBlockAdminTest.php
+++ b/core/modules/block/src/Tests/NonDefaultBlockAdminTest.php
@@ -24,15 +24,6 @@ class NonDefaultBlockAdminTest extends WebTestBase {
   public static $modules = array('block');
 
   /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_tasks_block');
-  }
-
-  /**
    * Test non-default theme admin.
    */
   function testNonDefaultBlockAdmin() {
diff --git a/core/modules/block_content/src/Tests/BlockContentTestBase.php b/core/modules/block_content/src/Tests/BlockContentTestBase.php
index 3e0aa74..82139c0 100644
--- a/core/modules/block_content/src/Tests/BlockContentTestBase.php
+++ b/core/modules/block_content/src/Tests/BlockContentTestBase.php
@@ -60,7 +60,6 @@ protected function setUp() {
     }
 
     $this->adminUser = $this->drupalCreateUser($this->permissions);
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/comment/src/Tests/CommentTestBase.php b/core/modules/comment/src/Tests/CommentTestBase.php
index 12ea894..a52cbb3 100644
--- a/core/modules/comment/src/Tests/CommentTestBase.php
+++ b/core/modules/comment/src/Tests/CommentTestBase.php
@@ -27,7 +27,7 @@
    *
    * @var array
    */
-  public static $modules = ['block', 'comment', 'node', 'history', 'field_ui', 'datetime'];
+  public static $modules = array('comment', 'node', 'history', 'field_ui', 'datetime');
 
   /**
    * An administrative user with permission to configure comment settings.
@@ -86,7 +86,6 @@ protected function setUp() {
 
     // Create a test node authored by the web user.
     $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'uid' => $this->webUser->id()));
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/config/src/Tests/ConfigEntityListTest.php b/core/modules/config/src/Tests/ConfigEntityListTest.php
index 9b74a5f..ee58be5 100644
--- a/core/modules/config/src/Tests/ConfigEntityListTest.php
+++ b/core/modules/config/src/Tests/ConfigEntityListTest.php
@@ -23,7 +23,7 @@ class ConfigEntityListTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'config_test'];
+  public static $modules = array('config_test');
 
   /**
    * {@inheritdoc}
@@ -33,7 +33,6 @@ protected function setUp() {
     // Delete the override config_test entity since it is not required by this
     // test.
     \Drupal::entityManager()->getStorage('config_test')->load('override')->delete();
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
index fceb41d..4ceec20 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
@@ -80,7 +80,6 @@ protected function setUp() {
     $this->config('locale.settings')
       ->set('translation.import_enabled', TRUE)
       ->save();
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php
index 221b7d6..0916dcd 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationOverviewTest.php
@@ -24,7 +24,6 @@ class ConfigTranslationOverviewTest extends WebTestBase {
    * @var array
    */
   public static $modules = [
-    'block',
     'config_test',
     'config_translation',
     'config_translation_test',
@@ -68,7 +67,6 @@ protected function setUp() {
       ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
     $this->localeStorage = $this->container->get('locale.storage');
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
index 98a1816..f220d1a 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
@@ -31,7 +31,6 @@ class ConfigTranslationUiTest extends WebTestBase {
    * @var array
    */
   public static $modules = [
-    'block',
     'config_translation',
     'config_translation_test',
     'contact',
@@ -118,7 +117,6 @@ protected function setUp() {
       ConfigurableLanguage::createFromLangcode($langcode)->save();
     }
     $this->localeStorage = $this->container->get('locale.storage');
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/contact/src/Tests/ContactSitewideTest.php b/core/modules/contact/src/Tests/ContactSitewideTest.php
index 83f296f..1ab942b 100644
--- a/core/modules/contact/src/Tests/ContactSitewideTest.php
+++ b/core/modules/contact/src/Tests/ContactSitewideTest.php
@@ -39,7 +39,6 @@ class ContactSitewideTest extends WebTestBase {
   protected function setUp() {
     parent::setUp();
     $this->drupalPlaceBlock('system_breadcrumb_block');
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/contact/src/Tests/ContactStorageTest.php b/core/modules/contact/src/Tests/ContactStorageTest.php
index f18d10e..5d62e10 100644
--- a/core/modules/contact/src/Tests/ContactStorageTest.php
+++ b/core/modules/contact/src/Tests/ContactStorageTest.php
@@ -28,14 +28,13 @@ class ContactStorageTest extends ContactSitewideTest {
    *
    * @var array
    */
-  public static $modules = [
-    'block',
+  public static $modules = array(
     'text',
     'contact',
     'field_ui',
     'contact_storage_test',
     'contact_test',
-  ];
+  );
 
   /**
    * Tests configuration options and the site-wide contact form.
diff --git a/core/modules/field_ui/src/Tests/EntityDisplayModeTest.php b/core/modules/field_ui/src/Tests/EntityDisplayModeTest.php
index 1a6007c..7b7fe12 100644
--- a/core/modules/field_ui/src/Tests/EntityDisplayModeTest.php
+++ b/core/modules/field_ui/src/Tests/EntityDisplayModeTest.php
@@ -19,18 +19,9 @@ class EntityDisplayModeTest extends WebTestBase {
   /**
    * Modules to enable.
    *
-   * @var string[]
+   * @var array
    */
-  public static $modules = ['block', 'entity_test', 'field_ui'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_actions_block');
-  }
+  public static $modules = array('entity_test', 'field_ui');
 
   /**
    * Tests the EntityViewMode user interface.
diff --git a/core/modules/field_ui/src/Tests/FieldUIRouteTest.php b/core/modules/field_ui/src/Tests/FieldUIRouteTest.php
index 181d3c3..6b68043 100644
--- a/core/modules/field_ui/src/Tests/FieldUIRouteTest.php
+++ b/core/modules/field_ui/src/Tests/FieldUIRouteTest.php
@@ -23,7 +23,7 @@ class FieldUIRouteTest extends WebTestBase {
    *
    * @var string[]
    */
-  public static $modules = ['block', 'entity_test', 'field_ui'];
+  public static $modules = array('entity_test', 'field_ui');
 
   /**
    * {@inheritdoc}
@@ -32,7 +32,6 @@ protected function setUp() {
     parent::setUp();
 
     $this->drupalLogin($this->rootUser);
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/field_ui/src/Tests/ManageFieldsTest.php b/core/modules/field_ui/src/Tests/ManageFieldsTest.php
index 6872bcf..3b2ac3e 100644
--- a/core/modules/field_ui/src/Tests/ManageFieldsTest.php
+++ b/core/modules/field_ui/src/Tests/ManageFieldsTest.php
@@ -66,10 +66,7 @@ class ManageFieldsTest extends WebTestBase {
    */
   protected function setUp() {
     parent::setUp();
-
     $this->drupalPlaceBlock('system_breadcrumb_block');
-    $this->drupalPlaceBlock('local_actions_block');
-    $this->drupalPlaceBlock('local_tasks_block');
 
     // Create a test user.
     $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer node fields', 'administer node form display', 'administer node display', 'administer taxonomy', 'administer taxonomy_term fields', 'administer taxonomy_term display', 'administer users', 'administer account settings', 'administer user display', 'bypass node access'));
diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index aa6d16c..217dbc8 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -515,8 +515,8 @@ function _filter_url($text, $filter) {
   // 1. Allow =&# for empty URL parameters and other URL-join artifacts
   $valid_url_ending_characters = '[\p{L}\p{M}\p{N}:_+~#=/]|(?:' . $valid_url_balanced_parens . ')';
 
-  $valid_url_query_chars = '[a-zA-Z0-9!?\*\'@\(\);:&=\+\$\/%#\[\]\-_\.,~|]';
-  $valid_url_query_ending_chars = '[a-zA-Z0-9_&=#\/]';
+  $valid_url_query_chars = '[a-z0-9!?\*\'@\(\);:&=\+\$\/%#\[\]\-_\.,~|]';
+  $valid_url_query_ending_chars = '[a-z0-9_&=#\/]';
 
   //full path
   //and allow @ in a url, but only in the middle. Catch things like http://example.com/@user/
diff --git a/core/modules/filter/src/Tests/FilterAdminTest.php b/core/modules/filter/src/Tests/FilterAdminTest.php
index 0c61a9e..54a7237 100644
--- a/core/modules/filter/src/Tests/FilterAdminTest.php
+++ b/core/modules/filter/src/Tests/FilterAdminTest.php
@@ -25,7 +25,7 @@ class FilterAdminTest extends WebTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['block', 'filter', 'node', 'filter_test_plugin', 'dblog'];
+  public static $modules = ['filter', 'node', 'filter_test_plugin', 'dblog'];
 
   /**
    * An user with administration permissions.
@@ -109,7 +109,6 @@ protected function setUp() {
     user_role_grant_permissions('authenticated', array($basic_html_format->getPermissionName()));
     user_role_grant_permissions('anonymous', array($restricted_html_format->getPermissionName()));
     $this->drupalLogin($this->adminUser);
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/filter/src/Tests/FilterFormatAccessTest.php b/core/modules/filter/src/Tests/FilterFormatAccessTest.php
index b9eeaa7..029c60b 100644
--- a/core/modules/filter/src/Tests/FilterFormatAccessTest.php
+++ b/core/modules/filter/src/Tests/FilterFormatAccessTest.php
@@ -24,7 +24,7 @@ class FilterFormatAccessTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'filter', 'node'];
+  public static $modules = array('filter', 'node');
 
   /**
    * A user with administrative permissions.
@@ -114,7 +114,6 @@ protected function setUp() {
       $this->secondAllowedFormat->getPermissionName(),
       $this->disallowedFormat->getPermissionName(),
     ));
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/filter/tests/filter.url-input.txt b/core/modules/filter/tests/filter.url-input.txt
index 92289dc..7b33af5 100644
--- a/core/modules/filter/tests/filter.url-input.txt
+++ b/core/modules/filter/tests/filter.url-input.txt
@@ -10,9 +10,6 @@ http://www.test.com
 www.test.com
 person@test.com
 <code>www.test.com</code>
-http://test.com/?search=test
-http://test.com/?search=Test
-http://test.com/?search=tesT
 
 What about tags that don't exist <x>like x say www.test.com</x>? And what about tag <pooh>beginning www.test.com with p?</pooh>
 
diff --git a/core/modules/filter/tests/filter.url-output.txt b/core/modules/filter/tests/filter.url-output.txt
index 814a4ed..9cc5073 100644
--- a/core/modules/filter/tests/filter.url-output.txt
+++ b/core/modules/filter/tests/filter.url-output.txt
@@ -10,9 +10,6 @@ This is just a <a href="http://www.test.com">www.test.com</a>. paragraph with <a
 <a href="http://www.test.com">www.test.com</a>
 <a href="mailto:person@test.com">person@test.com</a>
 <code>www.test.com</code>
-<a href="http://test.com/?search=test">http://test.com/?search=test</a>
-<a href="http://test.com/?search=Test">http://test.com/?search=Test</a>
-<a href="http://test.com/?search=tesT">http://test.com/?search=tesT</a>
 
 What about tags that don't exist <x>like x say <a href="http://www.test.com">www.test.com</a></x>? And what about tag <pooh>beginning <a href="http://www.test.com">www.test.com</a> with p?</pooh>
 
diff --git a/core/modules/forum/src/Tests/ForumTest.php b/core/modules/forum/src/Tests/ForumTest.php
index 767e3e3..3861f66 100644
--- a/core/modules/forum/src/Tests/ForumTest.php
+++ b/core/modules/forum/src/Tests/ForumTest.php
@@ -115,7 +115,6 @@ protected function setUp() {
       'access comments',
     ));
     $this->drupalPlaceBlock('help_block', array('region' => 'help'));
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/language/src/Tests/LanguagePathMonolingualTest.php b/core/modules/language/src/Tests/LanguagePathMonolingualTest.php
index aaccec0..c20a57e 100644
--- a/core/modules/language/src/Tests/LanguagePathMonolingualTest.php
+++ b/core/modules/language/src/Tests/LanguagePathMonolingualTest.php
@@ -21,7 +21,7 @@ class LanguagePathMonolingualTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'language', 'path'];
+  public static $modules = array('language', 'path');
 
   protected function setUp() {
     parent::setUp();
@@ -56,7 +56,6 @@ protected function setUp() {
     // Set language detection to URL.
     $edit = array('language_interface[enabled][language-url]' => TRUE);
     $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/language/src/Tests/LanguageTourTest.php b/core/modules/language/src/Tests/LanguageTourTest.php
index 6d8ec6a..98418b6 100644
--- a/core/modules/language/src/Tests/LanguageTourTest.php
+++ b/core/modules/language/src/Tests/LanguageTourTest.php
@@ -28,7 +28,7 @@ class LanguageTourTest extends TourTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'language', 'tour'];
+  public static $modules = array('language', 'tour');
 
   /**
    * {@inheritdoc}
@@ -37,7 +37,6 @@ protected function setUp() {
     parent::setUp();
     $this->adminUser = $this->drupalCreateUser(array('administer languages', 'access tour'));
     $this->drupalLogin($this->adminUser);
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/menu_ui/src/Tests/MenuLinkReorderTest.php b/core/modules/menu_ui/src/Tests/MenuLinkReorderTest.php
deleted file mode 100644
index d909077..0000000
--- a/core/modules/menu_ui/src/Tests/MenuLinkReorderTest.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu_ui\Tests\MenuLinkReorderTest.
- */
-
-namespace Drupal\menu_ui\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Reorder menu items.
- *
- * @group menu_ui
- */
-class MenuLinkReorderTest extends WebTestBase {
-
-  /**
-   * An administrator user.
-   *
-   * @var \Drupal\user\UserInterface
-   */
-  protected $administrator;
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('menu_ui', 'test_page_test', 'node', 'block');
-
-  /**
-   * Test creating, editing, deleting menu links via node form widget.
-   */
-  function testDefaultMenuLinkReorder() {
-
-    // Add the main menu block.
-    $this->drupalPlaceBlock('system_menu_block:main');
-
-    // Assert that the Home link is available.
-    $this->drupalGet('test-page');
-    $this->assertLink('Home');
-
-    // The administrator user that can re-order menu links.
-    $this->administrator = $this->drupalCreateUser(array(
-      'administer site configuration',
-      'access administration pages',
-      'administer menu',
-    ));
-    $this->drupalLogin($this->administrator);
-
-    // Change the weight of the link to a non default value.
-    $edit = array(
-      'links[menu_plugin_id:test_page_test.front_page][weight]' => -10,
-    );
-    $this->drupalPostForm('admin/structure/menu/manage/main', $edit, t('Save'));
-
-    // The link is still there.
-    $this->drupalGet('test-page');
-    $this->assertLink('Home');
-
-    // Clear all caches.
-    $this->drupalPostForm('admin/config/development/performance', [], t('Clear all caches'));
-
-    // Clearing all caches should not affect the state of the menu link.
-    $this->drupalGet('test-page');
-    $this->assertLink('Home');
-
-  }
-}
diff --git a/core/modules/migrate/migrate.info.yml b/core/modules/migrate/migrate.info.yml
index 97163f0..460f66b 100644
--- a/core/modules/migrate/migrate.info.yml
+++ b/core/modules/migrate/migrate.info.yml
@@ -1,7 +1,7 @@
 name: Migrate
 type: module
 description: 'Handles migrations'
-package: Core (Experimental)
+package: Core
 version: VERSION
 core: 8.x
 ;configure: admin/structure/migrate
diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index 50ab034..735e883 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -24,6 +24,7 @@
  * @ConfigEntityType(
  *   id = "migration",
  *   label = @Translation("Migration"),
+ *   module = "migrate",
  *   handlers = {
  *     "storage" = "Drupal\migrate\MigrationStorage"
  *   },
diff --git a/core/modules/migrate_drupal/migrate_drupal.info.yml b/core/modules/migrate_drupal/migrate_drupal.info.yml
index f2e7272..a0bdaf6 100644
--- a/core/modules/migrate_drupal/migrate_drupal.info.yml
+++ b/core/modules/migrate_drupal/migrate_drupal.info.yml
@@ -1,7 +1,7 @@
 name: Migrate Drupal
 type: module
 description: 'Contains migrations from older Drupal versions.'
-package: Core (Experimental)
+package: Core
 version: VERSION
 core: 8.x
 dependencies:
diff --git a/core/modules/node/src/Tests/NodeTranslationUITest.php b/core/modules/node/src/Tests/NodeTranslationUITest.php
index bcb9de9..fe3a4bc 100644
--- a/core/modules/node/src/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/src/Tests/NodeTranslationUITest.php
@@ -27,7 +27,6 @@ class NodeTranslationUITest extends ContentTranslationUITestBase {
   protected $defaultCacheContexts = [
     'languages:language_interface',
     'theme',
-    'route.name',
     'route.menu_active_trails:account',
     'route.menu_active_trails:footer',
     'route.menu_active_trails:main',
diff --git a/core/modules/node/src/Tests/PageEditTest.php b/core/modules/node/src/Tests/PageEditTest.php
index 31d6ea9..9082dca 100644
--- a/core/modules/node/src/Tests/PageEditTest.php
+++ b/core/modules/node/src/Tests/PageEditTest.php
@@ -16,19 +16,11 @@ class PageEditTest extends NodeTestBase {
   protected $webUser;
   protected $adminUser;
 
-  /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block', 'node', 'datetime'];
-
   protected function setUp() {
     parent::setUp();
 
     $this->webUser = $this->drupalCreateUser(array('edit own page content', 'create page content'));
     $this->adminUser = $this->drupalCreateUser(array('bypass node access', 'administer nodes'));
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
index f19ac70..c471cea 100644
--- a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
+++ b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
@@ -103,8 +103,6 @@ function testPageCacheTags() {
       'config:block.block.bartik_main_menu',
       'config:block.block.bartik_account_menu',
       'config:block.block.bartik_messages',
-      'config:block.block.bartik_local_actions',
-      'config:block.block.bartik_local_tasks',
       'node_view',
       'node:' . $node_1->id(),
       'user:' . $author_1->id(),
@@ -139,8 +137,6 @@ function testPageCacheTags() {
       'config:block.block.bartik_main_menu',
       'config:block.block.bartik_account_menu',
       'config:block.block.bartik_messages',
-      'config:block.block.bartik_local_actions',
-      'config:block.block.bartik_local_tasks',
       'node_view',
       'node:' . $node_2->id(),
       'user:' . $author_2->id(),
diff --git a/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php b/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php
index f3a2084..34ae8d3 100644
--- a/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php
+++ b/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php
@@ -26,6 +26,7 @@
  *       "duplicate" = "Drupal\responsive_image\ResponsiveImageStyleForm"
  *     }
  *   },
+ *   list_path = "admin/config/media/responsive-image-style",
  *   admin_permission = "administer responsive images",
  *   config_prefix = "styles",
  *   entity_keys = {
diff --git a/core/modules/rest/src/Plugin/views/style/Serializer.php b/core/modules/rest/src/Plugin/views/style/Serializer.php
index f83d57f..67a8364 100644
--- a/core/modules/rest/src/Plugin/views/style/Serializer.php
+++ b/core/modules/rest/src/Plugin/views/style/Serializer.php
@@ -122,11 +122,9 @@ public function render() {
     // which will transform it to arrays/scalars. If the Data field row plugin
     // is used, $rows will not contain objects and will pass directly to the
     // Encoder.
-    foreach ($this->view->result as $row_index => $row) {
-      $this->view->row_index = $row_index;
+    foreach ($this->view->result as $row) {
       $rows[] = $this->view->rowPlugin->render($row);
     }
-    unset($this->view->row_index);
 
     // Get the content type configured in the display or fallback to the
     // default.
diff --git a/core/modules/rest/src/Tests/Views/StyleSerializerTest.php b/core/modules/rest/src/Tests/Views/StyleSerializerTest.php
index c96c275..498942f 100644
--- a/core/modules/rest/src/Tests/Views/StyleSerializerTest.php
+++ b/core/modules/rest/src/Tests/Views/StyleSerializerTest.php
@@ -9,10 +9,7 @@
 
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Cache\Cache;
-use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\entity_test\Entity\EntityTest;
-use Drupal\field\Entity\FieldConfig;
-use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
 use Drupal\views\Entity\View;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
@@ -547,67 +544,4 @@ public function testFieldapiField() {
     $this->assertEqual($result[1]['nid'], $node->id());
     $this->assertTrue(strpos($this->getRawContent(), "<script") === FALSE, "No script tag is present in the raw page contents.");
   }
-
-  /**
-   * Tests the "Grouped rows" functionality.
-   */
-  public function testGroupRows() {
-    /** @var \Drupal\Core\Render\RendererInterface $renderer */
-    $renderer = $this->container->get('renderer');
-    $this->drupalCreateContentType(['type' => 'page']);
-    // Create a text field with cardinality set to unlimited.
-    $field_name = 'field_group_rows';
-    $field_storage = FieldStorageConfig::create([
-      'field_name' => $field_name,
-      'entity_type' => 'node',
-      'type' => 'string',
-      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
-    ]);
-    $field_storage->save();
-    // Create an instance of the text field on the content type.
-    $field = FieldConfig::create([
-      'field_storage' => $field_storage,
-      'bundle' => 'page',
-    ]);
-    $field->save();
-    $grouped_field_values = ['a', 'b', 'c'];
-    $edit = [
-      'title' => $this->randomMachineName(),
-      $field_name => $grouped_field_values,
-    ];
-    $this->drupalCreateNode($edit);
-    $view = Views::getView('test_serializer_node_display_field');
-    $view->setDisplay('rest_export_1');
-    // Override the view's fields to include the field_group_rows field, set the
-    // group_rows setting to true.
-    $fields = [
-      $field_name => [
-        'id' => $field_name,
-        'table' => 'node__' . $field_name,
-        'field' => $field_name,
-        'type' => 'string',
-        'group_rows' => TRUE,
-      ],
-    ];
-    $view->displayHandlers->get('default')->overrideOption('fields', $fields);
-    $build = $view->preview();
-    // Get the serializer service.
-    $serializer = $this->container->get('serializer');
-    // Check if the field_group_rows field is grouped.
-    $expected = [];
-    $expected[] = [$field_name => implode(', ', $grouped_field_values)];
-    $this->assertEqual($serializer->serialize($expected, 'json'), (string) $renderer->renderRoot($build));
-    // Set the group rows setting to false.
-    $view = Views::getView('test_serializer_node_display_field');
-    $view->setDisplay('rest_export_1');
-    $fields[$field_name]['group_rows'] = FALSE;
-    $view->displayHandlers->get('default')->overrideOption('fields', $fields);
-    $build = $view->preview();
-    // Check if the field_group_rows field is ungrouped and displayed per row.
-    $expected = [];
-    foreach ($grouped_field_values as $grouped_field_value) {
-      $expected[] = [$field_name => $grouped_field_value];
-    }
-    $this->assertEqual($serializer->serialize($expected, 'json'), (string) $renderer->renderRoot($build));
-  }
 }
diff --git a/core/modules/search/src/Tests/SearchConfigSettingsFormTest.php b/core/modules/search/src/Tests/SearchConfigSettingsFormTest.php
index 2c17ed6..a99ea45 100644
--- a/core/modules/search/src/Tests/SearchConfigSettingsFormTest.php
+++ b/core/modules/search/src/Tests/SearchConfigSettingsFormTest.php
@@ -58,7 +58,6 @@ protected function setUp() {
 
     // Enable the search block.
     $this->drupalPlaceBlock('search_form_block');
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/search/src/Tests/SearchPageTextTest.php b/core/modules/search/src/Tests/SearchPageTextTest.php
index 8a95fe6..408848c 100644
--- a/core/modules/search/src/Tests/SearchPageTextTest.php
+++ b/core/modules/search/src/Tests/SearchPageTextTest.php
@@ -23,22 +23,11 @@ class SearchPageTextTest extends SearchTestBase {
    */
   protected $searchingUser;
 
-  /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block'];
-
-  /**
-   * {@inheritdoc}
-   */
   protected function setUp() {
     parent::setUp();
 
     // Create user.
     $this->searchingUser = $this->drupalCreateUser(array('search content', 'access user profiles', 'use advanced search'));
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/shortcut/src/Tests/ShortcutSetsTest.php b/core/modules/shortcut/src/Tests/ShortcutSetsTest.php
index bc3c5f9..26a3171 100644
--- a/core/modules/shortcut/src/Tests/ShortcutSetsTest.php
+++ b/core/modules/shortcut/src/Tests/ShortcutSetsTest.php
@@ -17,22 +17,6 @@
 class ShortcutSetsTest extends ShortcutTestBase {
 
   /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_actions_block');
-  }
-
-  /**
    * Tests creating a shortcut set.
    */
   function testShortcutSetAdd() {
diff --git a/core/modules/simpletest/src/Tests/BrowserTest.php b/core/modules/simpletest/src/Tests/BrowserTest.php
index 3e58c0d..02422e7 100644
--- a/core/modules/simpletest/src/Tests/BrowserTest.php
+++ b/core/modules/simpletest/src/Tests/BrowserTest.php
@@ -24,22 +24,6 @@ class BrowserTest extends WebTestBase {
   protected static $cookieSet = FALSE;
 
   /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_tasks_block');
-  }
-
-  /**
    * Test \Drupal\simpletest\WebTestBase::getAbsoluteUrl().
    */
   function testGetAbsoluteUrl() {
diff --git a/core/modules/system/config/schema/system.schema.yml b/core/modules/system/config/schema/system.schema.yml
index b4a8873..12b0e6c 100644
--- a/core/modules/system/config/schema/system.schema.yml
+++ b/core/modules/system/config/schema/system.schema.yml
@@ -342,17 +342,6 @@ block.settings.system_menu_block:*:
       type: integer
       label: 'Maximum number of levels'
 
-block.settings.local_tasks_block:
-  type: block_settings
-  label: 'Tabs block'
-  mapping:
-    primary:
-      type: boolean
-      label: 'Whether primary tabs are shown'
-    secondary:
-      type: boolean
-      label: 'Whether secondary tabs are shown'
-
 condition.plugin.request_path:
   type: condition.plugin
   mapping:
diff --git a/core/modules/system/src/Plugin/Condition/RequestPath.php b/core/modules/system/src/Plugin/Condition/RequestPath.php
index 4cd92de..64331be 100644
--- a/core/modules/system/src/Plugin/Condition/RequestPath.php
+++ b/core/modules/system/src/Plugin/Condition/RequestPath.php
@@ -164,7 +164,9 @@ public function evaluate() {
    */
   public function getCacheContexts() {
     $contexts = parent::getCacheContexts();
-    $contexts[] = 'url.path';
+    // @todo Add a url.path cache context in
+    //   https://www.drupal.org/node/2521978.
+    $contexts[] = 'url';
     return $contexts;
   }
 
diff --git a/core/modules/system/src/Tests/Menu/LocalActionTest.php b/core/modules/system/src/Tests/Menu/LocalActionTest.php
index 22f188d..cd6dc81 100644
--- a/core/modules/system/src/Tests/Menu/LocalActionTest.php
+++ b/core/modules/system/src/Tests/Menu/LocalActionTest.php
@@ -19,20 +19,9 @@
 class LocalActionTest extends WebTestBase {
 
   /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block', 'menu_test'];
-
-  /**
    * {@inheritdoc}
    */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_actions_block');
-  }
+  public static $modules = array('menu_test');
 
   /**
    * Tests appearance of local actions.
diff --git a/core/modules/system/src/Tests/Menu/LocalTasksTest.php b/core/modules/system/src/Tests/Menu/LocalTasksTest.php
index 4030c48..1a0ce81 100644
--- a/core/modules/system/src/Tests/Menu/LocalTasksTest.php
+++ b/core/modules/system/src/Tests/Menu/LocalTasksTest.php
@@ -18,28 +18,7 @@
  */
 class LocalTasksTest extends WebTestBase {
 
-  /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block', 'menu_test', 'entity_test'];
-
-  /**
-   * The local tasks block under testing.
-   *
-   * @var \Drupal\block\Entity\Block
-   */
-  protected $sut;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->sut = $this->drupalPlaceBlock('local_tasks_block', ['id' => 'tabs_block']);
-  }
+  public static $modules = array('menu_test', 'entity_test');
 
   /**
    * Asserts local tasks in the page output.
@@ -87,20 +66,6 @@ protected function assertLocalTaskAppers($title) {
   }
 
   /**
-   * Asserts that the local tasks on the specified level are not being printed.
-   *
-   * @param int $level
-   *   (optional) The local tasks level to assert; 0 for primary, 1 for
-   *   secondary. Defaults to 0.
-   */
-  protected function assertNoLocalTasks($level = 0) {
-    $elements = $this->xpath('//*[contains(@class, :class)]//a', array(
-      ':class' => $level == 0 ? 'tabs primary' : 'tabs secondary',
-    ));
-    $this->assertFalse(count($elements), 'Local tasks not found.');
-  }
-
-  /**
    * Tests the plugin based local tasks.
    */
   public function testPluginLocalTask() {
@@ -207,52 +172,4 @@ public function testPluginLocalTask() {
     $this->assertEqual('upcasting sub2', (string) $result[0]->a, 'The "upcasting sub2" tab is active.');
   }
 
-  /**
-   * Tests that local task blocks are configurable to show a specific level.
-   */
-  public function testLocalTaskBlock() {
-    // Remove the default block and create a new one.
-    $this->sut->delete();
-
-    $this->sut = $this->drupalPlaceBlock('local_tasks_block', [
-      'id' => 'tabs_block',
-      'primary' => TRUE,
-      'secondary' => FALSE,
-    ]);
-
-    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_settings'));
-
-    // Verify that local tasks in the first level appear.
-    $this->assertLocalTasks([
-      ['menu_test.local_task_test_tasks_view', []],
-      ['menu_test.local_task_test_tasks_edit', []],
-      ['menu_test.local_task_test_tasks_settings', []],
-    ]);
-
-    // Verify that local tasks in the second level doesn't appear.
-    $this->assertNoLocalTasks(1);
-
-    $this->sut->delete();
-    $this->sut = $this->drupalPlaceBlock('local_tasks_block', [
-      'id' => 'tabs_block',
-      'primary' => FALSE,
-      'secondary' => TRUE,
-    ]);
-
-    $this->drupalGet(Url::fromRoute('menu_test.local_task_test_tasks_settings'));
-
-    // Verify that local tasks in the first level doesn't appear.
-    $this->assertNoLocalTasks(0);
-
-    // Verify that local tasks in the second level appear.
-    $sub_tasks = [
-      ['menu_test.local_task_test_tasks_settings_sub1', []],
-      ['menu_test.local_task_test_tasks_settings_sub2', []],
-      ['menu_test.local_task_test_tasks_settings_sub3', []],
-      ['menu_test.local_task_test_tasks_settings_derived', ['placeholder' => 'derive1']],
-      ['menu_test.local_task_test_tasks_settings_derived', ['placeholder' => 'derive2']],
-    ];
-    $this->assertLocalTasks($sub_tasks, 1);
-  }
-
 }
diff --git a/core/modules/system/src/Tests/Menu/MenuRouterTest.php b/core/modules/system/src/Tests/Menu/MenuRouterTest.php
index 21052a4..7fd809d 100644
--- a/core/modules/system/src/Tests/Menu/MenuRouterTest.php
+++ b/core/modules/system/src/Tests/Menu/MenuRouterTest.php
@@ -43,7 +43,6 @@ protected function setUp() {
     parent::setUp();
 
     $this->drupalPlaceBlock('system_menu_block:tools');
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/system/src/Tests/Menu/MenuTranslateTest.php b/core/modules/system/src/Tests/Menu/MenuTranslateTest.php
index 3641ab1..e316c95 100644
--- a/core/modules/system/src/Tests/Menu/MenuTranslateTest.php
+++ b/core/modules/system/src/Tests/Menu/MenuTranslateTest.php
@@ -23,16 +23,7 @@ class MenuTranslateTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'menu_test'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_tasks_block');
-  }
+  public static $modules = array('menu_test');
 
   /**
    * Tests _menu_translate().
diff --git a/core/modules/system/src/Tests/System/DateTimeTest.php b/core/modules/system/src/Tests/System/DateTimeTest.php
index 39dac52..4fdc279 100644
--- a/core/modules/system/src/Tests/System/DateTimeTest.php
+++ b/core/modules/system/src/Tests/System/DateTimeTest.php
@@ -22,14 +22,13 @@ class DateTimeTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'node', 'language'];
+  public static $modules = array('node', 'language');
 
   protected function setUp() {
     parent::setUp();
 
     // Create admin user and log in admin user.
     $this->drupalLogin ($this->drupalCreateUser(array('administer site configuration')));
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/system/src/Tests/System/ThemeTest.php b/core/modules/system/src/Tests/System/ThemeTest.php
index f4e87e1..7c85275 100644
--- a/core/modules/system/src/Tests/System/ThemeTest.php
+++ b/core/modules/system/src/Tests/System/ThemeTest.php
@@ -30,7 +30,7 @@ class ThemeTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['node', 'block', 'file'];
+  public static $modules = array('node', 'block', 'file');
 
   protected function setUp() {
     parent::setUp();
@@ -40,7 +40,6 @@ protected function setUp() {
     $this->adminUser = $this->drupalCreateUser(array('access administration pages', 'view the administration theme', 'administer themes', 'bypass node access', 'administer blocks'));
     $this->drupalLogin($this->adminUser);
     $this->node = $this->drupalCreateNode();
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/system/src/Tests/Update/LocalActionsAndTasksConvertedIntoBlocksUpdateTest.php b/core/modules/system/src/Tests/Update/LocalActionsAndTasksConvertedIntoBlocksUpdateTest.php
deleted file mode 100644
index 0665f40..0000000
--- a/core/modules/system/src/Tests/Update/LocalActionsAndTasksConvertedIntoBlocksUpdateTest.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\system\Tests\Update\LocalActionsAndTasksConvertedIntoBlocksUpdateTest.
- */
-
-namespace Drupal\system\Tests\Update;
-
-use Drupal\node\Entity\Node;
-
-/**
- * Tests the upgrade path for local actions/tasks being converted into blocks.
- *
- * @see https://www.drupal.org/node/507488
- *
- * @group system
- */
-class LocalActionsAndTasksConvertedIntoBlocksUpdateTest extends UpdatePathTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setDatabaseDumpFiles() {
-    $this->databaseDumpFiles = [
-      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
-      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.local-actions-tasks-into-blocks-507488.php',
-    ];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    parent::setUp();
-    /** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
-    $theme_handler = \Drupal::service('theme_handler');
-    $theme_handler->refreshInfo();
-  }
-
-  /**
-   * Tests that local actions/tasks are being converted into blocks.
-   */
-  public function testUpdateHookN() {
-    $this->runUpdates();
-
-    /** @var \Drupal\block\BlockInterface $block_storage */
-    $block_storage = \Drupal::entityManager()->getStorage('block');
-    /* @var \Drupal\block\BlockInterface[] $help_blocks */
-    $help_blocks = $block_storage->loadByProperties(['theme' => 'bartik', 'region' => 'help']);
-
-    $this->assertRaw('Because your site has custom theme(s) installed, we had to set local actions and tasks blocks into the content region. Please manually review the block configurations and remove the removed variables from your templates.');
-
-    // Disable maintenance mode.
-    // @todo Can be removed once maintenance mode is automatically turned off
-    // after updates in https://www.drupal.org/node/2435135.
-    \Drupal::state()->set('system.maintenance_mode', FALSE);
-
-    // We finished updating so we can login the user now.
-    $this->drupalLogin($this->rootUser);
-
-    $page = Node::create([
-      'type' => 'page',
-      'title' => 'Page node',
-    ]);
-    $page->save();
-
-    // Ensures that blocks inside help region has been moved to content region.
-    foreach ($help_blocks as $block) {
-      $new_block = $block_storage->load($block->id());
-      $this->assertEqual($new_block->getRegion(), 'content');
-    }
-
-    // Local tasks are visible on the node page.
-    $this->drupalGet('node/' . $page->id());
-    $this->assertText(t('Edit'));
-
-    // Local actions are visible on the content listing page.
-    $this->drupalGet('admin/content');
-    $action_link = $this->cssSelect('.action-links');
-    $this->assertTrue($action_link);
-
-    $this->drupalGet('admin/structure/block/list/seven');
-
-    /** @var \Drupal\Core\Config\StorageInterface $config_storage */
-    $config_storage = \Drupal::service('config.storage');
-    $this->assertTrue($config_storage->exists('block.block.test_theme_local_tasks'), 'Local task block has been created for the custom theme.');
-    $this->assertTrue($config_storage->exists('block.block.test_theme_local_actions'), 'Local action block has been created for the custom theme.');
-  }
-
-}
diff --git a/core/modules/system/src/Tests/Update/UpdatePathTestBase.php b/core/modules/system/src/Tests/Update/UpdatePathTestBase.php
index 2dd61e5..fc8d4c3 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathTestBase.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathTestBase.php
@@ -186,7 +186,14 @@ protected function setUp() {
     // not safe to do here, because the database has not been updated yet.
     $this->container = \Drupal::getContainer();
 
-    $this->replaceUser1();
+    // Replace User 1 with the user created here.
+    // @todo: do this without saving the user account.
+    /** @var \Drupal\user\UserInterface $account */
+    $account = User::load(1);
+    $account->setPassword($this->rootUser->pass_raw);
+    $account->setEmail($this->rootUser->getEmail());
+    $account->setUsername($this->rootUser->getUsername());
+    $account->save();
   }
 
   /**
@@ -238,7 +245,6 @@ protected function runUpdates() {
     $this->drupalGet($this->updateUrl);
     $this->clickLink(t('Continue'));
 
-    $this->doSelectionTest();
     // Run the update hooks.
     $this->clickLink(t('Apply pending updates'));
 
@@ -260,27 +266,4 @@ protected function runUpdates() {
     $this->assertFalse(\Drupal::service('entity.definition_update_manager')->needsUpdates(), 'After all updates ran, entity schema is up to date.');
   }
 
-  /**
-   * Replace User 1 with the user created here.
-   */
-  protected function replaceUser1() {
-    /** @var \Drupal\user\UserInterface $account */
-    // @todo: Saving the account before the update is problematic.
-    //   https://www.drupal.org/node/2560237
-    $account = User::load(1);
-    $account->setPassword($this->rootUser->pass_raw);
-    $account->setEmail($this->rootUser->getEmail());
-    $account->setUsername($this->rootUser->getUsername());
-    $account->save();
-  }
-
-  /**
-   * Tests the selection page.
-   */
-  protected function doSelectionTest() {
-    // No-op. Tests wishing to do test the selection page or the general
-    // update.php environment before running update.php can override this method
-    // and implement their required tests.
-  }
-
 }
diff --git a/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php b/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php
index 9c175b4..623a400 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php
@@ -7,9 +7,6 @@
 
 namespace Drupal\system\Tests\Update;
 
-use Drupal\node\Entity\Node;
-use Drupal\user\Entity\User;
-
 /**
  * Runs UpdatePathTestBaseTest with a dump filled with content.
  *
@@ -25,403 +22,4 @@ protected function setDatabaseDumpFiles() {
     $this->databaseDumpFiles[0] = __DIR__ . '/../../../tests/fixtures/update/drupal-8.filled.standard.php.gz';
   }
 
-  /**
-   * Tests that the content and configuration were properly updated.
-   */
-  public function testUpdatedSite() {
-    $this->runUpdates();
-
-    $spanish = \Drupal::languageManager()->getLanguage('es');
-
-    $expected_node_data = array(
-      [1, 'article', 'en', 'Test Article - New title'],
-      [2, 'book', 'en', 'Book page'],
-      [3, 'forum', 'en', 'Forum topic'],
-      [4, 'page', 'en', 'Test page'],
-      [8, 'test_content_type', 'en', 'Test title'],
-    );
-    foreach ($expected_node_data as $node_data) {
-      $id = $node_data[0];
-      $type = $node_data[1];
-      $langcode = $node_data[2];
-      $title = $node_data[3];
-
-      // Make sure our English nodes still exist.
-      $node = Node::load($id);
-      $this->assertEqual($node->language()->getId(), $langcode);
-      $this->assertEqual($node->getType(), $type);
-      $this->assertEqual($node->getTitle(), $title);
-      // Assert that nodes are all published.
-      $this->assertTrue($node->isPublished());
-      $this->drupalGet('node/' . $id);
-      $this->assertText($title);
-    }
-
-    // Make sure the translated node still exists.
-    $translation = Node::load(8)->getTranslation('es');
-    $this->assertEqual('Test title Spanish', $translation->getTitle());
-
-    // Make sure our alias still works.
-    $this->drupalGet('test-article');
-    $this->assertText('Test Article - New title');
-    $this->assertText('Body');
-    $this->assertText('Tags');
-
-    // Make sure a translated page exists.
-    $this->drupalGet('node/8', ['language' => $spanish]);
-    // Check for text of two comments.
-    $this->assertText('Hola');
-    $this->assertText('Hello');
-    // The user entity reference field is access restricted.
-    $this->assertNoText('Test 12');
-    // Make sure all other field labels are there.
-    for ($i = 1; $i <= 23; $i++) {
-      if ($i != 12) {
-        $this->assertText('Test ' . $i);
-      }
-    }
-
-    // Make sure the translated slogan appears.
-    $this->assertText('drupal Spanish');
-
-    // Make sure the custom block appears.
-    $this->drupalGet('<front>');
-    // Block title.
-    $this->assertText('Another block');
-    // Block body.
-    $this->assertText('Hello');
-
-    // Log in as user 1.
-    $account = User::load(1);
-    $account->pass_raw = 'drupal';
-    $this->drupalLogin($account);
-
-    // Make sure we can see the access-restricted entity reference field
-    // now that we're logged in.
-    $this->drupalGet('node/8', ['language' => $spanish]);
-    $this->assertText('Test 12');
-    $this->assertLink('drupal');
-
-    // Make sure the content for node 8 is still in the edit form.
-    $this->drupalGet('node/8/edit');
-    $this->assertText('Test title');
-    $this->assertText('Test body');
-    $this->assertFieldChecked('edit-field-test-1-value');
-    $this->assertRaw('2015-08-16');
-    $this->assertRaw('test@example.com');
-    $this->assertRaw('drupal.org');
-    $this->assertText('0.1');
-    $this->assertText('0.2');
-    $this->assertRaw('+31612345678');
-    $this->assertRaw('+31612345679');
-    $this->assertText('Test Article - New title');
-    $this->assertText('test.txt');
-    $this->assertText('druplicon.small');
-    $this->assertRaw('General discussion');
-    $this->assertText('Test Article - New title');
-    $this->assertText('Test 1');
-    $this->assertRaw('0.01');
-    $this->drupalPostForm('node/8/edit', [], 'Save and keep published (this translation)');
-    $this->assertResponse(200);
-    $this->drupalGet('node/8/edit', ['language' => $spanish]);
-    $this->assertText('Test title Spanish');
-    $this->assertText('Test body Spanish');
-
-    // Make sure the user page is correct.
-    $this->drupalGet('user/3');
-    $this->assertText('usuario_test');
-    $this->assertRaw('druplicon.small');
-    $this->assertText('Test file field');
-    $this->assertLink('test.txt');
-
-    // Make sure the user is translated.
-    $this->drupalGet('user/3/translations');
-    $this->assertNoText('Not translated');
-
-    // Make sure the custom field on the user is still there.
-    $this->drupalGet('admin/config/people/accounts/fields');
-    $this->assertText('Test file field');
-
-    // Make sure the test view still exists.
-    $this->drupalGet('admin/structure/views/view/test_view');
-    $this->assertText('Test view');
-
-    // Make sure the book node exists.
-    $this->drupalGet('admin/structure/book');
-    $this->clickLink('Test Article - New title');
-    $this->assertText('Body');
-    $this->assertText('Tags');
-    $this->assertRaw('Text format');
-
-    // Make sure that users still exist.
-    $this->drupalGet('admin/people');
-    $this->assertText('usuario_test');
-    $this->assertText('drupal');
-    $this->drupalGet('user/1/edit');
-    $this->assertRaw('drupal@example.com');
-
-    // Make sure the content view works.
-    $this->drupalGet('admin/content');
-    $this->assertText('Test title');
-
-    // Make sure our custom blocks show up.
-    $this->drupalGet('admin/structure/block');
-    $this->assertText('Another block');
-    $this->assertText('Test block');
-    $this->drupalGet('admin/structure/block/block-content');
-    $this->assertText('Another block');
-    $this->assertText('Test block');
-
-    // Make sure our custom visibility conditions are correct.
-    $this->drupalGet('admin/structure/block/manage/testblock');
-    $this->assertNoFieldChecked('edit-visibility-language-langcodes-es');
-    $this->assertFieldChecked('edit-visibility-language-langcodes-en');
-    $this->assertNoFieldChecked('edit-visibility-node-type-bundles-book');
-    $this->assertFieldChecked('edit-visibility-node-type-bundles-test-content-type');
-
-    // Make sure our block is still translated.
-    $this->drupalGet('admin/structure/block/manage/testblock/translate/es/edit');
-    $this->assertRaw('Test block spanish');
-
-    // Make sure our custom text format exists.
-    $this->drupalGet('admin/config/content/formats');
-    $this->assertText('Test text format');
-    $this->drupalGet('admin/config/content/formats/manage/test_text_format');
-    $this->assertResponse('200');
-
-    // Make sure our feed still exists.
-    $this->drupalGet('admin/config/services/aggregator');
-    $this->assertText('Test feed');
-    $this->drupalGet('admin/config/services/aggregator/fields');
-    $this->assertText('field_test');
-
-    // Make sure our view appears in the overview.
-    $this->drupalGet('admin/structure/views');
-    $this->assertText('test_view');
-    $this->assertText('Test view');
-
-    // Make sure our custom forum exists.
-    $this->drupalGet('admin/structure/forum');
-    $this->assertText('Test forum');
-
-    // Make sure our custom menu exists.
-    $this->drupalGet('admin/structure/menu');
-    $this->assertText('Test menu');
-
-    // Make sure our custom menu exists.
-    $this->drupalGet('admin/structure/menu/manage/test-menu');
-    $this->clickLink('Admin');
-    // Make sure the translation for the menu is still correct.
-    $this->drupalGet('admin/structure/menu/manage/test-menu/translate/es/edit');
-    $this->assertRaw('Menu test');
-    // Make sure our custom menu link exists.
-    $this->drupalGet('admin/structure/menu/item/1/edit');
-    $this->assertFieldChecked('edit-enabled-value');
-
-    // Make sure our comment type exists.
-    $this->drupalGet('admin/structure/comment');
-    $this->assertText('Test comment type');
-    $this->drupalGet('admin/structure/comment/manage/test_comment_type/fields');
-    $this->assertText('comment_body');
-
-    // Make sure our contact form exists.
-    $this->drupalGet('admin/structure/contact');
-    $this->assertText('Test contact form');
-    $this->drupalGet('admin/structure/types');
-    $this->assertText('Test content type description');
-    $this->drupalGet('admin/structure/types/manage/test_content_type/fields');
-
-    // Make sure fields are the right type.
-    $this->assertLink('Text (formatted, long, with summary)');
-    $this->assertLink('Boolean');
-    $this->assertLink('Comments');
-    $this->assertLink('Date');
-    $this->assertLink('Email');
-    $this->assertLink('Link');
-    $this->assertLink('List (float)');
-    $this->assertLink('Telephone number');
-    $this->assertLink('Entity reference');
-    $this->assertLink('File');
-    $this->assertLink('Image');
-    $this->assertLink('Text (plain, long)');
-    $this->assertLink('List (text)');
-    $this->assertLink('Text (formatted, long)');
-    $this->assertLink('Text (plain)');
-    $this->assertLink('List (integer)');
-    $this->assertLink('Number (integer)');
-    $this->assertLink('Number (float)');
-
-    // Make sure our form mode exists.
-    $this->drupalGet('admin/structure/display-modes/form');
-    $this->assertText('New form mode');
-
-    // Make sure our view mode exists.
-    $this->drupalGet('admin/structure/display-modes/view');
-    $this->assertText('New view mode');
-    $this->drupalGet('admin/structure/display-modes/view/manage/node.new_view_mode');
-    $this->assertResponse(200);
-
-    // Make sure our other language is still there.
-    $this->drupalGet('admin/config/regional/language');
-    $this->assertText('Spanish');
-
-    // Make sure our custom date format exists.
-    $this->drupalGet('admin/config/regional/date-time');
-    $this->assertText('Test date format');
-    $this->drupalGet('admin/config/regional/date-time/formats/manage/test_date_format');
-    $this->assertOptionSelected('edit-langcode', 'es');
-
-    // Make sure our custom image style exists.
-    $this->drupalGet('admin/config/media/image-styles/manage/test_image_style');
-    $this->assertText('Test image style');
-    $this->assertText('Desaturate');
-    $this->assertText('Convert PNG');
-
-    // Make sure our custom responsive image style exists.
-    $this->drupalGet('admin/config/media/responsive-image-style/test');
-    $this->assertResponse(200);
-    $this->assertText('Test');
-
-    // Make sure our custom shortcut exists.
-    $this->drupalGet('admin/config/user-interface/shortcut');
-    $this->assertText('Test shortcut');
-    $this->drupalGet('admin/config/user-interface/shortcut/manage/test/customize');
-    $this->assertText('All content');
-
-    // Make sure our language detection settings are still correct.
-    $this->drupalGet('admin/config/regional/language/detection');
-    $this->assertFieldChecked('edit-language-interface-enabled-language-user-admin');
-    $this->assertFieldChecked('edit-language-interface-enabled-language-url');
-    $this->assertFieldChecked('edit-language-interface-enabled-language-session');
-    $this->assertFieldChecked('edit-language-interface-enabled-language-user');
-    $this->assertFieldChecked('edit-language-interface-enabled-language-browser');
-
-    // Make sure strings are still translated.
-    $this->drupalGet('admin/structure/views/view/content/translate/es/edit');
-    $this->assertText('Contenido');
-    $this->drupalPostForm('admin/config/regional/translate', ['string' => 'Full comment'], 'Filter');
-    $this->assertText('Comentario completo');
-
-    // Make sure our custom action is still there.
-    $this->drupalGet('admin/config/system/actions');
-    $this->assertText('Test action');
-    $this->drupalGet('admin/config/system/actions/configure/test_action');
-    $this->assertText('test_action');
-    $this->assertRaw('drupal.org');
-
-    // Make sure our ban still exists.
-    $this->drupalGet('admin/config/people/ban');
-    $this->assertText('8.8.8.8');
-
-    // Make sure our vocabulary exists.
-    $this->drupalGet('admin/structure/taxonomy/manage/test_vocabulary/overview');
-
-    // Make sure our terms exist.
-    $this->assertText('Test root term');
-    $this->assertText('Test child term');
-    $this->drupalGet('taxonomy/term/3');
-    $this->assertResponse('200');
-
-    // Make sure the terms are still translated.
-    $this->drupalGet('taxonomy/term/2/translations');
-    $this->assertLink('Test root term - Spanish');
-
-    // Make sure our contact form exists.
-    $this->drupalGet('admin/structure/contact');
-    $this->assertText('Test contact form');
-    $this->drupalGet('admin/structure/contact/manage/test_contact_form');
-    $this->assertText('test@example.com');
-    $this->assertText('Hello');
-    $this->drupalGet('admin/structure/contact/manage/test_contact_form/translate/es/edit');
-    $this->assertText('Hola');
-    $this->assertRaw('Test contact form Spanish');
-
-    // Make sure our modules are still enabled.
-    $expected_enabled_modules = [
-      'action',
-      'aggregator',
-      'ban',
-      'basic_auth',
-      'block',
-      'block_content',
-      'book',
-      'breakpoint',
-      'ckeditor',
-      'color',
-      'comment',
-      'config',
-      'config_translation',
-      'contact',
-      'content_translation',
-      'contextual',
-      'datetime',
-      'dblog',
-      'editor',
-      'entity_reference',
-      'field',
-      'field_ui',
-      'file',
-      'filter',
-      'hal',
-      'help',
-      'history',
-      'image',
-      'language',
-      'link',
-      'locale',
-      'menu_ui',
-      'migrate',
-      'migrate_drupal',
-      'node',
-      'options',
-      'page_cache',
-      'path',
-      'quickedit',
-      'rdf',
-      'responsive_image',
-      'rest',
-      'search',
-      'serialization',
-      'shortcut',
-      'simpletest',
-      'statistics',
-      'syslog',
-      'system',
-      'taxonomy',
-      'telephone',
-      'text',
-      'toolbar',
-      'tour',
-      'tracker',
-      'update',
-      'user',
-      'views_ui',
-      'forum',
-      'menu_link_content',
-      'views',
-      'standard',
-    ];
-    foreach ($expected_enabled_modules as $module) {
-      $this->assertTrue($this->container->get('module_handler')->moduleExists($module), 'The "' . $module . '" module is still enabled.');
-    }
-
-    // Make sure our themes are still enabled.
-    $expected_enabled_themes = [
-      'bartik',
-      'classy',
-      'seven',
-      'stark',
-    ];
-    foreach ($expected_enabled_themes as $theme) {
-      $this->assertTrue($this->container->get('theme_handler')->themeExists($theme), 'The "' . $theme . '" is still enabled.');
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function replaceUser1() {
-    // Do not replace the user from our dump.
-  }
-
 }
diff --git a/core/modules/system/src/Tests/Update/UpdatePathTestJavaScriptTest.php b/core/modules/system/src/Tests/Update/UpdatePathTestJavaScriptTest.php
deleted file mode 100644
index f3c82d0..0000000
--- a/core/modules/system/src/Tests/Update/UpdatePathTestJavaScriptTest.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\system\Tests\Update\UpdatePathTestJavaScriptTest.php
- */
-
-namespace Drupal\system\Tests\Update;
-
-/**
- * Tests the presence of JavaScript at update.php.
- *
- * @group Update
- */
-class UpdatePathTestJavaScriptTest extends UpdatePathTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setDatabaseDumpFiles() {
-    $this->databaseDumpFiles = [
-      __DIR__ . '/../../../tests/fixtures/update/drupal-8.bare.standard.php.gz',
-    ];
-  }
-
-  /**
-   * Test JavaScript loading at update.php.
-   *
-   * @see ::doPreUpdateTests
-   */
-  public function testJavaScriptLoading() {
-    $this->runUpdates();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function doSelectionTest() {
-    // Ensure that at least one JS script has drupalSettings in there.
-    $scripts = $this->xpath('//script');
-    $found = FALSE;
-    foreach ($scripts as $script) {
-      if (!isset($script['src'])) {
-        continue;
-      }
-      $src = (string) $script['src'];
-      $file_content = file_get_contents($src);
-
-      if (strpos($file_content, 'window.drupalSettings =') !== FALSE) {
-        $found = TRUE;
-        break;
-      }
-    }
-
-    $this->assertTrue($found, 'Ensure that the drupalSettingsLoader.js was included in the JS files');
-  }
-
-}
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 86365a9..ce06b7a 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -50,22 +50,6 @@ function system_requirements($phase) {
         'weight' => -9
       );
     }
-
-    // Warn if any experimental modules are installed.
-    $experimental = array();
-    $enabled_modules = system_rebuild_module_data();
-    foreach ($enabled_modules as $module => $data) {
-      if ($data->info['package'] === 'Core (Experimental)') {
-        $experimental[$module] = $data->info['name'];
-      }
-    }
-    if (!empty($experimental)) {
-      $requirements['experimental'] = array(
-        'title' => t('Experimental modules enabled'),
-        'value' => t('Experimental modules found: %module_list. Experimental modules are provided for testing purposes only. Use at your own risk.', array('%module_list' => implode(', ', $experimental))),
-        'severity' => REQUIREMENT_WARNING,
-      );
-    }
   }
 
   // Web server information.
@@ -1170,11 +1154,6 @@ function system_schema() {
 }
 
 /**
- * @addtogroup updates-8.0.0-beta
- * @{
- */
-
-/*
  * Change two fields on the default menu link storage to be serialized data.
  */
 function system_update_8001(&$sandbox = NULL) {
@@ -1183,26 +1162,6 @@ function system_update_8001(&$sandbox = NULL) {
   if ($schema->tableExists('menu_tree')) {
 
     if (!isset($sandbox['current'])) {
-      // Converting directly to blob can cause problems with reading out and
-      // serializing the string data later on postgres, so rename the existing
-      // columns and create replacement ones to hold the serialized objects.
-      $old_fields = array(
-        'title' => array(
-          'description' => 'The text displayed for the link.',
-          'type' => 'varchar',
-          'length' => 255,
-          'not null' => TRUE,
-          'default' => '',
-        ),
-        'description' => array(
-          'description' => 'The description of this link - used for admin pages and title attribute.',
-          'type' => 'text',
-          'not null' => FALSE,
-        ),
-      );
-      foreach ($old_fields as $name => $spec) {
-        $schema->changeField('menu_tree', $name, 'system_update_8001_' . $name, $spec);
-      }
       $spec = array(
         'description' => 'The title for the link. May be a serialized TranslationWrapper.',
         'type' => 'blob',
@@ -1210,7 +1169,7 @@ function system_update_8001(&$sandbox = NULL) {
         'not null' => FALSE,
         'serialize' => TRUE,
       );
-      $schema->addField('menu_tree', 'title', $spec);
+      $schema->changeField('menu_tree', 'title', 'title', $spec);
       $spec = array(
         'description' => 'The description of this link - used for admin pages and title attribute.',
         'type' => 'blob',
@@ -1218,14 +1177,14 @@ function system_update_8001(&$sandbox = NULL) {
         'not null' => FALSE,
         'serialize' => TRUE,
       );
-      $schema->addField('menu_tree', 'description', $spec);
+      $schema->changeField('menu_tree', 'description', 'description', $spec);
 
       $sandbox['current'] = 0;
       $sandbox['max'] = $database->query('SELECT COUNT(mlid) FROM {menu_tree}')
         ->fetchField();
     }
 
-    $menu_links = $database->queryRange('SELECT mlid, system_update_8001_title AS title, system_update_8001_description AS description FROM {menu_tree} ORDER BY mlid ASC', $sandbox['current'], $sandbox['current'] + 50)
+    $menu_links = $database->queryRange('SELECT mlid, title, description FROM {menu_tree} ORDER BY mlid ASC', $sandbox['current'], $sandbox['current'] + 50)
       ->fetchAllAssoc('mlid');
 
     foreach ($menu_links as $menu_link) {
@@ -1246,10 +1205,8 @@ function system_update_8001(&$sandbox = NULL) {
 
     if ($sandbox['#finished'] >= 1) {
       // Drop unnecessary fields from {menu_tree}.
-      $schema->dropField('menu_tree', 'system_update_8001_title');
       $schema->dropField('menu_tree', 'title_arguments');
       $schema->dropField('menu_tree', 'title_context');
-      $schema->dropField('menu_tree', 'system_update_8001_description');
     }
     return t('Menu links converted');
   }
@@ -1311,179 +1268,3 @@ function system_update_8004() {
     $manager->updateEntityType($manager->getEntityType($entity_type_id));
   }
 }
-
-/**
- * Place local actions and tasks blocks in every theme.
- */
-function system_update_8005() {
-  // When block module is not installed, there is nothing that could be done
-  // except showing a warning.
-  if (!\Drupal::moduleHandler()->moduleExists('block')) {
-    return t('Block module is not enabled so local actions and tasks which have been converted to blocks, are not visible anymore.');
-  }
-  $config_factory = \Drupal::configFactory();
-  /** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
-  $theme_handler = \Drupal::service('theme_handler');
-  $custom_themes_installed = FALSE;
-  $message = NULL;
-  $langcode = \Drupal::service('language_manager')->getCurrentLanguage()->getId();
-
-  $local_actions_default_settings = [
-    'plugin' => 'local_actions_block',
-    'region' => 'content',
-    'settings.label' => 'Primary admin actions',
-    'settings.label_display' => 0,
-    'settings.cache.max_age' => 0,
-    'visibility' => [],
-    'weight' => 0,
-    'langcode' => $langcode,
-  ];
-  $tabs_default_settings = [
-    'plugin' => 'local_tasks_block',
-    'region' => 'content',
-    'settings.label' => 'Tabs',
-    'settings.label_display' => 0,
-    'settings.cache.max_age' => 0,
-    'visibility' => [],
-    'weight' => 0,
-    'langcode' => $langcode,
-  ];
-  foreach ($theme_handler->listInfo() as $theme) {
-    $theme_name = $theme->getName();
-    switch ($theme_name) {
-      case 'bartik':
-        $name = 'block.block.bartik_local_actions';
-        $values = [
-          'id' => 'bartik_local_actions',
-          'weight' => -1,
-        ] + $local_actions_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-
-        $name = 'block.block.bartik_local_tasks';
-        $values = [
-          'id' => 'bartik_local_tasks',
-          'weight' => -7,
-        ] + $tabs_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-
-        // Help region has been removed so all the blocks inside has to be moved
-        // to content region.
-        $weight = -6;
-        $blocks = [];
-        foreach ($config_factory->listAll('block.block.') as $block_config) {
-          $block = $config_factory->getEditable($block_config);
-          if ($block->get('theme') == 'bartik' && $block->get('region') == 'help') {
-            $blocks[] = $block;
-          }
-        }
-        // Sort blocks by block weight.
-        uasort($blocks, function ($a, $b) {
-          return $a->get('weight') - $b->get('weight');
-        });
-        // Move blocks to content region and set them in right order by their
-        // weight.
-        foreach ($blocks as $block) {
-          $block->set('region', 'content');
-          $block->set('weight', $weight++);
-          $block->save();
-        }
-        break;
-
-      case 'seven':
-        $name = 'block.block.seven_local_actions';
-          $values = [
-            'id' => 'seven_local_actions',
-            'weight' => -10,
-          ] + $local_actions_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-
-        $name = 'block.block.seven_primary_local_tasks';
-        $values = [
-          'region' => 'header',
-          'id' => 'seven_primary_local_tasks',
-          'settings.label' => 'Primary tabs',
-          'settings.primary' => TRUE,
-          'settings.secondary' => FALSE,
-        ] + $tabs_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-
-        $values = [
-          'region' => 'pre_content',
-          'id' => 'seven_secondary_local_tasks',
-          'settings.label' => 'Secondary tabs',
-          'settings.primary' => FALSE,
-          'settings.secondary' => TRUE,
-        ] + $tabs_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-        break;
-
-      case 'stark':
-        $name = 'block.block.stark_local_actions';
-        $values = [
-          'id' => 'stark_local_actions',
-        ] + $local_actions_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-
-        $name = 'block.block.stark_local_tasks';
-        $values = [
-          'id' => 'stark_local_tasks',
-        ] + $tabs_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-        break;
-
-      case 'classy':
-        // Don't place any blocks or trigger custom themes installed warning.
-        break;
-
-      default:
-        $custom_themes_installed = TRUE;
-        $name = sprintf('block.block.%s_local_actions', $theme_name);
-        $values = [
-          'id' => sprintf('%s_local_actions', $theme_name),
-          'weight' => -10,
-        ] + $local_actions_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-
-        $name = sprintf('block.block.%s_local_tasks', $theme_name);
-        $values = [
-          'id' => sprintf('%s_local_tasks', $theme_name),
-          'weight' => -20,
-        ] + $tabs_default_settings;
-        _system_update_create_block($name, $theme_name, $values);
-        break;
-    }
-  }
-
-  if ($custom_themes_installed) {
-    $message = t('Because your site has custom theme(s) installed, we had to set local actions and tasks blocks into the content region. Please manually review the block configurations and remove the removed variables from your templates.');
-  }
-
-  return $message;
-}
-
-/**
- * Helper function to create block configuration objects for the update.
- *
- * @param string $name
- *   The name of the config object.
- * @param string $theme_name
- *   The name of the theme the block is associated with.
- * @param array $values
- *   The block config values.
- */
-function _system_update_create_block($name, $theme_name, array $values) {
-  if (!\Drupal::service('config.storage')->exists($name)) {
-    $block = \Drupal::configFactory()->getEditable($name);
-    $values['uuid'] = \Drupal::service('uuid')->generate();
-    $values['theme'] = $theme_name;
-    $values['dependencies.theme'] = [$theme_name];
-    foreach ($values as $key => $value) {
-      $block->set($key, $value);
-    }
-    $block->save();
-  }
-}
-
-/**
- * @} End of "addtogroup updates-8.0.0-beta".
- */
diff --git a/core/modules/system/templates/block--local-actions-block.html.twig b/core/modules/system/templates/block--local-actions-block.html.twig
deleted file mode 100644
index 65d57be..0000000
--- a/core/modules/system/templates/block--local-actions-block.html.twig
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "@block/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/modules/system/templates/field.html.twig b/core/modules/system/templates/field.html.twig
index babc512..1b78574 100644
--- a/core/modules/system/templates/field.html.twig
+++ b/core/modules/system/templates/field.html.twig
@@ -1,7 +1,7 @@
 {#
 /**
  * @file
- * Default theme implementation for a field.
+ * 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
@@ -33,9 +33,8 @@
  * - field_type: The type of the field.
  * - label_display: The display settings for the label.
  *
- * @see template_preprocess_field()
  *
- * @ingroup themeable
+ * @see template_preprocess_field()
  */
 #}
 
diff --git a/core/modules/system/templates/page.html.twig b/core/modules/system/templates/page.html.twig
index b80310e..c5a3711 100644
--- a/core/modules/system/templates/page.html.twig
+++ b/core/modules/system/templates/page.html.twig
@@ -32,6 +32,10 @@
  * - title_suffix: Additional output populated by modules, intended to be
  *   displayed after the main title tag that appears in the template.
  * - messages: Status and error messages. Should be displayed prominently.
+ * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
+ *   view and edit tabs when displaying a node).
+ * - action_links: Actions local to the page, such as "Add menu" on the menu
+ *   administration interface.
  * - 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
@@ -106,6 +110,13 @@
         <h1>{{ title }}</h1>
       {% endif %}
       {{ title_suffix }}
+
+      {{ tabs }}
+
+      {% if action_links %}
+        <nav class="action-links">{{ action_links }}</nav>
+      {% endif %}
+
       {{ page.content }}
     </div>{# /.layout-content #}
 
diff --git a/core/modules/system/tests/fixtures/update/block.block.testfor507488.yml b/core/modules/system/tests/fixtures/update/block.block.testfor507488.yml
deleted file mode 100644
index a8b79fd..0000000
--- a/core/modules/system/tests/fixtures/update/block.block.testfor507488.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-uuid: ee7c230c-337b-4e8f-8600-d65bfd34f171
-langcode: en
-status: true
-dependencies:
-  theme:
-    - seven
-id: seven_local_actions
-theme: seven
-region: content
-weight: -10
-provider: null
-plugin: local_actions_block
-settings:
-  id: local_actions_block
-  label: 'Primary admin actions'
-  label_display: '0'
-  cache:
-    max_age: 0
-  status: true
-visibility: {  }
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.local-actions-tasks-into-blocks-507488.php b/core/modules/system/tests/fixtures/update/drupal-8.local-actions-tasks-into-blocks-507488.php
deleted file mode 100644
index 986362f..0000000
--- a/core/modules/system/tests/fixtures/update/drupal-8.local-actions-tasks-into-blocks-507488.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains database additions to drupal-8.bare.standard.php.gz for testing the
- * upgrade path of https://www.drupal.org/node/507488.
- */
-
-use Drupal\Core\Database\Database;
-
-$connection = Database::getConnection();
-
-// Structure of a custom block with visibility settings.
-$block_configs[] = \Drupal\Component\Serialization\Yaml::decode(file_get_contents(__DIR__ . '/block.block.testfor507488.yml'));
-
-foreach ($block_configs as $block_config) {
-  $connection->insert('config')
-    ->fields([
-      'collection',
-      'name',
-      'data',
-    ])
-    ->values([
-      'collection' => '',
-      'name' => 'block.block.' . $block_config['id'],
-      'data' => serialize($block_config),
-    ])
-    ->execute();
-}
-
-// Update the config entity query "index".
-$existing_blocks = $connection->select('key_value')
-    ->fields('key_value', ['value'])
-    ->condition('collection', 'config.entity.key_store.block')
-    ->condition('name', 'theme:seven')
-    ->execute()
-    ->fetchField();
-$existing_blocks = unserialize($existing_blocks);
-
-$connection->update('key_value')
-  ->fields([
-    'value' => serialize(array_merge($existing_blocks, ['block.block.seven_local_actions']))
-  ])
-  ->condition('collection', 'config.entity.key_store.block')
-  ->condition('name', 'theme:seven')
-  ->execute();
-
-// Enable test theme.
-$extensions = $connection->select('config')
-  ->fields('config', ['data'])
-  ->condition('name', 'core.extension')
-  ->execute()
-  ->fetchField();
-$extensions = unserialize($extensions);
-$connection->update('config')
-  ->fields([
-    'data' => serialize(array_merge_recursive($extensions, ['theme' => ['test_theme' => 0]]))
-  ])
-  ->condition('name', 'core.extension')
-  ->execute();
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php
index 41ce146..59a2648 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php
@@ -23,6 +23,7 @@
  *   },
  *   base_table = "entity_test_update",
  *   revision_table = "entity_test_update_revision",
+ *   fieldable = TRUE,
  *   persistent_cache = FALSE,
  *   entity_keys = {
  *     "id" = "id",
diff --git a/core/modules/system/tests/modules/menu_test/menu_test.module b/core/modules/system/tests/modules/menu_test/menu_test.module
index 60c926f..429b357 100644
--- a/core/modules/system/tests/modules/menu_test/menu_test.module
+++ b/core/modules/system/tests/modules/menu_test/menu_test.module
@@ -27,9 +27,9 @@ function menu_test_menu_links_discovered_alter(&$links) {
 }
 
 /**
- * Implements hook_menu_local_tasks_alter().
+ * Implements hook_menu_local_tasks().
  */
-function menu_test_menu_local_tasks_alter(&$data, $route_name) {
+function menu_test_menu_local_tasks(&$data, $route_name) {
   if (in_array($route_name, array('menu_test.tasks_default'))) {
     $data['tabs'][0]['foo'] = array(
       '#theme' => 'menu_local_task',
@@ -51,6 +51,32 @@ function menu_test_menu_local_tasks_alter(&$data, $route_name) {
 }
 
 /**
+ * Implements hook_menu_local_tasks_alter().
+ *
+ * If the menu_test.settings configuration 'tasks.alter' has been set, adds
+ * several local tasks to menu-test/tasks.
+ */
+function menu_test_menu_local_tasks_alter(&$data, $route_name) {
+  if (!\Drupal::config('menu_test.settings')->get('tasks.alter')) {
+    return;
+  }
+  if (in_array($route_name, array('menu_test.tasks_default', 'menu_test.tasks_empty', 'menu_test.tasks_tasks'))) {
+    // Rename the default local task from 'View' to 'Show'.
+    // $data['tabs'] is expected to be keyed by link hrefs.
+    // The default local task always links to its parent path, which means that
+    // if the tab root path appears as key in $data['tabs'], then that key is
+    // the default local task.
+    $key = $route_name . '_tab';
+    if (isset($data['tabs'][0][$key])) {
+      $data['tabs'][0][$key]['#link']['title'] = 'Show it';
+    }
+    // Rename the 'foo' task to "Advanced settings" and put it last.
+    $data['tabs'][0]['foo']['#link']['title'] = 'Advanced settings';
+    $data['tabs'][0]['foo']['#weight'] = 110;
+  }
+}
+
+/**
  * Page callback: Tests the theme negotiation functionality.
  *
  * @param bool $inherited
diff --git a/core/modules/system/tests/modules/test_page_test/test_page_test.links.menu.yml b/core/modules/system/tests/modules/test_page_test/test_page_test.links.menu.yml
index 1150688..291fd70 100644
--- a/core/modules/system/tests/modules/test_page_test/test_page_test.links.menu.yml
+++ b/core/modules/system/tests/modules/test_page_test/test_page_test.links.menu.yml
@@ -2,7 +2,3 @@ test_page_test.test_page:
   route_name: test_page_test.test_page
   title: 'Test front page link'
   weight: 0
-test_page_test.front_page:
-  title: 'Home'
-  route_name: '<front>'
-  menu_name: main
diff --git a/core/modules/taxonomy/src/Tests/TermTest.php b/core/modules/taxonomy/src/Tests/TermTest.php
index 9d06719..3af85d8 100644
--- a/core/modules/taxonomy/src/Tests/TermTest.php
+++ b/core/modules/taxonomy/src/Tests/TermTest.php
@@ -35,22 +35,8 @@ class TermTest extends TaxonomyTestBase {
    */
   protected $field;
 
-  /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block'];
-
-  /**
-   * {@inheritdoc}
-   */
   protected function setUp() {
     parent::setUp();
-
-    $this->drupalPlaceBlock('local_actions_block');
-    $this->drupalPlaceBlock('local_tasks_block');
-
     $this->drupalLogin($this->drupalCreateUser(['administer taxonomy', 'bypass node access']));
     $this->vocabulary = $this->createVocabulary();
 
@@ -322,7 +308,10 @@ function testTermInterface() {
     // Submitting a term takes us to the add page; we need the List page.
     $this->drupalGet('admin/structure/taxonomy/manage/' . $this->vocabulary->id() . '/overview');
 
-    $this->clickLink(t('Edit'));
+    // Test edit link as accessed from Taxonomy administration pages.
+    // Because Simpletest creates its own database when running tests, we know
+    // the first edit link found on the listing page is to our term.
+    $this->clickLink(t('Edit'), 1);
 
     $this->assertRaw($edit['name[0][value]'], 'The randomly generated term name is present.');
     $this->assertText($edit['description[0][value]'], 'The randomly generated term description is present.');
diff --git a/core/modules/taxonomy/src/Tests/VocabularyUiTest.php b/core/modules/taxonomy/src/Tests/VocabularyUiTest.php
index 029e99d..3a34c2e 100644
--- a/core/modules/taxonomy/src/Tests/VocabularyUiTest.php
+++ b/core/modules/taxonomy/src/Tests/VocabularyUiTest.php
@@ -29,7 +29,6 @@ protected function setUp() {
     parent::setUp();
     $this->drupalLogin($this->drupalCreateUser(['administer taxonomy']));
     $this->vocabulary = $this->createVocabulary();
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/tour/src/Tests/TourTest.php b/core/modules/tour/src/Tests/TourTest.php
index d0acf45..8ed261c 100644
--- a/core/modules/tour/src/Tests/TourTest.php
+++ b/core/modules/tour/src/Tests/TourTest.php
@@ -21,7 +21,7 @@ class TourTest extends TourTestBasic {
    *
    * @var array
    */
-  public static $modules = ['block', 'tour', 'locale', 'language', 'tour_test'];
+  public static $modules = array('tour', 'locale', 'language', 'tour_test');
 
   /**
    * The permissions required for a logged in user to test tour tips.
@@ -42,18 +42,6 @@ class TourTest extends TourTestBasic {
   );
 
   /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_actions_block', [
-      'theme' => 'seven',
-      'region' => 'content'
-    ]);
-  }
-
-  /**
    * Test tour functionality.
    */
   public function testTourFunctionality() {
diff --git a/core/modules/tracker/src/Tests/TrackerTest.php b/core/modules/tracker/src/Tests/TrackerTest.php
index d8da6e8..246e163 100644
--- a/core/modules/tracker/src/Tests/TrackerTest.php
+++ b/core/modules/tracker/src/Tests/TrackerTest.php
@@ -32,7 +32,7 @@ class TrackerTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'comment', 'tracker', 'history', 'node_test'];
+  public static $modules = array('comment', 'tracker', 'history', 'node_test');
 
   /**
    * The main user for testing.
@@ -61,8 +61,6 @@ protected function setUp() {
       'access content',
       'access user profiles',
     ));
-    $this->drupalPlaceBlock('local_tasks_block', ['id' => 'page_tabs_block']);
-    $this->drupalPlaceBlock('local_actions_block', ['id' => 'page_actions_block']);
   }
 
   /**
@@ -86,22 +84,10 @@ function testTrackerAll() {
     $this->assertLink(t('My recent content'), 0, 'User tab shows up on the global tracker page.');
 
     // Assert cache contexts, specifically the pager and node access contexts.
-    $this->assertCacheContexts(['languages:language_interface', 'route.name', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user.node_grants:view', 'user']);
-    // Assert cache tags for the action/tabs blocks, visible node, and node list
-    // cache tag.
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user.node_grants:view', 'user.permissions', 'user.roles:authenticated']);
+    // Assert cache tags for the visible node and node list cache tag.
     $expected_tags = Cache::mergeTags($published->getCacheTags(), $published->getOwner()->getCacheTags());
-    $block_tags = [
-      'block_view',
-      'config:block.block.page_actions_block',
-      'config:block.block.page_tabs_block',
-      'config:block_list',
-    ];
-    $expected_tags = Cache::mergeTags($expected_tags, $block_tags);
-    $additional_tags = [
-      'node_list',
-      'rendered',
-    ];
-    $expected_tags = Cache::mergeTags($expected_tags, $additional_tags);
+    $expected_tags = Cache::mergeTags($expected_tags, ['node_list', 'rendered']);
     $this->assertCacheTags($expected_tags);
 
     // Delete a node and ensure it no longer appears on the tracker.
@@ -164,27 +150,16 @@ function testTrackerUser() {
     $this->assertText($other_published_my_comment->label(), "Nodes that the user has commented on appear in the user's tracker listing.");
 
     // Assert cache contexts.
-    $this->assertCacheContexts(['languages:language_interface', 'route.name', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
     // Assert cache tags for the visible nodes (including owners) and node list
     // cache tag.
     $expected_tags = Cache::mergeTags($my_published->getCacheTags(), $my_published->getOwner()->getCacheTags());
     $expected_tags = Cache::mergeTags($expected_tags, $other_published_my_comment->getCacheTags());
     $expected_tags = Cache::mergeTags($expected_tags, $other_published_my_comment->getOwner()->getCacheTags());
-    $block_tags = [
-      'block_view',
-      'config:block.block.page_actions_block',
-      'config:block.block.page_tabs_block',
-      'config:block_list',
-    ];
-    $expected_tags = Cache::mergeTags($expected_tags, $block_tags);
-    $additional_tags = [
-      'node_list',
-      'rendered',
-    ];
-    $expected_tags = Cache::mergeTags($expected_tags, $additional_tags);
+    $expected_tags = Cache::mergeTags($expected_tags, ['node_list', 'rendered']);
 
     $this->assertCacheTags($expected_tags);
-    $this->assertCacheContexts(['languages:language_interface', 'route.name', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
 
     $this->assertLink($my_published->label());
     $this->assertNoLink($unpublished->label());
diff --git a/core/modules/update/src/Tests/UpdateCoreTest.php b/core/modules/update/src/Tests/UpdateCoreTest.php
index b105780..aef7c5e 100644
--- a/core/modules/update/src/Tests/UpdateCoreTest.php
+++ b/core/modules/update/src/Tests/UpdateCoreTest.php
@@ -22,13 +22,12 @@ class UpdateCoreTest extends UpdateTestBase {
    *
    * @var array
    */
-  public static $modules = ['update_test', 'update', 'language', 'block'];
+  public static $modules = array('update_test', 'update', 'language');
 
   protected function setUp() {
     parent::setUp();
     $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer modules', 'administer themes'));
     $this->drupalLogin($admin_user);
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
   /**
diff --git a/core/modules/user/src/Plugin/views/argument/RolesRid.php b/core/modules/user/src/Plugin/views/argument/RolesRid.php
index d795419..7fd209d 100644
--- a/core/modules/user/src/Plugin/views/argument/RolesRid.php
+++ b/core/modules/user/src/Plugin/views/argument/RolesRid.php
@@ -56,7 +56,7 @@ public static function create(ContainerInterface $container, array $configuratio
   /**
    * {@inheritdoc}
    */
-  public function titleQuery() {
+  public function title_query() {
     $entities = $this->roleStorage->loadMultiple($this->value);
     $titles = array();
     foreach ($entities as $entity) {
diff --git a/core/modules/user/src/Tests/UserRoleAdminTest.php b/core/modules/user/src/Tests/UserRoleAdminTest.php
index a01c01e..455d6f7 100644
--- a/core/modules/user/src/Tests/UserRoleAdminTest.php
+++ b/core/modules/user/src/Tests/UserRoleAdminTest.php
@@ -25,20 +25,9 @@ class UserRoleAdminTest extends WebTestBase {
    */
   protected $adminUser;
 
-  /**
-   * Modules to enable.
-   *
-   * @var string[]
-   */
-  public static $modules = ['block'];
-
-  /**
-   * {@inheritdoc}
-   */
   protected function setUp() {
     parent::setUp();
     $this->adminUser = $this->drupalCreateUser(array('administer permissions', 'administer users'));
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
diff --git a/core/modules/user/src/Tests/Views/RolesRidArgumentTest.php b/core/modules/user/src/Tests/Views/RolesRidArgumentTest.php
deleted file mode 100644
index 642a691..0000000
--- a/core/modules/user/src/Tests/Views/RolesRidArgumentTest.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\user\Tests\Views\RolesRidArgumentTest.
- */
-
-namespace Drupal\user\Tests\Views;
-
-/**
- * Tests the handler of the user: roles argument.
- *
- * @group user
- * @see \Drupal\user\Plugin\views\argument\RolesRid
- */
-class RolesRidArgumentTest extends UserTestBase {
-
-  /**
-   * Views used by this test.
-   *
-   * @var array
-   */
-  public static $testViews = array('test_user_roles_rid');
-
-  /**
-   * Tests the generated title of a user: roles argument.
-   */
-  public function testArgumentTitle() {
-    $role_id = $this->createRole([], 'markup_role_name', '<em>Role name with markup</em>');
-    $user = $this->createUser();
-    $user->addRole($role_id);
-    $user->save();
-
-    $this->drupalGet('/user_roles_rid_test/markup_role_name');
-    $this->assertEscaped('<em>Role name with markup</em>');
-  }
-
-}
diff --git a/core/modules/user/src/UserViewsData.php b/core/modules/user/src/UserViewsData.php
index c71b2ac..cc24f2e 100644
--- a/core/modules/user/src/UserViewsData.php
+++ b/core/modules/user/src/UserViewsData.php
@@ -245,7 +245,7 @@ public function getViewsData() {
         'allow empty' => TRUE,
       ),
       'argument' => array(
-        'id' => 'user__roles_rid',
+        'id' => 'user__roles_target_id',
         'name table' => 'role',
         'name field' => 'name',
         'empty field name' => t('No role'),
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_roles_rid.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_roles_rid.yml
deleted file mode 100644
index 71c0a4d..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_roles_rid.yml
+++ /dev/null
@@ -1,220 +0,0 @@
-langcode: en
-status: true
-dependencies:
-  module:
-    - user
-id: test_user_roles_rid
-label: test_user_roles_rid
-module: views
-description: ''
-tag: ''
-base_table: users_field_data
-base_field: uid
-core: 8.x
-display:
-  default:
-    display_plugin: default
-    id: default
-    display_title: Master
-    position: 0
-    display_options:
-      access:
-        type: none
-        options: {  }
-      cache:
-        type: tag
-        options: {  }
-      query:
-        type: views_query
-        options:
-          disable_sql_rewrite: false
-          distinct: false
-          replica: false
-          query_comment: ''
-          query_tags: {  }
-      exposed_form:
-        type: basic
-        options:
-          submit_button: Apply
-          reset_button: false
-          reset_button_label: Reset
-          exposed_sorts_label: 'Sort by'
-          expose_sort_order: true
-          sort_asc_label: Asc
-          sort_desc_label: Desc
-      pager:
-        type: full
-        options:
-          items_per_page: 10
-          offset: 0
-          id: 0
-          total_pages: null
-          expose:
-            items_per_page: false
-            items_per_page_label: 'Items per page'
-            items_per_page_options: '5, 10, 25, 50'
-            items_per_page_options_all: false
-            items_per_page_options_all_label: '- All -'
-            offset: false
-            offset_label: Offset
-          tags:
-            previous: '‹ previous'
-            next: 'next ›'
-            first: '« first'
-            last: 'last »'
-          quantity: 9
-      style:
-        type: default
-        options:
-          grouping: {  }
-          row_class: ''
-          default_row_class: true
-          uses_fields: false
-      row:
-        type: fields
-        options:
-          inline: {  }
-          separator: ''
-          hide_empty: false
-          default_field_elements: true
-      fields:
-        name:
-          id: name
-          table: users_field_data
-          field: name
-          entity_type: user
-          entity_field: name
-          label: ''
-          alter:
-            alter_text: false
-            make_link: false
-            absolute: false
-            trim: false
-            word_boundary: false
-            ellipsis: false
-            strip_tags: false
-            html: false
-          hide_empty: false
-          empty_zero: false
-          plugin_id: field
-          relationship: none
-          group_type: group
-          admin_label: ''
-          exclude: false
-          element_type: ''
-          element_class: ''
-          element_label_type: ''
-          element_label_class: ''
-          element_label_colon: true
-          element_wrapper_type: ''
-          element_wrapper_class: ''
-          element_default_classes: true
-          empty: ''
-          hide_alter_empty: true
-          click_sort_column: value
-          type: user_name
-          settings: {  }
-          group_column: value
-          group_columns: {  }
-          group_rows: true
-          delta_limit: 0
-          delta_offset: 0
-          delta_reversed: false
-          delta_first_last: false
-          multi_type: separator
-          separator: ', '
-          field_api_classes: false
-      filters:
-        status:
-          value: true
-          table: users_field_data
-          field: status
-          plugin_id: boolean
-          entity_type: user
-          entity_field: status
-          id: status
-          expose:
-            operator: ''
-          group: 1
-      sorts:
-        uid:
-          id: uid
-          table: users
-          field: uid
-          relationship: none
-          group_type: group
-          admin_label: ''
-          order: ASC
-          exposed: false
-          expose:
-            label: ''
-          entity_type: user
-          entity_field: uid
-          plugin_id: standard
-      header: {  }
-      footer: {  }
-      empty: {  }
-      relationships: {  }
-      arguments:
-        roles_target_id:
-          id: roles_target_id
-          table: user__roles
-          field: roles_target_id
-          relationship: none
-          group_type: group
-          admin_label: ''
-          default_action: empty
-          exception:
-            value: all
-            title_enable: false
-            title: All
-          title_enable: true
-          title: '%1'
-          default_argument_type: fixed
-          default_argument_options:
-            argument: ''
-          default_argument_skip_url: false
-          summary_options:
-            base_path: ''
-            count: true
-            items_per_page: 25
-            override: false
-          summary:
-            sort_order: asc
-            number_of_records: 0
-            format: default_summary
-          specify_validation: false
-          validate:
-            type: none
-            fail: 'not found'
-          validate_options: {  }
-          break_phrase: false
-          add_table: false
-          require_value: false
-          reduce_duplicates: false
-          plugin_id: user__roles_rid
-      display_extenders: {  }
-    cache_metadata:
-      contexts:
-        - 'languages:language_content'
-        - 'languages:language_interface'
-        - url
-        - url.query_args
-        - user.permissions
-      cacheable: false
-  page_1:
-    display_plugin: page
-    id: page_1
-    display_title: Page
-    position: 1
-    display_options:
-      display_extenders: {  }
-      path: user_roles_rid_test
-    cache_metadata:
-      contexts:
-        - 'languages:language_content'
-        - 'languages:language_interface'
-        - url
-        - url.query_args
-        - user.permissions
-      cacheable: false
diff --git a/core/modules/user/tests/src/Unit/Views/Argument/RolesRidTest.php b/core/modules/user/tests/src/Unit/Views/Argument/RolesRidTest.php
index ae3a044..f382579 100644
--- a/core/modules/user/tests/src/Unit/Views/Argument/RolesRidTest.php
+++ b/core/modules/user/tests/src/Unit/Views/Argument/RolesRidTest.php
@@ -72,15 +72,15 @@ public function testTitleQuery() {
     $roles_rid_argument = new RolesRid(array(), 'user__roles_rid', array(), $entity_manager);
 
     $roles_rid_argument->value = array();
-    $titles = $roles_rid_argument->titleQuery();
+    $titles = $roles_rid_argument->title_query();
     $this->assertEquals(array(), $titles);
 
     $roles_rid_argument->value = array('test_rid_1');
-    $titles = $roles_rid_argument->titleQuery();
+    $titles = $roles_rid_argument->title_query();
     $this->assertEquals(array('test rid 1'), $titles);
 
     $roles_rid_argument->value = array('test_rid_1', 'test_rid_2');
-    $titles = $roles_rid_argument->titleQuery();
+    $titles = $roles_rid_argument->title_query();
     $this->assertEquals(array('test rid 1', Html::escape('test <strong>rid 2</strong>')), $titles);
   }
 
diff --git a/core/modules/views/config/schema/views.argument_validator.schema.yml b/core/modules/views/config/schema/views.argument_validator.schema.yml
index 75e3431..af1ebfd 100644
--- a/core/modules/views/config/schema/views.argument_validator.schema.yml
+++ b/core/modules/views/config/schema/views.argument_validator.schema.yml
@@ -36,6 +36,3 @@ views.argument_validator_entity:
     multiple:
       type: integer
       label: 'Multiple arguments'
-
-views.argument_validator.entity:*:
-  type: views.argument_validator_entity
diff --git a/core/modules/views/src/Tests/Plugin/DisplayPageWebTest.php b/core/modules/views/src/Tests/Plugin/DisplayPageWebTest.php
index 8bc8bc3..be85795 100644
--- a/core/modules/views/src/Tests/Plugin/DisplayPageWebTest.php
+++ b/core/modules/views/src/Tests/Plugin/DisplayPageWebTest.php
@@ -33,14 +33,10 @@ class DisplayPageWebTest extends PluginTestBase {
    */
   public static $modules = ['menu_ui', 'block', 'views_ui'];
 
-  /**
-   * {@inheritdoc}
-   */
   protected function setUp() {
     parent::setUp();
 
     $this->enableViewsTestModule();
-    $this->drupalPlaceBlock('local_tasks_block');
   }
 
   /**
@@ -57,7 +53,7 @@ public function testArguments() {
 
     $this->drupalGet('test_route_with_argument/1');
     $this->assertResponse(200);
-    $this->assertCacheContexts(['languages:language_interface', 'route.name', 'theme', 'url']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url']);
     $result = $this->xpath('//span[@class="field-content"]');
     $this->assertEqual(count($result), 1, 'Ensure that just the filtered entry was returned.');
     $this->assertEqual((string) $result[0], 1, 'The passed ID was returned.');
diff --git a/core/modules/views/src/Tests/Wizard/WizardTestBase.php b/core/modules/views/src/Tests/Wizard/WizardTestBase.php
index 7d8d9c0..f610a5f 100644
--- a/core/modules/views/src/Tests/Wizard/WizardTestBase.php
+++ b/core/modules/views/src/Tests/Wizard/WizardTestBase.php
@@ -27,7 +27,6 @@ protected function setUp() {
     // Create and log in a user with administer views permission.
     $views_admin = $this->drupalCreateUser(array('administer views', 'administer blocks', 'bypass node access', 'access user profiles', 'view all revisions'));
     $this->drupalLogin($views_admin);
-    $this->drupalPlaceBlock('local_actions_block');
   }
 
 }
diff --git a/core/modules/views_ui/src/Tests/SettingsTest.php b/core/modules/views_ui/src/Tests/SettingsTest.php
index f2df1ee..262fc7a 100644
--- a/core/modules/views_ui/src/Tests/SettingsTest.php
+++ b/core/modules/views_ui/src/Tests/SettingsTest.php
@@ -22,14 +22,6 @@ class SettingsTest extends UITestBase {
   protected $adminUser;
 
   /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-    $this->drupalPlaceBlock('local_tasks_block');
-  }
-
-  /**
    * Tests the settings for the edit ui.
    */
   function testEditUI() {
diff --git a/core/modules/views_ui/src/Tests/ViewsListTest.php b/core/modules/views_ui/src/Tests/ViewsListTest.php
index 4fcf223..cc49bfd 100644
--- a/core/modules/views_ui/src/Tests/ViewsListTest.php
+++ b/core/modules/views_ui/src/Tests/ViewsListTest.php
@@ -23,35 +23,19 @@ class ViewsListTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('block', 'views_ui');
-
-  /**
-   * A user with permission to administer views.
-   *
-   * @var \Drupal\user\Entity\User
-   */
-  protected $adminUser;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->drupalPlaceBlock('local_tasks_block');
-    $this->drupalPlaceBlock('local_actions_block');
-    $this->adminUser = $this->drupalCreateUser(['administer views']);
-    $this->drupalLogin($this->adminUser);
-  }
+  public static $modules = array('views_ui');
 
   /**
    * Tests that the views list does not use a pager.
    */
   public function testViewsListLimit() {
+    // Login.
+    $user = $this->createUser(['administer views']);
+    $this->drupalLogin($user);
+
     // Check if we can access the main views admin page.
     $this->drupalGet('admin/structure/views');
-    $this->assertResponse(200);
-    $this->assertLink(t('Add new view'));
+    $this->assertText(t('Add new view'));
 
     // Count default views to be subtracted from the limit.
     $views = count(Views::getEnabledViews());
diff --git a/core/profiles/minimal/config/install/block.block.stark_local_actions.yml b/core/profiles/minimal/config/install/block.block.stark_local_actions.yml
deleted file mode 100644
index f2dd88b..0000000
--- a/core/profiles/minimal/config/install/block.block.stark_local_actions.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-id: stark_local_actions
-theme: stark
-weight: -10
-status: true
-langcode: en
-region: content
-plugin: local_actions_block
-settings:
-  id: local_actions_block
-  label: Primary admin actions
-  label_display: '0'
-dependencies:
-  theme:
-    - stark
-visibility: {  }
diff --git a/core/profiles/minimal/config/install/block.block.stark_local_tasks.yml b/core/profiles/minimal/config/install/block.block.stark_local_tasks.yml
deleted file mode 100644
index 2d0c5dc..0000000
--- a/core/profiles/minimal/config/install/block.block.stark_local_tasks.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-id: stark_local_tasks
-theme: stark
-weight: -20
-status: true
-langcode: en
-region: content
-plugin: local_tasks_block
-settings:
-  id: local_tasks_block
-  label: Tabs
-  label_display: '0'
-dependencies:
-  theme:
-    - stark
-visibility: {  }
diff --git a/core/profiles/standard/config/install/block.block.bartik_help.yml b/core/profiles/standard/config/install/block.block.bartik_help.yml
index e93a546..88c4f1a 100644
--- a/core/profiles/standard/config/install/block.block.bartik_help.yml
+++ b/core/profiles/standard/config/install/block.block.bartik_help.yml
@@ -1,9 +1,9 @@
 id: bartik_help
 theme: bartik
-weight: -30
+weight: 0
 status: true
 langcode: en
-region: content
+region: help
 plugin: help_block
 settings:
   id: help_block
diff --git a/core/profiles/standard/config/install/block.block.bartik_local_actions.yml b/core/profiles/standard/config/install/block.block.bartik_local_actions.yml
deleted file mode 100644
index c88b8753..0000000
--- a/core/profiles/standard/config/install/block.block.bartik_local_actions.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-id: bartik_local_actions
-theme: bartik
-weight: -20
-status: true
-langcode: en
-region: content
-plugin: local_actions_block
-settings:
-  id: local_actions_block
-  label: Primary admin actions
-  label_display: '0'
-dependencies:
-  theme:
-    - bartik
-visibility: {  }
diff --git a/core/profiles/standard/config/install/block.block.bartik_local_tasks.yml b/core/profiles/standard/config/install/block.block.bartik_local_tasks.yml
deleted file mode 100644
index 1cf88fe..0000000
--- a/core/profiles/standard/config/install/block.block.bartik_local_tasks.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-id: bartik_local_tasks
-theme: bartik
-weight: -40
-status: true
-langcode: en
-region: content
-plugin: local_tasks_block
-settings:
-  id: local_tasks_block
-  label: Tabs
-  label_display: '0'
-dependencies:
-  theme:
-    - bartik
-visibility: {  }
diff --git a/core/profiles/standard/config/install/block.block.seven_local_actions.yml b/core/profiles/standard/config/install/block.block.seven_local_actions.yml
deleted file mode 100644
index 999807f..0000000
--- a/core/profiles/standard/config/install/block.block.seven_local_actions.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-id: seven_local_actions
-theme: seven
-weight: -10
-status: true
-langcode: en
-region: content
-plugin: local_actions_block
-settings:
-  id: local_actions_block
-  label: Primary admin actions
-  label_display: '0'
-dependencies:
-  theme:
-    - seven
-visibility: {  }
diff --git a/core/profiles/standard/config/install/block.block.seven_primary_local_tasks.yml b/core/profiles/standard/config/install/block.block.seven_primary_local_tasks.yml
deleted file mode 100644
index 66e8d7b..0000000
--- a/core/profiles/standard/config/install/block.block.seven_primary_local_tasks.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-id: seven_primary_local_tasks
-theme: seven
-weight: 0
-status: true
-langcode: en
-region: header
-plugin: local_tasks_block
-settings:
-  id: local_tasks_block
-  label: Primary tabs
-  label_display: '0'
-  primary: true
-  secondary: false
-dependencies:
-  theme:
-    - seven
-visibility: {  }
diff --git a/core/profiles/standard/config/install/block.block.seven_secondary_local_tasks.yml b/core/profiles/standard/config/install/block.block.seven_secondary_local_tasks.yml
deleted file mode 100644
index 7824d64..0000000
--- a/core/profiles/standard/config/install/block.block.seven_secondary_local_tasks.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-id: seven_secondary_local_tasks
-theme: seven
-weight: 0
-status: true
-langcode: en
-region: pre_content
-plugin: local_tasks_block
-settings:
-  id: local_tasks_block
-  label: Secondary tabs
-  label_display: '0'
-  primary: false
-  secondary: true
-dependencies:
-  theme:
-    - seven
-visibility: {  }
diff --git a/core/tests/Drupal/Tests/Component/Plugin/DefaultFactoryTest.php b/core/tests/Drupal/Tests/Component/Plugin/DefaultFactoryTest.php
index a23b690..d02deee 100644
--- a/core/tests/Drupal/Tests/Component/Plugin/DefaultFactoryTest.php
+++ b/core/tests/Drupal/Tests/Component/Plugin/DefaultFactoryTest.php
@@ -7,7 +7,11 @@
 
 namespace Drupal\Tests\Component\Plugin;
 
+use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
 use Drupal\Component\Plugin\Factory\DefaultFactory;
+use Drupal\plugin_test\Plugin\plugin_test\fruit\Cherry;
+use Drupal\plugin_test\Plugin\plugin_test\fruit\FruitInterface;
+use Drupal\plugin_test\Plugin\plugin_test\fruit\Kale;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -17,41 +21,110 @@
 class DefaultFactoryTest extends UnitTestCase {
 
   /**
-   * Tests getPluginClass() with a valid plugin.
+   * Tests getPluginClass() with a valid array plugin definition.
+   *
+   * @covers ::getPluginClass
    */
-  public function testGetPluginClassWithValidPlugin() {
-    $plugin_class = 'Drupal\plugin_test\Plugin\plugin_test\fruit\Cherry';
+  public function testGetPluginClassWithValidArrayPluginDefinition() {
+    $plugin_class = Cherry::class;
     $class = DefaultFactory::getPluginClass('cherry', ['class' => $plugin_class]);
 
     $this->assertEquals($plugin_class, $class);
   }
 
   /**
+   * Tests getPluginClass() with a valid object plugin definition.
+   *
+   * @covers ::getPluginClass
+   */
+  public function testGetPluginClassWithValidObjectPluginDefinition() {
+    $plugin_class = Cherry::class;
+    $plugin_definition = $this->getMock(PluginDefinitionInterface::class);
+    $plugin_definition->expects($this->atLeastOnce())
+      ->method('getClass')
+      ->willReturn($plugin_class);
+    $class = DefaultFactory::getPluginClass('cherry', $plugin_definition);
+
+    $this->assertEquals($plugin_class, $class);
+  }
+
+  /**
    * Tests getPluginClass() with a missing class definition.
    *
+   * @covers ::getPluginClass
+   *
    * @expectedException \Drupal\Component\Plugin\Exception\PluginException
    * @expectedExceptionMessage The plugin (cherry) did not specify an instance class.
    */
-  public function testGetPluginClassWithMissingClass() {
+  public function testGetPluginClassWithMissingClassWithArrayPluginDefinition() {
     DefaultFactory::getPluginClass('cherry', []);
   }
 
   /**
+   * Tests getPluginClass() with a missing class definition.
+   *
+   * @covers ::getPluginClass
+   *
+   * @expectedException \Drupal\Component\Plugin\Exception\PluginException
+   * @expectedExceptionMessage The plugin (cherry) did not specify an instance class.
+   */
+  public function testGetPluginClassWithMissingClassWithObjectPluginDefinition() {
+    $plugin_definition = $this->getMock(PluginDefinitionInterface::class);
+    DefaultFactory::getPluginClass('cherry', $plugin_definition);
+  }
+
+  /**
    * Tests getPluginClass() with a not existing class definition.
    *
+   * @covers ::getPluginClass
+   *
    * @expectedException \Drupal\Component\Plugin\Exception\PluginException
    * @expectedExceptionMessage Plugin (kiwifruit) instance class "\Drupal\plugin_test\Plugin\plugin_test\fruit\Kiwifruit" does not exist.
    */
-  public function testGetPluginClassWithNotExistingClass() {
+  public function testGetPluginClassWithNotExistingClassWithArrayPluginDefinition() {
     DefaultFactory::getPluginClass('kiwifruit', ['class' => '\Drupal\plugin_test\Plugin\plugin_test\fruit\Kiwifruit']);
   }
 
   /**
+   * Tests getPluginClass() with a not existing class definition.
+   *
+   * @covers ::getPluginClass
+   *
+   * @expectedException \Drupal\Component\Plugin\Exception\PluginException
+   */
+  public function testGetPluginClassWithNotExistingClassWithObjectPluginDefinition() {
+    $plugin_class = '\Drupal\plugin_test\Plugin\plugin_test\fruit\Kiwifruit';
+    $plugin_definition = $this->getMock(PluginDefinitionInterface::class);
+    $plugin_definition->expects($this->atLeastOnce())
+      ->method('getClass')
+      ->willReturn($plugin_class);
+    DefaultFactory::getPluginClass('kiwifruit', $plugin_definition);
+  }
+
+  /**
+   * Tests getPluginClass() with a required interface.
+   *
+   * @covers ::getPluginClass
+   */
+  public function testGetPluginClassWithInterfaceWithArrayPluginDefinition() {
+    $plugin_class = Cherry::class;
+    $class = DefaultFactory::getPluginClass('cherry', ['class' => $plugin_class], FruitInterface::class);
+
+    $this->assertEquals($plugin_class, $class);
+  }
+
+  /**
    * Tests getPluginClass() with a required interface.
+   *
+   * @covers ::getPluginClass
    */
-  public function testGetPluginClassWithInterface() {
-    $plugin_class = 'Drupal\plugin_test\Plugin\plugin_test\fruit\Cherry';
-    $class = DefaultFactory::getPluginClass('cherry', ['class' => $plugin_class], '\Drupal\plugin_test\Plugin\plugin_test\fruit\FruitInterface');
+  public function testGetPluginClassWithInterfaceWithObjectPluginDefinition() {
+    $plugin_class = Cherry::class;
+    $plugin_definition = $this->getMock(PluginDefinitionInterface::class);
+    $plugin_definition->expects($this->atLeastOnce())
+      ->method('getClass')
+      ->willReturn($plugin_class);
+    $class = DefaultFactory::getPluginClass('cherry', $plugin_definition, FruitInterface::class);
 
     $this->assertEquals($plugin_class, $class);
   }
@@ -59,12 +132,30 @@ public function testGetPluginClassWithInterface() {
   /**
    * Tests getPluginClass() with a required interface but no implementation.
    *
+   * @covers ::getPluginClass
+   *
+   * @expectedException \Drupal\Component\Plugin\Exception\PluginException
+   * @expectedExceptionMessage Plugin "cherry" (Drupal\plugin_test\Plugin\plugin_test\fruit\Kale) must implement interface Drupal\plugin_test\Plugin\plugin_test\fruit\FruitInterface.
+   */
+  public function testGetPluginClassWithInterfaceAndInvalidClassWithArrayPluginDefinition() {
+    $plugin_class = Kale::class;
+    DefaultFactory::getPluginClass('cherry', ['class' => $plugin_class, 'provider' => 'core'], FruitInterface::class);
+  }
+
+  /**
+   * Tests getPluginClass() with a required interface but no implementation.
+   *
+   * @covers ::getPluginClass
+   *
    * @expectedException \Drupal\Component\Plugin\Exception\PluginException
-   * @expectedExceptionMessage Plugin "cherry" (Drupal\plugin_test\Plugin\plugin_test\fruit\Kale) must implement interface \Drupal\plugin_test\Plugin\plugin_test\fruit\FruitInterface.
    */
-  public function testGetPluginClassWithInterfaceAndInvalidClass() {
-    $plugin_class = 'Drupal\plugin_test\Plugin\plugin_test\fruit\Kale';
-    DefaultFactory::getPluginClass('cherry', ['class' => $plugin_class, 'provider' => 'core'], '\Drupal\plugin_test\Plugin\plugin_test\fruit\FruitInterface');
+  public function testGetPluginClassWithInterfaceAndInvalidClassWithObjectPluginDefinition() {
+    $plugin_class = Kale::class;
+    $plugin_definition = $this->getMock(PluginDefinitionInterface::class);
+    $plugin_definition->expects($this->atLeastOnce())
+      ->method('getClass')
+      ->willReturn($plugin_class);
+    DefaultFactory::getPluginClass('cherry', $plugin_definition, FruitInterface::class);
   }
 
 }
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
index 3b47dbe..c350b48 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\Tests\Core\Entity;
 
 use Drupal\Core\Entity\EntityType;
-use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -33,29 +32,6 @@ protected function setUpEntityType($definition) {
   }
 
   /**
-   * @covers ::get
-   *
-   * @dataProvider providerTestGet
-   */
-  public function testGet(array $defintion, $key, $expected) {
-    $entity_type = $this->setUpEntityType($defintion);
-    $this->assertSame($expected, $entity_type->get($key));
-  }
-
-  /**
-   * @covers ::set
-   * @covers ::get
-   *
-   * @dataProvider providerTestSet
-   */
-  public function testSet($key, $value) {
-    $entity_type = $this->setUpEntityType([]);
-    $this->assertInstanceOf('Drupal\Core\Entity\EntityTypeInterface', $entity_type->set($key, $value));
-    $this->assertSame($value, $entity_type->get($key));
-    $this->assertNoPublicProperties($entity_type);
-  }
-
-  /**
    * Tests the getKeys() method.
    *
    * @dataProvider providerTestGetKeys
@@ -89,34 +65,6 @@ public function testHasKey($entity_keys, $expected) {
   }
 
   /**
-   * Provides test data for testGet.
-   */
-  public function providerTestGet() {
-    return [
-      [[], 'provider', NULL],
-      [['provider' => ''], 'provider', ''],
-      [['provider' => 'test'], 'provider', 'test'],
-      [[], 'something_additional', NULL],
-      [['something_additional' => ''], 'something_additional', ''],
-      [['something_additional' => 'additional'], 'something_additional', 'additional'],
-    ];
-  }
-
-  /**
-   * Provides test data for testSet.
-   */
-  public function providerTestSet() {
-    return [
-      ['provider', NULL],
-      ['provider', ''],
-      ['provider', 'test'],
-      ['something_additional', NULL],
-      ['something_additional', ''],
-      ['something_additional', 'additional'],
-    ];
-  }
-
-  /**
    * Provides test data.
    */
   public function providerTestGetKeys() {
@@ -324,14 +272,4 @@ public function testConstraintMethods() {
     $this->assertEquals([], $entity_type->getConstraints());
   }
 
-  /**
-   * Asserts there on no public properties on the object instance.
-   *
-   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
-   */
-  protected function assertNoPublicProperties(EntityTypeInterface $entity_type) {
-    $reflection = new \ReflectionObject($entity_type);
-    $this->assertEmpty($reflection->getProperties(\ReflectionProperty::IS_PUBLIC));
-  }
-
 }
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
index 24a09f2..85731c7 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalActionManagerTest.php
@@ -10,8 +10,6 @@
 use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Component\Plugin\Factory\FactoryInterface;
 use Drupal\Core\Access\AccessManagerInterface;
-use Drupal\Core\Access\AccessResult;
-use Drupal\Core\Access\AccessResultForbidden;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\Language;
@@ -111,11 +109,10 @@ protected function setUp() {
     $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
     $this->cacheBackend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
 
-    $access_result = new AccessResultForbidden();
     $this->accessManager = $this->getMock('Drupal\Core\Access\AccessManagerInterface');
     $this->accessManager->expects($this->any())
       ->method('checkNamedRoute')
-      ->willReturn($access_result);
+      ->will($this->returnValue(FALSE));
     $this->account = $this->getMock('Drupal\Core\Session\AccountInterface');
     $this->discovery = $this->getMock('Drupal\Component\Plugin\Discovery\DiscoveryInterface');
     $this->factory = $this->getMock('Drupal\Component\Plugin\Factory\FactoryInterface');
@@ -205,7 +202,7 @@ public function getActionsForRouteProvider() {
             'url' => Url::fromRoute('test_route_2'),
             'localized_options' => '',
           ),
-          '#access' => AccessResult::forbidden(),
+          '#access' => FALSE,
           '#weight' => 0,
         ),
       ),
@@ -239,7 +236,7 @@ public function getActionsForRouteProvider() {
             'url' => Url::fromRoute('test_route_2'),
             'localized_options' => '',
           ),
-          '#access' => AccessResult::forbidden(),
+          '#access' => FALSE,
           '#weight' => 0,
         ),
       ),
@@ -274,7 +271,7 @@ public function getActionsForRouteProvider() {
             'url' => Url::fromRoute('test_route_2'),
             'localized_options' => '',
           ),
-          '#access' => AccessResult::forbidden(),
+          '#access' => FALSE,
           '#weight' => 1,
         ),
         'plugin_id_2' => array(
@@ -284,7 +281,7 @@ public function getActionsForRouteProvider() {
             'url' => Url::fromRoute('test_route_3'),
             'localized_options' => '',
           ),
-          '#access' => AccessResult::forbidden(),
+          '#access' => FALSE,
           '#weight' => 0,
         ),
       ),
@@ -321,7 +318,7 @@ public function getActionsForRouteProvider() {
             'url' => Url::fromRoute('test_route_2', ['test1']),
             'localized_options' => '',
           ),
-          '#access' => AccessResult::forbidden(),
+          '#access' => FALSE,
           '#weight' => 1,
         ),
         'plugin_id_2' => array(
@@ -331,7 +328,7 @@ public function getActionsForRouteProvider() {
             'url' => Url::fromRoute('test_route_2', ['test2']),
             'localized_options' => '',
           ),
-          '#access' => AccessResult::forbidden(),
+          '#access' => FALSE,
           '#weight' => 0,
         ),
       ),
diff --git a/core/tests/Drupal/Tests/Core/Menu/MenuLinkDefaultTest.php b/core/tests/Drupal/Tests/Core/Menu/MenuLinkDefaultTest.php
deleted file mode 100644
index ff7abda..0000000
--- a/core/tests/Drupal/Tests/Core/Menu/MenuLinkDefaultTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\Core\Menu\MenuLinkDefaultTest.
- */
-
-namespace Drupal\Tests\Core\Menu;
-
-use Drupal\Core\Menu\MenuLinkDefault;
-use Drupal\Core\Menu\StaticMenuLinkOverridesInterface;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * @coversDefaultClass \Drupal\Core\Menu\MenuLinkDefault
- * @group Menu
- */
-class MenuLinkDefaultTest extends UnitTestCase {
-
-  /**
-   * @covers ::updateLink
-   */
-  public function testUpdateLink() {
-    $plugin_definition = [
-      'title' => 'Hey jude',
-      'enabled' => 1,
-      'expanded' => 1,
-      'menu_name' => 'admin',
-      'parent' => '',
-      'weight' => 10,
-    ];
-    $expected_plugin_definition = $plugin_definition;
-    $expected_plugin_definition['weight'] = -10;
-
-    $static_override = $this->prophesize(StaticMenuLinkOverridesInterface::class);
-    $static_override->saveOverride('example_menu_link', $expected_plugin_definition);
-    $static_override = $static_override->reveal();
-
-    $menu_link = new MenuLinkDefault([], 'example_menu_link', $plugin_definition, $static_override);
-
-    $this->assertEquals($expected_plugin_definition, $menu_link->updateLink(['weight' => -10], TRUE));
-  }
-
-  /**
-   * @covers ::updateLink
-   */
-  public function testUpdateLinkWithoutPersist() {
-    $plugin_definition = [
-      'title' => 'Hey jude',
-      'enabled' => 1,
-      'expanded' => 1,
-      'menu_name' => 'admin',
-      'parent' => '',
-      'weight' => 10,
-    ];
-    $expected_plugin_definition = $plugin_definition;
-    $expected_plugin_definition['weight'] = -10;
-
-    $static_override = $this->prophesize(StaticMenuLinkOverridesInterface::class);
-    $static_override->saveOverride()->shouldNotBeCalled();
-    $static_override = $static_override->reveal();
-
-    $menu_link = new MenuLinkDefault([], 'example_menu_link', $plugin_definition, $static_override);
-
-    $this->assertEquals($expected_plugin_definition, $menu_link->updateLink(['weight' => -10], FALSE));
-  }
-
-}
diff --git a/core/themes/bartik/bartik.info.yml b/core/themes/bartik/bartik.info.yml
index 8b52f48..308afbf 100644
--- a/core/themes/bartik/bartik.info.yml
+++ b/core/themes/bartik/bartik.info.yml
@@ -17,6 +17,7 @@ regions:
   header: Header
   primary_menu: 'Primary menu'
   secondary_menu: 'Secondary menu'
+  help: Help
   page_top: 'Page top'
   page_bottom: 'Page bottom'
   highlighted: Highlighted
diff --git a/core/themes/bartik/bartik.libraries.yml b/core/themes/bartik/bartik.libraries.yml
index bb49f7e..9c1a33c 100644
--- a/core/themes/bartik/bartik.libraries.yml
+++ b/core/themes/bartik/bartik.libraries.yml
@@ -19,7 +19,7 @@ global-styling:
       css/components/form.css: {}
       css/components/forum.css: {}
       css/components/header.css: {}
-      css/components/help.css: {}
+      css/components/region-help.css: {}
       css/components/item-list.css: {}
       css/components/list-group.css: {}
       css/components/list.css: {}
diff --git a/core/themes/bartik/css/components/help.css b/core/themes/bartik/css/components/help.css
deleted file mode 100644
index c606992..0000000
--- a/core/themes/bartik/css/components/help.css
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * @file
- * Styles for the help block.
- */
-
-.block-help {
-  border: 1px solid #d3d7d9;
-  padding: 0 1.5em;
-  margin-bottom: 30px;
-}
diff --git a/core/themes/bartik/css/components/region-help.css b/core/themes/bartik/css/components/region-help.css
new file mode 100644
index 0000000..3c16b0d
--- /dev/null
+++ b/core/themes/bartik/css/components/region-help.css
@@ -0,0 +1,10 @@
+/**
+ * @file
+ * Styles for the help region.
+ */
+
+.region-help {
+  border: 1px solid #d3d7d9;
+  padding: 0 1.5em;
+  margin-bottom: 30px;
+}
diff --git a/core/themes/bartik/templates/page.html.twig b/core/themes/bartik/templates/page.html.twig
index 4c27d8f..b5d9c08 100644
--- a/core/themes/bartik/templates/page.html.twig
+++ b/core/themes/bartik/templates/page.html.twig
@@ -38,6 +38,10 @@
  * - 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.
+ * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
+ *   view and edit tabs when displaying a node).
+ * - action_links: Actions local to the page, such as "Add menu" on the menu
+ *   administration interface.
  * - 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
@@ -49,6 +53,7 @@
  * - page.primary_menu: Items for the primary menu region.
  * - page.secondary_menu: Items for the secondary menu region.
  * - page.featured_top: Items for the featured top 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.
@@ -131,6 +136,15 @@
               </h1>
             {% endif %}
             {{ title_suffix }}
+            {% if tabs %}
+              <nav class="tabs" role="navigation" aria-label="{{ 'Tabs'|t }}">
+                {{ tabs }}
+              </nav>
+            {% endif %}
+            {{ page.help }}
+            {% if action_links %}
+              <ul class="action-links">{{ action_links }}</ul>
+            {% endif %}
             {{ page.content }}
           </section>
         </main>
diff --git a/core/themes/classy/templates/block/block--local-actions-block.html.twig b/core/themes/classy/templates/block/block--local-actions-block.html.twig
deleted file mode 100644
index 2a0f5c4..0000000
--- a/core/themes/classy/templates/block/block--local-actions-block.html.twig
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "@block/block.html.twig" %}
-{#
-/**
- * @file
- * Theme override for local actions (primary admin actions.)
- */
-#}
-{% block content %}
-  {% if content %}
-    <nav class="action-links">{{ content }}</nav>
-  {% endif %}
-{% endblock %}
diff --git a/core/themes/classy/templates/block/block--local-tasks-block.html.twig b/core/themes/classy/templates/block/block--local-tasks-block.html.twig
deleted file mode 100644
index a191c60..0000000
--- a/core/themes/classy/templates/block/block--local-tasks-block.html.twig
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "@block/block.html.twig" %}
-{#
-/**
- * @file
- * Theme override for tabs.
- */
-#}
-{% block content %}
-  {% if content %}
-    <nav class="tabs" role="navigation" aria-label="{{ 'Tabs'|t }}">
-      {{ content }}
-    </nav>
-  {% endif %}
-{% endblock %}
diff --git a/core/themes/classy/templates/layout/page.html.twig b/core/themes/classy/templates/layout/page.html.twig
index 8c81950..57533c8 100644
--- a/core/themes/classy/templates/layout/page.html.twig
+++ b/core/themes/classy/templates/layout/page.html.twig
@@ -31,6 +31,10 @@
  * - 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.
+ * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
+ *   view and edit tabs when displaying a node).
+ * - action_links: Actions local to the page, such as "Add menu" on the menu
+ *   administration interface.
  * - 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
@@ -105,6 +109,13 @@
         <h1>{{ title }}</h1>
       {% endif %}
       {{ title_suffix }}
+
+      {{ tabs }}
+
+      {% if action_links %}
+        <nav class="action-links">{{ action_links }}</nav>
+      {% endif %}
+
       {{ page.content }}
     </div>{# /.layout-content #}
 
diff --git a/core/themes/seven/seven.info.yml b/core/themes/seven/seven.info.yml
index 1427896..99a3ec1 100644
--- a/core/themes/seven/seven.info.yml
+++ b/core/themes/seven/seven.info.yml
@@ -14,14 +14,12 @@ stylesheets-remove:
 quickedit_stylesheets:
   - css/components/quickedit.css
 regions:
-  header: 'Header'
-  pre_content: 'Pre-content'
-  breadcrumb: Breadcrumb
+  content: Content
   highlighted: Highlighted
   help: Help
-  content: Content
   page_top: 'Page top'
   page_bottom: 'Page bottom'
   sidebar_first: 'First sidebar'
+  breadcrumb: Breadcrumb
 regions_hidden:
   - sidebar_first
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index 1a44bc4..930b7d0 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -24,6 +24,18 @@ function seven_preprocess_html(&$variables) {
 }
 
 /**
+ * Implements hook_preprocess_HOOK() for page templates.
+ */
+function seven_preprocess_page(&$variables) {
+  $variables['primary_local_tasks'] = $variables['tabs'];
+  unset($variables['primary_local_tasks']['#secondary']);
+  $variables['secondary_local_tasks'] = array(
+    '#theme' => 'menu_local_tasks',
+    '#secondary' => isset($variables['tabs']['#secondary']) ? $variables['tabs']['#secondary'] : '',
+  );
+}
+
+/**
  * Implements hook_pre_render_HOOK() for menu-local-tasks templates.
  *
  * Use preprocess hook to set #attached to child elements
diff --git a/core/themes/seven/templates/block--local-actions-block.html.twig b/core/themes/seven/templates/block--local-actions-block.html.twig
deleted file mode 100644
index 6539758..0000000
--- a/core/themes/seven/templates/block--local-actions-block.html.twig
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "@block/block.html.twig" %}
-{#
-/**
- * @file
- * Theme override for local actions (primary admin actions.)
- */
-#}
-{% block content %}
-  {% if content %}
-    <ul class="action-links">
-      {{ content }}
-    </ul>
-  {% endif %}
-{% endblock %}
diff --git a/core/themes/seven/templates/page.html.twig b/core/themes/seven/templates/page.html.twig
index ac26a51..1c36be5 100644
--- a/core/themes/seven/templates/page.html.twig
+++ b/core/themes/seven/templates/page.html.twig
@@ -32,18 +32,24 @@
  * - 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.
+ * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
+ *   view and edit tabs when displaying a node).
+ * - action_links: Actions local to the page, such as "Add menu" on the menu
+ *   administration interface.
  * - 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.pre_content: Items for the pre-content region.
- * - page.breadcrumb: Items for the breadcrumb region.
+ * - page.page_top: Items for the header region.
  * - page.highlighted: Items for the highlighted 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.page_bottom: Items for the footer region.
+ * - page.breadcrumb: Items for the breadcrumb region.
  *
  * @see template_preprocess_page()
  * @see seven_preprocess_page()
@@ -57,13 +63,19 @@
         <h1 class="page-title">{{ title }}</h1>
       {% endif %}
       {{ title_suffix }}
-      {{ page.header }}
+      {% if primary_local_tasks %}
+        {{ primary_local_tasks }}
+      {% endif %}
     </div>
   </header>
 
   <div class="layout-container">
-    {{ page.pre_content }}
+    {% if secondary_local_tasks %}
+      <div class="tabs-secondary clearfix" role="navigation">{{ secondary_local_tasks }}</div>
+    {% endif %}
+
     {{ page.breadcrumb }}
+
     <main class="page-content clearfix" role="main">
       <div class="visually-hidden"><a id="main-content" tabindex="-1"></a></div>
       {{ page.highlighted }}
@@ -72,6 +84,11 @@
           {{ page.help }}
         </div>
       {% endif %}
+      {% if action_links %}
+        <ul class="action-links">
+          {{ action_links }}
+        </ul>
+      {% endif %}
       {{ page.content }}
     </main>
 
diff --git a/update.php b/update.php
old mode 100644
new mode 100755
