diff --git a/core/includes/config.inc b/core/includes/config.inc
index 00c7fa6..3e22534 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -256,7 +256,7 @@ function config_import_invoke_owner(array $config_changes, StorageInterface $sou
       // Check whether the module implements hook_config_import() and ask it to
       // handle the configuration change.
       $handled_by_module = FALSE;
-      if (module_exists($module) && module_hook($module, 'config_import_' . $op)) {
+      if (module_hook($module, 'config_import_' . $op)) {
         $old_config = new Config($name, $target_storage);
         $old_config->load();
 
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index ce67e40..24ceaf2 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -1784,8 +1784,7 @@ function install_check_requirements($install_state) {
         // having settings.php also owned by the webserver does not introduce
         // any additional security risk, so we keep the file in place.
         if (fileowner($default_settings_file) === fileowner($settings_file)) {
-          $readable = drupal_verify_install_file($settings_file, FILE_READABLE);
-          $writable = drupal_verify_install_file($settings_file, FILE_WRITABLE);
+          $writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
           $exists = TRUE;
         }
         // If settings.php and default.settings.php have different owners, this
@@ -1809,8 +1808,7 @@ function install_check_requirements($install_state) {
           $exists = !$deleted;
           if ($exists) {
             $settings_file_ownership_error = TRUE;
-            $readable = drupal_verify_install_file($settings_file, FILE_READABLE);
-            $writable = drupal_verify_install_file($settings_file, FILE_WRITABLE);
+            $writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
           }
         }
       }
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 6b8ee4a..3ce399b 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1830,7 +1830,7 @@ function theme_breadcrumb($variables) {
     // Provide a navigational heading to give context for breadcrumb links to
     // screen-reader users. Make the heading invisible with .element-invisible.
     $output .= '<h2 class="element-invisible">' . t('You are here') . '</h2>';
-    $output .= '<ol><li>' . implode('</li><li>', $breadcrumb) . '</li></ol>';
+    $output .= '<ol><li>' . implode(' » </li><li>', $breadcrumb) . '</li></ol>';
     $output .= '</nav>';
   }
   return $output;
diff --git a/core/includes/update.inc b/core/includes/update.inc
index 2bbc9ff..5b045f6 100644
--- a/core/includes/update.inc
+++ b/core/includes/update.inc
@@ -499,11 +499,7 @@ function update_fix_d8_requirements() {
   global $conf;
 
   if (drupal_get_installed_schema_version('system') < 8000 && !update_variable_get('update_d8_requirements', FALSE)) {
-
-    // Make sure that file.module is enabled as it is required for the user
-    // picture upgrade path.
-    update_module_enable(array('file'));
-
+    // @todo: Make critical, first-run changes to the database here.
     update_variable_set('update_d8_requirements', TRUE);
   }
 }
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/ProcessDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/ProcessDecorator.php
deleted file mode 100644
index bcb5cad..0000000
--- a/core/lib/Drupal/Component/Plugin/Discovery/ProcessDecorator.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Component\Plugin\Discovery\ProcessDecorator.
- */
-
-namespace Drupal\Component\Plugin\Discovery;
-
-/**
- * Allows custom processing of the discovered definition.
- *
- * Example use cases include adding in default values for a definition, or
- * providing a backwards compatibility layer for renamed definition properties.
- */
-class ProcessDecorator implements DiscoveryInterface {
-
-  /**
-   * The Discovery object being decorated.
-   *
-   * @var \Drupal\Component\Plugin\Discovery\DiscoveryInterface
-   */
-  protected $decorated;
-
-  /**
-   * The processor callback to run on each discovered definition.
-   *
-   * @var callable
-   */
-   protected $processCallback;
-
-  /**
-   * Constructs a \Drupal\Component\Plugin\Discovery\ProcessDecorator object.
-   *
-   * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface $decorated
-   *   The discovery object that is being decorated.
-   * @param callable $process_callback
-   *   The processor callback to run on each discovered definition. The
-   *   callback will be called with the following arguments:
-   *   - array $definition: the discovered definition, that the callback
-   *     should accept by reference and modify in place.
-   *   - string $plugin_id: the corresponding plugin_id.
-   */
-  public function __construct(DiscoveryInterface $decorated, $process_callback) {
-    $this->decorated = $decorated;
-    $this->processCallback = $process_callback;
-  }
-
-  /**
-   * Implements \Drupal\Component\Plugin\Discovery\DicoveryInterface::getDefinition().
-   */
-  public function getDefinition($plugin_id) {
-    $definitions = $this->getDefinitions();
-    if (isset($definitions[$plugin_id])) {
-      return $definitions[$plugin_id];
-    }
-  }
-
-  /**
-   * Implements \Drupal\Component\Plugin\Discovery\DicoveryInterface::getDefinitions().
-   */
-  public function getDefinitions() {
-    $definitions = $this->decorated->getDefinitions();
-    foreach ($definitions as $plugin_id => &$definition) {
-      call_user_func_array($this->processCallback, array(&$definition, $plugin_id));
-    }
-    return $definitions;
-  }
-
-  /**
-   * Passes through all unknown calls onto the decorated object.
-   */
-  public function __call($method, $args) {
-    return call_user_func_array(array($this->decorated, $method), $args);
-  }
-
-}
diff --git a/core/lib/Drupal/Component/Plugin/PluginManagerBase.php b/core/lib/Drupal/Component/Plugin/PluginManagerBase.php
index fce7004..c337f9f 100644
--- a/core/lib/Drupal/Component/Plugin/PluginManagerBase.php
+++ b/core/lib/Drupal/Component/Plugin/PluginManagerBase.php
@@ -49,14 +49,23 @@
    * Implements Drupal\Component\Plugin\PluginManagerInterface::getDefinition().
    */
   public function getDefinition($plugin_id) {
-    return $this->discovery->getDefinition($plugin_id);;
+    $definition = $this->discovery->getDefinition($plugin_id);
+    if (isset($definition)) {
+      $this->processDefinition($definition, $plugin_id);
+    }
+    return $definition;
   }
 
   /**
    * Implements Drupal\Component\Plugin\PluginManagerInterface::getDefinitions().
    */
   public function getDefinitions() {
-    return $this->discovery->getDefinitions();
+    $definitions = $this->discovery->getDefinitions();
+    foreach ($definitions as $plugin_id => &$definition) {
+      $this->processDefinition($definition, $plugin_id);
+    }
+
+    return $definitions;
   }
 
   /**
@@ -89,7 +98,7 @@ public function getInstance(array $options) {
    * additional processing logic they can do that by replacing or extending the
    * method.
    */
-  public function processDefinition(&$definition, $plugin_id) {
+  protected function processDefinition(&$definition, $plugin_id) {
     $definition = NestedArray::mergeDeep($this->defaults, $definition);
   }
 
diff --git a/core/lib/Drupal/Core/Access/AccessCheckInterface.php b/core/lib/Drupal/Core/Access/AccessCheckInterface.php
deleted file mode 100644
index 0280330..0000000
--- a/core/lib/Drupal/Core/Access/AccessCheckInterface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\Core\Access\AccessCheckInterface.
- */
-
-namespace Drupal\Core\Access;
-
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * An access check service determines access rules for particular routes.
- */
-interface AccessCheckInterface {
-
-  /**
-   * Declares whether the access check applies to a specific route or not.
-   *
-   * @param \Symfony\Component\Routing\Route $route
-   *   The route to consider attaching to.
-   *
-   * @return bool
-   *   TRUE if the check applies to the passed route, FALSE otherwise.
-   */
-  public function applies(Route $route);
-
-  /**
-   * Checks for access to route.
-   *
-   * @param \Symfony\Component\Routing\Route $route
-   *   The route to check against.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object.
-   *
-   * @return mixed
-   *   TRUE if access is allowed.
-   *   FALSE if not.
-   *   NULL if no opinion.
-   */
-  public function access(Route $route, Request $request);
-}
diff --git a/core/lib/Drupal/Core/Access/AccessManager.php b/core/lib/Drupal/Core/Access/AccessManager.php
deleted file mode 100644
index 33d3e9d..0000000
--- a/core/lib/Drupal/Core/Access/AccessManager.php
+++ /dev/null
@@ -1,150 +0,0 @@
-<?php
-/**
- * @file
- * Contains Drupal\Core\Access\AccessManager.
- */
-
-namespace Drupal\Core\Access;
-
-use Symfony\Component\Routing\RouteCollection;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\DependencyInjection\ContainerAware;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
-
-/**
- * Attaches access check services to routes and runs them on request.
- */
-class AccessManager extends ContainerAware {
-
-  /**
-   * Array of registered access check service ids.
-   *
-   * @var array
-   */
-  protected $checkIds;
-
-  /**
-   * Array of access check objects keyed by service id.
-   *
-   * @var array
-   */
-  protected $checks;
-
-  /**
-   * The request object.
-   *
-   * @var \Symfony\Component\HttpFoundation\Request
-   */
-  protected $request;
-
-  /**
-   * Constructs a new AccessManager.
-   *
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object.
-   */
-  public function __construct(Request $request) {
-    $this->request = $request;
-  }
-
-  /**
-   * Registers a new AccessCheck by service ID.
-   *
-   * @param string $service_id
-   *   The ID of the service in the Container that provides a check.
-   */
-  public function addCheckService($service_id) {
-    $this->checkIds[] = $service_id;
-  }
-
-  /**
-   * For each route, saves a list of applicable access checks to the route.
-   *
-   * @param \Symfony\Component\Routing\RouteCollection $routes
-   *   A collection of routes to apply checks to.
-   */
-  public function setChecks(RouteCollection $routes) {
-    foreach ($routes as $route) {
-      $checks = $this->applies($route);
-      if (!empty($checks)) {
-        $route->setOption('_access_checks', $checks);
-      }
-    }
-  }
-
-  /**
-   * Determine which registered access checks apply to a route.
-   *
-   * @param \Symfony\Component\Routing\Route $route
-   *   The route to get list of access checks for.
-   *
-   * @return array
-   *   An array of service ids for the access checks that apply to passed
-   *   route.
-   */
-  protected function applies(Route $route) {
-    $checks = array();
-
-    foreach ($this->checkIds as $service_id) {
-      if (empty($this->checks[$service_id])) {
-        $this->loadCheck($service_id);
-      }
-
-      if ($this->checks[$service_id]->applies($route)) {
-        $checks[] = $service_id;
-      }
-    }
-
-    return $checks;
-  }
-
-  /**
-   * Checks a route against applicable access check services.
-   *
-   * Determines whether the route is accessible or not.
-   *
-   * @param \Symfony\Component\Routing\Route $route
-   *   The route to check access to.
-   *
-   * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
-   *   If any access check denies access or none explicitly approve.
-   */
-  public function check(Route $route) {
-    $access = FALSE;
-    $checks = $route->getOption('_access_checks') ?: array();
-
-    // No checks == deny by default.
-    foreach ($checks as $service_id) {
-      if (empty($this->checks[$service_id])) {
-        $this->loadCheck($service_id);
-      }
-
-      $access = $this->checks[$service_id]->access($route, $this->request);
-      if ($access === FALSE) {
-        // A check has denied access, no need to continue checking.
-        break;
-      }
-    }
-
-    // Access has been denied or not explicily approved.
-    if (!$access) {
-      throw new AccessDeniedHttpException();
-    }
-  }
-
-  /**
-   * Lazy-loads access check services.
-   *
-   * @param string $service_id
-   *   The service id of the access check service to load.
-   */
-  protected function loadCheck($service_id) {
-    if (!in_array($service_id, $this->checkIds)) {
-      throw new \InvalidArgumentException(sprintf('No check has been registered for %s', $service_id));
-    }
-
-    $this->checks[$service_id] = $this->container->get($service_id);
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Access/DefaultAccessCheck.php b/core/lib/Drupal/Core/Access/DefaultAccessCheck.php
deleted file mode 100644
index 80afdef..0000000
--- a/core/lib/Drupal/Core/Access/DefaultAccessCheck.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\Core\Access\DefaultAccessCheck.
- */
-
-namespace Drupal\Core\Access;
-
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Allows access to routes to be controlled by an '_access' boolean parameter.
- */
-class DefaultAccessCheck implements AccessCheckInterface {
-
-  /**
-   * Implements AccessCheckInterface::applies().
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_access', $route->getRequirements());
-  }
-
-  /**
-   * Implements AccessCheckInterface::access().
-   */
-  public function access(Route $route, Request $request) {
-    return $route->getRequirement('_access');
-  }
-}
diff --git a/core/lib/Drupal/Core/Access/PermissionAccessCheck.php b/core/lib/Drupal/Core/Access/PermissionAccessCheck.php
deleted file mode 100644
index ee3768b..0000000
--- a/core/lib/Drupal/Core/Access/PermissionAccessCheck.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\Core\Access\PermissionAccessCheck.
- */
-
-namespace Drupal\Core\Access;
-
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Determines access to routes based on permissions defined via hook_permission().
- */
-class PermissionAccessCheck implements AccessCheckInterface {
-
-  /**
-   * Implements AccessCheckInterface::applies().
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_permission', $route->getRequirements());
-  }
-
-  /**
-   * Implements AccessCheckInterface::access().
-   */
-  public function access(Route $route, Request $request) {
-    $permission = $route->getRequirement('_permission');
-    // @todo Replace user_access() with a correctly injected and session-using
-    //   alternative.
-    // If user_access() fails, return NULL to give other checks a chance.
-    return user_access($permission) ? TRUE : NULL;
-  }
-}
diff --git a/core/lib/Drupal/Core/Ajax/AjaxResponse.php b/core/lib/Drupal/Core/Ajax/AjaxResponse.php
index 492665e..12250b9 100644
--- a/core/lib/Drupal/Core/Ajax/AjaxResponse.php
+++ b/core/lib/Drupal/Core/Ajax/AjaxResponse.php
@@ -27,29 +27,20 @@ class AjaxResponse extends JsonResponse {
    *
    * @param object $command
    *   An AJAX command object implementing CommandInterface.
-   * @param boolean $prepend
-   *   A boolean which determines whether the new command should be executed
-   *   before previously added commands. Defaults to FALSE.
    *
    * @return AjaxResponse
    *   The current AjaxResponse.
    */
-  public function addCommand($command, $prepend = FALSE) {
-    if ($prepend) {
-      array_unshift($this->commands, $command->render());
-    }
-    else {
-      $this->commands[] = $command->render();
-    }
-
+  public function addCommand($command) {
+    $this->commands[] = $command->render();
     return $this;
   }
 
   /**
    * Sets the response's data to be the array of AJAX commands.
    *
-   * @param Request $request
-   *   A request object.
+   * @param
+   *   $request A request object.
    *
    * @return
    *   Response The current response.
@@ -63,25 +54,24 @@ public function prepare(Request $request) {
   /**
    * Prepares the AJAX commands for sending back to the client.
    *
-   * @param Request $request
+   * @param Request
    *   The request object that the AJAX is responding to.
    *
    * @return array
    *   An array of commands ready to be returned as JSON.
    */
-  protected function ajaxRender(Request $request) {
+  protected function ajaxRender($request) {
     // Ajax responses aren't rendered with html.tpl.php, so we have to call
     // drupal_get_css() and drupal_get_js() here, in order to have new files
     // added during this request to be loaded by the page. We only want to send
     // back files that the page hasn't already loaded, so we implement simple
     // diffing logic using array_diff_key().
-    $ajax_page_state = $request->request->get('ajax_page_state');
     foreach (array('css', 'js') as $type) {
       // It is highly suspicious if $_POST['ajax_page_state'][$type] is empty,
       // since the base page ought to have at least one JS file and one CSS file
       // loaded. It probably indicates an error, and rather than making the page
       // reload all of the files, instead we return no new files.
-      if (empty($ajax_page_state[$type])) {
+      if (empty($request->parameters['ajax_page_state'][$type])) {
         $items[$type] = array();
       }
       else {
@@ -100,7 +90,7 @@ protected function ajaxRender(Request $request) {
           }
         }
         // Ensure that the page doesn't reload what it already has.
-        $items[$type] = array_diff_key($items[$type], $ajax_page_state[$type]);
+        $items[$type] = array_diff_key($items[$type], $request->parameters['ajax_page_state'][$type]);
       }
     }
 
@@ -115,26 +105,21 @@ protected function ajaxRender(Request $request) {
     $scripts_footer = drupal_get_js('footer', $items['js'], TRUE);
     $scripts_header = drupal_get_js('header', $items['js'], TRUE);
 
-    // Prepend commands to add the resources, preserving their relative order.
-    $resource_commands = array();
     if (!empty($styles)) {
-      $resource_commands[] = new AddCssCommand($styles);
+      $this->addCommand(new AddCssCommand($styles));
     }
     if (!empty($scripts_header)) {
-      $resource_commands[] = new PrependCommand('head', $scripts_header);
+      $this->addCommand(new PrependCommand('head', $scripts_header));
     }
     if (!empty($scripts_footer)) {
-      $resource_commands[] = new AppendCommand('body', $scripts_footer);
-    }
-    foreach (array_reverse($resource_commands) as $resource_command) {
-      $this->addCommand($resource_command, TRUE);
+      $this->addCommand(new AppendCommand('body', $scripts_footer));
     }
 
-    // Prepend a command to merge changes and additions to Drupal.settings.
+    // Now add a command to merge changes and additions to Drupal.settings.
     $scripts = drupal_add_js();
     if (!empty($scripts['settings'])) {
       $settings = $scripts['settings'];
-      $this->addCommand(new SettingsCommand(call_user_func_array('array_merge_recursive', $settings['data']), TRUE), TRUE);
+      $this->addCommand(new SettingsCommand(call_user_func_array('array_merge_recursive', $settings['data']), TRUE));
     }
 
     $commands = $this->commands;
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 8b4eaaa..71ef37b 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -8,7 +8,6 @@
 namespace Drupal\Core;
 
 use Drupal\Core\DependencyInjection\Compiler\RegisterKernelListenersPass;
-use Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterMatchersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterNestedMatchersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterSerializationClassesPass;
@@ -180,18 +179,8 @@ public function build(ContainerBuilder $container) {
     $container->register('view_subscriber', 'Drupal\Core\EventSubscriber\ViewSubscriber')
       ->addArgument(new Reference('content_negotiation'))
       ->addTag('event_subscriber');
-    $container->register('legacy_access_subscriber', 'Drupal\Core\EventSubscriber\LegacyAccessSubscriber')
-      ->addTag('event_subscriber');
-    $container->register('access_manager', 'Drupal\Core\Access\AccessManager')
-      ->addArgument(new Reference('request'))
-      ->addMethodCall('setContainer', array(new Reference('service_container')));
     $container->register('access_subscriber', 'Drupal\Core\EventSubscriber\AccessSubscriber')
-      ->addArgument(new Reference('access_manager'))
       ->addTag('event_subscriber');
-    $container->register('access_check.default', 'Drupal\Core\Access\DefaultAccessCheck')
-      ->addTag('access_check');
-    $container->register('access_check.permission', 'Drupal\Core\Access\PermissionAccessCheck')
-      ->addTag('access_check');
     $container->register('maintenance_mode_subscriber', 'Drupal\Core\EventSubscriber\MaintenanceModeSubscriber')
       ->addTag('event_subscriber');
     $container->register('path_subscriber', 'Drupal\Core\EventSubscriber\PathSubscriber')
@@ -232,9 +221,6 @@ public function build(ContainerBuilder $container) {
     $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
     // Add a compiler pass for adding Normalizers and Encoders to Serializer.
     $container->addCompilerPass(new RegisterSerializationClassesPass());
-    // Add a compiler pass for registering event subscribers.
-    $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
-    $container->addCompilerPass(new RegisterAccessChecksPass());
   }
 
 }
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterAccessChecksPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterAccessChecksPass.php
deleted file mode 100644
index 9e6506d..0000000
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterAccessChecksPass.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass.
- */
-
-namespace Drupal\Core\DependencyInjection\Compiler;
-
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
-
-/**
- * Adds services tagged 'access_check' to the access_manager service.
- */
-class RegisterAccessChecksPass implements CompilerPassInterface {
-
-  /**
-   * Implements CompilerPassInterface::process().
-   *
-   * Adds services tagged 'access_check' to the access_manager service.
-   */
-  public function process(ContainerBuilder $container) {
-    if (!$container->hasDefinition('access_manager')) {
-      return;
-    }
-    $access_manager = $container->getDefinition('access_manager');
-    foreach ($container->findTaggedServiceIds('access_check') as $id => $attributes) {
-      $access_manager->addMethodCall('addCheckService', array($id));
-    }
-  }
-}
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index f07d081..a5624d7 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -192,7 +192,7 @@ public function registerBundles() {
       // When installing new modules, the modules in the list passed to
       // updateModules() do not yet have their namespace registered.
       $namespace = 'Drupal\\' . $module;
-      if (empty($namespaces[$namespace]) && $this->moduleData($module)) {
+      if (!isset($namespaces[$namespace]) && $this->moduleData($module)) {
         $path = dirname(DRUPAL_ROOT . '/' . $this->moduleData($module)->uri) . '/lib';
         $this->modulePaths[$module] = $path;
         $this->classLoader->registerNamespace($namespace, $path);
@@ -319,20 +319,15 @@ protected function initializeContainer() {
       // All namespaces must be registered before we attempt to use any service
       // from the container.
       $namespaces = $this->classLoader->getNamespaces();
-      $namespaces_revert = array();
       foreach ($this->container->getParameter('container.modules') as $module => $path) {
         $namespace = 'Drupal\\' . $module;
-        if (empty($namespaces[$namespace])) {
+        if (!isset($namespaces[$namespace])) {
           $this->classLoader->registerNamespace($namespace, $path);
-          $namespaces_revert[$namespace] = array();
         }
       }
       $module_list = $this->moduleList ?: $this->container->get('config.factory')->get('system.module')->load()->get('enabled');
       if (array_keys((array)$module_list) !== array_keys($this->container->getParameter('container.modules'))) {
         unset($this->container);
-        // Since 'container.modules' was incorrect, revert the classloader
-        // registrations, and allow buildContainer() to get it right.
-        $this->classLoader->registerNamespaces($namespaces_revert);
       }
     }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 34feb10..6c8e48b 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Component\Plugin\Factory\DefaultFactory;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\Plugin\Discovery\InfoHookDecorator;
@@ -229,11 +228,7 @@ class EntityManager extends PluginManagerBase {
    */
   public function __construct() {
     // Allow the plugin definition to be altered by hook_entity_info_alter().
-    $this->discovery = new AnnotatedClassDiscovery('Core', 'Entity');
-    $this->discovery = new InfoHookDecorator($this->discovery, 'entity_info');
-    $this->discovery = new AlterDecorator($this->discovery, 'entity_info');
-    // @todo Run process before altering, see http://drupal.org/node/1848964.
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
+    $this->discovery = new AlterDecorator(new InfoHookDecorator(new AnnotatedClassDiscovery('Core', 'Entity'), 'entity_info'), 'entity_info');
     $this->factory = new DefaultFactory($this);
 
     // Entity type plugins includes translated strings, so each language is
@@ -271,7 +266,7 @@ public function getDefinitions() {
   /**
    * Overrides Drupal\Component\Plugin\PluginManagerBase::processDefinition().
    */
-  public function processDefinition(&$definition, $plugin_id) {
+  protected function processDefinition(&$definition, $plugin_id) {
     parent::processDefinition($definition, $plugin_id);
 
     // @todo Remove this check once http://drupal.org/node/1780396 is resolved.
diff --git a/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
index 4cfd0b6..4f1dc75 100644
--- a/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
@@ -2,17 +2,15 @@
 
 /**
  * @file
- * Contains Drupal\Core\EventSubscriber\AccessSubscriber.
+ * Definition of Drupal\Core\EventSubscriber\AccessSubscriber.
  */
 
 namespace Drupal\Core\EventSubscriber;
 
 use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-use Drupal\Core\Routing\RoutingEvents;
-use Drupal\Core\Access\AccessManager;
-use Drupal\Core\Routing\RouteBuildEvent;
 
 /**
  * Access subscriber for controller requests.
@@ -20,41 +18,21 @@
 class AccessSubscriber implements EventSubscriberInterface {
 
   /**
-   * Constructs a new AccessSubscriber.
-   *
-   * @param \Drupal\Core\Access\AccessManager $access_manager
-   *   The access check manager that will be responsible for applying
-   *   AccessCheckers against routes.
-   */
-  public function __construct(AccessManager $access_manager) {
-    $this->accessManager = $access_manager;
-  }
-
-  /**
    * Verifies that the current user can access the requested path.
    *
-   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   * @todo This is a total hack to keep our current access system working. It
+   *   should be replaced with something robust and injected at some point.
+   *
+   * @param Symfony\Component\HttpKernel\Event\GetResponseEvent $event
    *   The Event to process.
    */
   public function onKernelRequestAccessCheck(GetResponseEvent $event) {
-    $request = $event->getRequest();
-    if (!$request->attributes->has('_route')) {
-      // If no Route is available it is likely a static resource and access is
-      // handled elsewhere.
-      return;
-    }
 
-    $this->accessManager->check($request->attributes->get('_route'));
-  }
+    $router_item = $event->getRequest()->attributes->get('drupal_menu_item');
 
-  /**
-   * Apply access checks to routes.
-   *
-   * @param \Drupal\Core\Routing\RouteBuildEvent $event
-   *   The event to process.
-   */
-  public function onRoutingRouteAlterSetAccessCheck(RouteBuildEvent $event) {
-    $this->accessManager->setChecks($event->getRouteCollection());
+    if (isset($router_item['access']) && !$router_item['access']) {
+      throw new AccessDeniedHttpException();
+    }
   }
 
   /**
@@ -65,8 +43,6 @@ public function onRoutingRouteAlterSetAccessCheck(RouteBuildEvent $event) {
    */
   static function getSubscribedEvents() {
     $events[KernelEvents::REQUEST][] = array('onKernelRequestAccessCheck', 30);
-    // Setting very low priority to ensure access checks are run after alters.
-    $events[RoutingEvents::ALTER][] = array('onRoutingRouteAlterSetAccessCheck', 0);
 
     return $events;
   }
diff --git a/core/lib/Drupal/Core/EventSubscriber/LegacyAccessSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/LegacyAccessSubscriber.php
deleted file mode 100644
index 566e82c..0000000
--- a/core/lib/Drupal/Core/EventSubscriber/LegacyAccessSubscriber.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\Core\EventSubscriber\LegacyAccessSubscriber.
- */
-
-namespace Drupal\Core\EventSubscriber;
-
-use Symfony\Component\HttpKernel\KernelEvents;
-use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-
-/**
- * Access subscriber for legacy controller requests.
- */
-class LegacyAccessSubscriber implements EventSubscriberInterface {
-
-  /**
-   * Verifies that the current user can access the requested path.
-   *
-   * @todo This is a total hack to keep our current access system working. It
-   *   should be replaced with something robust and injected at some point.
-   *
-   * @param Symfony\Component\HttpKernel\Event\GetResponseEvent $event
-   *   The Event to process.
-   */
-  public function onKernelRequestAccessCheck(GetResponseEvent $event) {
-
-    $router_item = $event->getRequest()->attributes->get('drupal_menu_item');
-
-    if (isset($router_item['access']) && !$router_item['access']) {
-      throw new AccessDeniedHttpException();
-    }
-  }
-
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestAccessCheck', 30);
-
-    return $events;
-  }
-}
diff --git a/core/lib/Drupal/Core/Routing/FirstEntryFinalMatcher.php b/core/lib/Drupal/Core/Routing/FirstEntryFinalMatcher.php
index cc1adde..45d0888 100644
--- a/core/lib/Drupal/Core/Routing/FirstEntryFinalMatcher.php
+++ b/core/lib/Drupal/Core/Routing/FirstEntryFinalMatcher.php
@@ -53,8 +53,7 @@ public function matchRequest(Request $request) {
 
       preg_match($compiled->getRegex(), $path, $matches);
 
-      $route->setOption('_name', $name);
-      return array_merge($this->mergeDefaults($matches, $route->getDefaults()), array('_route' => $route));
+      return array_merge($this->mergeDefaults($matches, $route->getDefaults()), array('_route' => $name));
     }
   }
 
diff --git a/core/modules/breakpoint/config/breakpoint.settings.yml b/core/modules/breakpoint/config/breakpoint.yml
similarity index 100%
rename from core/modules/breakpoint/config/breakpoint.settings.yml
rename to core/modules/breakpoint/config/breakpoint.yml
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 38adbd0..3449769 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -392,7 +392,7 @@ function _comment_body_field_create($info) {
  * Implements hook_permission().
  */
 function comment_permission() {
-  return array(
+  $permissions = array(
     'administer comments' => array(
       'title' => t('Administer comments and comment settings'),
     ),
@@ -409,6 +409,14 @@ function comment_permission() {
       'title' => t('Edit own comments'),
     ),
   );
+
+  if (module_exists('translation_entity') && translation_entity_enabled('comment')) {
+    $permissions['translate comments'] = array(
+      'title' => t('Translate comments'),
+    );
+  }
+
+  return $permissions;
 }
 
 /**
@@ -1599,6 +1607,7 @@ function comment_preview(Comment $comment) {
       $comment->name = check_plain($account->name);
       $comment->signature = $account->signature;
       $comment->signature_format = $account->signature_format;
+      $comment->picture = $account->picture;
     }
     elseif (empty($comment->name)) {
       $comment->name = config('user.settings')->get('anonymous');
@@ -1654,14 +1663,7 @@ function template_preprocess_comment(&$variables) {
   $variables['changed'] = format_date($comment->changed);
 
   $variables['new'] = !empty($comment->new) ? t('new') : '';
-  if (theme_get_setting('toggle_comment_user_picture')) {
-    // To change user picture settings (e.g., image style), edit the 'compact'
-    // view mode on the User entity.
-    $variables['user_picture'] = user_view($comment->account, 'compact');
-  }
-  else {
-    $variables['user_picture'] = array();
-  }
+  $variables['user_picture'] = theme_get_setting('toggle_comment_user_picture') ? theme('user_picture', array('account' => $comment)) : '';
   $variables['signature'] = $comment->signature;
 
   $uri = $comment->uri();
diff --git a/core/modules/comment/lib/Drupal/comment/CommentRenderController.php b/core/modules/comment/lib/Drupal/comment/CommentRenderController.php
index bc21cd2..c614f8e 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentRenderController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentRenderController.php
@@ -27,9 +27,6 @@ public function buildContent(array $entities = array(), $view_mode = 'full', $la
       return $return;
     }
 
-    // Attach user account.
-    user_attach_accounts($entities);
-
     parent::buildContent($entities, $view_mode, $langcode);
 
     foreach ($entities as $entity) {
diff --git a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
index 50dde39..4d447a5 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
@@ -34,7 +34,7 @@ protected function buildQuery($ids, $revision_id = FALSE) {
     $query->addField('n', 'type', 'node_type');
     $query->innerJoin('users', 'u', 'base.uid = u.uid');
     $query->addField('u', 'name', 'registered_name');
-    $query->fields('u', array('uid', 'signature', 'signature_format'));
+    $query->fields('u', array('uid', 'signature', 'signature_format', 'picture'));
     return $query;
   }
 
diff --git a/core/modules/comment/lib/Drupal/comment/CommentTranslationController.php b/core/modules/comment/lib/Drupal/comment/CommentTranslationController.php
index 0cfa52b..9a888f3 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentTranslationController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentTranslationController.php
@@ -17,6 +17,13 @@
 class CommentTranslationController extends EntityTranslationController {
 
   /**
+   * Overrides EntityTranslationController::getTranslationAccess().
+   */
+  public function getTranslationAccess(EntityInterface $entity, $op) {
+    return user_access('translate comments') && parent::getTranslationAccess($entity, $op);
+  }
+
+  /**
    * Overrides EntityTranslationController::entityFormTitle().
    */
   protected function entityFormTitle(EntityInterface $entity) {
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php
index 0738076..44a38d5 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php
@@ -44,11 +44,12 @@ function testCommentPreview() {
     // Login as web user and add a signature and a user picture.
     $this->drupalLogin($this->web_user);
     config('user.settings')->set('signatures', 1)->save();
+    variable_set('user_pictures', 1);
     $test_signature = $this->randomName();
     $edit['signature[value]'] = '<a href="http://example.com/">' . $test_signature. '</a>';
     $edit['signature[format]'] = 'filtered_html';
     $image = current($this->drupalGetTestFiles('image'));
-    $edit['files[user_picture_und_0]'] = drupal_realpath($image->uri);
+    $edit['files[picture_upload]'] = drupal_realpath($image->uri);
     $this->drupalPost('user/' . $this->web_user->uid . '/edit', $edit, t('Save'));
 
     // As the web user, fill in the comment form and preview the comment.
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
index 7dfb02e..6c2a146 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTranslationUITest.php
@@ -58,7 +58,7 @@ function setupBundle() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array('post comments', 'administer comments', "translate $this->entityType entities", 'edit original values');
+    return array('post comments', 'administer comments', 'translate comments', 'access entity translation overview', 'create entity translations', 'edit entity translations', 'delete entity translations');
   }
 
   /**
diff --git a/core/modules/comment/templates/comment.tpl.php b/core/modules/comment/templates/comment.tpl.php
index 5a8a37e..890e457 100644
--- a/core/modules/comment/templates/comment.tpl.php
+++ b/core/modules/comment/templates/comment.tpl.php
@@ -20,8 +20,7 @@
  * - $permalink: Comment permalink.
  * - $submitted: Submission information created from $author and $created during
  *   template_preprocess_comment().
- * - $user_picture: The comment author's picture. Use render($user_picture) to
- *   print it.
+ * - $user_picture: The comment author's picture from user-picture.tpl.php.
  * - $signature: Authors signature.
  * - $status: Comment status. Possible values are:
  *   unpublished, published, or preview.
@@ -80,7 +79,7 @@
   <?php print render($title_suffix); ?>
 
   <footer>
-    <?php print render($user_picture); ?>
+    <?php print $user_picture; ?>
     <p class="submitted"><?php print $submitted; ?></p>
     <?php
       // Indicate the semantic relationship between parent and child comments
diff --git a/core/modules/dblog/dblog.admin.inc b/core/modules/dblog/dblog.admin.inc
index edef5fb..3b56f45 100644
--- a/core/modules/dblog/dblog.admin.inc
+++ b/core/modules/dblog/dblog.admin.inc
@@ -61,7 +61,7 @@ function dblog_overview() {
     $rows[] = array('data' =>
       array(
         // Cells
-        array('class' => array('icon')),
+        array('class' => 'icon'),
         t($dblog->type),
         format_date($dblog->timestamp, 'short'),
         theme('dblog_message', array('event' => $dblog, 'link' => TRUE)),
diff --git a/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php b/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php
index ddfcac4..3492c88 100644
--- a/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php
+++ b/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php
@@ -518,10 +518,6 @@ protected function testFilter() {
       $this->assertEqual(array_sum($count), $type['count'], 'Count matched');
     }
 
-    $this->drupalGet('admin/reports/dblog', array('query' => array('order' => 'Type')));
-    $this->assertResponse(200);
-    $this->assertText(t('Operations'), 'Operations text found');
-
     // Clear all logs and make sure the confirmation message is found.
     $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
     $this->assertText(t('Database log cleared.'), 'Confirmation message found');
diff --git a/core/modules/field/field.install b/core/modules/field/field.install
index b88faa8..bc566d6 100644
--- a/core/modules/field/field.install
+++ b/core/modules/field/field.install
@@ -357,15 +357,6 @@ function _update_7000_field_create_instance($field, &$instance) {
     'deleted' => 0,
   );
 
-  // Merge in display defaults.
-  if (isset($instance['display'])) {
-    foreach ($instance['display'] as &$display) {
-      $display += array(
-        'weight' => 0,
-      );
-    }
-  }
-
   // The serialized 'data' column contains everything from $instance that does
   // not have its own column and is not automatically populated when the
   // instance is read.
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
index 55d0e3f..7f17d34 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
@@ -8,7 +8,6 @@
 namespace Drupal\field\Plugin\Type\Formatter;
 
 use Drupal\Component\Plugin\PluginManagerBase;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\field\Plugin\Type\Formatter\FormatterLegacyDiscoveryDecorator;
@@ -23,8 +22,8 @@ class FormatterPluginManager extends PluginManagerBase {
    * Overrides Drupal\Component\Plugin\PluginManagerBase:$defaults.
    */
   protected $defaults = array(
-    'field_types' => array(),
     'settings' => array(),
+    'default_value' => TRUE,
   );
 
   /**
@@ -33,7 +32,6 @@ class FormatterPluginManager extends PluginManagerBase {
   public function __construct() {
     $this->discovery = new AnnotatedClassDiscovery('field', 'formatter');
     $this->discovery = new FormatterLegacyDiscoveryDecorator($this->discovery);
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
     $this->discovery = new AlterDecorator($this->discovery, 'field_formatter_info');
     $this->discovery = new CacheDecorator($this->discovery, 'field_formatter_types', 'field');
 
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php
index 5722807..c5407bd 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php
@@ -8,7 +8,6 @@
 namespace Drupal\field\Plugin\Type\Widget;
 
 use Drupal\Component\Plugin\PluginManagerBase;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
@@ -23,7 +22,6 @@ class WidgetPluginManager extends PluginManagerBase {
    * Overrides Drupal\Component\Plugin\PluginManagerBase:$defaults.
    */
   protected $defaults = array(
-    'field_types' => array(),
     'settings' => array(),
     'multiple_values' => FALSE,
     'default_value' => TRUE,
@@ -35,7 +33,6 @@ class WidgetPluginManager extends PluginManagerBase {
   public function __construct() {
     $this->discovery = new AnnotatedClassDiscovery('field', 'widget');
     $this->discovery = new WidgetLegacyDiscoveryDecorator($this->discovery);
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
     $this->discovery = new AlterDecorator($this->discovery, 'field_widget_info');
     $this->discovery = new CacheDecorator($this->discovery, 'field_widget_types',  'field');
 
diff --git a/core/modules/field/modules/field_sql_storage/field_sql_storage.install b/core/modules/field/modules/field_sql_storage/field_sql_storage.install
index 9607a9c..4d4fe57 100644
--- a/core/modules/field/modules/field_sql_storage/field_sql_storage.install
+++ b/core/modules/field/modules/field_sql_storage/field_sql_storage.install
@@ -118,15 +118,11 @@ function field_sql_storage_update_8000(&$sandbox) {
     $table_info = array($data_table => $primary_key_data, $revision_table => $primary_key_revision);
 
     foreach ($table_info as $table => $primary_key) {
-      // Do not attempt to rename the 'language' column for fields that already
-      // contain it (created during the upgrade before this update function).
-      if (db_field_exists($table, 'language')) {
-        db_drop_primary_key($table);
-        db_drop_index($table, 'language');
-        db_change_field($table, 'language', 'langcode', $field_langcode);
-        db_add_primary_key($table, $primary_key);
-        db_add_index($table, 'langcode', $langcode_index);
-      }
+      db_drop_primary_key($table);
+      db_drop_index($table, 'language');
+      db_change_field($table, 'language', 'langcode', $field_langcode);
+      db_add_primary_key($table, $primary_key);
+      db_add_index($table, 'langcode', $langcode_index);
     }
   }
 }
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index c51a309..c93aa03 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -455,12 +455,6 @@ function field_ui_widget_type_options($field_type = NULL, $by_label = FALSE) {
     $widget_types = field_info_widget_types();
     uasort($widget_types, 'drupal_sort_weight');
     foreach ($widget_types as $name => $widget_type) {
-      if (!isset($widget_type['field_types'])) {
-        // @todo: TestFieldWidgetMultiple widget is found but the info alter
-        //   hook isn't. Looks like another namespace problem. Ignore this entry
-        //   to allow the tests to pass. See http://drupal.org/node/1836008.
-        continue;
-      }
       foreach ($widget_type['field_types'] as $widget_field_type) {
         // Check that the field type exists.
         if (isset($field_types[$widget_field_type])) {
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
index a777f3e..9f96991 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -101,18 +101,7 @@ public function form(array $form, array &$form_state) {
     // Field rows.
     foreach ($instances as $name => $instance) {
       $field = field_info_field($instance['field_name']);
-
-      if (isset($instance['display'][$this->view_mode])) {
-        $display = $instance['display'][$this->view_mode];
-      }
-      else {
-        $display = array(
-          'type' => 'hidden',
-          'label' => 'above',
-          'weight' => 0,
-        );
-      }
-
+      $display = $instance['display'][$this->view_mode];
       $table[$name] = array(
         '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
         '#row_type' => 'field',
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
index a67ad1f..39324bf 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
@@ -32,19 +32,6 @@ function setUp() {
     $type_name = strtolower($this->randomName(8)) . '_test';
     $type = $this->drupalCreateContentType(array('name' => $type_name, 'type' => $type_name));
     $this->type = $type->type;
-
-    // Create a default vocabulary.
-    $vocabulary = entity_create('taxonomy_vocabulary', array(
-      'name' => $this->randomName(),
-      'description' => $this->randomName(),
-      'machine_name' => drupal_strtolower($this->randomName()),
-      'langcode' => LANGUAGE_NOT_SPECIFIED,
-      'help' => '',
-      'nodes' => array('article' => 'article'),
-      'weight' => mt_rand(0, 10),
-    ));
-    taxonomy_vocabulary_save($vocabulary);
-    $this->vocabulary = $vocabulary->machine_name;
   }
 
   /**
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
index 8396c7f..7ea0e46 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
@@ -168,35 +168,14 @@ function testViewModeCustom() {
   }
 
   /**
-   * Tests that field instances with no explicit display settings do not break.
-   */
-  function testNonInitializedFields() {
-    // Create a test field.
-    $edit = array(
-      'fields[_add_new_field][label]' => 'Test',
-      'fields[_add_new_field][field_name]' => 'test',
-    );
-    $this->fieldUIAddNewField('admin/structure/types/manage/' . $this->type, $edit);
-
-    // Check that no settings have been set for the 'teaser' mode.
-    $instance = field_info_instance('node', 'field_test', $this->type);
-    $this->assertFalse(isset($instance['display']['teaser']));
-
-    // Check that the field appears as 'hidden' on the 'Manage display' page
-    // for the 'teaser' mode.
-    $this->drupalGet('admin/structure/types/manage/' . $this->type . '/display/teaser');
-    $this->assertFieldByName('fields[field_test][type]', 'hidden', 'The field is displayed as \'hidden \'.');
-  }
-
-  /**
    * Tests hiding the view modes fieldset when there's only one available.
    */
   function testSingleViewMode() {
-    $this->drupalGet('admin/structure/taxonomy/' . $this->vocabulary . '/display');
+    $this->drupalGet('admin/config/people/accounts/display');
     $this->assertNoText('Use custom display settings for the following view modes', 'Custom display settings fieldset found.');
 
     // This may not trigger a notice when 'view_modes_custom' isn't available.
-    $this->drupalPost('admin/structure/taxonomy/' . $this->vocabulary . '/display', array(), t('Save'));
+    $this->drupalPost('admin/config/people/accounts/display', array(), t('Save'));
   }
 
   /**
diff --git a/core/modules/layout/lib/Drupal/layout/Plugin/Type/LayoutManager.php b/core/modules/layout/lib/Drupal/layout/Plugin/Type/LayoutManager.php
index 8446fa8..e58ad4b 100644
--- a/core/modules/layout/lib/Drupal/layout/Plugin/Type/LayoutManager.php
+++ b/core/modules/layout/lib/Drupal/layout/Plugin/Type/LayoutManager.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Component\Plugin\Factory\ReflectionFactory;
 
@@ -27,10 +26,7 @@ class LayoutManager extends PluginManagerBase {
    */
   public function __construct() {
     // Create layout plugin derivatives from declaratively defined layouts.
-    $this->discovery = new AnnotatedClassDiscovery('layout', 'layout');
-    $this->discovery = new DerivativeDiscoveryDecorator($this->discovery);
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
-
+    $this->discovery = new DerivativeDiscoveryDecorator(new AnnotatedClassDiscovery('layout', 'layout'));
     $this->factory = new ReflectionFactory($this);
   }
 }
diff --git a/core/modules/node/lib/Drupal/node/NodeRenderController.php b/core/modules/node/lib/Drupal/node/NodeRenderController.php
index 606722a..129f325 100644
--- a/core/modules/node/lib/Drupal/node/NodeRenderController.php
+++ b/core/modules/node/lib/Drupal/node/NodeRenderController.php
@@ -23,10 +23,6 @@ public function buildContent(array $entities = array(), $view_mode = 'full', $la
     if (empty($entities)) {
       return $return;
     }
-
-    // Attach user account.
-    user_attach_accounts($entities);
-
     parent::buildContent($entities, $view_mode, $langcode);
 
     foreach ($entities as $key => $entity) {
diff --git a/core/modules/node/lib/Drupal/node/NodeTranslationController.php b/core/modules/node/lib/Drupal/node/NodeTranslationController.php
index da078ac..0b5977f 100644
--- a/core/modules/node/lib/Drupal/node/NodeTranslationController.php
+++ b/core/modules/node/lib/Drupal/node/NodeTranslationController.php
@@ -23,6 +23,13 @@ public function getAccess(EntityInterface $entity, $op) {
   }
 
   /**
+   * Overrides EntityTranslationController::getTranslationAccess().
+   */
+  public function getTranslationAccess(EntityInterface $entity, $op) {
+    return user_access("translate any {$entity->bundle()} content") && parent::getTranslationAccess($entity, $op);
+  }
+
+  /**
    * Overrides EntityTranslationController::entityFormAlter().
    */
   public function entityFormAlter(array &$form, array &$form_state, EntityInterface $entity) {
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
index 8cd5b49..2cc5d01 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
@@ -56,7 +56,7 @@ protected function setupBundle() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array("edit any $this->bundle content", "translate $this->entityType entities", 'edit original values');
+    return array("edit any $this->bundle content", "translate any $this->bundle content", 'access entity translation overview', 'create entity translations', 'edit entity translations', 'delete entity translations');
   }
 
   /**
diff --git a/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php b/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php
index 4276146..61b725a 100644
--- a/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/SummaryLengthTest.php
@@ -33,30 +33,21 @@ function testSummaryLength() {
 
     // Create user with permission to view the node.
     $web_user = $this->drupalCreateUser(array('access content', 'administer content types'));
-    $this->loggedInUser = $web_user;
-
-    // Render the node as a teaser.
-    $content = entity_render_controller('node')->view($node, 'teaser');
-    $this->assertTrue(strlen($content['body'][0]['#markup']) < 600, 'Teaser is less than 600 characters long.');
-    $this->drupalSetContent(drupal_render($content));
-    // The string 'What is a Drupalism?' is between the 200th and 600th
-    // characters of the node body, so it should be included if the summary is
-    // 600 characters long.
+    $this->drupalLogin($web_user);
+
+    // Attempt to access the front page.
+    $this->drupalGet("node");
+    // The node teaser when it has 600 characters in length
     $expected = 'What is a Drupalism?';
-    $this->assertRaw($expected);
+    $this->assertRaw($expected, 'Check that the summary is 600 characters in length', 'Node');
 
     // Change the teaser length for "Basic page" content type.
     $instance = field_info_instance('node', 'body', $node->type);
     $instance['display']['teaser']['settings']['trim_length'] = 200;
     field_update_instance($instance);
 
-    // Render the node as a teaser again and check that the summary is now only
-    // 200 characters in length and so does not include 'What is a Drupalism?'.
-    $content = entity_render_controller('node')->view($node, 'teaser');
-    $this->assertTrue(strlen($content['body'][0]['#markup']) < 200, 'Teaser is less than 200 characters long.');
-    $this->drupalSetContent(drupal_render($content));
-    $this->assertText($node->label());
-    $this->assertNoRaw($expected);
+    // Attempt to access the front page again and check if the summary is now only 200 characters in length.
+    $this->drupalGet("node");
+    $this->assertNoRaw($expected, 'Check that the summary is not longer than 200 characters', 'Node');
   }
-
 }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 71a57f2..729075d 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1148,14 +1148,7 @@ function template_preprocess_node(&$variables) {
   if (variable_get('node_submitted_' . $node->type, TRUE)) {
     $variables['display_submitted'] = TRUE;
     $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['name'], '!datetime' => $variables['date']));
-    if (theme_get_setting('toggle_node_user_picture')) {
-      // To change user picture settings (e.g. image style), edit the 'compact'
-      // view mode on User entity.
-      $variables['user_picture'] = user_view($node->account, 'compact');
-    }
-    else {
-      $variables['user_picture'] = array();
-    }
+    $variables['user_picture'] = theme_get_setting('toggle_node_user_picture') ? theme('user_picture', array('account' => $node)) : '';
   }
   else {
     $variables['display_submitted'] = FALSE;
@@ -2862,6 +2855,13 @@ function node_list_permissions($type) {
       'title' => t('%type_name: Delete any content', array('%type_name' => $type->name)),
     ),
   );
+
+  if (module_exists('translation_entity') && translation_entity_enabled('node', $type->type)) {
+    $perms["translate any $type->type content"] = array(
+      'title' => t('%type_name: Translate any content', array('%type_name' => $type->name)),
+    );
+  }
+
   return $perms;
 }
 
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index 71c72b8..a71f5eb 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -133,6 +133,7 @@ function node_preview(Node $node) {
       // user ID 0 denotes the anonymous user.
       if ($user = user_load_by_name($node->name)) {
         $node->uid = $user->uid;
+        $node->picture = $user->picture;
       }
       else {
         $node->uid = 0; // anonymous user
@@ -141,6 +142,7 @@ function node_preview(Node $node) {
     elseif ($node->uid) {
       $user = user_load($node->uid);
       $node->name = $user->name;
+      $node->picture = $user->picture;
     }
 
     $node->changed = REQUEST_TIME;
diff --git a/core/modules/node/templates/node.tpl.php b/core/modules/node/templates/node.tpl.php
index 196d26f..ca9a75b 100644
--- a/core/modules/node/templates/node.tpl.php
+++ b/core/modules/node/templates/node.tpl.php
@@ -10,7 +10,7 @@
  *   or print a subset such as render($content['field_example']). Use
  *   hide($content['field_example']) to temporarily suppress the printing of a
  *   given element.
- * - $user_picture: The node author's picture. Use render() to print it.
+ * - $user_picture: The node author's picture from user-picture.tpl.php.
  * - $date: Formatted creation date. Preprocess functions can reformat it by
  *   calling format_date() with the desired parameters on the $created variable.
  * - $name: Themed username of node author output from theme_username().
@@ -86,7 +86,7 @@
 
   <?php if ($display_submitted): ?>
     <footer>
-      <?php print render($user_picture); ?>
+      <?php print $user_picture; ?>
       <p class="submitted"><?php print $submitted; ?></p>
     </footer>
   <?php endif; ?>
diff --git a/core/modules/openid/lib/Drupal/openid/Tests/OpenIDTestBase.php b/core/modules/openid/lib/Drupal/openid/Tests/OpenIDTestBase.php
index e5ab23c..f88ba92 100644
--- a/core/modules/openid/lib/Drupal/openid/Tests/OpenIDTestBase.php
+++ b/core/modules/openid/lib/Drupal/openid/Tests/OpenIDTestBase.php
@@ -19,7 +19,7 @@
    *
    * @var array
    */
-  public static $modules = array('block', 'openid', 'test_page_test');
+  public static $modules = array('block', 'node', 'openid');
 
   function setUp() {
     parent::setUp();
@@ -42,7 +42,13 @@ function setUp() {
 
     // Use a different front page than login page for testing OpenID login from
     // the user login block.
-    config('system.site')->set('page.front', 'test-page')->save();
+    config('system.site')->set('page.front', 'node')->save();
+
+    // Create Basic page and Article node types.
+    if ($this->profile != 'standard') {
+      $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
+      $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+    }
   }
 
   /**
diff --git a/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php b/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php
index 83fdd63..f76d535 100644
--- a/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php
+++ b/core/modules/rest/lib/Drupal/rest/EventSubscriber/RouteSubscriber.php
@@ -62,7 +62,6 @@ public function dynamicRoutes(RouteBuildEvent $event) {
 
         // @todo Switch to ->addCollection() once http://drupal.org/node/1819018 is resolved.
         foreach ($plugin->routes() as $name => $route) {
-          $route->setRequirement('_access', 'TRUE');
           $collection->add("rest.$name", $route);
         }
       }
diff --git a/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php b/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php
deleted file mode 100644
index 117dc1a..0000000
--- a/core/modules/system/lib/Drupal/system/Access/CronAccessCheck.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\system\Access\CronAccessCheck.
- */
-
-namespace Drupal\system\Access;
-
-use Drupal\Core\Access\AccessCheckInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Access check for cron routes.
- */
-class CronAccessCheck implements AccessCheckInterface {
-
-  /**
-   * Implements AccessCheckInterface::applies().
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_access_system_cron', $route->getRequirements());
-  }
-
-  /**
-   * Implements AccessCheckInterface::access().
-   */
-  public function access(Route $route, Request $request) {
-    $key = $request->attributes->get('key');
-    if ($key != state()->get('system.cron_key')) {
-      watchdog('cron', 'Cron could not run because an invalid key was used.', array(), WATCHDOG_NOTICE);
-      return FALSE;
-    }
-    elseif (config('system.maintenance')->get('enabled')) {
-      watchdog('cron', 'Cron could not run because the site is in maintenance mode.', array(), WATCHDOG_NOTICE);
-      return FALSE;
-    }
-    return TRUE;
-  }
-}
diff --git a/core/modules/system/lib/Drupal/system/CronController.php b/core/modules/system/lib/Drupal/system/CronController.php
index 1a7e50e..292d242 100644
--- a/core/modules/system/lib/Drupal/system/CronController.php
+++ b/core/modules/system/lib/Drupal/system/CronController.php
@@ -8,9 +8,10 @@
 namespace Drupal\system;
 
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
- * Controller for Cron handling.
+ * Controllers for Cron handling.
  */
 class CronController {
 
@@ -20,11 +21,35 @@ class CronController {
    * @return Symfony\Component\HttpFoundation\Response
    *   A Symfony response object.
    */
-  public function run() {
+  public function run($key) {
+    if (!$this->access($key)) {
+      throw new AccessDeniedHttpException();
+    }
+
     // @todo Make this an injected object.
     drupal_cron_run();
 
     // HTTP 204 is "No content", meaning "I did what you asked and we're done."
     return new Response('', 204);
   }
+
+  /**
+   * Determines if the user has access to run cron.
+   *
+   * @todo Eliminate this method in favor of a new-style access checker once
+   * http://drupal.org/node/1793520 gets in.
+   */
+  function access($key) {
+    if ($key != state()->get('system.cron_key')) {
+      watchdog('cron', 'Cron could not run because an invalid key was used.', array(), WATCHDOG_NOTICE);
+      return FALSE;
+    }
+    elseif (config('system.maintenance')->get('enabled')) {
+      watchdog('cron', 'Cron could not run because the site is in maintenance mode.', array(), WATCHDOG_NOTICE);
+      return FALSE;
+    }
+
+    return TRUE;
+  }
+
 }
diff --git a/core/modules/system/lib/Drupal/system/SystemBundle.php b/core/modules/system/lib/Drupal/system/SystemBundle.php
deleted file mode 100644
index 4ea6017..0000000
--- a/core/modules/system/lib/Drupal/system/SystemBundle.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\system\SystemBundle.
- */
-
-namespace Drupal\system;
-
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\HttpKernel\Bundle\Bundle;
-
-/**
- * System dependency injection container.
- */
-class SystemBundle extends Bundle {
-
-  /**
-   * Overrides Bundle::build().
-   */
-  public function build(ContainerBuilder $container) {
-    $container->register('access_check.cron', 'Drupal\system\Access\CronAccessCheck')
-      ->addTag('access_check');
-  }
-}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Module/ClassLoaderTest.php b/core/modules/system/lib/Drupal/system/Tests/Module/ClassLoaderTest.php
index df59ea0..ea2026d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Module/ClassLoaderTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Module/ClassLoaderTest.php
@@ -37,10 +37,16 @@ function testClassLoading() {
 
     module_disable(array('module_autoload_test'), FALSE);
     $this->resetAll();
-    // Check twice to test an unprimed and primed system_list() cache.
+    // The first request after a module has been disabled will result in that
+    // module's namespace getting registered because the kernel registers all
+    // namespaces in the existing 'container.modules' parameter before checking
+    // whether the list of modules has changed and rebuilding the container.
+    // @todo Fix the behavior so that the namespace is not registered even on the
+    //   first request after disabling the module and revert this test to having
+    //   the assertion inside the loop. See http://drupal.org/node/1846376
     for ($i=0; $i<2; $i++) {
       $this->drupalGet('module-test/class-loading');
-      $this->assertNoText($expected, 'Autoloader does not load classes from a disabled module.');
     }
+    $this->assertNoText($expected, 'Autoloader does not load classes from a disabled module.');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Module/ModuleTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Module/ModuleTestBase.php
index b7fd25c..f23204b 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Module/ModuleTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Module/ModuleTestBase.php
@@ -99,7 +99,7 @@ function assertModuleConfig($module) {
       return;
     }
     $module_file_storage = new FileStorage($module_config_dir);
-    $names = $module_file_storage->listAll($module . '.');
+    $names = $module_file_storage->listAll();
 
     // Verify that the config directory is not empty.
     $this->assertTrue($names);
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/FirstEntryFinalMatcherTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/FirstEntryFinalMatcherTest.php
index c44a492..a288b9e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/FirstEntryFinalMatcherTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/FirstEntryFinalMatcherTest.php
@@ -61,7 +61,7 @@ public function testFinalMatcherStatic() {
     $matcher->setCollection($collection);
     $attributes = $matcher->matchRequest($request);
 
-    $this->assertEqual($attributes['_route']->getOption('_name'), 'route_a', 'The correct matching route was found.');
+    $this->assertEqual($attributes['_route'], 'route_a', 'The correct matching route was found.');
     $this->assertEqual($attributes['_controller'], 'foo', 'The correct controller was found.');
   }
 
@@ -82,7 +82,7 @@ public function testFinalMatcherPattern() {
     $matcher->setCollection($collection);
     $attributes = $matcher->matchRequest($request);
 
-    $this->assertEqual($attributes['_route']->getOption('_name'), 'route_a', 'The correct matching route was found.');
+    $this->assertEqual($attributes['_route'], 'route_a', 'The correct matching route was found.');
     $this->assertEqual($attributes['_controller'], 'foo', 'The correct controller was found.');
     $this->assertEqual($attributes['value'], 'narf', 'Required placeholder value found.');
   }
@@ -105,7 +105,7 @@ public function testFinalMatcherPatternDefalts() {
     $matcher->setCollection($collection);
     $attributes = $matcher->matchRequest($request);
 
-    $this->assertEqual($attributes['_route']->getOption('_name'), 'route_a', 'The correct matching route was found.');
+    $this->assertEqual($attributes['_route'], 'route_a', 'The correct matching route was found.');
     $this->assertEqual($attributes['_controller'], 'foo', 'The correct controller was found.');
     $this->assertEqual($attributes['value'], 'poink', 'Optional placeholder value used default.');
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/HttpMethodMatcherTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/HttpMethodMatcherTest.php
index 8055743..c98da2e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/HttpMethodMatcherTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/HttpMethodMatcherTest.php
@@ -44,7 +44,7 @@ function __construct($test_id = NULL) {
 
     $this->fixtures = new RoutingFixtures();
   }
-
+  
   /**
    * Confirms that the HttpMethod matcher matches properly.
    */
@@ -78,7 +78,7 @@ public function testNestedMatcher() {
 
     $attributes = $matcher->matchRequest($request);
 
-    $this->assertEqual($attributes['_route']->getOption('_name'), 'route_a', 'The correct matching route was found.');
+    $this->assertEqual($attributes['_route'], 'route_a', 'The correct matching route was found.');
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/MimeTypeMatcherTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/MimeTypeMatcherTest.php
index 8c9a1d8..850cc7e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/MimeTypeMatcherTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/MimeTypeMatcherTest.php
@@ -93,7 +93,7 @@ public function testNestedMatcher() {
     $request->headers->set('Accept', 'text/html, text/xml;q=0.9');
 
     $attributes = $matcher->matchRequest($request);
-    $this->assertEqual($attributes['_route']->getOption('_name'), 'route_e', 'The correct matching route was found.');
+    $this->assertEqual($attributes['_route'], 'route_e', 'The correct matching route was found.');
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/NestedMatcherTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/NestedMatcherTest.php
index de29538..444785c 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/NestedMatcherTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/NestedMatcherTest.php
@@ -60,6 +60,6 @@ public function testNestedMatcher() {
 
     $attributes = $matcher->matchRequest($request);
 
-    $this->assertEqual($attributes['_route']->getOption('_name'), 'route_a', 'The correct matching route was found.');
+    $this->assertEqual($attributes['_route'], 'route_a', 'The correct matching route was found.');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/RouterPermissionTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/RouterPermissionTest.php
deleted file mode 100644
index 6980886..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/Routing/RouterPermissionTest.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\system\Tests\Routing\RouterPermissionTest.
- */
-
-namespace Drupal\system\Tests\Routing;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Basic tests for access permissions in routes.
- */
-class RouterPermissionTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('router_test');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Router Permission tests',
-      'description' => 'Function Tests for the routing permission system.',
-      'group' => 'Routing',
-    );
-  }
-
-  /**
-   * Tests permission requirements on routes.
-   */
-  public function testPermissionAccess() {
-
-    $this->drupalGet('router_test/test7');
-    $this->assertResponse(403, "Access denied for a route where we don't have a permission");
-
-    $this->drupalGet('router_test/test8');
-    $this->assertResponse(403, 'Access denied by default if no access specified');
-
-    $user = $this->drupalCreateUser(array('access test7'));
-    $this->drupalLogin($user);
-    $this->drupalGet('router_test/test7');
-    $this->assertResponse(200);
-    $this->assertNoRaw('Access denied');
-    $this->assertRaw('test7text', 'The correct string was returned because the route was successful.');
-  }
-}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
deleted file mode 100644
index d86f7cd..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\system\Tests\Upgrade\UserPictureUpgradePathTest.
- */
-
-namespace Drupal\system\Tests\Upgrade;
-
-/**
- * Tests upgrading a filled database with user picture data.
- *
- * Loads a filled installation of Drupal 7 with user picture data and runs the
- * upgrade process on it.
- */
-class UserPictureUpgradePathTest extends UpgradePathTestBase {
-
-  public static function getInfo() {
-    return array(
-      'name'  => 'User picture upgrade test',
-      'description'  => 'Upgrade tests with user picture data.',
-      'group' => 'Upgrade path',
-    );
-  }
-
-  public function setUp() {
-    $path = drupal_get_path('module', 'system') . '/tests/upgrade';
-    $this->databaseDumpFiles = array(
-      $path . '/drupal-7.bare.standard_all.database.php.gz',
-      $path . '/drupal-7.user_picture.database.php',
-    );
-    parent::setUp();
-  }
-
-  /**
-   * Tests expected user picture conversions after a successful upgrade.
-   */
-  public function testUserPictureUpgrade() {
-    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
-
-    // Retrieve the field instance and check for migrated settings.
-    $instance = field_info_instance('user', 'user_picture', 'user');
-    $file = entity_load('file', $instance['settings']['default_image']);
-    $this->assertIdentical($instance['settings']['default_image'], $file->id(), 'Default user picture has been migrated.');
-    $this->assertEqual($file->uri, 'public://user_pictures_dir/druplicon.png', 'File id matches the uri expected.');
-    $this->assertEqual($file->filename, 'druplicon.png');
-    $this->assertEqual($file->langcode, LANGUAGE_NOT_SPECIFIED);
-    $this->assertEqual($file->filemime, 'image/png');
-    $this->assertFalse(empty($file->uuid));
-
-    // Check file usage for the default image.
-    $usage = file_usage()->listUsage($file);
-    $field = field_info_field('user_picture');
-    $this->assertEqual(1, $usage['image']['default_image'][$field['id']]);
-
-    $this->assertEqual($instance['settings']['max_resolution'], '800x800', 'User picture maximum resolution has been migrated.');
-    $this->assertEqual($instance['settings']['max_filesize'], '700 KB', 'User picture maximum filesize has been migrated.');
-    $this->assertEqual($instance['description'], 'These are user picture guidelines.', 'User picture guidelines are now the user picture field description.');
-    $this->assertEqual($instance['settings']['file_directory'], 'user_pictures_dir', 'User picture directory path has been migrated.');
-    $this->assertEqual($instance['display']['default']['settings']['image_style'], 'thumbnail', 'User picture image style setting has been migrated.');
-
-    // Verify compact view mode default settings.
-    $this->drupalGet('admin/config/people/accounts/display/compact');
-    $this->assertFieldByName('fields[member_for][type]', 'hidden');
-
-    // Check the user picture and file usage record.
-    $user = user_load(1);
-    $file = file_load($user->user_picture[LANGUAGE_NOT_SPECIFIED][0]['fid']);
-    $this->assertEqual('public://user_pictures_dir/faked_image.png', $file->uri);
-    $usage = file_usage()->listUsage($file);
-    $this->assertEqual(1, $usage['file']['user'][1]);
-  }
-
-}
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 8c59d82..d08c4ce 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -409,7 +409,7 @@ function system_theme_settings($form, &$form_state, $key = '') {
 
   // Some features are not always available
   $disabled = array();
-  if (!user_picture_enabled()) {
+  if (!variable_get('user_pictures', 0)) {
     $disabled['toggle_node_user_picture'] = TRUE;
     $disabled['toggle_comment_user_picture'] = TRUE;
   }
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 5e3582f..239d3a2 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -2590,48 +2590,44 @@ function hook_schema() {
         'description' => 'The primary identifier for a node.',
         'type' => 'serial',
         'unsigned' => TRUE,
-        'not null' => TRUE,
-      ),
+        'not null' => TRUE),
       'vid' => array(
         'description' => 'The current {node_revision}.vid version identifier.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
-        'default' => 0,
-      ),
+        'default' => 0),
       'type' => array(
         'description' => 'The {node_type} of this node.',
         'type' => 'varchar',
         'length' => 32,
         'not null' => TRUE,
-        'default' => '',
-      ),
+        'default' => ''),
       'title' => array(
         'description' => 'The title of this node, always treated as non-markup plain text.',
         'type' => 'varchar',
         'length' => 255,
         'not null' => TRUE,
-        'default' => '',
+        'default' => ''),
       ),
-    ),
     'indexes' => array(
       'node_changed'        => array('changed'),
       'node_created'        => array('created'),
-    ),
+      ),
     'unique keys' => array(
       'nid_vid' => array('nid', 'vid'),
-      'vid'     => array('vid'),
-    ),
+      'vid'     => array('vid')
+      ),
     'foreign keys' => array(
       'node_revision' => array(
         'table' => 'node_revision',
         'columns' => array('vid' => 'vid'),
-      ),
+        ),
       'node_author' => array(
         'table' => 'users',
-        'columns' => array('uid' => 'uid'),
-      ),
-    ),
+        'columns' => array('uid' => 'uid')
+        ),
+       ),
     'primary key' => array('nid'),
   );
   return $schema;
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index 085895e..85e0517 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -1,6 +1,4 @@
-system.cron:
+cron:
   pattern: '/cron/{key}'
   defaults:
     _controller: '\Drupal\system\CronController::run'
-  requirements:
-    _access_system_cron: 'TRUE'
diff --git a/core/modules/system/system.theme.css b/core/modules/system/system.theme.css
index 4d49d84..6a4a64d 100644
--- a/core/modules/system/system.theme.css
+++ b/core/modules/system/system.theme.css
@@ -305,13 +305,6 @@ ul.inline li {
   margin: 0;
   padding: 0;
 }
-/* IE8 does not support :not() and :last-child. */
-.breadcrumb li:before {
-  content: ' » ';
-}
-.breadcrumb li:first-child:before {
-  content: none;
-}
 
 /**
  * Markup generated by theme_menu_local_tasks().
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/DefaultsTestPluginManager.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/DefaultsTestPluginManager.php
index a449c81..607b100 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/DefaultsTestPluginManager.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/DefaultsTestPluginManager.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Component\Plugin\Discovery\StaticDiscovery;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Component\Plugin\Factory\DefaultFactory;
 
 /**
@@ -23,7 +22,6 @@ public function __construct() {
     // discovery implementation, but StaticDiscovery lets us add some simple
     // mock plugins for unit testing.
     $this->discovery = new StaticDiscovery();
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'ProcessDefinition'));
     $this->factory = new DefaultFactory($this);
 
     // Specify default values.
diff --git a/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/RouteTestSubscriber.php b/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/RouteTestSubscriber.php
index 4243f81..a67e83f 100644
--- a/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/RouteTestSubscriber.php
+++ b/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/RouteTestSubscriber.php
@@ -35,8 +35,6 @@ public function dynamicRoutes(RouteBuildEvent $event) {
     $collection = $event->getRouteCollection();
     $route = new Route('/router_test/test5', array(
       '_content' => '\Drupal\router_test\TestControllers::test5'
-    ), array(
-      '_access' => 'TRUE'
     ));
     $collection->add('router_test_5', $route);
   }
diff --git a/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/TestControllers.php b/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/TestControllers.php
index adb5c34..bcf18b7 100644
--- a/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/TestControllers.php
+++ b/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/TestControllers.php
@@ -34,16 +34,4 @@ public function test5() {
     return "test5";
   }
 
-  public function test6() {
-    return new Response('test6');
-  }
-
-  public function test7() {
-    return new Response('test7text');
-  }
-
-  public function test8() {
-    return new Response('test8');
-  }
-
 }
diff --git a/core/modules/system/tests/modules/router_test/router_test.module b/core/modules/system/tests/modules/router_test/router_test.module
index ffbe070..b3d9bbc 100644
--- a/core/modules/system/tests/modules/router_test/router_test.module
+++ b/core/modules/system/tests/modules/router_test/router_test.module
@@ -1,13 +1 @@
 <?php
-
-/**
- * Implements hook_permission().
- */
-function router_test_permission() {
-  return array(
-    'access test7' =>  array(
-      'title' => t('Access test7 route'),
-      'description' => t('Test permission only.'),
-    ),
-  );
-}
diff --git a/core/modules/system/tests/modules/router_test/router_test.routing.yml b/core/modules/system/tests/modules/router_test/router_test.routing.yml
index 2c94ff2..cc177d3 100644
--- a/core/modules/system/tests/modules/router_test/router_test.routing.yml
+++ b/core/modules/system/tests/modules/router_test/router_test.routing.yml
@@ -2,46 +2,24 @@ router_test_1:
   pattern: '/router_test/test1'
   defaults:
     _controller: '\Drupal\router_test\TestControllers::test1'
-  requirements:
-    _access: 'TRUE'
 
 router_test_2:
   pattern: '/router_test/test2'
   defaults:
     _content: '\Drupal\router_test\TestControllers::test2'
-  requirements:
-    _access: 'TRUE'
 
 router_test_3:
   pattern: '/router_test/test3/{value}'
   defaults:
     _content: '\Drupal\router_test\TestControllers::test3'
-  requirements:
-    _access: 'TRUE'
 
 router_test_4:
   pattern: '/router_test/test4/{value}'
   defaults:
     _content: '\Drupal\router_test\TestControllers::test4'
     value: 'narf'
-  requirements:
-    _access: 'TRUE'
 
 router_test_6:
   pattern: '/router_test/test6'
   defaults:
     _controller: '\Drupal\router_test\TestControllers::test1'
-  requirements:
-    _access: 'TRUE'
-
-router_test_7:
-  pattern: '/router_test/test7'
-  defaults:
-    _controller: '\Drupal\router_test\TestControllers::test7'
-  requirements:
-    _permission: 'access test7'
-
-router_test_8:
-  pattern: '/router_test/test8'
-  defaults:
-    _controller: '\Drupal\router_test\TestControllers::test8'
diff --git a/core/modules/system/tests/upgrade/drupal-7.user_picture.database.php b/core/modules/system/tests/upgrade/drupal-7.user_picture.database.php
deleted file mode 100644
index 12d2b2e..0000000
--- a/core/modules/system/tests/upgrade/drupal-7.user_picture.database.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/**
- * @file
- * Database additions for user picture tests. Used in UserPictureUpgradePathTest.
- *
- * This dump only contains data and schema components relevant for user picture
- * functionality. The drupal-7.bare.database.php file is imported before
- * this dump, so the two form the database structure expected in tests
- * altogether.
- */
-
-// Add an image and assign it to uid 1.
-$fid = db_insert('file_managed')
-  ->fields(array(
-    'uri' => 'public://user_pictures_dir/faked_image.png',
-    'uid' => 1,
-    'status' => 1,
-    'filename' => 'faked_image.png',
-    'filesize' => 1000,
-    'filemime' => 'image/png',
-    'timestamp' => 1353542634,
-  ))
-  ->execute();
-
-db_insert('file_usage')
-  ->fields(array(
-    'fid' => $fid,
-    'module' => 'user',
-    'type' => 'user',
-    'id' => 1,
-    'count' => 1,
-  ))
-  ->execute();
-
-db_update('users')
-  ->condition('uid', 1)
-  ->fields(array(
-    'picture' => $fid,
-  ))
-  ->execute();
-
-// Set up variables needed for user picture support.
-$deleted_variables = array(
-  'user_pictures',
-  'user_picture_default',
-  'user_picture_dimensions',
-  'user_picture_file_size',
-  'user_picture_guidelines',
-  'user_picture_path',
-  'user_picture_style',
-);
-db_delete('variable')
-  ->condition('name', $deleted_variables, 'IN')
-  ->execute();
-
-db_insert('variable')->fields(array(
-  'name',
-  'value',
-))
-->values(array(
-  'name' => 'user_pictures',
-  'value' => 'i:1;',
-))
-->values(array(
-  'name' => 'user_picture_default',
-  'value' => 's:51:"sites/default/files/user_pictures_dir/druplicon.png";',
-))
-->values(array(
-  'name' => 'user_picture_dimensions',
-  'value' => 's:7:"800x800";',
-))
-->values(array(
-  'name' => 'user_picture_file_size',
-  'value' => 's:3:"700";',
-))
-->values(array(
-  'name' => 'user_picture_guidelines',
-  'value' => 's:34:"These are user picture guidelines.";',
-))
-->values(array(
-  'name' => 'user_picture_path',
-  'value' => 's:17:"user_pictures_dir";',
-))
-->values(array(
-  'name' => 'user_picture_style',
-  'value' => 's:9:"thumbnail";',
-))
-->execute();
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php
index 2fa4227..02dc737 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermTranslationController.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\taxonomy;
 
+use Drupal\taxonomy\Plugin\Core\Entity\Term;
+
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\translation_entity\EntityTranslationController;
 
@@ -16,6 +18,13 @@
 class TermTranslationController extends EntityTranslationController {
 
   /**
+   * Overrides EntityTranslationController::getTranslationAccess().
+   */
+  public function getTranslationAccess(EntityInterface $entity, $op) {
+    return user_access("translate terms in $entity->vid") && parent::getTranslationAccess($entity, $op);
+  }
+
+  /**
    * Overrides EntityTranslationController::entityFormAlter().
    */
   public function entityFormAlter(array &$form, array &$form_state, EntityInterface $entity) {
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php
deleted file mode 100644
index f40f858..0000000
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\taxonomy\Tests\TaxonomyTermReferenceItemTest.
- */
-
-namespace Drupal\taxonomy\Tests;
-
-use Drupal\simpletest\WebTestBase;
-use Drupal\taxonomy\Type\TaxonomyTermReferenceItem;
-use Drupal\Core\Entity\Field\FieldItemInterface;
-use Drupal\Core\Entity\Field\FieldInterface;
-
-/**
- * Tests the new entity API for the taxonomy term reference field type.
- */
-class TaxonomyTermReferenceItemTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('field', 'field_sql_storage', 'taxonomy', 'entity_test', 'options');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Taxonomy reference API',
-      'description' => 'Tests using entity fields of the taxonomy term reference field type.',
-      'group' => 'Taxonomy',
-    );
-  }
-
-  public function setUp() {
-    parent::setUp();
-    $vocabulary = entity_create('taxonomy_vocabulary', array(
-      'name' => $this->randomName(),
-      'machine_name' => drupal_strtolower($this->randomName()),
-      'langcode' => LANGUAGE_NOT_SPECIFIED,
-    ));
-    $vocabulary->save();
-    $field = array(
-      'field_name' => 'field_test_taxonomy',
-      'type' => 'taxonomy_term_reference',
-      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
-      'settings' => array(
-        'allowed_values' => array(
-          array(
-            'vocabulary' => $vocabulary->machine_name,
-            'parent' => 0,
-          ),
-        ),
-      ),
-    );
-    field_create_field($field);
-    $instance = array(
-      'entity_type' => 'entity_test',
-      'field_name' => 'field_test_taxonomy',
-      'bundle' => 'entity_test',
-      'widget' => array(
-        'type' => 'options_select',
-      ),
-    );
-    field_create_instance($instance);
-    $this->term = entity_create('taxonomy_term', array(
-      'name' => $this->randomName(),
-      'vid' => $vocabulary->vid,
-      'langcode' => LANGUAGE_NOT_SPECIFIED,
-    ));
-    $this->term->save();
-  }
-
-  /**
-   * Tests using entity fields of the taxonomy term reference field type.
-   */
-  public function testTaxonomyTermReferenceItem() {
-    $tid = $this->term->id();
-    // Just being able to create the entity like this verifies a lot of code.
-    $entity = entity_create('entity_test', array());
-    $entity->field_test_taxonomy->tid = $this->term->tid;
-    $entity->name->value = $this->randomName();
-    $entity->save();
-
-    $entity = entity_load('entity_test', $entity->id());
-    $this->assertTrue($entity->field_test_taxonomy instanceof FieldInterface, 'Field implements interface.');
-    $this->assertTrue($entity->field_test_taxonomy[0] instanceof FieldItemInterface, 'Field item implements interface.');
-    $this->assertEqual($entity->field_test_taxonomy->tid, $this->term->tid);
-    $this->assertEqual($entity->field_test_taxonomy->entity->name, $this->term->name);
-    $this->assertEqual($entity->field_test_taxonomy->entity->id(), $tid);
-    $this->assertEqual($entity->field_test_taxonomy->entity->uuid(), $this->term->uuid());
-
-    // Change the name of the term via the reference.
-    $new_name = $this->randomName();
-    $entity->field_test_taxonomy->entity->name = $new_name;
-    $entity->field_test_taxonomy->entity->save();
-    // Verify it is the correct name.
-    $term = entity_load('taxonomy_term', $tid);
-    $this->assertEqual($term->name, $new_name);
-
-    // Make sure the computed term reflects updates to the term id.
-    $term2 = entity_create('taxonomy_term', array(
-      'name' => $this->randomName(),
-      'vid' => $this->term->vid,
-      'langcode' => LANGUAGE_NOT_SPECIFIED,
-    ));
-    $term2->save();
-
-    $entity->field_test_taxonomy->tid = $term2->tid;
-    $this->assertEqual($entity->field_test_taxonomy->entity->id(), $term2->tid);
-    $this->assertEqual($entity->field_test_taxonomy->entity->name, $term2->name);
-  }
-
-}
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php
index ba9c152..d5da3ec 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTranslationUITest.php
@@ -66,7 +66,8 @@ protected function setupBundle() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array('administer taxonomy', "translate $this->entityType entities", 'edit original values');
+    $vocabulary = taxonomy_vocabulary_machine_name_load($this->bundle);
+    return array('administer taxonomy', 'translate terms in ' . $vocabulary->id(), 'access entity translation overview', 'create entity translations', 'edit entity translations', 'delete entity translations');
   }
 
   /**
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
deleted file mode 100644
index 8eabe7d..0000000
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Type/TaxonomyTermReferenceItem.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\taxonomy\Type\TaxonomyTermReferenceItem.
- */
-
-namespace Drupal\taxonomy\Type;
-
-use Drupal\Core\Entity\Field\FieldItemBase;
-
-/**
- * Defines the 'taxonomy_term_reference' entity field item.
- */
-class TaxonomyTermReferenceItem extends FieldItemBase {
-
-  /**
-   * Property definitions of the contained properties.
-   *
-   * @see self::getPropertyDefinitions()
-   *
-   * @var array
-   */
-  static $propertyDefinitions;
-
-  /**
-   * Implements \Drupal\Core\TypedData\ComplexDataInterface::getPropertyDefinitions().
-   */
-  public function getPropertyDefinitions() {
-    if (!isset(self::$propertyDefinitions)) {
-      self::$propertyDefinitions['tid'] = array(
-        'type' => 'integer',
-        'label' => t('Referenced taxonomy term id.'),
-      );
-      self::$propertyDefinitions['entity'] = array(
-        'type' => 'entity',
-        'constraints' => array(
-          'entity type' => 'taxonomy_term',
-        ),
-        'label' => t('Term'),
-        'description' => t('The referenced taxonomy term'),
-        // The entity object is computed out of the tid.
-        'computed' => TRUE,
-        'read-only' => FALSE,
-        'settings' => array('id source' => 'tid'),
-      );
-    }
-    return self::$propertyDefinitions;
-  }
-
-  /**
-   * Overrides \Drupal\Core\Entity\Field\FieldItemBase::setValue().
-   */
-  public function setValue($values) {
-    // Treat the values as property value of the entity field, if no array
-    // is given.
-    if (!is_array($values)) {
-      $values = array('entity' => $values);
-    }
-
-    // Entity is computed out of the ID, so we only need to update the ID. Only
-    // set the entity field if no ID is given.
-    if (isset($values['tid'])) {
-      $this->properties['tid']->setValue($values['tid']);
-    }
-    elseif (isset($values['entity'])) {
-      $this->properties['entity']->setValue($values['entity']);
-    }
-    else {
-      $this->properties['entity']->setValue(NULL);
-    }
-    unset($values['entity'], $values['tid']);
-    if ($values) {
-      throw new \InvalidArgumentException('Property ' . key($values) . ' is unknown.');
-    }
-  }
-
-}
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 0158e7e..fa63f64 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -101,6 +101,13 @@ function taxonomy_permission() {
          'title' => t('Delete terms from %vocabulary', array('%vocabulary' => $vocabulary->name)),
       ),
     );
+    if (module_exists('translation_entity') && translation_entity_enabled('taxonomy_term', $vocabulary->machine_name)) {
+      $permissions += array(
+         'translate terms in ' . $vocabulary->vid => array(
+           'title' => t('Translate terms from %vocabulary', array('%vocabulary' => $vocabulary->name)),
+        ),
+      );
+    }
   }
   return $permissions;
 }
@@ -1015,7 +1022,6 @@ function taxonomy_field_info() {
       'description' => t('This field stores a reference to a taxonomy term.'),
       'default_widget' => 'options_select',
       'default_formatter' => 'taxonomy_term_reference_link',
-      'field item class' => 'Drupal\taxonomy\Type\TaxonomyTermReferenceItem',
       'settings' => array(
         'allowed_values' => array(
           array(
diff --git a/core/modules/taxonomy/taxonomy.views.inc b/core/modules/taxonomy/taxonomy.views.inc
index 0bcb6e5..57ef50c 100644
--- a/core/modules/taxonomy/taxonomy.views.inc
+++ b/core/modules/taxonomy/taxonomy.views.inc
@@ -489,7 +489,7 @@ function views_taxonomy_set_breadcrumb(&$breadcrumb, &$argument) {
       continue;
     }
     if (!empty($argument->options['use_taxonomy_term_path'])) {
-      $path = $parent->uri();
+      $path = taxonomy_term_uri($parent);
       $path = $path['path'];
     }
     else {
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
index 26a2699..5a6a208 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -99,9 +99,8 @@ public function getAccess(EntityInterface $entity, $op) {
   /**
    * Implements EntityTranslationControllerInterface::getTranslationAccess().
    */
-  public function getTranslationAccess(EntityInterface $entity, $langcode) {
-    $entity_type = $entity->entityType();
-    return (user_access('translate any entity') || user_access("translate $entity_type entities")) && ($langcode != $entity->language()->langcode || user_access('edit original values'));
+  public function getTranslationAccess(EntityInterface $entity, $op) {
+    return user_access("$op entity translations");
   }
 
   /**
@@ -220,7 +219,7 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
         '#collapsed' => TRUE,
         '#tree' => TRUE,
         '#weight' => 10,
-        '#access' => $this->getTranslationAccess($entity, $form_langcode),
+        '#access' => $this->getTranslationAccess($entity, $source_langcode ? 'create' : 'update'),
         '#multilingual' => TRUE,
       );
 
@@ -259,17 +258,11 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
   }
 
   /**
-   * Process callback: Determines which elements get clue in the form.
-   *
-   * @param array $element
-   *   Form API element.
-   *
-   * @return array
-   *   A processed element with the shared elements marked with a clue.
+   * Process callback: determines which elements get clue in the form.
    *
    * @see \Drupal\translation_entity\EntityTranslationController::entityFormAlter()
    */
-  public function entityFormSharedElements($element) {
+  public function entityFormSharedElements($element, $form_state, $form) {
     static $ignored_types;
 
     // @todo Find a more reliable way to determine if a form element concerns a
@@ -289,7 +282,15 @@ public function entityFormSharedElements($element) {
         }
         // Elements are considered to be non multilingual by default.
         if (empty($element[$key]['#multilingual'])) {
-          $this->addTranslatabilityClue($element[$key]);
+          // If we are displaying a multilingual entity form we need to provide
+          // transltability clues, otherwise the shared form elements should be
+          // hidden.
+          if (empty($form_state['translation_entity']['translation_form'])) {
+            $this->addTranslatabilityClue($element[$key]);
+          }
+          else {
+            $element[$key]['#access'] = FALSE;
+          }
         }
       }
     }
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php
index ed08fc0..45b9759 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationControllerInterface.php
@@ -136,13 +136,17 @@ public function getAccess(EntityInterface $entity, $op);
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
    *   The entity whose translation has to be accessed.
-   * @param string $langcode
-   *   The language code identifying the translation to be accessed.
+   * @param $op
+   *   The operation to be performed on the translation. Possible values are:
+   *   - "view"
+   *   - "update"
+   *   - "delete"
+   *   - "create"
    *
    * @return boolean
    *   TRUE if the operation may be performed, FALSE otherwise.
    */
-  public function getTranslationAccess(EntityInterface $entity, $langcode);
+  public function getTranslationAccess(EntityInterface $entity, $op);
 
   /**
    * Retrieves the source language for the translation being created.
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/ConfigTestTranslationUITest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/ConfigTestTranslationUITest.php
index 7d5a38b..4d5fead 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/ConfigTestTranslationUITest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/ConfigTestTranslationUITest.php
@@ -41,7 +41,7 @@ function setUp() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array("translate $this->entityType entities", 'edit original values');
+    return array('access entity translation overview', 'create entity translations', 'update entity translations', 'delete entity translations');
   }
 
   /**
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTestTranslationUITest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTestTranslationUITest.php
index f66fcc3..a1a2757 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTestTranslationUITest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTestTranslationUITest.php
@@ -39,7 +39,7 @@ function setUp() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array('administer entity_test content', "translate $this->entityType entities", 'edit original values');
+    return array('administer entity_test content', 'access entity translation overview', 'create entity translations', 'update entity translations', 'delete entity translations');
   }
 
   /**
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index f57773b..e1148d5 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -134,18 +134,38 @@ function translation_entity_menu() {
         'weight' => 2,
       ) + $item;
 
+      $items["$path/translations/overview"] = array(
+        'title' => 'Overview',
+        'type' => MENU_DEFAULT_LOCAL_TASK,
+        'weight' => 0,
+      );
+
       // Add translation callback.
       // @todo Add the access callback instead of replacing it as soon as the
       // routing system supports multiple callbacks.
-      $add_path = "$path/translations/add/%language/%language";
       $language_position = $entity_position + 3;
       $args = array($entity_position, $language_position, $language_position + 1);
-      $items[$add_path] = array(
+      $items["$path/translations/add/%language/%language"] = array(
         'title' => 'Add',
         'page callback' => 'translation_entity_add_page',
         'page arguments' => $args,
         'access callback' => 'translation_entity_add_access',
         'access arguments' => $args,
+        'type' => MENU_LOCAL_TASK,
+        'weight' => 1,
+      ) + $item;
+
+
+      // Edit translation callback.
+      $args = array($entity_position, $language_position);
+      $items["$path/translations/edit/%language"] = array(
+        'title' => 'Edit',
+        'page callback' => 'translation_entity_edit_page',
+        'page arguments' => $args,
+        'access callback' => 'translation_entity_edit_access',
+        'access arguments' => $args,
+        'type' => MENU_LOCAL_TASK,
+        'weight' => 1,
       ) + $item;
 
       // Delete translation callback.
@@ -153,6 +173,8 @@ function translation_entity_menu() {
         'title' => 'Delete',
         'page callback' => 'drupal_get_form',
         'page arguments' => array('translation_entity_delete_confirm', $entity_position, $language_position),
+        'access callback' => 'translation_entity_delete_access',
+        'access arguments' => $args,
       ) + $item;
     }
   }
@@ -230,7 +252,7 @@ function translation_entity_menu_alter(array &$items) {
  */
 function translation_entity_translate_access(EntityInterface $entity) {
   $entity_type = $entity->entityType();
-  return empty($entity->language()->locked) && language_multilingual() && translation_entity_enabled($entity_type, $entity->bundle()) && (user_access('translate any entity') || user_access("translate $entity_type entities"));
+  return empty($entity->language()->locked) && language_multilingual() && translation_entity_enabled($entity_type, $entity->bundle()) && user_access('access entity translation overview');
 }
 
 /**
@@ -239,16 +261,50 @@ function translation_entity_translate_access(EntityInterface $entity) {
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entity being translated.
  * @param \Drupal\Core\Language\Language $source
- *   The language of the values being translated.
+ *   (optional) The language of the values being translated. Defaults to the
+ *   entity language.
  * @param \Drupal\Core\Language\Language $target
- *   The language of the translated values.
+ *   (optional) The language of the translated values. Defaults to the current
+ *   content language.
  */
 function translation_entity_add_access(EntityInterface $entity, Language $source = NULL, Language $target = NULL) {
   $source = !empty($source) ? $source : $entity->language();
   $target = !empty($target) ? $target : language(LANGUAGE_TYPE_CONTENT);
   $translations = $entity->getTranslationLanguages();
   $languages = language_list();
-  return $source->langcode != $target->langcode && isset($languages[$source->langcode]) && isset($languages[$target->langcode]) && !isset($translations[$target->langcode]) && translation_entity_access($entity, $target->langcode);
+  return $source->langcode != $target->langcode && isset($languages[$source->langcode]) && isset($languages[$target->langcode]) && !isset($translations[$target->langcode]) && translation_entity_access($entity, 'create');
+}
+
+/**
+ * Access callback for the translation edit page.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity being translated.
+ * @param \Drupal\Core\Language\Language $language
+ *   (optional) The language of the translated values. Defaults to the current
+ *   content language.
+ */
+function translation_entity_edit_access(EntityInterface $entity, Language $language = NULL) {
+  $language = !empty($language) ? $language : language(LANGUAGE_TYPE_CONTENT);
+  $translations = $entity->getTranslationLanguages();
+  $languages = language_list();
+  return isset($languages[$language->langcode]) && isset($translations[$language->langcode]) && translation_entity_access($entity, 'update');
+}
+
+/**
+ * Access callback for the translation delete page.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity being translated.
+ * @param \Drupal\Core\Language\Language $language
+ *   (optional) The language of the translated values. Defaults to the current
+ *   content language.
+ */
+function translation_entity_delete_access(EntityInterface $entity, Language $language = NULL) {
+  $language = !empty($language) ? $language : language(LANGUAGE_TYPE_CONTENT);
+  $translations = $entity->getTranslationLanguages();
+  $languages = language_list();
+  return isset($languages[$language->langcode]) && isset($translations[$language->langcode]) && translation_entity_access($entity, 'delete');
 }
 
 /**
@@ -375,46 +431,45 @@ function translation_entity_form_controller(array $form_state) {
  *
  * @param \Drupal\Core\Entity\EntityInterface $entity
  *   The entity to be accessed.
- * @param string $langcode
- *   The language of the translation to be accessed.
+ * @param $op
+ *   The operation to be performed on the translation. Possible values are:
+ *   - "view"
+ *   - "update"
+ *   - "delete"
+ *   - "create"
  *
  * @return
  *   TRUE if the current user is allowed to view the translation.
  */
-function translation_entity_access(EntityInterface $entity, $langcode) {
-  return translation_entity_controller($entity->entityType())->getTranslationAccess($entity, $langcode) ;
+function translation_entity_access(EntityInterface $entity, $op) {
+  return translation_entity_controller($entity->entityType())->getTranslationAccess($entity, $op) ;
 }
 
 /**
  * Implements hook_permission().
  */
 function translation_entity_permission() {
-  $permission = array(
-    'edit original values' => array(
-      'title' => t('Edit original values'),
-      'description' => t('Access the entity form in the original language.'),
-    ),
+  return array(
     'toggle field translatability' => array(
       'title' => t('Toggle field translatability'),
       'description' => t('Toggle translatability of fields performing a bulk update.'),
     ),
-    'translate any entity' => array(
-      'title' => t('Translate any entity'),
-      'description' => t('Translate field content for any fieldable entity.'),
+    'access entity translation overview' => array(
+      'title' => t('Access translation overview'),
+    ),
+    'view entity translations' => array(
+      'title' => t('Access translations'),
+    ),
+    'create entity translations' => array(
+      'title' => t('Create translations'),
+    ),
+    'update entity translations' => array(
+      'title' => t('Edit translations'),
+    ),
+    'delete entity translations' => array(
+      'title' => t('Delete translations'),
     ),
   );
-
-  foreach (entity_get_info() as $entity_type => $info) {
-    if (translation_entity_enabled($entity_type)) {
-      $label = !empty($info['label']) ? t($info['label']) : $entity_type;
-      $permission["translate $entity_type entities"] = array(
-        'title' => t('Translate entities of type @type', array('@type' => $label)),
-        'description' => t('Translate field content for entities of type @type.', array('@type' => $label)),
-      );
-    }
-  }
-
-  return $permission;
 }
 
 /**
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index 294c97b..8dd4b03 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -51,11 +51,13 @@ function translation_entity_overview(EntityInterface $entity) {
       $language_name = $language->name;
       $langcode = $language->langcode;
       $add_path = $base_path . '/translations/add/' . $original . '/' . $langcode;
+      $translate_path = $base_path . '/translations/edit/' . $langcode;
       $delete_path = $base_path . '/translations/delete/' . $langcode;
 
       if ($base_path) {
         $add_links = _translation_entity_get_switch_links($add_path);
         $edit_links = _translation_entity_get_switch_links($edit_path);
+        $translate_links = _translation_entity_get_switch_links($translate_path);
         $delete_links = _translation_entity_get_switch_links($delete_path);
       }
 
@@ -80,8 +82,17 @@ function translation_entity_overview(EntityInterface $entity) {
           $row_title = $is_original ? $label : t('n/a');
         }
 
-        if ($edit_path && $controller->getAccess($entity, 'update') && $controller->getTranslationAccess($entity, $langcode)) {
+        // If the user is allowed to edit the entity we point the edit link to
+        // the entity form, otherwise if we are not dealing with the original
+        // language we point the link to the translation form.
+        if ($edit_path && $controller->getAccess($entity, 'update')) {
           $links['edit'] = isset($edit_links->links[$langcode]['href']) ? $edit_links->links[$langcode] : array('href' => $edit_path, 'language' => $language);
+        }
+        elseif (!$is_original && $controller->getTranslationAccess($entity, 'update')) {
+          $links['edit'] = isset($translate_links->links[$langcode]['href']) ? $translate_links->links[$langcode] : array('href' => $translate_path, 'language' => $language);
+        }
+
+        if (isset($links['edit'])) {
           $links['edit']['title'] = t('edit');
         }
 
@@ -113,7 +124,7 @@ function translation_entity_overview(EntityInterface $entity) {
             $links['add']['title'] = t('add');
           }
           elseif ($field_ui) {
-            $entity_path = field_ui_bundle_admin_path($entity->entityType(), $entity->bundle());
+            $entity_path = _field_ui_bundle_admin_path($entity->entityType(), $entity->bundle());
             // Link directly to the fields tab to make it easier to find the
             // setting to enable translation on fields.
             $path = $entity_path . '/fields';
@@ -193,6 +204,27 @@ function translation_entity_add_page(EntityInterface $entity, Language $source =
 }
 
 /**
+ * Page callback for the translation edit page.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ *   The entity being translated.
+ * @param \Drupal\Core\Language\Language $language
+ *   (optional) The language of the translated values. Defaults to the current
+ *   content language.
+ *
+ * @return array
+ *   A processed form array ready to be rendered.
+ */
+function translation_entity_edit_page(EntityInterface $entity, Language $language = NULL) {
+  $language = !empty($language) ? $language : language(LANGUAGE_TYPE_CONTENT);
+  $info = $entity->entityInfo();
+  $operation = isset($info['default_operation']) ? $info['default_operation'] : 'default';
+  $form_state = entity_form_state_defaults($entity, $operation, $language->langcode);
+  $form_state['translation_entity']['translation_form'] = TRUE;
+  $form_id = entity_form_id($entity);
+  return drupal_build_form($form_id, $form_state);
+}
+/**
  * Populates target values with the source values.
  *
  * @param \Drupal\Core\Entity\EntityInterface $entity
diff --git a/core/modules/user/lib/Drupal/user/Access/RegisterAccessCheck.php b/core/modules/user/lib/Drupal/user/Access/RegisterAccessCheck.php
deleted file mode 100644
index f8adae4..0000000
--- a/core/modules/user/lib/Drupal/user/Access/RegisterAccessCheck.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\user\Access\RegisterAccessCheck.
- */
-
-namespace Drupal\user\Access;
-
-use Drupal\Core\Access\AccessCheckInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Access check for user registration routes.
- */
-class RegisterAccessCheck implements AccessCheckInterface {
-
-  /**
-   * Implements AccessCheckInterface::applies().
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_access_user_register', $route->getRequirements());
-  }
-
-  /**
-   * Implements AccessCheckInterface::access().
-   */
-  public function access(Route $route, Request $request) {
-    return user_is_anonymous() && (config('user.settings')->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY);
-  }
-}
diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php
index 30a6740..b79e983 100644
--- a/core/modules/user/lib/Drupal/user/AccountFormController.php
+++ b/core/modules/user/lib/Drupal/user/AccountFormController.php
@@ -171,6 +171,39 @@ public function form(array $form, array &$form_state, EntityInterface $account)
       '#format' => isset($account->signature_format) ? $account->signature_format : NULL,
     );
 
+    // Picture/avatar.
+    $form['picture'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Picture'),
+      '#weight' => 1,
+      '#access' => (!$register && variable_get('user_pictures', 0)),
+    );
+
+    $form['picture']['picture'] = array(
+      '#type' => 'value',
+      '#value' => isset($account->picture) ? $account->picture : NULL,
+    );
+
+    $form['picture']['picture_current'] = array(
+      '#markup' => theme('user_picture', array('account' => $account)),
+    );
+
+    $form['picture']['picture_delete'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Delete picture'),
+      '#access' => !empty($account->picture->fid),
+      '#description' => t('Check this box to delete your current picture.'),
+    );
+
+    $form['picture']['picture_upload'] = array(
+      '#type' => 'file',
+      '#title' => t('Upload picture'),
+      '#size' => 48,
+      '#description' => t('Your virtual face or picture. Pictures larger than @dimensions pixels will be scaled down.', array('@dimensions' => variable_get('user_picture_dimensions', '85x85'))) . ' ' . filter_xss_admin(variable_get('user_picture_guidelines', '')),
+    );
+
+    $form['#validate'][] = 'user_validate_picture';
+
     $user_preferred_langcode = $register ? $language_interface->langcode : user_preferred_langcode($account);
 
     $user_preferred_admin_langcode = $register ? $language_interface->langcode : user_preferred_langcode($account, 'admin');
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php
index 99aeac8..dbedf89 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php
@@ -47,11 +47,7 @@
  *     "full" = {
  *       "label" = "User account",
  *       "custom_settings" = FALSE
- *     },
- *     "compact" = {
-         "label" = "Compact",
-         "custom_settings" = TRUE
-       }
+ *     }
  *   }
  * )
  */
@@ -172,6 +168,13 @@ class User extends Entity {
   public $preferred_admin_langcode = LANGUAGE_NOT_SPECIFIED;
 
   /**
+   * The file ID of the user's picture.
+   *
+   * @var integer
+   */
+  public $picture = 0;
+
+  /**
    * The email address used for initial account creation.
    *
    * @var string
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/field/Picture.php b/core/modules/user/lib/Drupal/user/Plugin/views/field/Picture.php
new file mode 100644
index 0000000..8446fac
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/field/Picture.php
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\user\Plugin\views\field\Picture.
+ */
+
+namespace Drupal\user\Plugin\views\field;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\views\ViewExecutable;
+use Drupal\views\Plugin\views\field\FieldPluginBase;
+
+/**
+ * Field handler to provide simple renderer that allows using a themed user link.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @Plugin(
+ *   id = "user_picture",
+ *   module = "user"
+ * )
+ */
+class Picture extends FieldPluginBase {
+
+  /**
+   * Overrides Drupal\views\Plugin\views\field\FieldPluginBase::init().
+   */
+  public function init(ViewExecutable $view, &$options) {
+    parent::init($view, $options);
+
+    $this->additional_fields['uid'] = 'uid';
+    $this->additional_fields['name'] = 'name';
+    $this->additional_fields['mail'] = 'mail';
+  }
+
+  function element_type($none_supported = FALSE, $default_empty = FALSE, $inline = FALSE) {
+    if ($inline) {
+      return 'span';
+    }
+    if ($none_supported) {
+      if ($this->options['element_type'] === '0') {
+        return '';
+      }
+    }
+    if ($this->options['element_type']) {
+      return check_plain($this->options['element_type']);
+    }
+    if ($default_empty) {
+      return '';
+    }
+    if (isset($this->definition['element type'])) {
+      return $this->definition['element type'];
+    }
+
+    return 'div';
+  }
+
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['link_photo_to_profile'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['image_style'] = array('default' => '');
+    return $options;
+  }
+
+  public function buildOptionsForm(&$form, &$form_state) {
+    parent::buildOptionsForm($form, $form_state);
+    $form['link_photo_to_profile'] = array(
+      '#title' => t("Link to user's profile"),
+      '#description' => t("Link the user picture to the user's profile"),
+      '#type' => 'checkbox',
+      '#default_value' => $this->options['link_photo_to_profile'],
+    );
+
+    if (module_exists('image')) {
+      $styles = image_styles();
+      $style_options = array('' => t('Default'));
+      foreach ($styles as $style) {
+        $style_options[$style['name']] = $style['name'];
+      }
+
+      $form['image_style'] = array(
+        '#title' => t('Image style'),
+        '#description' => t('Using <em>Default</em> will use the site-wide image style for user pictures set in the <a href="!account-settings">Account settings</a>.', array('!account-settings' => url('admin/config/people/accounts', array('fragment' => 'edit-personalization')))),
+        '#type' => 'select',
+        '#options' => $style_options,
+        '#default_value' => $this->options['image_style'],
+      );
+    }
+  }
+
+  function render($values) {
+    if ($this->options['image_style'] && module_exists('image')) {
+      // @todo: Switch to always using theme('user_picture') when it starts
+      // supporting image styles. See http://drupal.org/node/1021564
+      if ($picture_fid = $this->get_value($values)) {
+        $picture = file_load($picture_fid);
+        $picture_filepath = $picture->uri;
+      }
+      else {
+        $picture_filepath = variable_get('user_picture_default', '');
+      }
+      if (file_valid_uri($picture_filepath)) {
+        $output = theme('image_style', array('style_name' => $this->options['image_style'], 'path' => $picture_filepath));
+        if ($this->options['link_photo_to_profile'] && user_access('access user profiles')) {
+          $uid = $this->get_value($values, 'uid');
+          $output = l($output, "user/$uid", array('html' => TRUE));
+        }
+      }
+      else {
+        $output = '';
+      }
+    }
+    else {
+      // Fake an account object.
+      $account = entity_create('user', array());
+      if ($this->options['link_photo_to_profile']) {
+        // Prevent template_preprocess_user_picture from adding a link
+        // by not setting the uid.
+        $account->uid = $this->get_value($values, 'uid');
+      }
+      $account->name = $this->get_value($values, 'name');
+      $account->mail = $this->get_value($values, 'mail');
+      $account->picture = $this->get_value($values);
+      $output = theme('user_picture', array('account' => $account));
+    }
+
+    return $output;
+  }
+
+}
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserEditTest.php b/core/modules/user/lib/Drupal/user/Tests/UserEditTest.php
index 0cd38e4..ea78e03 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserEditTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserEditTest.php
@@ -26,7 +26,8 @@ public static function getInfo() {
    * Test user edit page.
    */
   function testUserEdit() {
-    // Test user edit functionality.
+    // Test user edit functionality with user pictures disabled.
+    variable_set('user_pictures', 0);
     $user1 = $this->drupalCreateUser(array('change own username'));
     $user2 = $this->drupalCreateUser(array());
     $this->drupalLogin($user1);
@@ -36,6 +37,11 @@ function testUserEdit() {
     $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
     $this->assertRaw(t('The name %name is already taken.', array('%name' => $edit['name'])));
 
+    // Repeat the test with user pictures enabled, which modifies the form.
+    variable_set('user_pictures', 1);
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t('The name %name is already taken.', array('%name' => $edit['name'])));
+
     // Check that filling out a single password field does not validate.
     $edit = array();
     $edit['pass[pass1]'] = '';
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserPictureTest.php b/core/modules/user/lib/Drupal/user/Tests/UserPictureTest.php
index 26545d8..0413b3b 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserPictureTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserPictureTest.php
@@ -9,9 +9,6 @@
 
 use Drupal\simpletest\WebTestBase;
 
-/**
- * Tests user picture functionality.
- */
 class UserPictureTest extends WebTestBase {
 
   /**
@@ -19,117 +16,312 @@ class UserPictureTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('image', 'comment');
+  public static $modules = array('image');
 
   protected $user;
   protected $_directory_test;
 
   public static function getInfo() {
     return array(
-      'name' => 'User pictures',
-      'description' => 'Tests user picture functionality.',
-      'group' => 'User',
+      'name' => 'Upload user picture',
+      'description' => 'Assure that dimension check, extension check and image scaling work as designed.',
+      'group' => 'User'
     );
   }
 
   function setUp() {
     parent::setUp();
 
-    $this->web_user = $this->drupalCreateUser(array(
-      'access content',
-      'access comments',
-      'post comments',
-      'skip comment approval',
-    ));
-    $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
-
-    // @see standard.install
-    module_load_install('user');
-    _user_install_picture_field();
-
-    // Remove 'summary' pseudo-field from compact view mode on the User entity.
-    $bundle_settings = field_bundle_settings('user', 'user');
-    $bundle_settings['extra_fields']['display']['member_for']['compact'] = array(
-      'visible' => FALSE,
-      'weight' => 10,
-    );
-    field_bundle_settings('user', 'user', $bundle_settings);
+    // Enable user pictures.
+    variable_set('user_pictures', 1);
+
+    // Configure default user picture settings.
+    variable_set('user_picture_dimensions', '1024x1024');
+    variable_set('user_picture_file_size', '800');
+    variable_set('user_picture_style', 'thumbnail');
+
+    $this->user = $this->drupalCreateUser();
+
+    // Test if directories specified in settings exist in filesystem.
+    $file_dir = 'public://';
+    $file_check = file_prepare_directory($file_dir, FILE_CREATE_DIRECTORY);
+    // TODO: Test public and private methods?
+
+    $picture_dir = variable_get('user_picture_path', 'pictures');
+    $picture_path = $file_dir . $picture_dir;
+
+    $pic_check = file_prepare_directory($picture_path, FILE_CREATE_DIRECTORY);
+    $this->_directory_test = is_writable($picture_path);
+    $this->assertTrue($this->_directory_test, "The directory $picture_path doesn't exist or is not writable. Further tests won't be made.");
+  }
+
+  function testNoPicture() {
+    $this->drupalLogin($this->user);
+
+    // Try to upload a file that is not an image for the user picture.
+    $not_an_image = current($this->drupalGetTestFiles('html'));
+    $this->saveUserPicture($not_an_image);
+    $this->assertRaw(t('Only JPEG, PNG and GIF images are allowed.'), 'Non-image files are not accepted.');
   }
 
   /**
-   * Tests creation, display, and deletion of user pictures.
+   * Do the test:
+   *  GD Toolkit is installed
+   *  Picture has invalid dimension
+   *
+   * results: The image should be uploaded because ImageGDToolkit resizes the picture
    */
-  function testCreateDeletePicture() {
-    $this->drupalLogin($this->web_user);
+  function testWithGDinvalidDimension() {
+    if ($this->_directory_test && image_get_toolkit()) {
+      $this->drupalLogin($this->user);
 
-    // Save a new picture.
-    $image = current($this->drupalGetTestFiles('image'));
-    $file = $this->saveUserPicture($image);
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
 
-    // Verify that the image is displayed on the user account page.
-    $this->drupalGet('user');
-    $this->assertRaw(file_uri_target($file->uri), 'User picture found on user account page.');
-
-    // Delete the picture.
-    $edit = array();
-    $this->drupalPost('user/' . $this->web_user->uid . '/edit', $edit, t('Remove'));
-    $this->drupalPost(NULL, array(), t('Save'));
-
-    // Call system_cron() to clean up the file. Make sure the timestamp
-    // of the file is older than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
-    db_update('file_managed')
-      ->fields(array(
-        'timestamp' => REQUEST_TIME - (DRUPAL_MAXIMUM_TEMP_FILE_AGE + 1),
-      ))
-      ->condition('fid', $file->fid)
-      ->execute();
-    drupal_cron_run();
-
-    // Verify that the image has been deleted.
-    $this->assertFalse(file_load($file->fid), 'File was removed from the database.');
-    // Clear out PHP's file stat cache so we see the current value.
-    clearstatcache(TRUE, $file->uri);
-    $this->assertFalse(is_file($file->uri), 'File was removed from the file system.');
+      // Set new variables: invalid dimensions, valid filesize (0 = no limit).
+      $test_dim = ($info['width'] - 10) . 'x' . ($info['height'] - 10);
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', 0);
+
+      $pic_path = $this->saveUserPicture($image);
+      // Check that the image was resized and is being displayed on the
+      // user's profile page.
+      $text = t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', array('%dimensions' => $test_dim));
+      $this->assertRaw($text, 'Image was resized.');
+      $alt = t("@user's picture", array('@user' => user_format_name($this->user)));
+      $style = variable_get('user_picture_style', '');
+      $this->assertRaw(image_style_url($style, $pic_path), "Image is displayed in user's edit page");
+
+      // Check if file is located in proper directory.
+      $this->assertTrue(is_file($pic_path), 'File is located in proper directory.');
+    }
   }
 
   /**
-   * Tests embedded users on node pages.
+   * Do the test:
+   *  GD Toolkit is installed
+   *  Picture has invalid size
+   *
+   * results: The image should be uploaded because ImageGDToolkit resizes the picture
    */
-  function testPictureOnNodeComment() {
-    $this->drupalLogin($this->web_user);
+  function testWithGDinvalidSize() {
+    if ($this->_directory_test && image_get_toolkit()) {
+      $this->drupalLogin($this->user);
 
-    // Save a new picture.
-    $image = current($this->drupalGetTestFiles('image'));
-    $file = $this->saveUserPicture($image);
+      // Images are sorted first by size then by name. We need an image
+      // bigger than 1 KB so we'll grab the last one.
+      $files = $this->drupalGetTestFiles('image');
+      $image = end($files);
+      $info = image_get_info($image->uri);
+
+      // Set new variables: valid dimensions, invalid filesize.
+      $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+      $test_size = 1;
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', $test_size);
 
-    $node = $this->drupalCreateNode(array('type' => 'article'));
+      $pic_path = $this->saveUserPicture($image);
 
-    // Enable user pictures on nodes.
-    variable_set('theme_settings', array('toggle_node_user_picture' => TRUE));
+      // Test that the upload failed and that the correct reason was cited.
+      $text = t('The specified file %filename could not be uploaded.', array('%filename' => $image->filename));
+      $this->assertRaw($text, 'Upload failed.');
+      $text = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size(filesize($image->uri)), '%maxsize' => format_size($test_size * 1024)));
+      $this->assertRaw($text, 'File size cited as reason for failure.');
 
-    // Verify that the image is displayed on the user account page.
-    $this->drupalGet('node/' . $node->nid);
-    $this->assertRaw(file_uri_target($file->uri), 'User picture found on node page.');
+      // Check if file is not uploaded.
+      $this->assertFalse(is_file($pic_path), 'File was not uploaded.');
+    }
+  }
 
-    // Enable user pictures on comments, instead of nodes.
-    variable_set('theme_settings', array('toggle_comment_user_picture' => TRUE));
+  /**
+   * Do the test:
+   *  GD Toolkit is not installed
+   *  Picture has invalid size
+   *
+   * results: The image shouldn't be uploaded
+   */
+  function testWithoutGDinvalidDimension() {
+    if ($this->_directory_test && !image_get_toolkit()) {
+      $this->drupalLogin($this->user);
 
-    $edit = array(
-      'comment_body[' . LANGUAGE_NOT_SPECIFIED . '][0][value]' => $this->randomString(),
-    );
-    $this->drupalPost('comment/reply/' . $node->nid, $edit, t('Save'));
-    $this->assertRaw(file_uri_target($file->uri), 'User picture found on comment.');
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: invalid dimensions, valid filesize (0 = no limit).
+      $test_dim = ($info['width'] - 10) . 'x' . ($info['height'] - 10);
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', 0);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Test that the upload failed and that the correct reason was cited.
+      $text = t('The specified file %filename could not be uploaded.', array('%filename' => $image->filename));
+      $this->assertRaw($text, 'Upload failed.');
+      $text = t('The image is too large; the maximum dimensions are %dimensions pixels.', array('%dimensions' => $test_dim));
+      $this->assertRaw($text, 'Checking response on invalid image (dimensions).');
+
+      // Check if file is not uploaded.
+      $this->assertFalse(is_file($pic_path), 'File was not uploaded.');
+    }
+  }
+
+  /**
+   * Do the test:
+   *  GD Toolkit is not installed
+   *  Picture has invalid size
+   *
+   * results: The image shouldn't be uploaded
+   */
+  function testWithoutGDinvalidSize() {
+    if ($this->_directory_test && !image_get_toolkit()) {
+      $this->drupalLogin($this->user);
+
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: valid dimensions, invalid filesize.
+      $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+      $test_size = 1;
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', $test_size);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Test that the upload failed and that the correct reason was cited.
+      $text = t('The specified file %filename could not be uploaded.', array('%filename' => $image->filename));
+      $this->assertRaw($text, 'Upload failed.');
+      $text = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size(filesize($image->uri)), '%maxsize' => format_size($test_size * 1024)));
+      $this->assertRaw($text, 'File size cited as reason for failure.');
+
+      // Check if file is not uploaded.
+      $this->assertFalse(is_file($pic_path), 'File was not uploaded.');
+    }
   }
 
   /**
-   * Edits the user picture for the test user.
+   * Do the test:
+   *  Picture is valid (proper size and dimension)
+   *
+   * results: The image should be uploaded
    */
+  function testPictureIsValid() {
+    if ($this->_directory_test) {
+      $this->drupalLogin($this->user);
+
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: valid dimensions, valid filesize (0 = no limit).
+      $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', 0);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Check if image is displayed in user's profile page.
+      $this->drupalGet('user');
+      $this->assertRaw(file_uri_target($pic_path), "Image is displayed in user's profile page.");
+
+      // Check if file is located in proper directory.
+      $this->assertTrue(is_file($pic_path), 'File is located in proper directory.');
+
+      // Set new picture dimensions.
+      $test_dim = ($info['width'] + 5) . 'x' . ($info['height'] + 5);
+      variable_set('user_picture_dimensions', $test_dim);
+
+      $pic_path2 = $this->saveUserPicture($image);
+      $this->assertNotEqual($pic_path, $pic_path2, 'Filename of second picture is different.');
+    }
+  }
+
+  /**
+   * Test HTTP schema working with user pictures.
+   */
+  function testExternalPicture() {
+    $this->drupalLogin($this->user);
+    // Set the default picture to an URI with a HTTP schema.
+    $images = $this->drupalGetTestFiles('image');
+    $image = $images[0];
+    $pic_path = file_create_url($image->uri);
+    variable_set('user_picture_default', $pic_path);
+
+    // Check if image is displayed in user's profile page.
+    $this->drupalGet('user');
+
+    // Get the user picture image via xpath.
+    $elements = $this->xpath('//div[@class="user-picture"]/img');
+    $this->assertEqual(count($elements), 1, "There is exactly one user picture on the user's profile page.");
+    $this->assertEqual($pic_path, (string) $elements[0]['src'], format_string("User picture source is correct: %path %elements.", array('%path' => $pic_path, '%elements' => print_r($elements, TRUE))));
+  }
+
+  /**
+   * Tests deletion of user pictures.
+   */
+  function testDeletePicture() {
+    $this->drupalLogin($this->user);
+
+    $image = current($this->drupalGetTestFiles('image'));
+    $info = image_get_info($image->uri);
+
+    // Set new variables: valid dimensions, valid filesize (0 = no limit).
+    $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+    variable_set('user_picture_dimensions', $test_dim);
+    variable_set('user_picture_file_size', 0);
+
+    // Save a new picture.
+    $edit = array('files[picture_upload]' => drupal_realpath($image->uri));
+    $this->drupalPost('user/' . $this->user->uid . '/edit', $edit, t('Save'));
+
+    // Load actual user data from database.
+    $account = user_load($this->user->uid, TRUE);
+    $pic_path = !empty($account->picture) ? $account->picture->uri : NULL;
+
+    // Check if image is displayed in user's profile page.
+    $this->drupalGet('user');
+    $this->assertRaw(file_uri_target($pic_path), "Image is displayed in user's profile page");
+
+    // Check if file is located in proper directory.
+    $this->assertTrue(is_file($pic_path), 'File is located in proper directory');
+
+    $edit = array('picture_delete' => 1);
+    $this->drupalPost('user/' . $this->user->uid . '/edit', $edit, t('Save'));
+
+    // Load actual user data from database.
+    $account1 = user_load($this->user->uid, TRUE);
+    $this->assertFalse($account1->picture, 'User object has no picture');
+
+    $file = file_load($account->picture->fid);
+    $this->assertFalse($file, 'File is removed from database');
+
+    // Clear out PHP's file stat cache so we see the current value.
+    clearstatcache(TRUE, $pic_path);
+    $this->assertFalse(is_file($pic_path), 'File is removed from file system');
+  }
+
   function saveUserPicture($image) {
-    $edit = array('files[user_picture_und_0]' => drupal_realpath($image->uri));
-    $this->drupalPost('user/' . $this->web_user->uid . '/edit', $edit, t('Save'));
+    $edit = array('files[picture_upload]' => drupal_realpath($image->uri));
+    $this->drupalPost('user/' . $this->user->uid . '/edit', $edit, t('Save'));
 
     // Load actual user data from database.
-    $account = user_load($this->web_user->uid, TRUE);
-    return file_load($account->user_picture[LANGUAGE_NOT_SPECIFIED][0]['fid']);
+    $account = user_load($this->user->uid, TRUE);
+    return !empty($account->picture) ? $account->picture->uri : NULL;
+  }
+
+  /**
+   * Tests the admin form validates user picture settings.
+   */
+  function testUserPictureAdminFormValidation() {
+    $this->drupalLogin($this->drupalCreateUser(array('administer users')));
+
+    // The default values are valid.
+    $this->drupalPost('admin/config/people/accounts', array(), t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'The default values are valid.');
+
+    // The form does not save with an invalid file size.
+    $edit = array(
+      'user_picture_file_size' => $this->randomName(),
+    );
+    $this->drupalPost('admin/config/people/accounts', $edit, t('Save configuration'));
+    $this->assertNoText(t('The configuration options have been saved.'), 'The form does not save with an invalid file size.');
   }
 }
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
index 73f3396..9c518d7 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
@@ -185,6 +185,7 @@ function testRegistrationDefaultValues() {
     $this->assertEqual($new_user->timezone, variable_get('date_default_timezone'), 'Correct time zone field.');
     $this->assertEqual($new_user->langcode, language_default()->langcode, 'Correct language field.');
     $this->assertEqual($new_user->preferred_langcode, language_default()->langcode, 'Correct preferred language field.');
+    $this->assertEqual($new_user->picture, 0, 'Correct picture field.');
     $this->assertEqual($new_user->init, $mail, 'Correct init field.');
   }
 
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserTranslationUITest.php b/core/modules/user/lib/Drupal/user/Tests/UserTranslationUITest.php
index 1b6160a..c60096a 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserTranslationUITest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserTranslationUITest.php
@@ -48,7 +48,7 @@ function setUp() {
    * Overrides \Drupal\translation_entity\Tests\EntityTranslationUITest::getTranslatorPermission().
    */
   function getTranslatorPermissions() {
-    return array('administer users', "translate $this->entityType entities", 'edit original values');
+    return array('administer users', 'access entity translation overview', 'create entity translations', 'update entity translations', 'delete entity translations');
   }
 
   /**
diff --git a/core/modules/user/lib/Drupal/user/UserBundle.php b/core/modules/user/lib/Drupal/user/UserBundle.php
deleted file mode 100644
index 9ae8936..0000000
--- a/core/modules/user/lib/Drupal/user/UserBundle.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains Drupal\system\UserBundle.
- */
-
-namespace Drupal\user;
-
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\HttpKernel\Bundle\Bundle;
-
-/**
- * User dependency injection container.
- */
-class UserBundle extends Bundle {
-
-  /**
-   * Overrides Bundle::build().
-   */
-  public function build(ContainerBuilder $container) {
-    $container->register('access_check.user.register', 'Drupal\user\Access\RegisterAccessCheck')
-      ->addTag('access_check');
-  }
-}
diff --git a/core/modules/user/lib/Drupal/user/UserRouteController.php b/core/modules/user/lib/Drupal/user/UserRouteController.php
index cf3b50e..0cb5a15 100644
--- a/core/modules/user/lib/Drupal/user/UserRouteController.php
+++ b/core/modules/user/lib/Drupal/user/UserRouteController.php
@@ -8,6 +8,7 @@
 namespace Drupal\user;
 
 use Symfony\Component\DependencyInjection\ContainerAware;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
  * Returns responses for User module routes.
@@ -21,6 +22,12 @@ class UserRouteController extends ContainerAware {
    *   A renderable array containing the user registration form.
    */
   public function register() {
+    // @todo Remove once access control is integrated with new routing system:
+    //   http://drupal.org/node/1793520.
+    if (!user_register_access()) {
+      throw new AccessDeniedHttpException();
+    }
+
     $account = entity_create('user', array());
     return entity_get_form($account, 'register');
   }
diff --git a/core/modules/user/lib/Drupal/user/UserStorageController.php b/core/modules/user/lib/Drupal/user/UserStorageController.php
index cf0322d..ca47505 100644
--- a/core/modules/user/lib/Drupal/user/UserStorageController.php
+++ b/core/modules/user/lib/Drupal/user/UserStorageController.php
@@ -23,7 +23,12 @@ class UserStorageController extends DatabaseStorageController {
    * Overrides Drupal\Core\Entity\DatabaseStorageController::attachLoad().
    */
   function attachLoad(&$queried_users, $load_revision = FALSE) {
+    // Build an array of user picture IDs so that these can be fetched later.
+    $picture_fids = array();
     foreach ($queried_users as $key => $record) {
+      if ($record->picture) {
+        $picture_fids[] = $record->picture;
+      }
       $queried_users[$key]->data = unserialize($record->data);
       $queried_users[$key]->roles = array();
       if ($record->uid) {
@@ -40,6 +45,15 @@ function attachLoad(&$queried_users, $load_revision = FALSE) {
       $queried_users[$record->uid]->roles[$record->rid] = $record->name;
     }
 
+    // Add the full file objects for user pictures if enabled.
+    if (!empty($picture_fids) && variable_get('user_pictures', 1) == 1) {
+      $pictures = file_load_multiple($picture_fids);
+      foreach ($queried_users as $entity) {
+        if (!empty($entity->picture) && isset($pictures[$entity->picture])) {
+          $entity->picture = $pictures[$entity->picture];
+        }
+      }
+    }
     // Call the default attachLoad() method. This will add fields and call
     // hook_user_load().
     parent::attachLoad($queried_users, $load_revision);
@@ -83,7 +97,45 @@ protected function preSave(EntityInterface $entity) {
       }
     }
 
+    if (!empty($entity->picture_upload)) {
+      $entity->picture = $entity->picture_upload;
+    }
+    // Delete the picture if the submission indicates that it should be deleted
+    // and no replacement was submitted.
+    elseif (!empty($entity->picture_delete)) {
+      $entity->picture = 0;
+      file_usage()->delete($entity->original->picture, 'user', 'user', $entity->uid);
+      file_delete($entity->original->picture->fid);
+    }
+
     if (!$entity->isNew()) {
+      // Process picture uploads.
+      if (!empty($entity->picture->fid) && (!isset($entity->original->picture->fid) || $entity->picture->fid != $entity->original->picture->fid)) {
+        $picture = $entity->picture;
+        // If the picture is a temporary file, move it to its final location
+        // and make it permanent.
+        if (!$picture->status) {
+          $info = image_get_info($picture->uri);
+          $picture_directory =  file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');
+
+          // Prepare the pictures directory.
+          file_prepare_directory($picture_directory, FILE_CREATE_DIRECTORY);
+          $destination = file_stream_wrapper_uri_normalize($picture_directory . '/picture-' . $entity->uid . '-' . REQUEST_TIME . '.' . $info['extension']);
+
+          // Move the temporary file into the final location.
+          if ($picture = file_move($picture, $destination, FILE_EXISTS_RENAME)) {
+            $entity->picture = $picture;
+            file_usage()->add($picture, 'user', 'user', $entity->uid);
+          }
+        }
+        // Delete the previous picture if it was deleted or replaced.
+        if (!empty($entity->original->picture->fid)) {
+          file_usage()->delete($entity->original->picture, 'user', 'user', $entity->uid);
+          file_delete($entity->original->picture->fid);
+        }
+      }
+      $entity->picture = empty($entity->picture->fid) ? 0 : $entity->picture->fid;
+
       // If the password is empty, that means it was not changed, so use the
       // original password.
       if (empty($entity->pass)) {
diff --git a/core/modules/user/templates/user-profile.tpl.php b/core/modules/user/templates/user-profile.tpl.php
index dd9eb78..a7bca78 100644
--- a/core/modules/user/templates/user-profile.tpl.php
+++ b/core/modules/user/templates/user-profile.tpl.php
@@ -8,10 +8,12 @@
  * e.g., example.com/user/123. 123 being the users ID.
  *
  * Use render($user_profile) to print all profile items, or print a subset
- * such as render($content['field_example']).
- * If the item is a category, it will contain all its profile items. By default,
- * $user_profile['summary'] is provided, which contains data on the user's
- * history. Other data can be included by modules.
+ * such as render($user_profile['user_picture']). Always call
+ * render($user_profile) at the end in order to print all remaining items. If
+ * the item is a category, it will contain all its profile items. By default,
+ * $user_profile['member_for'] is provided, which contains data on the user's
+ * history. Other data can be included by modules. $user_profile['user_picture']
+ * is available for showing the account picture.
  *
  * Available variables:
  *   - $user_profile: An array of profile items. Use render() to print them.
diff --git a/core/modules/user/user-rtl.css b/core/modules/user/user-rtl.css
index ec459b4..5a1442c 100644
--- a/core/modules/user/user-rtl.css
+++ b/core/modules/user/user-rtl.css
@@ -20,3 +20,9 @@ div.password-confirm {
 .password-parent {
   clear: right;
 }
+
+/* Generated by user.module but used by profile.module: */
+.profile .user-picture {
+  float: left;
+  margin: 0 0 1em 1em;
+}
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index 277164a..bab307b 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -376,6 +376,78 @@ function user_admin_settings($form, &$form_state) {
     '#title' => t('Enable signatures.'),
     '#default_value' => $config->get('signatures'),
   );
+  // If picture support is enabled, check whether the picture directory exists.
+  if (variable_get('user_pictures', 0)) {
+    $picture_path =  file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');
+    if (!file_prepare_directory($picture_path, FILE_CREATE_DIRECTORY)) {
+      form_set_error('user_picture_path', t('The directory %directory does not exist or is not writable.', array('%directory' => $picture_path)));
+      watchdog('file system', 'The directory %directory does not exist or is not writable.', array('%directory' => $picture_path), WATCHDOG_ERROR);
+    }
+  }
+  $picture_support = variable_get('user_pictures', 0);
+  $form['personalization']['user_pictures'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable user pictures.'),
+    '#default_value' => $picture_support,
+  );
+  $form['#attached']['library'][] = array('user', 'drupal.user');
+  $form['personalization']['pictures'] = array(
+    '#type' => 'container',
+    '#states' => array(
+      // Hide the additional picture settings when user pictures are disabled.
+      'invisible' => array(
+        'input[name="user_pictures"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+  $form['personalization']['pictures']['user_picture_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Picture directory'),
+    '#default_value' => variable_get('user_picture_path', 'pictures'),
+    '#size' => 30,
+    '#maxlength' => 255,
+    '#description' => t('Subdirectory in the file upload directory where pictures will be stored.'),
+  );
+  $form['personalization']['pictures']['user_picture_default'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default picture'),
+    '#default_value' => variable_get('user_picture_default', ''),
+    '#size' => 30,
+    '#maxlength' => 255,
+    '#description' => t('URL of picture to display for users with no custom picture selected. Leave blank for none.'),
+  );
+  if (module_exists('image')) {
+    $form['personalization']['pictures']['settings']['user_picture_style'] = array(
+      '#type' => 'select',
+      '#title' => t('Picture display style'),
+      '#options' => image_style_options(TRUE),
+      '#default_value' => variable_get('user_picture_style', ''),
+      '#description' => t('The style selected will be used on display, while the original image is retained. Styles may be configured in the <a href="!url">Image styles</a> administration area.', array('!url' => url('admin/config/media/image-styles'))),
+    );
+  }
+  $form['personalization']['pictures']['user_picture_dimensions'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Picture upload dimensions'),
+    '#default_value' => variable_get('user_picture_dimensions', '85x85'),
+    '#size' => 10,
+    '#maxlength' => 10,
+    '#field_suffix' => ' ' . t('pixels'),
+    '#description' => t('Pictures larger than this will be scaled down to this size.'),
+  );
+  $form['personalization']['pictures']['user_picture_file_size'] = array(
+    '#type' => 'number',
+    '#title' => t('Picture upload file size'),
+    '#default_value' => variable_get('user_picture_file_size', '30'),
+    '#min' => 0,
+    '#field_suffix' => ' ' . t('KB'),
+    '#description' => t('Maximum allowed file size for uploaded pictures. Upload size is normally limited only by the PHP maximum post and file upload settings, and images are automatically scaled down to the dimensions specified above.'),
+  );
+  $form['personalization']['pictures']['user_picture_guidelines'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Picture guidelines'),
+    '#default_value' => variable_get('user_picture_guidelines', ''),
+    '#description' => t("This text is displayed at the picture upload form in addition to the default guidelines. It's useful for helping or instructing your users."),
+  );
 
   $form['email_title'] = array(
     '#type' => 'item',
diff --git a/core/modules/user/user.api.php b/core/modules/user/user.api.php
index cb7b4e5..8714d16 100644
--- a/core/modules/user/user.api.php
+++ b/core/modules/user/user.api.php
@@ -349,17 +349,12 @@ function hook_user_logout($account) {
  * @see hook_entity_view()
  */
 function hook_user_view($account, $view_mode, $langcode) {
-  if (!isset($account->content['summary'])) {
-    $account->content['summary'] = array();
-  }
-  $account->content['summary'] += array(
-    '#type' => 'user_profile_category',
-    '#title' => t('History'),
-    '#attributes' => array('class' => array('user-member')),
-    '#weight' => 5,
+  $account->content['user_picture'] = array(
+    '#markup' => theme('user_picture', array('account' => $account)),
+    '#weight' => -10,
   );
-  $account->content['summary']['member_for'] = array(
-    '#type' => 'user_profile_item',
+  $account->content['member_for'] = array(
+    '#type' => 'item',
     '#title' => t('Member for'),
     '#markup' => format_interval(REQUEST_TIME - $account->created),
   );
diff --git a/core/modules/user/user.css b/core/modules/user/user.css
index 28aa373..a54a5d0 100644
--- a/core/modules/user/user.css
+++ b/core/modules/user/user.css
@@ -65,6 +65,29 @@ div.password-suggestions ul {
   width: 36.3em;
 }
 
+/* Generated by user.module but used by profile.module: */
+.profile {
+  clear: both;
+  margin: 1em 0;
+}
+.profile .user-picture {
+  float: right; /* LTR */
+  margin: 0 1em 1em 0; /* LTR */
+}
+.profile h2 {
+  border-bottom: 1px solid #ccc;
+}
+.profile dl {
+  margin: 0 0 1.5em 0;
+}
+.profile dt {
+  margin: 0 0 0.2em 0;
+  font-weight: bold;
+}
+.profile dd {
+  margin: 0 0 1em 0;
+}
+
 /**
  * Toolbar icon.
  */
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 28511d3..3bc837f 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -5,8 +5,6 @@
  * Install, update and uninstall functions for the user module.
  */
 
-use Drupal\Component\Uuid\Uuid;
-
 /**
  * Implements hook_schema().
  */
@@ -122,6 +120,12 @@ function user_schema() {
         'default' => '',
         'description' => 'The {language}.langcode that the user prefers for viewing administration pages.',
       ),
+      'picture' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "Foreign key: {file_managed}.fid of user's picture.",
+      ),
       'init' => array(
         'type' => 'varchar',
         'length' => 254,
@@ -141,6 +145,7 @@ function user_schema() {
       'access' => array('access'),
       'created' => array('created'),
       'mail' => array('mail'),
+      'picture' => array('picture'),
     ),
     'unique keys' => array(
       'uuid' => array('uuid'),
@@ -623,246 +628,5 @@ function user_update_8010() {
 }
 
 /**
- * Create user picture field.
- */
-function user_update_8011() {
-  global $user;
-
-  // User pictures can only be migrated to the new user picture image field
-  // if Image module is installed.
-  if (!module_exists('image')) {
-    module_enable(array('image'));
-  }
-
-  if ($default_image = update_variable_get('user_picture_default', '')) {
-    $picture_directory =  update_variable_get('file_default_scheme', 'public') . '://' . update_variable_get('user_picture_path', 'pictures');
-    file_prepare_directory($picture_directory, FILE_CREATE_DIRECTORY);
-    $destination = file_stream_wrapper_uri_normalize($picture_directory . '/' . drupal_basename($default_image));
-    // The file entity needs to be created manually as entities can not be
-    // created/saved during the upgrade path. Attempt to replicate the behavior
-    // of file_save_data() by updating an eventually existing record for that
-    // file.
-    file_unmanaged_save_data($default_image, $destination, FILE_EXISTS_REPLACE);
-    $uuid = new Uuid();
-    db_merge('file_managed')
-      ->key(array(
-        'uri' => $destination,
-      ))
-      ->fields(array(
-        'uid' => $user->uid,
-        'status' => FILE_STATUS_PERMANENT,
-        'filename' => drupal_basename($destination),
-        'uuid' => $uuid->generate(),
-        'langcode' => LANGUAGE_NOT_SPECIFIED,
-        'filesize' => filesize($destination),
-        'filemime' => file_get_mimetype($destination),
-        'timestamp' => REQUEST_TIME,
-      ))
-      ->execute();
-    $default_image_fid = db_query('SELECT fid FROM {file_managed} WHERE uri = :uri', array(':uri' => $destination))->fetchField();
-  }
-  $settings = array(
-    // In D7, user pictures did not require Image module to work. Image module
-    // only allowed usage of an image style to format user pictures in the
-    // output. The 'user_pictures' variable had a global effect on the
-    // presence of the user picture functionality before. The new user picture
-    // image field is created regardless of that global setting, which means
-    // the field appears on the user account form after migration, even if
-    // user pictures were disabled previously. The picture is only hidden in
-    // the output.
-    'formatter' => update_variable_get('user_pictures', 0) ? 'image' : 'hidden',
-    'file_directory' => update_variable_get('user_picture_path', 'pictures'),
-    'default_image' => !empty($default_image_fid) ? $default_image_fid : 0,
-    'image_style' => update_variable_get('user_picture_style', ''),
-    'max_resolution' => update_variable_get('user_picture_dimensions', '85x85'),
-    'max_filesize' => update_variable_get('user_picture_file_size', '30') . ' KB',
-    'description' => update_variable_get('user_picture_guidelines', ''),
-  );
-
-  $field = _user_install_picture_field($settings);
-
-  // Add file usage for the default field.
-  if (!empty($default_image_fid)) {
-    db_insert('file_usage')
-      ->fields(array(
-        'fid' => $default_image_fid,
-        'module' => 'image',
-        'type' => 'default_image',
-        'id' => $field['id'],
-        'count' => 1,
-      ))
-      ->execute();
-  }
-
-  // Update the user bundle settings and hide the member_for extra field.
-  $settings = update_variable_get('field_bundle_settings_user__user');
-  $settings['extra_fields']['display']['member_for']['compact'] = array(
-    'weight' => 0,
-    'visible' => FALSE,
-  );
-  update_variable_set('field_bundle_settings_user__user', $settings);
-
-  // Delete old variables.
-  update_variable_del('user_pictures');
-  update_variable_del('user_picture_path');
-  update_variable_del('user_picture_default');
-  update_variable_del('user_picture_style');
-  update_variable_del('user_picture_dimensions');
-  update_variable_del('user_picture_file_size');
-  update_variable_del('user_picture_guidelines');
-}
-
-/**
- * Migrate {users}.picture to 'user_picture' image field.
- */
-function user_update_8012(&$sandbox) {
-  // Initialize total values to process.
-  if (!isset($sandbox['total'])) {
-    $sandbox['total'] = (int) db_query('SELECT COUNT(picture) FROM {users} WHERE picture > 0')->fetchField();
-    $sandbox['processed'] = 0;
-  }
-
-  if ($sandbox['total']) {
-    // Retrieve next 20 rows to migrate.
-    $rows = db_query_range('SELECT uid, picture FROM {users} WHERE picture > 0', 0, 20)->fetchAllKeyed();
-    foreach ($rows as $uid => $fid) {
-      // Add a row to the field data and revision tables.
-      db_insert('field_data_user_picture')
-        ->fields(array(
-          'entity_type' => 'user',
-          'bundle' => 'user',
-          'entity_id' => $uid,
-          'revision_id' => $uid,
-          'langcode' => LANGUAGE_NOT_SPECIFIED,
-          'delta' => 0,
-          'user_picture_fid' => $fid,
-        ))
-        ->execute();
-      db_insert('field_revision_user_picture')
-        ->fields(array(
-          'entity_type' => 'user',
-          'bundle' => 'user',
-          'entity_id' => $uid,
-          'revision_id' => $uid,
-          'langcode' => LANGUAGE_NOT_SPECIFIED,
-          'delta' => 0,
-          'user_picture_fid' => $fid,
-        ))
-        ->execute();
-
-      // Update file usage from user to file module.
-      // @see file_field_insert()
-      // Old: file_usage_add($picture, 'user', 'user', $entity->uid);
-      // New: file_usage_add(file_load($item['fid']), 'file', $entity_type, $id);
-      db_update('file_usage')
-        ->condition('fid', $fid)
-        ->condition('module', 'user')
-        ->condition('type', 'user')
-        ->condition('id', $uid)
-        ->fields(array(
-          'module' => 'file',
-        ))
-        ->execute();
-    }
-
-    // Set picture column of the migrated users to 0.
-    db_update('users')
-      ->fields(array(
-        'picture' => 0,
-      ))
-      ->condition('uid', array_keys($rows))
-      ->execute();
-
-    // Report status.
-    $sandbox['processed'] += count($rows);
-  }
-  $sandbox['#finished'] = $sandbox['total'] ? $sandbox['processed'] / $sandbox['total'] : 1;
-
-}
-
-/**
- * Deletes {users}.picture field.
- */
-function user_update_8013() {
-  db_drop_field('users', 'picture');
-}
-
-/**
  * @} End of "addtogroup updates-7.x-to-8.x".
  */
-
-/**
- * Creates a user picture image field for the User entity.
- */
-function _user_install_picture_field(array $settings = array()) {
-  $t = get_t();
-  $settings += array(
-    'formatter' => 'image',
-    'file_directory' => 'pictures',
-    'default_image' => 0,
-    'image_style' => 'thumbnail',
-    'max_resolution' => '85x85',
-    'max_filesize' => '30 KB',
-    'description' => $t('Your virtual face or picture.'),
-  );
-
-  $field = array(
-    'field_name' => 'user_picture',
-    'module' => 'image',
-    'type' => 'image',
-    'cardinality' => 1,
-    'locked' => FALSE,
-    'indexes' => array('fid' => array('fid')),
-    'settings' => array(
-      'uri_scheme' => 'public',
-      'default_image' => FALSE,
-    ),
-    'storage' => array(
-      'type' => 'field_sql_storage',
-      'settings' => array(),
-    ),
-  );
-  _update_7000_field_create_field($field);
-
-  $instance = array(
-    'field_name' => 'user_picture',
-    'entity_type' => 'user',
-    'label' => 'Picture',
-    'bundle' => 'user',
-    'description' => $settings['description'],
-    'required' => FALSE,
-    'settings' => array(
-      'file_extensions' => 'png gif jpg jpeg',
-      'file_directory' => $settings['file_directory'],
-      'max_filesize' => $settings['max_filesize'],
-      'alt_field' => 0,
-      'title_field' => 0,
-      'max_resolution' => $settings['max_resolution'],
-      'min_resolution' => '',
-      'default_image' => $settings['default_image'],
-    ),
-    'widget' => array(
-      'module' => 'image',
-      'type' => 'image_image',
-      'settings' => array(
-        'progress_indicator' => 'throbber',
-        'preview_image_style' => 'thumbnail',
-      ),
-      'weight' => -1,
-    ),
-    'display' => array(
-      'default' => array(
-        'label' => 'hidden',
-        'type' => $settings['formatter'],
-        'settings' => array('image_style' => 'thumbnail', 'image_link' => 'content'),
-      ),
-      'compact' => array(
-        'label' => 'hidden',
-        'type' => $settings['formatter'],
-        'settings' => array('image_style' => $settings['image_style'], 'image_link' => 'content'),
-      ),
-    ),
-  );
-  _update_7000_field_create_instance($field, $instance);
-  return $field;
-}
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 93c48e1..7403177 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -55,7 +55,7 @@ function user_help($path, $arg) {
       $output .= '<dt>' . t('User roles and permissions') . '</dt>';
       $output .= '<dd>' . t('<em>Roles</em> are used to group and classify users; each user can be assigned one or more roles. By default there are two roles: <em>anonymous user</em> (users that are not logged in) and <em>authenticated user</em> (users that are registered and logged in). Depending on choices you made when you installed Drupal, the installation process may have defined more roles, and you can create additional custom roles on the <a href="@roles">Roles page</a>. After creating roles, you can set permissions for each role on the <a href="@permissions_user">Permissions page</a>. Granting a permission allows users who have been assigned a particular role to perform an action on the site, such as viewing a particular type of content, editing or creating content, administering settings for a particular module, or using a particular function of the site (such as search).', array('@permissions_user' => url('admin/people/permissions'), '@roles' => url('admin/people/roles'))) . '</dd>';
       $output .= '<dt>' . t('Account settings') . '</dt>';
-      $output .= '<dd>' . t('The <a href="@accounts">Account settings page</a> allows you to manage settings for the displayed name of the anonymous user role, personal contact forms, user registration, and account cancellation. On this page you can also manage settings for account personalization (including signatures), and adapt the text for the e-mail messages that are sent automatically during the user registration process.', array('@accounts'  => url('admin/config/people/accounts'))) . '</dd>';
+      $output .= '<dd>' . t('The <a href="@accounts">Account settings page</a> allows you to manage settings for the displayed name of the anonymous user role, personal contact forms, user registration, and account cancellation. On this page you can also manage settings for account personalization (including signatures and user pictures), and adapt the text for the e-mail messages that are sent automatically during the user registration process.', array('@accounts'  => url('admin/config/people/accounts'))) . '</dd>';
       $output .= '</dl>';
       return $output;
     case 'admin/people/create':
@@ -85,6 +85,10 @@ function user_help($path, $arg) {
  */
 function user_theme() {
   return array(
+    'user_picture' => array(
+      'variables' => array('account' => NULL),
+      'template' => 'user-picture',
+    ),
     'user_profile' => array(
       'render element' => 'elements',
       'template' => 'user-profile',
@@ -141,44 +145,6 @@ function user_label($entity_type, $entity) {
 }
 
 /**
- * Populates $entity->account for each prepared entity.
- *
- * Called by hook_entity_prepare_view() implementations.
- *
- * @param array $entities
- *   The entities keyed by entity ID.
- */
-function user_attach_accounts(array $entities) {
-  $uids = array();
-  foreach ($entities as $entity) {
-    $uids[] = $entity->uid;
-  }
-  $uids = array_unique($uids);
-  $accounts = user_load_multiple($uids);
-  $anonymous = drupal_anonymous_user();
-  foreach ($entities as $id => $entity) {
-    if (isset($accounts[$entity->uid])) {
-      $entities[$id]->account = $accounts[$entity->uid];
-    }
-    else {
-      $entities[$id]->account = $anonymous;
-    }
-  }
-}
-
-/**
- * Returns whether this site supports the default user picture feature.
- *
- * This approach preserves compatibility with node/comment templates. Alternate
- * user picture implementations (e.g., Gravatar) should provide their own
- * add/edit/delete forms and populate the 'picture' variable during the
- * preprocess stage.
- */
-function user_picture_enabled() {
-  return (bool) field_info_instance('user', 'user_picture', 'user');
-}
-
-/**
  * Implements hook_field_info_alter().
  */
 function user_field_info_alter(&$info) {
@@ -363,6 +329,29 @@ function user_validate_name($name) {
 }
 
 /**
+ * Validates an image uploaded by a user.
+ *
+ * @see AccountFormController::form()
+ */
+function user_validate_picture(&$form, &$form_state) {
+  // If required, validate the uploaded picture.
+  $validators = array(
+    'file_validate_is_image' => array(),
+    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '85x85')),
+    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
+  );
+
+  // Save the file as a temporary file.
+  $file = file_save_upload('picture_upload', $validators);
+  if ($file === FALSE) {
+    form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
+  }
+  elseif ($file !== NULL) {
+    $form_state['values']['picture_upload'] = $file;
+  }
+}
+
+/**
  * Generate a random alphanumeric password.
  */
 function user_password($length = 10) {
@@ -532,6 +521,45 @@ function user_permission() {
 }
 
 /**
+ * Implements hook_file_download().
+ *
+ * Ensure that user pictures (avatars) are always downloadable.
+ */
+function user_file_download($uri) {
+  if (strpos(file_uri_target($uri), variable_get('user_picture_path', 'pictures') . '/picture-') === 0) {
+    $info = image_get_info($uri);
+    return array('Content-Type' => $info['mime_type']);
+  }
+}
+
+/**
+ * Implements hook_file_move().
+ */
+function user_file_move(File $file, File $source) {
+  // If a user's picture is replaced with a new one, update the record in
+  // the users table.
+  if (isset($file->fid) && isset($source->fid) && $file->fid != $source->fid) {
+    db_update('users')
+      ->fields(array(
+        'picture' => $file->fid,
+      ))
+      ->condition('picture', $source->fid)
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_file_predelete().
+ */
+function user_file_predelete(File $file) {
+  // Remove any references to the file.
+  db_update('users')
+    ->fields(array('picture' => 0))
+    ->condition('picture', $file->fid)
+    ->execute();
+}
+
+/**
  * Implements hook_search_info().
  */
 function user_search_info() {
@@ -592,6 +620,10 @@ function user_search_execute($keys = NULL, $conditions = NULL) {
  * Implements hook_user_view().
  */
 function user_user_view($account) {
+  $account->content['user_picture'] = array(
+    '#markup' => theme('user_picture', array('account' => $account)),
+    '#weight' => -10,
+  );
   $account->content['member_for'] = array(
     '#type' => 'item',
     '#title' => t('Member for'),
@@ -870,6 +902,55 @@ function user_template_preprocess_default_variables_alter(&$variables) {
 }
 
 /**
+ * Process variables for user-picture.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $account: A user, node or comment object with 'name', 'uid' and 'picture'
+ *   fields.
+ *
+ * @see user-picture.tpl.php
+ */
+function template_preprocess_user_picture(&$variables) {
+  $variables['user_picture'] = '';
+  if (variable_get('user_pictures', 0)) {
+    $account = $variables['account'];
+    if (!empty($account->picture)) {
+      // @TODO: Ideally this function would only be passed file entities, but
+      // since there's a lot of legacy code that JOINs the {users} table to
+      // {node} or {comments} and passes the results into this function if we
+      // a numeric value in the picture field we'll assume it's a file id
+      // and load it for them. Once we've got user_load_multiple() and
+      // comment_load_multiple() functions the user module will be able to load
+      // the picture files in mass during the object's load process.
+      if (is_numeric($account->picture)) {
+        $account->picture = file_load($account->picture);
+      }
+      if (!empty($account->picture->uri)) {
+        $filepath = $account->picture->uri;
+      }
+    }
+    elseif (variable_get('user_picture_default', '')) {
+      $filepath = variable_get('user_picture_default', '');
+    }
+    if (isset($filepath)) {
+      $alt = t("@user's picture", array('@user' => user_format_name($account)));
+      // If the image does not have a valid Drupal scheme (for eg. HTTP),
+      // don't load image styles.
+      if (module_exists('image') && file_valid_uri($filepath) && $style = variable_get('user_picture_style', '')) {
+        $variables['user_picture'] = theme('image_style', array('style_name' => $style, 'uri' => $filepath, 'alt' => $alt, 'title' => $alt));
+      }
+      else {
+        $variables['user_picture'] = theme('image', array('uri' => $filepath, 'alt' => $alt, 'title' => $alt));
+      }
+      if (!empty($account->uid) && user_access('access user profiles')) {
+        $attributes = array('attributes' => array('title' => t('View user profile.')), 'html' => TRUE);
+        $variables['user_picture'] = l($variables['user_picture'], "user/$account->uid", $attributes);
+      }
+    }
+  }
+}
+
+/**
  * Preprocesses variables for theme_username().
  *
  * Modules that make any changes to variables like 'name' or 'extra' must insure
@@ -1182,7 +1263,7 @@ function user_menu() {
   );
   $items['admin/config/people/accounts'] = array(
     'title' => 'Account settings',
-    'description' => 'Configure default behavior of users, including registration requirements, e-mails, and fields.',
+    'description' => 'Configure default behavior of users, including registration requirements, e-mails, fields, and user pictures.',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('user_admin_settings'),
     'access arguments' => array('administer users'),
@@ -1942,6 +2023,8 @@ function user_view_page($account) {
  *
  * When viewing a user profile, the $page array contains:
  *
+ * - $page['content']['user_picture']:
+ *   User's rendered picture.
  * - $page['content']['member_for']:
  *   Contains the default "Member for" profile data for a user.
  * - $page['content']['#account']:
@@ -2792,10 +2875,6 @@ function user_form_process_password_confirm($element) {
 
 /**
  * Implements hook_node_load().
- *
- * @todo Deprecated by $node->author, attached in
- *   \Drupal\node\NodeRenderController::buildContent(). Update code that
- *   depends on these properties.
  */
 function user_node_load($nodes, $types) {
   // Build an array of all uids for node authors, keyed by nid.
@@ -2804,17 +2883,37 @@ function user_node_load($nodes, $types) {
     $uids[$nid] = $node->uid;
   }
 
-  // Fetch name and data for these users.
-  $user_fields = db_query("SELECT uid, name, data FROM {users} WHERE uid IN (:uids)", array(':uids' => $uids))->fetchAllAssoc('uid');
+  // Fetch name, picture, and data for these users.
+  $user_fields = db_query("SELECT uid, name, picture, data FROM {users} WHERE uid IN (:uids)", array(':uids' => $uids))->fetchAllAssoc('uid');
 
   // Add these values back into the node objects.
   foreach ($uids as $nid => $uid) {
     $nodes[$nid]->name = $user_fields[$uid]->name;
+    $nodes[$nid]->picture = $user_fields[$uid]->picture;
     $nodes[$nid]->data = $user_fields[$uid]->data;
   }
 }
 
 /**
+ * Implements hook_image_style_delete().
+ */
+function user_image_style_delete($style) {
+  // If a style is deleted, update the variables.
+  // Administrators choose a replacement style when deleting.
+  user_image_style_save($style);
+}
+
+/**
+ * Implements hook_image_style_save().
+ */
+function user_image_style_save($style) {
+  // If a style is renamed, update the variables that use it.
+  if ($style->id() != $style->getOriginalID()) {
+    variable_set('user_picture_style', $style->id());
+  }
+}
+
+/**
  * Implements hook_action_info().
  */
 function user_action_info() {
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index c3a05d7..5e11fab 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -2,5 +2,3 @@ user_register:
   pattern: '/user/register'
   defaults:
     _content: '\Drupal\user\UserRouteController::register'
-  requirements:
-    _access_user_register: 'TRUE'
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index 170759a..295278a 100644
--- a/core/modules/user/user.views.inc
+++ b/core/modules/user/user.views.inc
@@ -153,6 +153,25 @@ function user_views_data() {
     ),
   );
 
+  // picture
+  $data['users']['picture'] = array(
+    'title' => t('Picture'),
+    'help' => t("The user's picture, if allowed."), // The help that appears on the UI,
+    // Information for displaying the uid
+    'field' => array(
+      'id' => 'user_picture',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'boolean',
+      'label' => t('Has Avatar'),
+      'type' => 'yes-no',
+    ),
+  );
+
   // link
   $data['users']['view_user'] = array(
     'field' => array(
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Type/JoinManager.php b/core/modules/views/lib/Drupal/views/Plugin/Type/JoinManager.php
index 2ed3f99..eac395b 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Type/JoinManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Type/JoinManager.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Component\Plugin\Factory\DefaultFactory;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
@@ -20,11 +19,7 @@ class JoinManager extends PluginManagerBase {
    * Constructs a JoinManager object.
    */
   public function __construct() {
-    $this->discovery = new AnnotatedClassDiscovery('views', 'join');
-    $this->discovery = new AlterDecorator($this->discovery, 'views_plugins_join');
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
-    $this->discovery = new CacheDecorator($this->discovery, 'views:join', 'views_info');
-
+    $this->discovery = new CacheDecorator(new AlterDecorator(new AnnotatedClassDiscovery('views', 'join'), 'views_plugins_join'), 'views:join', 'views_info');
     $this->factory = new DefaultFactory($this);
     $this->defaults = array(
       'module' => 'views',
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Type/PluginManager.php b/core/modules/views/lib/Drupal/views/Plugin/Type/PluginManager.php
index 354c106..f5f6f6e 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Type/PluginManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Type/PluginManager.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Component\Plugin\Factory\DefaultFactory;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
@@ -20,11 +19,7 @@ class PluginManager extends PluginManagerBase {
    * Constructs a PluginManager object.
    */
   public function __construct($type) {
-    $this->discovery = new AnnotatedClassDiscovery('views', $type);
-    $this->discovery = new AlterDecorator($this->discovery, 'views_plugins_' . $type);
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
-    $this->discovery = new CacheDecorator($this->discovery, 'views:' . $type, 'views_info');
-
+    $this->discovery = new CacheDecorator(new AlterDecorator(new AnnotatedClassDiscovery('views', $type), 'views_plugins_' . $type), 'views:' . $type, 'views_info');
     $this->factory = new DefaultFactory($this);
     $this->defaults += array(
       'parent' => 'parent',
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Type/WizardManager.php b/core/modules/views/lib/Drupal/views/Plugin/Type/WizardManager.php
index 8a0aed5..96b544f 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Type/WizardManager.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Type/WizardManager.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Component\Plugin\Factory\DefaultFactory;
-use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
@@ -20,10 +19,7 @@ class WizardManager extends PluginManagerBase {
    * Constructs a WizardManager object.
    */
   public function __construct() {
-    $this->discovery = new AnnotatedClassDiscovery('views', 'wizard');
-    $this->discovery = new AlterDecorator($this->discovery, 'views_plugins_wizard');
-    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
-    $this->discovery = new CacheDecorator($this->discovery, 'views:wizard', 'views_info');
+    $this->discovery = new CacheDecorator(new AlterDecorator(new AnnotatedClassDiscovery('views', 'wizard'), 'views_plugins_wizard'), 'views:wizard', 'views_info');
     $this->factory = new DefaultFactory($this);
     $this->defaults = array(
       'module' => 'views',
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/filter/Combine.php b/core/modules/views/lib/Drupal/views/Plugin/views/filter/Combine.php
index 25a0837..c43d5b3 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/filter/Combine.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/filter/Combine.php
@@ -72,14 +72,14 @@ public function query() {
     }
     if ($fields) {
       $count = count($fields);
-      $separated_fields = array();
+      $seperated_fields = array();
       foreach ($fields as $key => $field) {
-        $separated_fields[] = $field;
+        $seperated_fields[] = $field;
         if ($key < $count-1) {
-          $separated_fields[] = "' '";
+          $seperated_fields[] = "' '";
         }
       }
-      $expression = implode(', ', $separated_fields);
+      $expression = implode(', ', $seperated_fields);
       $expression = "CONCAT_WS(' ', $expression)";
 
       $info = $this->operators();
diff --git a/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php
index 590bc6e..a274311 100644
--- a/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php
@@ -116,37 +116,6 @@ function testDefaultViews() {
   }
 
   /**
-   * Tests that enabling views moves them to the correct table.
-   */
-  function testSplitListing() {
-    // Build a re-usable xpath query.
-    $xpath = '//div[@id="views-entity-list"]/div[@class = :status]/table//tr[@title = :title]';
-    $arguments = array(
-      ':status' => 'views-list-section enabled',
-      ':title' => t('Machine name: test_view_status'),
-    );
-
-    $this->drupalGet('admin/structure/views');
-
-    $elements = $this->xpath($xpath, $arguments);
-    $this->assertIdentical(count($elements), 0, 'A disabled view is not found in the enabled views table.');
-
-    $arguments[':status'] = 'views-list-section disabled';
-    $elements = $this->xpath($xpath, $arguments);
-    $this->assertIdentical(count($elements), 1, 'A disabled view is found in the disabled views table.');
-
-    // Enable the view.
-    $this->clickViewsOperationLink(t('Enable'), '/test_view_status/');
-
-    $elements = $this->xpath($xpath, $arguments);
-    $this->assertIdentical(count($elements), 0, 'After enabling a view, it is not found in the disabled views table.');
-
-    $arguments[':status'] = 'views-list-section enabled';
-    $elements = $this->xpath($xpath, $arguments);
-    $this->assertIdentical(count($elements), 1, 'After enabling a view, it is found in the enabled views table.');
-  }
-
-  /**
    * Click a link to perform an operation on a view.
    *
    * In general, we expect lots of links titled "enable" or "disable" on the
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 4d05126..6347df6 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -575,7 +575,13 @@ function views_page_alter(&$page) {
   // If the main content of this page contains a view, attach its contextual
   // links to the overall page array. This allows them to be rendered directly
   // next to the page title.
-  if ($view = views_get_page_view()) {
+  $view = views_get_page_view();
+  if (!empty($view)) {
+    // If a module is still putting in the display like we used to, catch that.
+    if (is_subclass_of($view, 'views_plugin_display')) {
+      $view = $view->view;
+    }
+
     views_add_contextual_links($page, 'page', $view, $view->current_display);
   }
 }
diff --git a/core/modules/views/views_ui/admin.inc b/core/modules/views/views_ui/admin.inc
index 2e632d7..1c67ceb 100644
--- a/core/modules/views/views_ui/admin.inc
+++ b/core/modules/views/views_ui/admin.inc
@@ -295,10 +295,10 @@ function views_ui_break_lock_confirm($form, &$form_state, ViewUI $view) {
 
   $account = user_load($view->locked->owner);
   $form = confirm_form($form,
-                  t('Do you want to break the lock on view %name?',
+                  t('Are you sure you want to break the lock on view %name?',
                   array('%name' => $view->get('name'))),
                   $cancel,
-                  t('By breaking this lock, any unsaved changes made by !user will be lost.', array('!user' => theme('username', array('account' => $account)))),
+                  t('By breaking this lock, any unsaved changes made by !user will be lost!', array('!user' => theme('username', array('account' => $account)))),
                   t('Break lock'),
                   t('Cancel'));
   $form['actions']['submit']['#submit'][] = array($view, 'submitBreakLock');
diff --git a/core/modules/views/views_ui/css/views-admin.theme.css b/core/modules/views/views_ui/css/views-admin.theme.css
index a565b47..d309edc 100644
--- a/core/modules/views/views_ui/css/views-admin.theme.css
+++ b/core/modules/views/views_ui/css/views-admin.theme.css
@@ -1158,7 +1158,3 @@ div.messages {
 }
 
 /* @end */
-
-.views-list-section {
-  margin-bottom: 2em;
-}
diff --git a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewListController.php b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewListController.php
index 46c139b..a3e2bea 100644
--- a/core/modules/views/views_ui/lib/Drupal/views_ui/ViewListController.php
+++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ViewListController.php
@@ -19,18 +19,15 @@ class ViewListController extends EntityListController {
    * Overrides Drupal\Core\Entity\EntityListController::load();
    */
   public function load() {
-    $entities = array(
-      'enabled' => array(),
-      'disabled' => array(),
-    );
-    foreach (parent::load() as $entity) {
-      if ($entity->isEnabled()) {
-        $entities['enabled'][] = $entity;
-      }
-      else {
-        $entities['disabled'][] = $entity;
+    $entities = parent::load();
+    uasort($entities, function ($a, $b) {
+      $a_enabled = $a->isEnabled();
+      $b_enabled = $b->isEnabled();
+      if ($a_enabled != $b_enabled) {
+        return $a_enabled < $b_enabled;
       }
-    }
+      return $a->id() > $b->id();
+    });
     return $entities;
   }
 
@@ -159,30 +156,10 @@ public function buildOperations(EntityInterface $entity) {
    * Overrides Drupal\Core\Entity\EntityListController::render();
    */
   public function render() {
-    $entities = $this->load();
-    $list['#type'] = 'container';
+    $list = parent::render();
     $list['#attached']['css'] = ViewFormControllerBase::getAdminCSS();
     $list['#attached']['library'][] = array('system', 'drupal.ajax');
     $list['#attributes']['id'] = 'views-entity-list';
-    $list['enabled']['heading']['#markup'] = '<h2>' . t('Enabled') . '</h2>';
-    $list['disabled']['heading']['#markup'] = '<h2>' . t('Disabled') . '</h2>';
-    foreach (array('enabled', 'disabled') as $status) {
-      $list[$status]['#type'] = 'container';
-      $list[$status]['#attributes'] = array('class' => array('views-list-section', $status));
-      $list[$status]['table'] = array(
-        '#theme' => 'table',
-        '#header' => $this->buildHeader(),
-        '#rows' => array(),
-      );
-      foreach ($entities[$status] as $entity) {
-        $list[$status]['table']['#rows'][$entity->id()] = $this->buildRow($entity);
-      }
-    }
-    // @todo Use a placeholder for the entity label if this is abstracted to
-    // other entity types.
-    $list['enabled']['table']['#empty'] = t('There are no enabled views.');
-    $list['disabled']['table']['#empty'] = t('There are no disabled views.');
-
     return $list;
   }
 
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index 071bf31..c063a6d 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -253,6 +253,12 @@ function standard_install() {
   // Don't display date and author information for "Basic page" nodes by default.
   variable_set('node_submitted_page', FALSE);
 
+  // Enable user picture support and set the default to a square thumbnail option.
+  variable_set('user_pictures', '1');
+  variable_set('user_picture_dimensions', '1024x1024');
+  variable_set('user_picture_file_size', '800');
+  variable_set('user_picture_style', 'thumbnail');
+
   // Allow visitor account creation with administrative approval.
   $user_settings = config('user.settings');
   $user_settings->set('register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)->save();
@@ -377,17 +383,6 @@ function standard_install() {
   );
   field_create_instance($instance);
 
-  // Create user picture field.
-  module_load_install('user');
-  _user_install_picture_field();
-  // Remove 'summary' pseudo-field from compact view mode on the User entity.
-  $bundle_settings = field_bundle_settings('user', 'user');
-  $bundle_settings['extra_fields']['display']['member_for']['compact'] = array(
-    'visible' => FALSE,
-    'weight' => 10,
-  );
-  field_bundle_settings('user', 'user', $bundle_settings);
-
   // Enable default permissions for system roles.
   $filtered_html_permission = filter_permission_name($filtered_html_format);
   user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access comments', $filtered_html_permission));
diff --git a/core/themes/bartik/css/style-rtl.css b/core/themes/bartik/css/style-rtl.css
index 74f2950..711a742 100644
--- a/core/themes/bartik/css/style-rtl.css
+++ b/core/themes/bartik/css/style-rtl.css
@@ -83,9 +83,9 @@ ul.tips {
 
 /* ----------------- Content ------------------ */
 
-.submitted .field-name-field-user-picture img {
+.submitted .user-picture img {
   float: right;
-  margin-left: 20px;
+  margin-left: 5px;
   margin-right: 0;
 }
 .field-type-taxonomy-term-reference .field-label {
@@ -104,7 +104,7 @@ ul.tips {
 
 /* ----------------- Comments ----------------- */
 
-.comment .field-name-field-user-picture img {
+.comment .user-picture img {
   margin-right: 0;
 }
 .comment .attribution {
diff --git a/core/themes/bartik/css/style.css b/core/themes/bartik/css/style.css
index ffe0629..38e1afa 100644
--- a/core/themes/bartik/css/style.css
+++ b/core/themes/bartik/css/style.css
@@ -622,9 +622,10 @@ h1#page-title {
   color: #68696b;
   margin-bottom: -5px;
 }
-.submitted .field-name-field-user-picture img {
+.submitted .user-picture img {
   float: left; /* LTR */
-  margin: 1px 20px 0 0; /* LTR */
+  height: 20px;
+  margin: 1px 5px 0 0; /* LTR */
 }
 .field-type-taxonomy-term-reference {
   margin: 0 0 1.2em;
@@ -656,7 +657,7 @@ h1#page-title {
   text-align: right;
 }
 .field-type-image img,
-.field-name-field-user-picture img {
+.user-picture img {
   margin: 0 0 1em;
 }
 ul.links {
@@ -677,7 +678,7 @@ ul.links {
 .comment h2.title {
   margin-bottom: 1em;
 }
-.comment .field-name-field-user-picture img {
+.comment div.user-picture img {
   margin-left: 0; /* LTR */
 }
 .comment {
@@ -1057,7 +1058,7 @@ div.messages {
 
 /* -------------- User Profile   -------------- */
 
-.profile .field-name-field-user-picture {
+.profile .user-picture {
   float: none;
 }
 
diff --git a/core/themes/bartik/templates/comment.tpl.php b/core/themes/bartik/templates/comment.tpl.php
index 2b285d2..ef525c1 100644
--- a/core/themes/bartik/templates/comment.tpl.php
+++ b/core/themes/bartik/templates/comment.tpl.php
@@ -20,6 +20,7 @@
  * - $permalink: Comment permalink.
  * - $submitted: Submission information created from $author and $created
  *   during template_preprocess_comment().
+ * - $picture: Authors picture.
  * - $signature: Authors signature.
  * - $status: Comment status. Possible values are:
  *   unpublished, published, or preview.
@@ -72,7 +73,7 @@
 
   <div class="attribution">
 
-    <?php print render($user_picture); ?>
+    <?php print $user_picture; ?>
 
     <div class="submitted">
       <p class="commenter-name">
diff --git a/core/themes/bartik/templates/node.tpl.php b/core/themes/bartik/templates/node.tpl.php
index 0038e92..8467a4d 100644
--- a/core/themes/bartik/templates/node.tpl.php
+++ b/core/themes/bartik/templates/node.tpl.php
@@ -10,7 +10,7 @@
  *   or print a subset such as render($content['field_example']). Use
  *   hide($content['field_example']) to temporarily suppress the printing of a
  *   given element.
- * - $user_picture: The node author's picture. Use render() when printing.
+ * - $user_picture: The node author's picture from user-picture.tpl.php.
  * - $date: Formatted creation date. Preprocess functions can reformat it by
  *   calling format_date() with the desired parameters on the $created variable.
  * - $name: Themed username of node author output from theme_username().
@@ -88,7 +88,7 @@
 
   <?php if ($display_submitted): ?>
     <div class="meta submitted">
-      <?php print render($user_picture); ?>
+      <?php print $user_picture; ?>
       <?php print $submitted; ?>
     </div>
   <?php endif; ?>
diff --git a/core/update.php b/core/update.php
index 4e74c0c..98296bb 100644
--- a/core/update.php
+++ b/core/update.php
@@ -200,8 +200,7 @@ function update_results_page() {
     $output = '<p>Updates were attempted. If you see no failures below, you may proceed happily back to your <a href="' . base_path() . '">site</a>. Otherwise, you may need to update your database manually.' . $log_message . '</p>';
   }
   else {
-    $last = reset($_SESSION['updates_remaining']);
-    list($module, $version) = array_pop($last);
+    list($module, $version) = array_pop(reset($_SESSION['updates_remaining']));
     $output = '<p class="error">The update process was aborted prematurely while running <strong>update #' . $version . ' in ' . $module . '.module</strong>.' . $log_message;
     if (module_exists('dblog')) {
       $output .= ' You may need to check the <code>watchdog</code> database table manually.';
