diff --git a/core/assets/vendor/classList/README.md b/core/assets/vendor/classList/README.md
new file mode 100644
index 0000000..dd7359c
--- /dev/null
+++ b/core/assets/vendor/classList/README.md
@@ -0,0 +1,7 @@
+classList.js is a cross-browser JavaScript shim that fully implements `element.classList`. Refer to [the MDN page on `element.classList`][1] for more information.
+
+
+![Tracking image](https://in.getclicky.com/212712ns.gif)
+
+
+  [1]: https://developer.mozilla.org/en/DOM/element.classList "MDN / DOM / element.classList"
diff --git a/core/assets/vendor/classList/classList.js b/core/assets/vendor/classList/classList.js
new file mode 100644
index 0000000..1faaec8
--- /dev/null
+++ b/core/assets/vendor/classList/classList.js
@@ -0,0 +1,179 @@
+/*
+ * classList.js: Cross-browser full element.classList implementation.
+ * 2012-11-15
+ *
+ * By Eli Grey, http://eligrey.com
+ * Public Domain.
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+ */
+
+/*global self, document, DOMException */
+
+/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
+
+if ("document" in self && !(
+		"classList" in document.createElement("_") &&
+		"classList" in document.createElementNS("http://www.w3.org/2000/svg", "svg")
+	)) {
+
+(function (view) {
+
+"use strict";
+
+if (!('Element' in view)) return;
+
+var
+	  classListProp = "classList"
+	, protoProp = "prototype"
+	, elemCtrProto = view.Element[protoProp]
+	, objCtr = Object
+	, strTrim = String[protoProp].trim || function () {
+		return this.replace(/^\s+|\s+$/g, "");
+	}
+	, arrIndexOf = Array[protoProp].indexOf || function (item) {
+		var
+			  i = 0
+			, len = this.length
+		;
+		for (; i < len; i++) {
+			if (i in this && this[i] === item) {
+				return i;
+			}
+		}
+		return -1;
+	}
+	// Vendors: please allow content code to instantiate DOMExceptions
+	, DOMEx = function (type, message) {
+		this.name = type;
+		this.code = DOMException[type];
+		this.message = message;
+	}
+	, checkTokenAndGetIndex = function (classList, token) {
+		if (token === "") {
+			throw new DOMEx(
+				  "SYNTAX_ERR"
+				, "An invalid or illegal string was specified"
+			);
+		}
+		if (/\s/.test(token)) {
+			throw new DOMEx(
+				  "INVALID_CHARACTER_ERR"
+				, "String contains an invalid character"
+			);
+		}
+		return arrIndexOf.call(classList, token);
+	}
+	, ClassList = function (elem) {
+		var
+			  trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
+			, classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
+			, i = 0
+			, len = classes.length
+		;
+		for (; i < len; i++) {
+			this.push(classes[i]);
+		}
+		this._updateClassName = function () {
+			elem.setAttribute("class", this.toString());
+		};
+	}
+	, classListProto = ClassList[protoProp] = []
+	, classListGetter = function () {
+		return new ClassList(this);
+	}
+;
+// Most DOMException implementations don't allow calling DOMException's toString()
+// on non-DOMExceptions. Error's toString() is sufficient here.
+DOMEx[protoProp] = Error[protoProp];
+classListProto.item = function (i) {
+	return this[i] || null;
+};
+classListProto.contains = function (token) {
+	token += "";
+	return checkTokenAndGetIndex(this, token) !== -1;
+};
+classListProto.add = function () {
+	var
+		  tokens = arguments
+		, i = 0
+		, l = tokens.length
+		, token
+		, updated = false
+	;
+	do {
+		token = tokens[i] + "";
+		if (checkTokenAndGetIndex(this, token) === -1) {
+			this.push(token);
+			updated = true;
+		}
+	}
+	while (++i < l);
+
+	if (updated) {
+		this._updateClassName();
+	}
+};
+classListProto.remove = function () {
+	var
+		  tokens = arguments
+		, i = 0
+		, l = tokens.length
+		, token
+		, updated = false
+	;
+	do {
+		token = tokens[i] + "";
+		var index = checkTokenAndGetIndex(this, token);
+		if (index !== -1) {
+			this.splice(index, 1);
+			updated = true;
+		}
+	}
+	while (++i < l);
+
+	if (updated) {
+		this._updateClassName();
+	}
+};
+classListProto.toggle = function (token, forse) {
+	token += "";
+
+	var
+		  result = this.contains(token)
+		, method = result ?
+			forse !== true && "remove"
+		:
+			forse !== false && "add"
+	;
+
+	if (method) {
+		this[method](token);
+	}
+
+	return !result;
+};
+classListProto.toString = function () {
+	return this.join(" ");
+};
+
+if (objCtr.defineProperty) {
+	var classListPropDesc = {
+		  get: classListGetter
+		, enumerable: true
+		, configurable: true
+	};
+	try {
+		objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+	} catch (ex) { // IE 8 doesn't support enumerable:true
+		if (ex.number === -0x7FF5EC54) {
+			classListPropDesc.enumerable = false;
+			objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+		}
+	}
+} else if (objCtr[protoProp].__defineGetter__) {
+	elemCtrProto.__defineGetter__(classListProp, classListGetter);
+}
+
+}(self));
+
+}
diff --git a/core/assets/vendor/classList/classList.min.js b/core/assets/vendor/classList/classList.min.js
index 99b828c..fa98825 100644
--- a/core/assets/vendor/classList/classList.min.js
+++ b/core/assets/vendor/classList/classList.min.js
@@ -1,2 +1,2 @@
-/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */
-if("document" in self){if(!("classList" in document.createElement("_"))){(function(j){"use strict";if(!("Element" in j)){return}var a="classList",f="prototype",m=j.Element[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.getAttribute("class")||""),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.setAttribute("class",this.toString())}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(){var s=arguments,r=0,p=s.length,q,o=false;do{q=s[r]+"";if(g(this,q)===-1){this.push(q);o=true}}while(++r<p);if(o){this._updateClassName()}};e.remove=function(){var t=arguments,s=0,p=t.length,r,o=false,q;do{r=t[s]+"";q=g(this,r);while(q!==-1){this.splice(q,1);o=true;q=g(this,r)}}while(++s<p);if(o){this._updateClassName()}};e.toggle=function(p,q){p+="";var o=this.contains(p),r=o?q!==true&&"remove":q!==false&&"add";if(r){this[r](p)}if(q===true||q===false){return q}else{return !o}};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))}else{(function(){var b=document.createElement("_");b.classList.add("c1","c2");if(!b.classList.contains("c2")){var c=function(e){var d=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(h){var g,f=arguments.length;for(g=0;g<f;g++){h=arguments[g];d.call(this,h)}}};c("add");c("remove")}b.classList.toggle("c3",false);if(b.classList.contains("c3")){var a=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(d,e){if(1 in arguments&&!this.contains(d)===!e){return e}else{return a.call(this,d)}}}b=null}())}};
\ No newline at end of file
+/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
+if("document" in self&&!("classList" in document.createElement("_")&&"classList" in document.createElementNS("http://www.w3.org/2000/svg","svg"))){(function(j){"use strict";if(!("Element" in j)){return}var a="classList",f="prototype",m=j.Element[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.getAttribute("class")),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.setAttribute("class",this.toString())}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(){var s=arguments,r=0,p=s.length,q,o=false;do{q=s[r]+"";if(g(this,q)===-1){this.push(q);o=true}}while(++r<p);if(o){this._updateClassName()}};e.remove=function(){var t=arguments,s=0,p=t.length,r,o=false;do{r=t[s]+"";var q=g(this,r);if(q!==-1){this.splice(q,1);o=true}}while(++s<p);if(o){this._updateClassName()}};e.toggle=function(p,q){p+="";var o=this.contains(p),r=o?q!==true&&"remove":q!==false&&"add";if(r){this[r](p)}return !o};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))};
diff --git a/core/assets/vendor/jquery-ui-touch-punch/jquery.ui.touch-punch.js b/core/assets/vendor/jquery-ui-touch-punch/jquery.ui.touch-punch.js
index 31272ce..33d6f97 100644
--- a/core/assets/vendor/jquery-ui-touch-punch/jquery.ui.touch-punch.js
+++ b/core/assets/vendor/jquery-ui-touch-punch/jquery.ui.touch-punch.js
@@ -1,11 +1,11 @@
-/*!
- * jQuery UI Touch Punch 0.2.3
+/*
+ * jQuery UI Touch Punch 0.2.2
  *
- * Copyright 2011–2014, Dave Furfero
+ * Copyright 2011, Dave Furfero
  * Dual licensed under the MIT or GPL Version 2 licenses.
  *
  * Depends:
  *  jquery.ui.widget.js
  *  jquery.ui.mouse.js
  */
-!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);
\ No newline at end of file
+(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery);
\ No newline at end of file
diff --git a/core/assets/vendor/normalize-css/CHANGELOG.md b/core/assets/vendor/normalize-css/CHANGELOG.md
new file mode 100644
index 0000000..5c358be
--- /dev/null
+++ b/core/assets/vendor/normalize-css/CHANGELOG.md
@@ -0,0 +1,76 @@
+=== HEAD
+
+=== 3.0.1 (March 27, 2014)
+
+* Add package.json for npm support.
+
+=== 3.0.0 (January 28, 2014)
+
+=== 3.0.0-rc.1 (January 26, 2014)
+
+* Explicit tests for each normalization.
+* Fix i18n for `q` element.
+* Fix `pre` text formatting and overflow.
+* Fix vertical alignment of `progress`.
+* Address `button` overflow in IE 8/9/10.
+* Revert `textarea` alignment modification.
+* Fix number input button cursor in Chrome on OS X.
+* Remove `a:focus` outline normalization.
+* Fix `figure` margin normalization.
+* Normalize `optgroup`.
+* Remove default table cell padding.
+* Set correct display for `progress` in IE 8/9.
+* Fix `font` and `color` inheritance for forms.
+
+=== 2.1.3 (August 26, 2013)
+
+* Fix component.json.
+* Remove the gray background color from active links in IE 10.
+
+=== 2.1.2 (May 11, 2013)
+
+* Revert root `color` and `background` normalizations.
+
+=== 2.1.1 (April 8, 2013)
+
+* Normalize root `color` and `background` to counter the effects of system
+  color schemes.
+
+=== 2.1.0 (January 21, 2013)
+
+* Normalize `text-transform` for `button` and `select`.
+* Normalize `h1` margin when within HTML5 sectioning elements.
+* Normalize `hr` element.
+* Remove unnecessary `pre` styles.
+* Add `main` element to HTML5 display definitions.
+* Fix cursor style for disabled button `input`.
+
+=== 2.0.1 (August 20, 2012)
+
+* Remove stray IE 6/7 `inline-block` hack from HTML5 display settings.
+
+=== 2.0.0 (August 19, 2012)
+
+* Remove legacy browser form normalizations.
+* Remove all list normalizations.
+* Add `quotes` normalizations.
+* Remove all heading normalizations except `h1` font size.
+* Form elements automatically inherit `font-family` from ancestor.
+* Drop support for IE 6/7, Firefox < 4, and Safari < 5.
+
+=== 1.0.1 (August 19, 2012)
+
+* Adjust `small` font size normalization.
+
+=== 1.0.0 (August 14, 2012)
+
+(Only the notable changes since public release)
+
+* Add MIT License.
+* Hide `audio` elements without controls in iOS 5 (#69).
+* Normalize heading margins and font size.
+* Move font-family normalization from `body` to `html` (#62).
+* Remove scrollbar normalization (#64 #65).
+* Remove excess padding from checkbox and radio inputs in IE 7 (#42).
+* Add IE9 correction for SVG overflow (#16).
+* Add fix for legend not inheriting color in IE 6/7/8/9.
diff --git a/core/assets/vendor/normalize-css/CONTRIBUTING.md b/core/assets/vendor/normalize-css/CONTRIBUTING.md
new file mode 100644
index 0000000..abcbae2
--- /dev/null
+++ b/core/assets/vendor/normalize-css/CONTRIBUTING.md
@@ -0,0 +1,177 @@
+# Contributing to normalize.css
+
+Please take a moment to review this document in order to make the contribution
+process easy and effective for everyone involved.
+
+Following these guidelines helps to communicate that you respect the time of
+the developers managing and developing this open source project. In return,
+they should reciprocate that respect in addressing your issue or assessing
+patches and features.
+
+
+## Using the issue tracker
+
+The issue tracker is the preferred channel for [bug reports](#bugs),
+[features requests](#features) and [submitting pull
+requests](#pull-requests), but please respect the following restrictions:
+
+* Please **do not** use the issue tracker for personal support requests.
+
+* Please **do not** derail or troll issues. Keep the discussion on topic and
+  respect the opinions of others.
+
+
+<a name="bugs"></a>
+## Bug reports
+
+A bug is a _demonstrable problem_ that is caused by the code in the repository.
+Good bug reports are extremely helpful - thank you!
+
+Guidelines for bug reports:
+
+1. **Use the GitHub issue search** – check if the issue has already been
+   reported.
+
+2. **Check if the issue has been fixed** – try to reproduce it using the
+   latest `master` branch in the repository.
+
+3. **Isolate the problem** – create a live example (e.g., on
+   [Codepen](http://codepen.io)) of a [reduced test
+   case](http://css-tricks.com/6263-reduced-test-cases/).
+
+A good bug report shouldn't leave others needing to chase you up for more
+information. Please try to be as detailed as possible in your report. What is
+your environment? What steps will reproduce the issue? What browser(s) and OS
+experience the problem? What would you expect to be the outcome? All these
+details will help people to fix any potential bugs.
+
+Example:
+
+> Short and descriptive example bug report title
+>
+> A summary of the issue and the browser/OS environment in which it occurs. If
+> suitable, include the steps required to reproduce the bug.
+>
+> 1. This is the first step
+> 2. This is the second step
+> 3. Further steps, etc.
+>
+> `<url>` - a link to the reduced test case
+>
+> Any other information you want to share that is relevant to the issue being
+> reported. This might include the lines of code that you have identified as
+> causing the bug, and potential solutions (and your opinions on their
+> merits).
+
+
+<a name="features"></a>
+## Feature requests
+
+Feature requests are welcome. But take a moment to find out whether your idea
+fits with the scope and aims of the project. It's up to *you* to make a strong
+case to convince the project's developers of the merits of this feature. Please
+provide as much detail and context as possible.
+
+
+<a name="pull-requests"></a>
+## Pull requests
+
+Good pull requests - patches, improvements, new features - are a fantastic
+help. They should remain focused in scope and avoid containing unrelated
+commits.
+
+**Please ask first** before embarking on any significant work, otherwise you
+risk spending a lot of time working on something that the project's developers
+might not want to merge into the project.
+
+Please adhere to the coding conventions used throughout a project (whitespace,
+accurate comments, etc.) and any other requirements (such as test coverage).
+
+Follow this process if you'd like your work considered for inclusion in the
+project:
+
+1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,
+   and configure the remotes:
+
+   ```bash
+   # Clone your fork of the repo into the current directory
+   git clone https://github.com/<your-username>/normalize.css
+   # Navigate to the newly cloned directory
+   cd normalize.css
+   # Assign the original repo to a remote called "upstream"
+   git remote add upstream https://github.com/necolas/normalize.css
+   ```
+
+2. If you cloned a while ago, get the latest changes from upstream:
+
+   ```bash
+   git checkout master
+   git pull upstream master
+   ```
+
+3. Never work directly on `master`. Create a new topic branch (off the latest
+   version of `master`) to contain your feature, change, or fix:
+
+   ```bash
+   git checkout -b <topic-branch-name>
+   ```
+
+4. Commit your changes in logical chunks. Please adhere to these [git commit
+   message conventions](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
+   or your code is unlikely be merged into the main project. Use Git's
+   [interactive rebase](https://help.github.com/articles/interactive-rebase)
+   feature to tidy up your commits before making them public.
+
+   Make sure to add a test to the `test.html` file if appropriate, and test
+   your change in all supported browsers.
+
+5. Locally rebase the upstream development branch into your topic branch:
+
+   ```bash
+   git pull --rebase upstream master
+   ```
+
+6. Push your topic branch up to your fork:
+
+   ```bash
+   git push origin <topic-branch-name>
+   ```
+
+10. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
+    with a clear title and description.
+
+    Please submit a separate pull request for any appropriate changes required
+    in the `v1` branch for legacy browsers.
+
+**IMPORTANT**: By submitting a patch, you agree to allow the project owner to
+license your work under the same license as that used by the project.
+
+
+<a name="maintainers"></a>
+## Maintainers
+
+If you have commit access, please follow this process for merging patches and
+cutting new releases.
+
+### Accepting patches
+
+1. Check that a patch is within the scope and philosophy of the project.
+2. Check that a patch has any necessary tests and a proper, descriptive commit
+   message.
+3. Test the patch locally.
+4. Do not use GitHub's merge button. Apply the patch to `master` locally
+   (either via `git am` or by checking the whole branch out). Amend minor
+   problems with the author's original commit if necessary. Then push to GitHub.
+5. If a patch should be included in `v1`, cherry-pick the commits or manually
+   apply if all else fails.
+
+### Releasing a new version
+
+1. Include all new functional changes in the CHANGELOG.
+2. Use a dedicated commit to increment the version. The version needs to be
+   added to the CHANGELOG (inc. date), and the `bower.json`, `component.json`,
+   and `normalize.css` files.
+3. The commit message must be of `v0.0.0` format.
+4. Create an annotated tag for the version: `git tag -m "v0.0.0" 0.0.0`.
+5. Push the changes and tags to GitHub: `git push --tags origin master`
+6. Checkout the `gh-pages` branch and follow the instructions in the README.
diff --git a/core/assets/vendor/normalize-css/LICENSE.md b/core/assets/vendor/normalize-css/LICENSE.md
new file mode 100644
index 0000000..c6bcc9b
--- /dev/null
+++ b/core/assets/vendor/normalize-css/LICENSE.md
@@ -0,0 +1,19 @@
+Copyright (c) Nicolas Gallagher and Jonathan Neal
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/core/assets/vendor/normalize-css/README.md b/core/assets/vendor/normalize-css/README.md
new file mode 100644
index 0000000..80ec51a
--- /dev/null
+++ b/core/assets/vendor/normalize-css/README.md
@@ -0,0 +1,57 @@
+# normalize.css v3
+
+Normalize.css is a customisable CSS file that makes browsers render all
+elements more consistently and in line with modern standards.
+
+The project relies on researching the differences between default browser
+styles in order to precisely target only the styles that need or benefit from
+normalizing.
+
+[View the test file](http://necolas.github.io/normalize.css/latest/test.html)
+
+## Install
+
+Download from the [project page](http://necolas.github.io/normalize.css/).
+
+Install with [Component(1)](https://github.com/component/component/): `component install necolas/normalize.css`
+
+Install with [npm](http://npmjs.org/): `npm install --save normalize.css`
+
+Install with [Bower](http://bower.io/): `bower install --save normalize.css`
+
+## What does it do?
+
+* Preserves useful defaults, unlike many CSS resets.
+* Normalizes styles for a wide range of elements.
+* Corrects bugs and common browser inconsistencies.
+* Improves usability with subtle improvements.
+* Explains what code does using detailed comments.
+
+## How to use it
+
+No other styles should come before Normalize.css.
+
+It is recommended that you include the `normalize.css` file as untouched
+library code.
+
+## Browser support
+
+* Google Chrome (latest)
+* Mozilla Firefox (latest)
+* Mozilla Firefox 4
+* Opera (latest)
+* Apple Safari 6+
+* Internet Explorer 8+
+
+[Normalize.css v1 provides legacy browser
+support](https://github.com/necolas/normalize.css/tree/v1) (IE 6+, Safari 4+),
+but is no longer actively developed.
+
+## Contributing
+
+Please read the CONTRIBUTING.md
+
+## Acknowledgements
+
+Normalize.css is a project by [Nicolas Gallagher](https://github.com/necolas),
+co-created with [Jonathan Neal](https://github.com/jonathantneal).
diff --git a/core/assets/vendor/normalize-css/bower.json b/core/assets/vendor/normalize-css/bower.json
new file mode 100644
index 0000000..9ddcdd0
--- /dev/null
+++ b/core/assets/vendor/normalize-css/bower.json
@@ -0,0 +1,13 @@
+{
+  "name": "normalize-css",
+  "version": "3.0.1",
+  "main": "normalize.css",
+  "author": "Nicolas Gallagher",
+  "ignore": [
+    "CHANGELOG.md",
+    "CONTRIBUTING.md",
+    "component.json",
+    "package.json",
+    "test.html"
+  ]
+}
diff --git a/core/assets/vendor/normalize-css/component.json b/core/assets/vendor/normalize-css/component.json
new file mode 100644
index 0000000..ac21fb1
--- /dev/null
+++ b/core/assets/vendor/normalize-css/component.json
@@ -0,0 +1,8 @@
+{
+  "name": "normalize.css",
+  "repo": "necolas/normalize.css",
+  "version": "3.0.1",
+  "styles": ["normalize.css"],
+  "author": "Nicolas Gallagher",
+  "license": "MIT"
+}
diff --git a/core/assets/vendor/normalize-css/normalize.css b/core/assets/vendor/normalize-css/normalize.css
index 81c6f31..08f8950 100644
--- a/core/assets/vendor/normalize-css/normalize.css
+++ b/core/assets/vendor/normalize-css/normalize.css
@@ -1,4 +1,4 @@
-/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
 
 /**
  * 1. Set default font family to sans-serif.
@@ -25,8 +25,7 @@ body {
 
 /**
  * Correct `block` display not defined for any HTML5 element in IE 8/9.
- * Correct `block` display not defined for `details` or `summary` in IE 10/11
- * and Firefox.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.
  * Correct `block` display not defined for `main` in IE 11.
  */
 
@@ -39,7 +38,6 @@ footer,
 header,
 hgroup,
 main,
-menu,
 nav,
 section,
 summary {
@@ -87,7 +85,7 @@ template {
  */
 
 a {
-  background-color: transparent;
+  background: transparent;
 }
 
 /**
@@ -424,4 +422,4 @@ table {
 td,
 th {
   padding: 0;
-}
\ No newline at end of file
+}
diff --git a/core/assets/vendor/normalize-css/package.json b/core/assets/vendor/normalize-css/package.json
new file mode 100644
index 0000000..19afaa3
--- /dev/null
+++ b/core/assets/vendor/normalize-css/package.json
@@ -0,0 +1,17 @@
+{
+  "name": "normalize.css",
+  "version": "3.0.1",
+  "description": "Normalize.css as a node packaged module",
+  "style": "normalize.css",
+  "files": [
+    "normalize.css",
+    "component.json"
+  ],
+  "homepage": "http://necolas.github.io/normalize.css",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/necolas/normalize.css.git"
+  },
+  "author": "Nicolas Gallagher",
+  "license": "MIT"
+}
diff --git a/core/assets/vendor/normalize-css/test.html b/core/assets/vendor/normalize-css/test.html
new file mode 100644
index 0000000..03d2bf6
--- /dev/null
+++ b/core/assets/vendor/normalize-css/test.html
@@ -0,0 +1,508 @@
+<!DOCTYPE html>
+<html lang="en">
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>Normalize CSS: UI tests</title>
+<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+<link rel="stylesheet" href="normalize.css">
+<style>
+  /*! suit-test v0.1.0 | MIT License | github.com/suitcss */
+
+  .Test {
+    background: #fff;
+    counter-reset: test-describe;
+  }
+
+  .Test-describe:before {
+    content: counter(test-describe);
+    counter-increment: test-describe;
+  }
+
+  .Test-describe {
+    counter-reset: test-it;
+  }
+
+  .Test-it:before {
+    content: counter(test-describe) "." counter(test-it);
+    counter-increment: test-it;
+  }
+
+  .Test-title {
+    font-size: 2em;
+    font-family: sans-serif;
+    padding: 20px;
+    margin: 20px 0;
+    background: #eee;
+    color: #999;
+  }
+
+  .Test-describe,
+  .Test-it {
+    background: #eee;
+    border-left: 5px solid #666;
+    color: #666;
+    font-family: sans-serif;
+    font-weight: bold;
+    margin: 20px 0;
+    padding: 0.75em 20px;
+  }
+
+  .Test-describe {
+    font-size: 1.5em;
+    margin: 60px 0 20px;
+  }
+
+  .Test-describe:before,
+  .Test-it:before {
+    color: #999;
+    display: inline-block;
+    margin-right: 10px;
+    min-width: 30px;
+    text-transform: uppercase;
+  }
+
+  /* Custom helpers */
+
+  /**
+   * Test whether the body's margin has been removed
+   */
+
+  body {
+    background: red;
+  }
+
+  /**
+   * Highlight the bounds of direct children of a test block
+   */
+
+  .Test-run--highlightEl > * {
+    outline: 1px solid #ADD8E6;
+  }
+</style>
+
+<div class="Test">
+  .
+
+  <h1 class="Test-title"><a href="https://github.com/necolas/normalize.css">Normalize.css</a>: UI tests</h1>
+
+  <h2 class="Test-describe"><code>html</code></h2>
+  <h3 class="Test-it">should have sans-serif font family (opinionated)</h3>
+  <div class="Test-run">
+    abcdefghijklmnopqrstuvwxyz
+  </div>
+
+  <h2 class="Test-describe"><code>body</code></h2>
+  <h3 class="Test-it">should have no margin (opinionated)</h3>
+  <div class="Test-run">
+    (there should be no red background visible on this page)
+  </div>
+
+  <h2 class="Test-describe"><code>article</code>, <code>aside</code>, <code>details</code>, <code>figure</code>, <code>figcaption</code>, <code>footer</code>, <code>header</code>, <code>hgroup</code>, <code>main</code>, <code>nav</code>, <code>section</code>, <code>summary</code></h2>
+  <h3 class="Test-it">should render as block</h3>
+  <div class="Test-run Test-run--highlightEl">
+    <article>article</article>
+    <aside>aside</aside>
+    <details>
+      <summary>summary</summary>
+      details
+    </details>
+    <figure>
+      figure
+      <figcaption>figcaption</figcaption>
+    </figure>
+    <footer>footer</footer>
+    <header>header</header>
+    <hgroup>hgroup</hgroup>
+    <main>main</main>
+    <nav>nav</nav>
+    <section>section</section>
+  </div>
+
+  <h2 class="Test-describe"><code>audio</code>, <code>canvas</code>, <code>progress</code>, <code>video</code></h2>
+  <h3 class="Test-it">should render as inline-block and baseline-aligned</h3>
+  <div class="Test-run Test-run--highlightEl">
+    <audio controls>audio</audio>
+    <canvas>canvas</canvas>
+    <progress>progress</progress>
+    <video controls>video</video>
+  </div>
+
+  <h2 class="Test-describe"><code>audio:not([controls])</code>, <code>template</code>, <code>[hidden]</code></h2>
+  <h3 class="Test-it">should not display</h3>
+  <div class="Test-run Test-run--highlightEl">
+    <audio>audio</audio>
+    <template>
+      <h1>{{title}}</h1>
+      <content></content>
+    </template>
+    <p hidden>This should be hidden</p>
+  </div>
+
+  <h2 class="Test-describe"><code>a</code></h2>
+  <h3 class="Test-it">should have a transparent background when active</h3>
+  <div class="Test-run">
+    <a href="#non">dummy anchor</a>
+  </div>
+  <h3 class="Test-it">should not have a focus outline when both focused and hovered (opinionated)</h3>
+  <div class="Test-run">
+    <a href="#non">dummy anchor</a>
+  </div>
+
+  <h2 class="Test-describe"><code>abbr[title]</code></h2>
+  <h3 class="Test-it">should have a dotted bottom border</h3>
+  <div class="Test-run">
+    <abbr title="abbreviation">abbr</abbr>
+  </div>
+
+  <h2 class="Test-describe"><code>b</code>, <code>strong</code></h2>
+  <h3 class="Test-it">should have bold font-weight</h3>
+  <div class="Test-run">
+    <b>b</b>
+    <strong>strong</strong>
+  </div>
+
+  <h2 class="Test-describe"><code>dfn</code></h2>
+  <h3 class="Test-it">should have italic font-style</h3>
+  <div class="Test-run">
+    <dfn>dfn</dfn>
+  </div>
+
+  <h2 class="Test-describe"><code>h1</code></h2>
+  <h3 class="Test-it">should not change size within an <code>article</code></h3>
+  <div class="Test-run">
+    <h1>Heading (control)</h1>
+    <article>
+      <h1>Heading (in article)</h1>
+    </article>
+  </div>
+  <h3 class="Test-it">should not change size within a <code>section</code></h3>
+  <div class="Test-run">
+    <h1>Heading (control)</h1>
+    <section>
+      <h1>Heading (in section)</h1>
+    </section>
+  </div>
+
+  <h2 class="Test-describe"><code>mark</code></h2>
+  <h3 class="Test-it">should have a yellow background</h3>
+  <div class="Test-run">
+    <mark>mark</mark>
+  </div>
+
+  <h2 class="Test-describe"><code>small</code></h2>
+  <h3 class="Test-it">should render equally small in all browsers</h3>
+  <div class="Test-run">
+    control. <small>small.</small>
+  </div>
+
+  <h2 class="Test-describe"><code>sub</code> and <code>sup</code></h2>
+  <h3 class="Test-it">should not affect a line's visual line-height</h3>
+  <div class="Test-run Test-run--highlightEl">
+    <p>control.</p>
+    <p>control. <sub>sub.</sub></p>
+    <p>control. <sup>sup.</sup></p>
+  </div>
+
+  <h2 class="Test-describe"><code>img</code></h2>
+  <h3 class="Test-it">should not have a border when wrapped in an anchor</h3>
+  <div class="Test-run">
+    <a href="#non">
+      <!-- scaled-up 1px image -->
+      <img style="background-color:#ADD8E6" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" width="100" height="100">
+    </a>
+  </div>
+
+  <h2 class="Test-describe"><code>svg</code></h2>
+  <h3 class="Test-it">should not overflow</h3>
+  <div class="Test-run Test-run--highlightEl">
+    <svg width="100px" height="100px">
+      <circle cx="100" cy="100" r="100" fill="#ADD8E6" />
+    </svg>
+  </div>
+
+  <h2 class="Test-describe"><code>figure</code></h2>
+  <h3 class="Test-it">should have margins</h3>
+  <div class="Test-run" style="outline:1px solid #ADD8E6; overflow:hidden;">
+    <figure>
+      <img style="background-color:#ADD8E6" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" width="400" height="200">
+    </figure>
+  </div>
+
+  <h2 class="Test-describe"><code>hr</code></h2>
+  <h3 class="Test-it">should have a <code>content-box</code> box model</h3>
+  <div class="Test-run" style="">
+    <hr style="height:2px; border:solid #ADD8E6; border-width:2px 0;">
+  </div>
+
+  <h2 class="Test-describe"><code>pre</code></h2>
+  <h3 class="Test-it">should trigger a scrollbar when too wide for its container</h3>
+  <div class="Test-run" style="max-width:300px; outline:1px solid #ADD8E6;">
+    <pre>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et me.</pre>
+  </div>
+
+  <h2 class="Test-describe"><code>code</code>, <code>kbd</code>, <code>pre</code>, <code>samp</code></h2>
+  <h3 class="Test-it">should render <code>em</code>-unit preformatted text at the same absolute size as normal text</h3>
+  <div class="Test-run">
+    <span>span: abcdefghijklmnopqrstuvwxyz.</span><br>
+    <code>code: abcdefghijklmnopqrstuvwxyz.</code><br>
+    <kbd>kbd: abcdefghijklmnopqrstuvwxyz.</kbd><br>
+    <samp>samp: abcdefghijklmnopqrstuvwxyz.</samp>
+    <pre>pre: abcdefghijklmnopqrstuvwxyz.</pre>
+  </div>
+
+  <h2 class="Test-describe"><code>button</code>, <code>input</code>, <code>optgroup</code>, <code>select</code>, <code>textarea</code></h2>
+  <h3 class="Test-it">should inherit <code>color</code> from ancestor</h3>
+  <div class="Test-run" style="color:#ADD8E6;">
+    <button>button</button><br>
+    <input value="input"><br>
+    <select style="border:1px solid #999;">
+      <optgroup label="optgroup">
+        <option>option</option>
+      </optgroup>
+      <option>option</option>
+    </select><br>
+    <textarea>textarea</textarea>
+  </div>
+  <h3 class="Test-it">should inherit <code>font</code> from ancestor</h3>
+  <div class="Test-run" style="font:bold italic 20px/1 serif;">
+    <button>button</button><br>
+    <input value="input"><br>
+    <select style="border:1px solid #999;">
+      <optgroup label="optgroup">
+        <option>option</option>
+      </optgroup>
+      <option>option</option>
+    </select><br>
+    <textarea>textarea</textarea>
+  </div>
+  <h3 class="Test-it">should not have margins</h3>
+  <div class="Test-run" id="form-collection-margins">
+    <style>
+      #form-collection-margins {
+        outline: 1px solid #ADD8E6;
+        overflow: hidden;
+      }
+
+      #form-collection-margins button,
+      #form-collection-margins input,
+      #form-collection-margins select,
+      #form-collection-margins textarea {
+        display: block;
+      }
+    </style>
+    <button>button</button>
+    <input value="input">
+    <select style="border:1px solid #999;">
+      <optgroup label="optgroup">
+        <option>option</option>
+      </optgroup>
+      <option>option</option>
+    </select>
+    <textarea>textarea</textarea>
+  </div>
+
+  <h2 class="Test-describe"><code>button</code></h2>
+  <h3 class="Test-it">should have visible overflow</h3>
+  <div class="Test-run" id="button-overflow">
+    <style>
+      #button-overflow button:after {
+        content: "";
+        background: #ADD8E6;
+        display: inline-block;
+        height: 10px;
+        position:relative;
+        right: -20px;
+        width: 10px;
+      }
+    </style>
+    <button>abcdefghijklmnopqrstuvwxyz</button>
+  </div>
+
+  <h2 class="Test-describe"><code>button</code>, <code>select</code></h2>
+  <h3 class="Test-it">should not inherit <code>text-transform</code></h3>
+  <div class="Test-run" style="text-transform:uppercase">
+    <button>button</button>
+    <select><option>option</option></select>
+  </div>
+
+  <h2 class="Test-describe"><code>button</code> and button-style <code>input</code></h2>
+  <h3 class="Test-it">should have <code>pointer</code> cursor style</h3>
+  <div class="Test-run">
+    <p><button>button</button></p>
+    <p><input type="image" src="http://lorempixel.com/90/24" alt="input (image)"></p>
+    <p><input type="button" value="input (button)"></p>
+    <p><input type="reset" value="input (reset)"></p>
+    <p><input type="submit" value="input (submit)"></p>
+  </div>
+  <h3 class="Test-it">should be styleable</h3>
+  <div class="Test-run" id="button-like-style">
+    <style>
+      #button-like-style button,
+      #button-like-style input {
+        background: #ADD8E6;
+        border: 2px solid black;
+        border-radius: 2px;
+        padding: 5px;
+      }
+    </style>
+    <p><button>button</button></p>
+    <p><input type="image" src="http://lorempixel.com/90/24" alt="input (image)"></p>
+    <p><input type="button" value="input (button)"></p>
+    <p><input type="reset" value="input (reset)"></p>
+    <p><input type="submit" value="input (submit)"></p>
+  </div>
+
+  <h2 class="Test-describe">disabled <code>button</code> and <code>input</code></h2>
+  <h3 class="Test-it">should have <code>default</code> cursor style</h3>
+  <div class="Test-run">
+    <p><button disabled>button</button></p>
+    <p><input disabled type="image" src="http://lorempixel.com/90/24" alt="input (image)"></p>
+    <p><input disabled type="button" value="input (button)"></p>
+    <p><input disabled type="reset" value="input (reset)"></p>
+    <p><input disabled type="submit" value="input (submit)"></p>
+  </div>
+
+  <h2 class="Test-describe"><code>button</code>, <code>input</code></h2>
+  <h3 class="Test-it">should not have extra inner padding in Firefox</h3>
+  <div class="Test-run" id="button-input-padding">
+    <style>
+      #button-input-padding button,
+      #button-input-padding input {
+        border: 0;
+        padding: 0;
+        outline: 1px solid #ADD8E6;
+      }
+    </style>
+    <p><button>button</button></p>
+    <p><input value="input (text)"></p>
+    <p><input type="button" value="input (button)"></p>
+    <p><input type="reset" value="input (reset)"></p>
+    <p><input type="submit" value="input (submit)"></p>
+  </div>
+
+  <h2 class="Test-describe"><code>input</code></h2>
+  <h3 class="Test-it">should not inherit <code>line-height</code></h3>
+  <div class="Test-run" style="line-height:50px">
+    <input value="input (text)">
+  </div>
+
+  <h2 class="Test-describe"><code>input[type="checkbox"]</code>, <code>input[type="radio"]</code></h2>
+  <h3 class="Test-it">should have a <code>border-box</code> box model</h3>
+  <div class="Test-run Test-run--highlightEl" id="radio-box-model">
+    <style>
+      #radio-box-model {
+        width: 200px;
+        border: 1px solid red;
+      }
+
+      #radio-box-model input {
+        width: 100%;
+        border: 5px solid #ADD8E6;
+        display: block;
+        position: relative;
+      }
+    </style>
+    <input type="checkbox">
+    <input type="radio" name="rad">
+  </div>
+  <h3 class="Test-it">should not have padding</h3>
+  <div class="Test-run Test-run--highlightEl">
+    <input type="checkbox">
+    <input type="radio" name="rad">
+  </div>
+
+  <h2 class="Test-describe"><code>input[type="number"]</code></h2>
+  <h3 class="Test-it">should display a default cursor for the decrement button's click target in Chrome</h3>
+  <div class="Test-run">
+    <input style="height:50px; font-size:15px;" type="number" id="in" min="0" max="10" value="5">
+  </div>
+
+  <h2 class="Test-describe"><code>input[type="search"]</code></h2>
+  <h3 class="Test-it">should be styleable</h3>
+  <div class="Test-run">
+    <input type="search" style="border:1px solid #ADD8E6; padding:10px; width:200px;">
+  </div>
+  <h3 class="Test-it">should have a <code>content-box</code> box model</h3>
+  <div class="Test-run">
+    <div style="background:red; display:inline-block; height:62px; width:242px;">
+      <input type="search" style="border:1px solid #ADD8E6; height:20px; padding:20px; width:200px;">
+    </div>
+  </div>
+  <h3 class="Test-it">should not have a cancel button in Safari or Chrome</h3>
+  <div class="Test-run">
+    <input type="search" value="search">
+  </div>
+
+  <h2 class="Test-describe"><code>fieldset</code></h2>
+  <h3 class="Test-it">should have consistent border, padding, and margin</h3>
+  <div class="Test-run">
+    <fieldset>
+      <div style="width:100%; height:100px; background:#ADD8E6;"></div>
+    </fieldset>
+  </div>
+
+  <h2 class="Test-describe"><code>legend</code></h2>
+  <h3 class="Test-it">should inherit color</h3>
+  <div class="Test-run" style="color:#ADD8E6;">
+    <fieldset>
+      <legend>legend</legend>
+    </fieldset>
+  </div>
+  <h3 class="Test-it">should not have padding</h3>
+  <div class="Test-run">
+    <fieldset>
+      <legend>legend</legend>
+    </fieldset>
+  </div>
+
+  <h2 class="Test-describe"><code>textarea</code></h2>
+  <h3 class="Test-it">should not have a scrollbar unless overflowing</h3>
+  <div class="Test-run">
+    <textarea>textarea</textarea>
+  </div>
+
+  <h2 class="Test-describe"><code>table</code></h2>
+  <h3 class="Test-it">should not have spaces between cells</h3>
+  <div class="Test-run">
+    <table>
+      <caption>Jimi Hendrix - albums</caption>
+      <thead>
+        <tr>
+          <th>Album</th>
+          <th>Year</th>
+          <th>Price</th>
+        </tr>
+      </thead>
+      <tfoot>
+        <tr>
+          <th>Album</th>
+          <th>Year</th>
+          <th>Price</th>
+        </tr>
+      </tfoot>
+      <tbody>
+        <tr>
+          <td>Are You Experienced</td>
+          <td>1967</td>
+          <td>$10.00</td>
+        </tr>
+        <tr>
+          <td>Axis: Bold as Love</td>
+          <td>1967</td>
+          <td>$12.00</td>
+        </tr>
+        <tr>
+          <td>Electric Ladyland</td>
+          <td>1968</td>
+          <td>$10.00</td>
+        </tr>
+        <tr>
+          <td>Band of Gypsys</td>
+          <td>1970</td>
+          <td>$12.00</td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+
+</div>
diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml
index 4afb536..f6442f7 100644
--- a/core/config/schema/core.entity.schema.yml
+++ b/core/config/schema/core.entity.schema.yml
@@ -251,7 +251,7 @@ field.formatter.settings.number_decimal:
 
 field.formatter.settings.number_integer:
   type: mapping
-  label: 'Number integer display format settings'
+  label: 'Number interger display format settings'
   mapping:
     thousand_separator:
       type: string
diff --git a/core/core.libraries.yml b/core/core.libraries.yml
index 1a36202..5324b86 100644
--- a/core/core.libraries.yml
+++ b/core/core.libraries.yml
@@ -14,10 +14,11 @@ backbone:
 
 classList:
   remote: https://github.com/eligrey/classList.js
-  version: 2014-12-13
+  # @todo Stable release required for Drupal 8.0.
+  version: master
   license:
     name: Public Domain
-    url: https://github.com/eligrey/classList.js/blob/2014-12-13/LICENSE.md
+    url: https://github.com/eligrey/classList.js/blob/master/LICENSE.md
     gpl-compatible: true
   js:
     assets/vendor/classList/classList.min.js: { weight: -21, browsers: { IE: 'lte IE 9', '!IE': false }, minified: true }
@@ -764,7 +765,7 @@ jquery.ui.tooltip:
 
 jquery.ui.touch-punch:
   remote: https://github.com/furf/jquery-ui-touch-punch
-  version: 0.2.3
+  version: 0.2.2
   license:
     name: GNU-GPL-2.0-or-later
     url: https://github.com/furf/jquery-ui-touch-punch
@@ -812,7 +813,7 @@ modernizr:
 
 normalize:
   remote: https://github.com/necolas/normalize.css
-  version: 3.0.2
+  version: 3.0.1
   license:
     name: MIT
     url: https://github.com/necolas/normalize.css/blob/master/LICENSE.md
diff --git a/core/core.services.yml b/core/core.services.yml
index 73c7873..b3c4ffe 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -823,7 +823,7 @@ services:
     arguments: ['@language_manager', '@config.factory', '@page_cache_request_policy', '@page_cache_response_policy']
   redirect_response_subscriber:
     class: Drupal\Core\EventSubscriber\RedirectResponseSubscriber
-    arguments: ['@url_generator', '@router.request_context']
+    arguments: ['@url_generator']
     tags:
       - { name: event_subscriber }
   request_close_subscriber:
diff --git a/core/includes/pager.inc b/core/includes/pager.inc
index a2483ab..05be5c8 100644
--- a/core/includes/pager.inc
+++ b/core/includes/pager.inc
@@ -304,11 +304,8 @@ function pager_query_add_page(array $query, $element, $index) {
   if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $page)))) {
     $query['page'] = $new_page;
   }
-  // Merge the query parameters passed to this function with the parameters
-  // from the current request. In case of collision, the parameters passed
-  // into this function take precedence.
-  if ($current_request_query = pager_get_query_parameters()) {
-    $query = array_merge($current_request_query, $query);
+  if ($query_pager = pager_get_query_parameters()) {
+    $query = array_merge($query, $query_pager);
   }
   return $query;
 }
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 5f58419..27573e7 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1343,15 +1343,8 @@ function template_preprocess_html(&$variables) {
   // Add a variable for the root path. This can be used to create a class and
   // theme the page depending on the current path (e.g. node, admin, user) as
   // well as more specific data like path-frontpage.
-  $is_front_page =  \Drupal::service('path.matcher')->isFrontPage();
-
-  if ($is_front_page) {
-    $variables['root_path'] = TRUE;
-  }
-  else {
-    $system_path = \Drupal::request()->attributes->get('_system_path');
-    $variables['root_path'] = explode('/', $system_path)[0];
-  }
+  $path = \Drupal::request()->getPathInfo();
+  $variables['root_path'] = explode('/', $path)[1];
 
   $site_config = \Drupal::config('system.site');
   // Construct page title.
@@ -1363,7 +1356,7 @@ function template_preprocess_html(&$variables) {
   }
   // @todo Remove once views is not bypassing the view subscriber anymore.
   //   @see http://drupal.org/node/2068471
-  elseif ($is_front_page) {
+  elseif (drupal_is_front_page()) {
     $head_title = array(
       'title' => t('Home'),
       'name' => String::checkPlain($site_config->get('name')),
diff --git a/core/lib/Drupal/Component/ProxyBuilder/ProxyBuilder.php b/core/lib/Drupal/Component/ProxyBuilder/ProxyBuilder.php
index 373a779..f2e25c5 100644
--- a/core/lib/Drupal/Component/ProxyBuilder/ProxyBuilder.php
+++ b/core/lib/Drupal/Component/ProxyBuilder/ProxyBuilder.php
@@ -48,28 +48,11 @@ public function build($class_name) {
 EOS;
     $class_start = 'class {{ proxy_class_name }}';
 
-    // For cases in which the implemented interface is a child of another
-    // interface, getInterfaceNames() also returns the parent. This causes a
-    // PHP error.
-    // In order to avoid that, check for each interface, whether one of its
-    // parents is also in the list and exclude it.
-    if ($interfaces = $reflection->getInterfaces()) {
-      foreach ($interfaces as $interface_name => $interface) {
-        // Exclude all parents from the list of implemented interfaces of the
-        // class.
-        if ($parent_interfaces = $interface->getInterfaceNames()) {
-          foreach ($parent_interfaces as $parent_interface) {
-            if (isset($interfaces[$parent_interface])) {}
-            unset($interfaces[$parent_interface]);
-          }
-        }
+    if ($interfaces = $reflection->getInterfaceNames()) {
+      foreach ($interfaces as &$interface) {
+        $interface = '\\' . $interface;
       }
-
-      $interface_names = [];
-      foreach ($interfaces as $interface) {
-        $interface_names[] = '\\' . $interface->getName();
-      }
-      $class_start .= ' implements ' . implode(', ', $interface_names);
+      $class_start .= ' implements ' . implode(', ', $interfaces);
     }
 
     $output .= $this->buildUseStatements();
@@ -119,7 +102,7 @@ public function build($class_name) {
     $output .= implode("\n", $methods);
 
     // Indent the output.
-    $output = implode("\n", array_map(function ($value) {
+    $output = implode("\n", array_map(function($value) {
       if ($value === '') {
         return $value;
       }
@@ -191,7 +174,7 @@ protected function buildMethod(\ReflectionMethod $reflection_method) {
 
     $output .= $this->buildMethodBody($reflection_method);
 
-    $output .= "\n" . '}';
+    $output .= "\n". '}';
     return $output;
   }
 
diff --git a/core/lib/Drupal/Component/ProxyBuilder/ProxyDumper.php b/core/lib/Drupal/Component/ProxyBuilder/ProxyDumper.php
index 7126062..99eae59 100644
--- a/core/lib/Drupal/Component/ProxyBuilder/ProxyDumper.php
+++ b/core/lib/Drupal/Component/ProxyBuilder/ProxyDumper.php
@@ -16,13 +16,6 @@
 class ProxyDumper implements DumperInterface {
 
   /**
-   * Keeps track of already existing proxy classes.
-   *
-   * @var array
-   */
-  protected $buildClasses = [];
-
-  /**
    * The proxy builder.
    *
    * @var \Drupal\Component\ProxyBuilder\ProxyBuilder
@@ -63,16 +56,7 @@ public function getProxyFactoryCode(Definition $definition, $id) {
    * {@inheritdoc}
    */
   public function getProxyCode(Definition $definition) {
-    // Maybe the same class is used in different services, which are both marked
-    // as lazy (just think about 2 database connections).
-    // In those cases we should not generate proxy code the second time.
-    if (!isset($this->buildClasses[$definition->getClass()])) {
-      $this->buildClasses[$definition->getClass()] = TRUE;
-      return $this->builder->build($definition->getClass());
-    }
-    else {
-      return '';
-    }
+    return $this->builder->build($definition->getClass());
   }
 
 }
diff --git a/core/lib/Drupal/Core/Config/ConfigInstaller.php b/core/lib/Drupal/Core/Config/ConfigInstaller.php
index c02a132..72ae554 100644
--- a/core/lib/Drupal/Core/Config/ConfigInstaller.php
+++ b/core/lib/Drupal/Core/Config/ConfigInstaller.php
@@ -22,11 +22,11 @@ class ConfigInstaller implements ConfigInstallerInterface {
   protected $configFactory;
 
   /**
-   * The active configuration storages, keyed by collection.
+   * The active configuration storage.
    *
-   * @var \Drupal\Core\Config\StorageInterface[]
+   * @var \Drupal\Core\Config\StorageInterface
    */
-  protected $activeStorages;
+  protected $activeStorage;
 
   /**
    * The typed configuration manager.
@@ -79,7 +79,7 @@ class ConfigInstaller implements ConfigInstallerInterface {
    */
   public function __construct(ConfigFactoryInterface $config_factory, StorageInterface $active_storage, TypedConfigManagerInterface $typed_config, ConfigManagerInterface $config_manager, EventDispatcherInterface $event_dispatcher) {
     $this->configFactory = $config_factory;
-    $this->activeStorages[$active_storage->getCollectionName()] = $active_storage;
+    $this->activeStorage = $active_storage;
     $this->typedConfig = $typed_config;
     $this->configManager = $config_manager;
     $this->eventDispatcher = $event_dispatcher;
@@ -119,7 +119,7 @@ public function installDefaultConfig($type, $name) {
     $enabled_extensions[] = 'core';
 
     foreach ($collection_info->getCollectionNames(TRUE) as $collection) {
-      $config_to_install = $this->listDefaultConfigToInstall($type, $name, $collection, $enabled_extensions);
+      $config_to_install = $this->listDefaultConfigCollection($collection, $type, $name, $enabled_extensions);
       if (!empty($config_to_install)) {
         $this->createConfiguration($collection, $config_to_install);
       }
@@ -130,25 +130,21 @@ public function installDefaultConfig($type, $name) {
   }
 
   /**
-   * Lists default configuration for an extension that is available to install.
-   *
-   * This looks in the extension's config/install directory and all of the
-   * currently enabled extensions config/install directories for configuration
-   * that begins with the extension's name.
+   * Installs default configuration for a particular collection.
    *
+   * @param string $collection
+   *  The configuration collection to install.
    * @param string $type
    *   The extension type; e.g., 'module' or 'theme'.
    * @param string $name
    *   The name of the module or theme to install default configuration for.
-   * @param string $collection
-   *  The configuration collection to install.
    * @param array $enabled_extensions
    *   A list of all the currently enabled modules and themes.
    *
    * @return array
    *   The list of configuration objects to create.
    */
-  protected function listDefaultConfigToInstall($type, $name, $collection, array $enabled_extensions) {
+  protected function listDefaultConfigCollection($collection, $type, $name, array $enabled_extensions) {
     // Get all default configuration owned by this extension.
     $source_storage = $this->getSourceStorage($collection);
     $config_to_install = $source_storage->listAll($name . '.');
@@ -159,17 +155,16 @@ protected function listDefaultConfigToInstall($type, $name, $collection, array $
     $extension_path = drupal_get_path($type, $name);
     if ($type !== 'core' && is_dir($extension_path . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY)) {
       $default_storage = new FileStorage($extension_path . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection);
-      $extension_provided_config = array_filter($default_storage->listAll(), function ($config_name) use ($config_to_install, $enabled_extensions) {
-        // Ensure that we have not already discovered the config to install.
-        if (in_array($config_name, $config_to_install)) {
-          return FALSE;
-        }
-        // Ensure the configuration is provided by an enabled module.
+      $other_module_config = array_filter($default_storage->listAll(), function ($value) use ($name) {
+        return !preg_match('/^' . $name . '\./', $value);
+      });
+
+      $other_module_config = array_filter($other_module_config, function ($config_name) use ($enabled_extensions) {
         $provider = Unicode::substr($config_name, 0, strpos($config_name, '.'));
         return in_array($provider, $enabled_extensions);
       });
 
-      $config_to_install = array_merge($config_to_install, $extension_provided_config);
+      $config_to_install = array_merge($config_to_install, $other_module_config);
     }
 
     return $config_to_install;
@@ -195,7 +190,7 @@ protected function createConfiguration($collection, array $config_to_install) {
     }
 
     // Remove configuration that already exists in the active storage.
-    $config_to_install = array_diff($config_to_install, $this->getActiveStorages($collection)->listAll());
+    $config_to_install = array_diff($config_to_install, $this->getActiveStorage($collection)->listAll());
 
     foreach ($config_to_install as $name) {
       // Allow config factory overriders to use a custom configuration object if
@@ -205,7 +200,7 @@ protected function createConfiguration($collection, array $config_to_install) {
         $new_config = $overrider->createConfigObject($name, $collection);
       }
       else {
-        $new_config = new Config($name, $this->getActiveStorages($collection), $this->eventDispatcher, $this->typedConfig);
+        $new_config = new Config($name, $this->getActiveStorage($collection), $this->eventDispatcher, $this->typedConfig);
       }
       if ($data[$name] !== FALSE) {
         $new_config->setData($data[$name]);
@@ -226,7 +221,7 @@ protected function createConfiguration($collection, array $config_to_install) {
           ->getStorage($entity_type);
         // It is possible that secondary writes can occur during configuration
         // creation. Updates of such configuration are allowed.
-        if ($this->getActiveStorages($collection)->exists($name)) {
+        if ($this->getActiveStorage($collection)->exists($name)) {
           $id = $entity_storage->getIDFromConfigName($name, $entity_storage->getEntityType()->getConfigPrefix());
           $entity = $entity_storage->load($id);
           $entity = $entity_storage->updateFromStorageRecord($entity, $new_config->get());
@@ -295,7 +290,7 @@ public function getSourceStorage($collection = StorageInterface::DEFAULT_COLLECT
       // Default to using the ExtensionInstallStorage which searches extension's
       // config directories for default configuration. Only include the profile
       // configuration during Drupal installation.
-      $this->sourceStorage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection, drupal_installation_attempted());
+      $this->sourceStorage = new ExtensionInstallStorage($this->activeStorage, InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection, drupal_installation_attempted());
     }
     if ($this->sourceStorage->getCollectionName() != $collection) {
       $this->sourceStorage = $this->sourceStorage->createCollection($collection);
@@ -313,11 +308,11 @@ public function getSourceStorage($collection = StorageInterface::DEFAULT_COLLECT
    * @return \Drupal\Core\Config\StorageInterface
    *   The configuration storage that provides the default configuration.
    */
-  protected function getActiveStorages($collection = StorageInterface::DEFAULT_COLLECTION) {
-    if (!isset($this->activeStorages[$collection])) {
-      $this->activeStorages[$collection] = reset($this->activeStorages)->createCollection($collection);
+  protected function getActiveStorage($collection = StorageInterface::DEFAULT_COLLECTION) {
+    if ($this->activeStorage->getCollectionName() != $collection) {
+      $this->activeStorage = $this->activeStorage->createCollection($collection);
     }
-    return $this->activeStorages[$collection];
+    return $this->activeStorage;
   }
 
   /**
@@ -334,31 +329,4 @@ public function setSyncing($status) {
   public function isSyncing() {
     return $this->isSyncing;
   }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function findPreExistingConfiguration($type, $name) {
-    $existing_configuration = array();
-    // Gather information about all the supported collections.
-    $collection_info = $this->configManager->getConfigCollectionInfo();
-
-    // Read enabled extensions directly from configuration to avoid circular
-    // dependencies on ModuleHandler and ThemeHandler.
-    $extension_config = $this->configFactory->get('core.extension');
-    $enabled_extensions = array_keys((array) $extension_config->get('module'));
-    $enabled_extensions += array_keys((array) $extension_config->get('theme'));
-    // Add the extension that will be enabled to the list of enabled extensions.
-    $enabled_extensions[] = $name;
-    foreach ($collection_info->getCollectionNames(TRUE) as $collection) {
-      $config_to_install = $this->listDefaultConfigToInstall($type, $name, $collection, $enabled_extensions);
-      $active_storage = $this->getActiveStorages($collection);
-      foreach ($config_to_install as $config_name) {
-        if ($active_storage->exists($config_name)) {
-          $existing_configuration[$collection][] = $config_name;
-        }
-      }
-    }
-    return $existing_configuration;
-  }
 }
diff --git a/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php b/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php
index 1d1e7e0..13e5b0e 100644
--- a/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php
+++ b/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php
@@ -84,26 +84,4 @@ public function setSyncing($status);
    */
   public function isSyncing();
 
-  /**
-   * Finds pre-existing configuration objects for the provided extension.
-   *
-   * Extensions can not be installed if configuration objects exist in the
-   * active storage with the same names. This can happen in a number of ways,
-   * commonly:
-   * - if a user has created configuration with the same name as that provided
-   *   by the extension.
-   * - if the extension provides default configuration that does not depend on
-   *   it and the extension has been uninstalled and is about to the
-   *   reinstalled.
-   *
-   * @param string $type
-   *   Type of extension to install.
-   * @param string $name
-   *   Name of extension to install.
-   *
-   * @return array
-   *   Array of configuration objects that already exist keyed by collection.
-   */
-  public function findPreExistingConfiguration($type, $name);
-
 }
diff --git a/core/lib/Drupal/Core/Config/ConfigManager.php b/core/lib/Drupal/Core/Config/ConfigManager.php
index e3fcaf8..da0fa98 100644
--- a/core/lib/Drupal/Core/Config/ConfigManager.php
+++ b/core/lib/Drupal/Core/Config/ConfigManager.php
@@ -110,19 +110,6 @@ public function getEntityTypeIdByName($name) {
   /**
    * {@inheritdoc}
    */
-  public function loadConfigEntityByName($name) {
-    $entity_type_id = $this->getEntityTypeIdByName($name);
-    if ($entity_type_id) {
-      $entity_type = $this->entityManager->getDefinition($entity_type_id);
-      $id = substr($name, strlen($entity_type->getConfigPrefix()) + 1);
-      return $this->entityManager->getStorage($entity_type_id)->load($id);
-    }
-    return NULL;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getEntityManager() {
     return $this->entityManager;
   }
diff --git a/core/lib/Drupal/Core/Config/ConfigManagerInterface.php b/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
index 79f4a7e..c5fdec1 100644
--- a/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
+++ b/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
@@ -24,17 +24,6 @@
   public function getEntityTypeIdByName($name);
 
   /**
-   * Loads a configuration entity using the configuration name.
-   *
-   * @param string $name
-   *   The configuration object name.
-   *
-   * @return \Drupal\Core\Entity\EntityInterface|null
-   *   The configuration entity or NULL if it does not exist.
-   */
-  public function loadConfigEntityByName($name);
-
-  /**
    * Gets the entity manager.
    *
    * @return \Drupal\Core\Entity\EntityManagerInterface
diff --git a/core/lib/Drupal/Core/Config/PreExistingConfigException.php b/core/lib/Drupal/Core/Config/PreExistingConfigException.php
deleted file mode 100644
index 8fe8a6a..0000000
--- a/core/lib/Drupal/Core/Config/PreExistingConfigException.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Config\PreExistingConfigException.
- */
-
-namespace Drupal\Core\Config;
-
-use Drupal\Component\Utility\String;
-
-/**
- * An exception thrown if configuration with the same name already exists.
- */
-class PreExistingConfigException extends ConfigException {
-
-  /**
-   * A list of configuration objects that already exist in active configuration.
-   *
-   * @var array
-   */
-  protected $configObjects = [];
-
-  /**
-   * The name of the module that is being installed.
-   *
-   * @var string
-   */
-  protected $extension;
-
-  /**
-   * Gets the list of configuration objects that already exist.
-   *
-   * @return array
-   *   A list of configuration objects that already exist in active
-   *   configuration keyed by collection.
-   */
-  public function getConfigObjects() {
-    return $this->configObjects;
-  }
-
-  /**
-   * Gets the name of the extension that is being installed.
-   *
-   * @return string
-   *   The name of the extension that is being installed.
-   */
-  public function getExtension() {
-    return $this->extension;
-  }
-
-  /**
-   * Creates an exception for an extension and a list of configuration objects.
-   *
-   * @param $extension
-   *   The name of the extension that is being installed.
-   * @param array $config_objects
-   *   A list of configuration objects that already exist in active
-   *   configuration, keyed by config collection.
-   *
-   * @return \Drupal\Core\Config\PreExistingConfigException
-   */
-  public static function create($extension, array $config_objects) {
-    $message = String::format('Configuration objects (@config_names) provided by @extension already exist in active configuration',
-      array(
-        '@config_names' => implode(', ', static::flattenConfigObjects($config_objects)),
-        '@extension' => $extension
-      )
-    );
-    $e = new static($message);
-    $e->configObjects = $config_objects;
-    $e->extension = $extension;
-    return $e;
-  }
-
-  /**
-   * Flattens the config object array to a single dimensional list.
-   *
-   * @param array $config_objects
-   *   A list of configuration objects that already exist in active
-   *   configuration, keyed by config collection.
-   *
-   * @return array
-   *   A list of configuration objects that have been prefixed with their
-   *   collection.
-   */
-  public static function flattenConfigObjects(array $config_objects) {
-    $flat_config_objects = array();
-    foreach ($config_objects as $collection => $config_names) {
-      $config_names = array_map(function ($config_name) use ($collection) {
-        if ($collection != StorageInterface::DEFAULT_COLLECTION) {
-          $config_name = str_replace('.', DIRECTORY_SEPARATOR, $collection) . DIRECTORY_SEPARATOR . $config_name;
-        }
-        return $config_name;
-      }, $config_names);
-      $flat_config_objects = array_merge($flat_config_objects, $config_names);
-    }
-    return $flat_config_objects;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
index bcab538..c67fbf5 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
@@ -8,7 +8,6 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Component\Utility\UrlHelper;
-use Drupal\Core\Routing\RequestContext;
 use Drupal\Core\Routing\UrlGeneratorInterface;
 use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
@@ -33,12 +32,9 @@ class RedirectResponseSubscriber implements EventSubscriberInterface {
    *
    * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
    *   The url generator service.
-   * @param \Drupal\Core\Routing\RequestContext $request_context
-   *   The request context.
    */
-  public function __construct(UrlGeneratorInterface $url_generator, RequestContext $request_context) {
+  public function __construct(UrlGeneratorInterface $url_generator) {
     $this->urlGenerator = $url_generator;
-    $this->requestContext = $request_context;
   }
 
   /**
@@ -59,21 +55,16 @@ public function checkRedirectUrl(FilterResponseEvent $event) {
       // the following exception:
       // - Absolute URLs that point to this site (i.e. same base URL and
       //   base path) are allowed.
-      if ($destination) {
-        if (!UrlHelper::isExternal($destination)) {
-          $destination = UrlHelper::parse($destination);
+      if ($destination && (!UrlHelper::isExternal($destination) || UrlHelper::externalIsLocal($destination, $GLOBALS['base_url']))) {
+        $destination = UrlHelper::parse($destination);
 
-          $path = $destination['path'];
-          $options['query'] = $destination['query'];
-          $options['fragment'] = $destination['fragment'];
-          // The 'Location' HTTP header contain an absolute URL.
-          $options['absolute'] = TRUE;
+        $path = $destination['path'];
+        $options['query'] = $destination['query'];
+        $options['fragment'] = $destination['fragment'];
+        // The 'Location' HTTP header must always be absolute.
+        $options['absolute'] = TRUE;
 
-          $response->setTargetUrl($this->urlGenerator->generateFromPath($path, $options));
-        }
-        elseif (UrlHelper::externalIsLocal($destination, $this->requestContext->getCompleteBaseUrl())) {
-          $response->setTargetUrl($destination);
-        }
+        $response->setTargetUrl($this->urlGenerator->generateFromPath($path, $options));
       }
     }
   }
diff --git a/core/lib/Drupal/Core/Extension/ModuleInstaller.php b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
index dba7a94..6cb8363 100644
--- a/core/lib/Drupal/Core/Extension/ModuleInstaller.php
+++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
@@ -10,8 +10,6 @@
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
-use Drupal\Core\Config\PreExistingConfigException;
-use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\DrupalKernelInterface;
 use Drupal\Component\Utility\String;
 
@@ -151,18 +149,6 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
           )));
         }
 
-        // Install profiles can not have config clashes. Configuration that
-        // has the same name as a module's configuration will be used instead.
-        if ($module != drupal_get_profile()) {
-          // Validate default configuration of this module. Bail if unable to
-          // install. Should not continue installing more modules because those
-          // may depend on this one.
-          $existing_configuration = $config_installer->findPreExistingConfiguration('module', $module);
-          if (!empty($existing_configuration)) {
-            throw PreExistingConfigException::create($module, $existing_configuration);
-          }
-        }
-
         $extension_config
           ->set("module.$module", 0)
           ->set('module', module_config_sort($extension_config->get('module')))
diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index d21e256..2f0fd94 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -13,7 +13,6 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Config\ConfigInstallerInterface;
 use Drupal\Core\Config\ConfigManagerInterface;
-use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Routing\RouteBuilderIndicatorInterface;
 use Drupal\Core\State\StateInterface;
 use Psr\Log\LoggerInterface;
@@ -256,13 +255,6 @@ public function install(array $theme_list, $install_dependencies = TRUE) {
         )));
       }
 
-      // Validate default configuration of the theme. If there is existing
-      // configuration then stop installing.
-      $existing_configuration = $this->configInstaller->findPreExistingConfiguration('theme', $key);
-      if (!empty($existing_configuration)) {
-        throw PreExistingConfigException::create($key, $existing_configuration);
-      }
-
       // The value is not used; the weight is ignored for themes currently.
       $extension_config
         ->set("theme.$key", 0)
diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index f1845ae..7702496 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -10,7 +10,7 @@
 /**
  * An object containing the information for an interface language.
  *
- * @see \Drupal\Core\Language\LanguageManager::getLanguage()
+ * @see language_default()
  */
 class Language implements LanguageInterface {
 
diff --git a/core/lib/Drupal/Core/Mail/MailManagerInterface.php b/core/lib/Drupal/Core/Mail/MailManagerInterface.php
index 5cb446a..78ae865 100644
--- a/core/lib/Drupal/Core/Mail/MailManagerInterface.php
+++ b/core/lib/Drupal/Core/Mail/MailManagerInterface.php
@@ -31,11 +31,10 @@
    * user_preferred_langcode(). If you send email based on form values filled on
    * the page, there are two additional choices if you are not sending the email
    * to a user on the site. You can either use the language used to generate the
-   * page or the site default language. See
-   * Drupal\Core\Language\LanguageManagerInterface::getDefaultLanguage(). The
-   * former is good if sending email to the person filling the form, the later
-   * is good if you send email to an address previously set up (like contact
-   * addresses in a contact form).
+   * page or the site default language. See language_default(). The former is
+   * good if sending email to the person filling the form, the later is good if
+   * you send email to an address previously set up (like contact addresses in a
+   * contact form).
    *
    * Taking care of always using the proper language is even more important when
    * sending emails in a row to multiple users. Hook_mail() abstracts whether
diff --git a/core/lib/Drupal/Core/Routing/RequestContext.php b/core/lib/Drupal/Core/Routing/RequestContext.php
index 2953251..2b2df99 100644
--- a/core/lib/Drupal/Core/Routing/RequestContext.php
+++ b/core/lib/Drupal/Core/Routing/RequestContext.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\Core\Routing;
 
-use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\Routing\RequestContext as SymfonyRequestContext;
 
@@ -20,53 +19,12 @@
 class RequestContext extends SymfonyRequestContext {
 
   /**
-   * The scheme, host and base path, for example "http://example.com/d8".
-   *
-   * @var string
-   */
-  protected $completeBaseUrl;
-
-  /**
    * Populates the context from the current request from the request stack.
    *
    * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
-   *   The current request stack.
    */
   public function fromRequestStack(RequestStack $request_stack) {
     $this->fromRequest($request_stack->getCurrentRequest());
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function fromRequest(Request $request) {
-    parent::fromRequest($request);
-
-    // @todo Extract the code in DrupalKernel::initializeRequestGlobals.
-    //   See https://www.drupal.org/node/2404601
-    if (isset($GLOBALS['base_url'])) {
-      $this->setCompleteBaseUrl($GLOBALS['base_url']);
-    }
-  }
-
-  /**
-   * Gets the scheme, host and base path.
-   *
-   * For example, in an installation in a subdirectory "d8", it should be
-   * "https://example.com/d8".
-   */
-  public function getCompleteBaseUrl() {
-    return $this->completeBaseUrl;
-  }
-
-  /**
-   * Sets the complete base URL for the Request context.
-   *
-   * @param string $complete_base_url
-   *   The complete base URL.
-   */
-  public function setCompleteBaseUrl($complete_base_url) {
-    $this->completeBaseUrl = $complete_base_url;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Session/UserSession.php b/core/lib/Drupal/Core/Session/UserSession.php
index 6af360d..92629d5 100644
--- a/core/lib/Drupal/Core/Session/UserSession.php
+++ b/core/lib/Drupal/Core/Session/UserSession.php
@@ -188,7 +188,7 @@ function getPreferredLangcode($fallback_to_default = TRUE) {
       return $language_list[$this->preferred_langcode]->getId();
     }
     else {
-      return $fallback_to_default ? \Drupal::languageManager()->getDefaultLanguage()->getId() : '';
+      return $fallback_to_default ? language_default()->getId() : '';
     }
   }
 
@@ -201,7 +201,7 @@ function getPreferredAdminLangcode($fallback_to_default = TRUE) {
       return $language_list[$this->preferred_admin_langcode]->getId();
     }
     else {
-      return $fallback_to_default ? \Drupal::languageManager()->getDefaultLanguage()->getId() : '';
+      return $fallback_to_default ? language_default()->getId() : '';
     }
   }
 
diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php
index 0c1ee37..eb2306a 100644
--- a/core/lib/Drupal/Core/Template/TwigExtension.php
+++ b/core/lib/Drupal/Core/Template/TwigExtension.php
@@ -109,7 +109,7 @@ public function getFilters() {
 
       // CSS class and ID filters.
       new \Twig_SimpleFilter('clean_class', '\Drupal\Component\Utility\Html::getClass'),
-      new \Twig_SimpleFilter('clean_id', '\Drupal\Component\Utility\Html::getId'),
+      new \Twig_SimpleFilter('clean_id', 'drupal_clean_id_identifier'),
     );
   }
 
diff --git a/core/lib/Drupal/Core/TypedData/Plugin/DataType/Language.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Language.php
index 273d264..aa25cc6 100644
--- a/core/lib/Drupal/Core/TypedData/Plugin/DataType/Language.php
+++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Language.php
@@ -43,7 +43,7 @@ class Language extends TypedData {
    */
   public function getValue() {
     if (!isset($this->language) && $this->id) {
-      $this->language = \Drupal::languageManager()->getLanguage($this->id);
+      $this->language = language_load($this->id);
     }
     return $this->language;
   }
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/UniqueFieldValueValidator.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/UniqueFieldValueValidator.php
deleted file mode 100644
index 54ace9e..0000000
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/UniqueFieldValueValidator.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Validation\Plugin\Validation\Constraint\UniqueFieldValueValidator.
- */
-
-namespace Drupal\Core\Validation\Plugin\Validation\Constraint;
-
-use Symfony\Component\Validator\Constraint;
-use Symfony\Component\Validator\ConstraintValidator;
-
-/**
- * Validates that a field is unique for the given entity type.
- */
-class UniqueFieldValueValidator extends ConstraintValidator {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validate($items, Constraint $constraint) {
-    if (!isset($items)) {
-      return;
-    }
-    $field_name = $items->getFieldDefinition()->getName();
-    /** @var \Drupal\Core\Entity\EntityInterface $entity */
-    $entity = $items->getEntity();
-    $entity_type_id = $entity->getEntityTypeId();
-    $id_key = $entity->getEntityType()->getKey('id');
-
-    $value_taken = (bool) \Drupal::entityQuery($entity_type_id)
-      // The id could be NULL, so we cast it to 0 in that case.
-      ->condition($id_key, (int) $items->getEntity()->id(), '<>')
-      ->condition($field_name, db_like($items->first()->value), 'LIKE')
-      ->range(0, 1)
-      ->count()
-      ->execute();
-
-    if ($value_taken) {
-      $this->context->addViolation($constraint->message, array("%value" => $items->value));
-    }
-  }
-}
diff --git a/core/modules/action/src/Plugin/Action/EmailAction.php b/core/modules/action/src/Plugin/Action/EmailAction.php
index ae9bd00..d93152d 100644
--- a/core/modules/action/src/Plugin/Action/EmailAction.php
+++ b/core/modules/action/src/Plugin/Action/EmailAction.php
@@ -11,7 +11,6 @@
 use Drupal\Core\Action\ConfigurableActionBase;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Mail\MailManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -58,12 +57,6 @@ class EmailAction extends ConfigurableActionBase implements ContainerFactoryPlug
    */
   protected $mailManager;
 
-  /** The language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface
-   */
-  protected $languageManager;
-
   /**
    * Constructs a EmailAction object.
    *
@@ -81,17 +74,14 @@ class EmailAction extends ConfigurableActionBase implements ContainerFactoryPlug
    *   A logger instance.
    * @param \Drupal\Core\Mail\MailManagerInterface
    *   The mail manager.
-   * @param \Drupal\Core\Language\LanguageManagerInterface
-   *   The language manager.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, Token $token, EntityManagerInterface $entity_manager, LoggerInterface $logger, MailManagerInterface $mail_manager, LanguageManagerInterface $language_manager) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, Token $token, EntityManagerInterface $entity_manager, LoggerInterface $logger, MailManagerInterface $mail_manager) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->token = $token;
     $this->storage = $entity_manager->getStorage('user');
     $this->logger = $logger;
     $this->mailManager = $mail_manager;
-    $this->languageManager = $language_manager;
   }
 
   /**
@@ -102,8 +92,7 @@ public static function create(ContainerInterface $container, array $configuratio
       $container->get('token'),
       $container->get('entity.manager'),
       $container->get('logger.factory')->get('action'),
-      $container->get('plugin.manager.mail'),
-      $container->get('language_manager')
+      $container->get('plugin.manager.mail')
     );
   }
 
@@ -126,7 +115,7 @@ public function execute($entity = NULL) {
       $langcode = $recipient_account->getPreferredLangcode();
     }
     else {
-      $langcode = $this->languageManager->getDefaultLanguage()->getId();
+      $langcode = language_default()->getId();
     }
     $params = array('context' => $this->configuration);
 
diff --git a/core/modules/aggregator/src/Entity/Feed.php b/core/modules/aggregator/src/Entity/Feed.php
index 6f3d2e2..7f0c287 100644
--- a/core/modules/aggregator/src/Entity/Feed.php
+++ b/core/modules/aggregator/src/Entity/Feed.php
@@ -150,8 +150,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'type' => 'string_textfield',
         'weight' => -5,
       ))
-      ->setDisplayConfigurable('form', TRUE)
-      ->addConstraint('FeedTitle', []);
+      ->setDisplayConfigurable('form', TRUE);
 
     $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
@@ -172,8 +171,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'type' => 'uri',
         'weight' => -3,
       ))
-      ->setDisplayConfigurable('form', TRUE)
-      ->addConstraint('FeedUrl', []);
+      ->setDisplayConfigurable('form', TRUE);
 
     $intervals = array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200);
     $period = array_map(array(\Drupal::service('date.formatter'), 'formatInterval'), array_combine($intervals, $intervals));
diff --git a/core/modules/aggregator/src/FeedForm.php b/core/modules/aggregator/src/FeedForm.php
index 35359ce..d84c11e 100644
--- a/core/modules/aggregator/src/FeedForm.php
+++ b/core/modules/aggregator/src/FeedForm.php
@@ -32,6 +32,25 @@ public function form(array $form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
+  public function validate(array $form, FormStateInterface $form_state) {
+    $feed = $this->buildEntity($form, $form_state);
+    // Check for duplicate titles.
+    $feed_storage = $this->entityManager->getStorage('aggregator_feed');
+    $result = $feed_storage->getFeedDuplicates($feed);
+    foreach ($result as $item) {
+      if (strcasecmp($item->label(), $feed->label()) == 0) {
+        $form_state->setErrorByName('title', $this->t('A feed named %feed already exists. Enter a unique title.', array('%feed' => $feed->label())));
+      }
+      if (strcasecmp($item->getUrl(), $feed->getUrl()) == 0) {
+        $form_state->setErrorByName('url', $this->t('A feed with this URL %url already exists. Enter a unique URL.', array('%url' => $feed->getUrl())));
+      }
+    }
+    parent::validate($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function save(array $form, FormStateInterface $form_state) {
     $feed = $this->entity;
     $insert = (bool) $feed->id();
diff --git a/core/modules/aggregator/src/Plugin/Validation/Constraint/FeedTitleConstraint.php b/core/modules/aggregator/src/Plugin/Validation/Constraint/FeedTitleConstraint.php
deleted file mode 100644
index 47d16ac..0000000
--- a/core/modules/aggregator/src/Plugin/Validation/Constraint/FeedTitleConstraint.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\aggregator\Plugin\Validation\Constraint\FeedTitleConstraint.
- */
-
-namespace Drupal\aggregator\Plugin\Validation\Constraint;
-
-use Symfony\Component\Validator\Constraint;
-
-/**
- * Supports validating feed titles.
- *
- * @Plugin(
- *   id = "FeedTitle",
- *   label = @Translation("Feed title", context = "Validation")
- * )
- */
-class FeedTitleConstraint extends Constraint {
-
-  public $message = 'A feed named %value already exists. Enter a unique title.';
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validatedBy() {
-    return '\Drupal\Core\Validation\Plugin\Validation\Constraint\UniqueFieldValueValidator';
-  }
-
-}
diff --git a/core/modules/aggregator/src/Plugin/Validation/Constraint/FeedUrlConstraint.php b/core/modules/aggregator/src/Plugin/Validation/Constraint/FeedUrlConstraint.php
deleted file mode 100644
index 0e2ce1d..0000000
--- a/core/modules/aggregator/src/Plugin/Validation/Constraint/FeedUrlConstraint.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\aggregator\Plugin\Validation\Constraint\FeedUrlConstraint.
- */
-
-namespace Drupal\aggregator\Plugin\Validation\Constraint;
-
-use Symfony\Component\Validator\Constraint;
-
-/**
- * Supports validating feed URLs.
- *
- * @Plugin(
- *   id = "FeedUrl",
- *   label = @Translation("Feed URL", context = "Validation")
- * )
- */
-class FeedUrlConstraint extends Constraint {
-
-  public $message = 'A feed with this URL %value already exists. Enter a unique URL.';
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validatedBy() {
-    return '\Drupal\Core\Validation\Plugin\Validation\Constraint\UniqueFieldValueValidator';
-  }
-
-}
diff --git a/core/modules/aggregator/src/Tests/AddFeedTest.php b/core/modules/aggregator/src/Tests/AddFeedTest.php
index 135ed18..bbeae85 100644
--- a/core/modules/aggregator/src/Tests/AddFeedTest.php
+++ b/core/modules/aggregator/src/Tests/AddFeedTest.php
@@ -30,16 +30,6 @@ function testAddFeed() {
     $this->assertText($feed->label(), 'Page title');
     $this->assertRaw($feed->getWebsiteUrl());
 
-    // Try to add a duplicate.
-    $edit = [
-      'title[0][value]' => $feed->label(),
-      'url[0][value]' => $feed->getUrl(),
-      'refresh' => '900',
-    ];
-    $this->drupalPostForm('aggregator/sources/add', $edit, t('Save'));
-    $this->assertRaw(t('A feed named %feed already exists. Enter a unique title.', array('%feed' => $feed->label())));
-    $this->assertRaw(t('A feed with this URL %url already exists. Enter a unique URL.', array('%url' => $feed->getUrl())));
-
     // Delete feed.
     $this->deleteFeed($feed);
   }
diff --git a/core/modules/aggregator/src/Tests/FeedValidationTest.php b/core/modules/aggregator/src/Tests/FeedValidationTest.php
deleted file mode 100644
index 83c01d0..0000000
--- a/core/modules/aggregator/src/Tests/FeedValidationTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\aggregator\Tests\FeedValidationTest.
- */
-
-namespace Drupal\aggregator\Tests;
-
-use Drupal\aggregator\Entity\Feed;
-use Drupal\system\Tests\Entity\EntityUnitTestBase;
-
-/**
- * Tests feed validation constraints.
- *
- * @group aggregator
- */
-class FeedValidationTest extends EntityUnitTestBase {
-
-  /**
-   * Modules to install.
-   *
-   * @var array
-   */
-  public static $modules = array('aggregator', 'options');
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-    $this->installEntitySchema('aggregator_feed');
-  }
-
-  /**
-   * Tests the feed validation constraints.
-   */
-  public function testValidation() {
-    // Add feed.
-    $feed = Feed::create([
-      'title' => 'Feed 1',
-      'url' => 'http://drupal.org/planet/rss',
-      'refresh' => 900,
-    ]);
-
-    $violations = $feed->validate();
-    $this->assertEqual(count($violations), 0);
-
-    $feed->save();
-
-    // Add another feed.
-    /* @var \Drupal\aggregator\FeedInterface $feed */
-    $feed = Feed::create([
-      'title' => 'Feed 1',
-      'url' => 'http://drupal.org/planet/rss',
-      'refresh' => 900,
-    ]);
-
-    $violations = $feed->validate();
-
-    $this->assertEqual(count($violations), 2);
-    $this->assertEqual($violations[0]->getPropertyPath(), 'title');
-    $this->assertEqual($violations[0]->getMessage(), t('A feed named %value already exists. Enter a unique title.', [
-      '%value' => $feed->label(),
-    ]));
-    $this->assertEqual($violations[1]->getPropertyPath(), 'url');
-    $this->assertEqual($violations[1]->getMessage(), t('A feed with this URL %value already exists. Enter a unique URL.', [
-      '%value' => $feed->getUrl(),
-    ]));
-  }
-
-}
diff --git a/core/modules/book/templates/book-navigation.html.twig b/core/modules/book/templates/book-navigation.html.twig
index 0f12980..f10a4e5 100644
--- a/core/modules/book/templates/book-navigation.html.twig
+++ b/core/modules/book/templates/book-navigation.html.twig
@@ -31,7 +31,7 @@
  */
 #}
 {% if tree or has_links %}
-  <nav role="navigation" aria-labelledby="book-label-{{ book_id }}">
+  <nav id="book-navigation-{{ book_id }}" role="navigation" aria-labelledby="book-label-{{ book_id }}">
     {{ tree }}
     {% if has_links %}
       <h2>{{ 'Book traversal links for'|t }} {{ book_title }}</h2>
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 32a6e32..e4b674f 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -69,7 +69,7 @@ function comment_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Enabling commenting and configuring defaults') . '</dt>';
-      $output .= '<dd>' . t('Comment functionality can be enabled for any entity sub-type (for example, a <a href="!content-type">content type</a>). On the Manage fields page for each entity sub-type, you can enable commenting by adding a Comments field. The entity sub-types each have their own default comment settings configured as: <em>Open</em> to allow new comments, <em>Closed</em> to view existing comments, but prevent new comments, or <em>Hidden</em> to hide existing comments and prevent new comments. For background information about entities, see the <a href="!field">Field module help page</a>.', array('!content-type' => \Drupal::url('node.overview_types'), '!field' => \Drupal::url('help.page', array('name' => 'field')))) . '</dd>';
+      $output .= '<dd>' . t('Comment functionality can be enabled for any <a href="!entity-help" title="Entity module help">entity sub-type</a> (for example, a <a href="!content-type">content type</a>). On the Manage fields page for each entity sub-type, you can enable commenting by adding a Comments field. The entity sub-types each have their own default comment settings configured as: <em>Open</em> to allow new comments, <em>Closed</em> to view existing comments, but prevent new comments, or <em>Hidden</em> to hide existing comments and prevent new comments.', array('!content-type' => \Drupal::url('node.overview_types'), '!entity-help' => \Drupal::url('help.page', array('name' => 'entity')))) . '</dd>';
       $output .= '<dt>' . t('Overriding default settings') . '</dt>';
       $output .= '<dd>' . t('When you create an entity item, you can override the default comment settings. Changing the entity sub-type defaults will not affect existing entity items, whether they used the default settings or had overrides.') . '</dd>';
       $output .= '<dt>' . t('Approving and managing comments') . '</dt>';
diff --git a/core/modules/comment/comment.routing.yml b/core/modules/comment/comment.routing.yml
index 5211387..a90f410 100644
--- a/core/modules/comment/comment.routing.yml
+++ b/core/modules/comment/comment.routing.yml
@@ -102,7 +102,7 @@ entity.comment_type.add_form:
   path: '/admin/structure/comment/types/add'
   defaults:
     _entity_form: 'comment_type.add'
-    _title: 'Add comment type'
+    _title: 'Add'
   requirements:
     _permission: 'administer comment types'
   options:
diff --git a/core/modules/comment/comment.tokens.inc b/core/modules/comment/comment.tokens.inc
index 1bae72e..0e27b92 100644
--- a/core/modules/comment/comment.tokens.inc
+++ b/core/modules/comment/comment.tokens.inc
@@ -110,7 +110,7 @@ function comment_tokens($type, $tokens, array $data = array(), array $options =
 
   $url_options = array('absolute' => TRUE);
   if (isset($options['langcode'])) {
-    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
+    $url_options['language'] = language_load($options['langcode']);
     $langcode = $options['langcode'];
   }
   else {
diff --git a/core/modules/comment/src/CommentManager.php b/core/modules/comment/src/CommentManager.php
index ef884e1..c905a23 100644
--- a/core/modules/comment/src/CommentManager.php
+++ b/core/modules/comment/src/CommentManager.php
@@ -263,7 +263,7 @@ public function forbiddenMessage(EntityInterface $entity, $field_name) {
         $destination = array('destination' => 'comment/reply/' . $entity->getEntityTypeId() . '/' . $entity->id() . '/' . $field_name . '#comment-form');
       }
       else {
-        $destination = array('destination' => $entity->url('canonical', array('fragment' => 'comment-form')));
+        $destination = array('destination' => $entity->getSystemPath() . '#comment-form');
       }
 
       if ($this->userConfig->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY) {
diff --git a/core/modules/comment/src/Controller/CommentController.php b/core/modules/comment/src/Controller/CommentController.php
index 84fbf72..4af3f05 100644
--- a/core/modules/comment/src/Controller/CommentController.php
+++ b/core/modules/comment/src/Controller/CommentController.php
@@ -128,7 +128,7 @@ public function commentPermalink(Request $request, CommentInterface $comment) {
       // Find the current display page for this comment.
       $page = $this->entityManager()->getStorage('comment')->getDisplayOrdinal($comment, $field_definition->getSetting('default_mode'), $field_definition->getSetting('per_page'));
       // @todo: Cleaner sub request handling.
-      $redirect_request = Request::create($entity->url(), 'GET', $request->query->all(), $request->cookies->all(), array(), $request->server->all());
+      $redirect_request = Request::create($entity->getSystemPath(), 'GET', $request->query->all(), $request->cookies->all(), array(), $request->server->all());
       $redirect_request->query->set('page', $page);
       // @todo: Convert the pager to use the request object.
       $request->query->set('page', $page);
diff --git a/core/modules/comment/src/Plugin/views/row/Rss.php b/core/modules/comment/src/Plugin/views/row/Rss.php
index 5f6f512..bbbce01 100644
--- a/core/modules/comment/src/Plugin/views/row/Rss.php
+++ b/core/modules/comment/src/Plugin/views/row/Rss.php
@@ -24,15 +24,8 @@
  */
 class Rss extends RssPluginBase {
 
-  /**
-   * {@inheritdoc}
-   */
-  protected $base_table = 'comment';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $base_field = 'cid';
+   var $base_table = 'comment';
+   var $base_field = 'cid';
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/comment/src/Tests/CommentLinksTest.php b/core/modules/comment/src/Tests/CommentLinksTest.php
index 2d37136..35b1ffc 100644
--- a/core/modules/comment/src/Tests/CommentLinksTest.php
+++ b/core/modules/comment/src/Tests/CommentLinksTest.php
@@ -10,6 +10,7 @@
 use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\comment\CommentInterface;
+use Drupal\entity\Entity\EntityViewDisplay;
 
 /**
  * Basic comment links tests to ensure markup present.
@@ -108,7 +109,7 @@ public function testCommentLinks() {
     entity_get_display('node', $this->node->bundle(), 'default')
       ->removeComponent('links')
       ->save();
-    $this->drupalGet($this->node->urlInfo());
+    $this->drupalGet($this->node->url());
     $this->assertNoLink('1 comment');
     $this->assertNoLink('Add new comment');
 
diff --git a/core/modules/comment/src/Tests/CommentTranslationUITest.php b/core/modules/comment/src/Tests/CommentTranslationUITest.php
index a0d13a9..0067297 100644
--- a/core/modules/comment/src/Tests/CommentTranslationUITest.php
+++ b/core/modules/comment/src/Tests/CommentTranslationUITest.php
@@ -118,10 +118,11 @@ protected function assertPublishedStatus() {
     $languages = $this->container->get('language_manager')->getLanguages();
 
     // Check that simple users cannot see unpublished field translations.
+    $path = $entity->getSystemPath();
     foreach ($this->langcodes as $index => $langcode) {
       $translation = $this->getTranslation($entity, $langcode);
       $value = $this->getValue($translation, 'comment_body', $langcode);
-      $this->drupalGet($entity->urlInfo(), array('language' => $languages[$langcode]));
+      $this->drupalGet($path, array('language' => $languages[$langcode]));
       if ($index > 0) {
         $this->assertNoRaw($value, 'Unpublished field translation is not shown.');
       }
diff --git a/core/modules/config/src/Tests/ConfigEntityStatusUITest.php b/core/modules/config/src/Tests/ConfigEntityStatusUITest.php
index 7f7a29d..32065cf 100644
--- a/core/modules/config/src/Tests/ConfigEntityStatusUITest.php
+++ b/core/modules/config/src/Tests/ConfigEntityStatusUITest.php
@@ -38,18 +38,18 @@ function testCRUD() {
     $entity = entity_load('config_test', $id);
 
     // Disable an entity.
-    $disable_url = $entity->urlInfo('disable');
-    $this->assertLinkByHref($disable_url->toString());
-    $this->drupalGet($disable_url);
+    $disable_path = $entity->getSystemPath('disable');
+    $this->assertLinkByHref($disable_path);
+    $this->drupalGet($disable_path);
     $this->assertResponse(200);
-    $this->assertNoLinkByHref($disable_url->toString());
+    $this->assertNoLinkByHref($disable_path);
 
     // Enable an entity.
-    $enable_url = $entity->urlInfo('enable');
-    $this->assertLinkByHref($enable_url->toString());
-    $this->drupalGet($enable_url);
+    $enable_path = $entity->getSystemPath('enable');
+    $this->assertLinkByHref($enable_path);
+    $this->drupalGet($enable_path);
     $this->assertResponse(200);
-    $this->assertNoLinkByHref($enable_url->toString());
+    $this->assertNoLinkByHref($enable_path);
   }
 
 }
diff --git a/core/modules/config/src/Tests/ConfigEntityTest.php b/core/modules/config/src/Tests/ConfigEntityTest.php
index 2bf47f5..4bdbe25 100644
--- a/core/modules/config/src/Tests/ConfigEntityTest.php
+++ b/core/modules/config/src/Tests/ConfigEntityTest.php
@@ -12,7 +12,6 @@
 use Drupal\Core\Entity\EntityStorageException;
 use Drupal\Core\Config\Entity\ConfigEntityStorage;
 use Drupal\Core\Config\Entity\Exception\ConfigEntityIdLengthException;
-use Drupal\Core\Url;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -123,7 +122,7 @@ function testCRUD() {
     }
 
     // The entity path can only be checked after saving.
-    $this->assertIdentical($config_test->url(), Url::fromRoute('entity.config_test.edit_form', ['config_test' => $expected['id']])->toString());
+    $this->assertIdentical($config_test->getSystemPath(), 'admin/structure/config_test/manage/' . $expected['id']);
 
     // Verify that the correct status is returned and properties did not change.
     $this->assertIdentical($status, SAVED_NEW);
diff --git a/core/modules/config/src/Tests/ConfigInstallTest.php b/core/modules/config/src/Tests/ConfigInstallTest.php
index 2da9e53..06038e8 100644
--- a/core/modules/config/src/Tests/ConfigInstallTest.php
+++ b/core/modules/config/src/Tests/ConfigInstallTest.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\config\Tests;
 
-use Drupal\Core\Config\PreExistingConfigException;
-use Drupal\Core\Config\StorageInterface;
 use Drupal\simpletest\KernelTestBase;
 
 /**
@@ -117,21 +115,6 @@ public function testCollectionInstallationCollections() {
       $this->assertEqual($collection, $data['collection']);
     }
 
-    // Tests that clashing configuration in collections is detected.
-    try {
-      \Drupal::service('module_installer')->install(['config_collection_clash_install_test']);
-      $this->fail('Expected PreExistingConfigException not thrown.');
-    }
-    catch (PreExistingConfigException $e) {
-      $this->assertEqual($e->getExtension(), 'config_collection_clash_install_test');
-      $this->assertEqual($e->getConfigObjects(), [
-        'another_collection' => ['config_collection_install_test.test'],
-        'collection.test1' => ['config_collection_install_test.test'],
-        'collection.test2' => ['config_collection_install_test.test'],
-      ]);
-      $this->assertEqual($e->getMessage(), 'Configuration objects (another_collection/config_collection_install_test.test, collection/test1/config_collection_install_test.test, collection/test2/config_collection_install_test.test) provided by config_collection_clash_install_test already exist in active configuration');
-    }
-
     // Test that the we can use the config installer to install all the
     // available default configuration in a particular collection for enabled
     // extensions.
diff --git a/core/modules/config/src/Tests/ConfigInstallWebTest.php b/core/modules/config/src/Tests/ConfigInstallWebTest.php
index b04ce39..1fecc90 100644
--- a/core/modules/config/src/Tests/ConfigInstallWebTest.php
+++ b/core/modules/config/src/Tests/ConfigInstallWebTest.php
@@ -2,15 +2,12 @@
 
 /**
  * @file
- * Contains \Drupal\config\Tests\ConfigInstallWebTest.
+ * Definition of Drupal\config\Tests\ConfigInstallTest.
  */
 
 namespace Drupal\config\Tests;
 
 use Drupal\Core\Config\InstallStorage;
-use Drupal\Core\Config\PreExistingConfigException;
-use Drupal\Core\Config\StorageInterface;
-use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 use Drupal\Core\Config\FileStorage;
 
@@ -23,18 +20,11 @@
 class ConfigInstallWebTest extends WebTestBase {
 
   /**
-   * The admin user used in this test.
-   */
-  protected $adminUser;
-
-  /**
    * {@inheritdoc}
    */
   protected function setUp() {
     parent::setUp();
 
-    $this->adminUser = $this->drupalCreateUser(array('administer modules', 'administer themes'));
-
     // Ensure the global variable being asserted by this test does not exist;
     // a previous test executed in this request/process might have set it.
     unset($GLOBALS['hook_config_test']);
@@ -92,18 +82,6 @@ function testIntegrationModuleReinstallation() {
     $this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
 
     // Reinstall the integration module.
-    try {
-      \Drupal::service('module_installer')->install(array('config_integration_test'));
-      $this->fail('Expected PreExistingConfigException not thrown.');
-    }
-    catch (PreExistingConfigException $e) {
-      $this->assertEqual($e->getExtension(), 'config_integration_test');
-      $this->assertEqual($e->getConfigObjects(), [StorageInterface::DEFAULT_COLLECTION => ['config_test.dynamic.config_integration_test']]);
-      $this->assertEqual($e->getMessage(), 'Configuration objects (config_test.dynamic.config_integration_test) provided by config_integration_test already exist in active configuration');
-    }
-
-    // Delete the configuration entity so that the install will work.
-    $config_entity->delete();
     \Drupal::service('module_installer')->install(array('config_integration_test'));
 
     // Verify the integration module's config was re-installed.
@@ -113,10 +91,10 @@ function testIntegrationModuleReinstallation() {
     $this->assertIdentical($config_static->isNew(), FALSE);
     $this->assertIdentical($config_static->get('foo'), 'default setting');
 
-    // Verify the integration config is using the default.
-    $config_entity = \Drupal::config($default_configuration_entity);
+    // Verify the customized integration config still exists.
+    $config_entity = $this->config($default_configuration_entity);
     $this->assertIdentical($config_entity->isNew(), FALSE);
-    $this->assertIdentical($config_entity->get('label'), 'Default integration config label');
+    $this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
   }
 
   /**
@@ -154,64 +132,21 @@ function testInstallProfileConfigOverwrite() {
     // created from the testing install profile's system.cron.yml file.
     $config = $this->config($config_name);
     $this->assertIdentical($config->get(), $expected_profile_data);
-  }
 
-  /**
-   * Tests pre-existing configuration detection.
-   */
-  public function testPreExistingConfigInstall() {
-    $this->drupalLogin($this->adminUser);
-
-    // Try to install config_install_fail_test and config_test. Doing this
-    // will install the config_test module first because it is a dependency of
-    // config_install_fail_test.
-    // @see \Drupal\system\Form\ModulesListForm::submitForm()
-    $this->drupalPostForm('admin/modules', array('modules[Testing][config_test][enable]' => TRUE, 'modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
-    $this->assertRaw('Unable to install Configuration install fail test, <em class="placeholder">config_test.dynamic.dotted.default</em> already exists in active configuration.');
-
-    // Uninstall the config_test module to test the confirm form.
-    $this->drupalPostForm('admin/modules/uninstall', array('uninstall[config_test]' => TRUE), t('Uninstall'));
-    $this->drupalPostForm(NULL, array(), t('Uninstall'));
-
-    // Try to install config_install_fail_test without selecting config_test.
-    // The user is shown a confirm form because the config_test module is a
-    // dependency.
-    // @see \Drupal\system\Form\ModulesListConfirmForm::submitForm()
-    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
-    $this->drupalPostForm(NULL, array(), t('Continue'));
-    $this->assertRaw('Unable to install Configuration install fail test, <em class="placeholder">config_test.dynamic.dotted.default</em> already exists in active configuration.');
-
-    // Test that collection configuration clashes during a module install are
-    // reported correctly.
-    \Drupal::service('module_installer')->install(['language']);
-    $this->rebuildContainer();
-    ConfigurableLanguage::createFromLangcode('fr')->save();
-    \Drupal::languageManager()
-      ->getLanguageConfigOverride('fr', 'config_test.dynamic.dotted.default')
-      ->set('label', 'Je suis Charlie')
-      ->save();
-
-    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
-    $this->assertRaw('Unable to install Configuration install fail test, <em class="placeholder">config_test.dynamic.dotted.default, language/fr/config_test.dynamic.dotted.default</em> already exist in active configuration.');
-
-    // Test installing a theme through the UI that has existing configuration.
-    // This relies on the fact the config_test has been installed and created
-    // the config_test.dynamic.dotted.default configuration and the translation
-    // override created still exists.
-    $this->drupalGet('admin/appearance');
-    $url = $this->xpath("//a[contains(@href,'config_clash_test_theme') and contains(@href,'/install?')]/@href")[0];
-    $this->drupalGet($this->getAbsoluteUrl($url));
-    $this->assertRaw('Unable to install config_clash_test_theme, <em class="placeholder">config_test.dynamic.dotted.default, language/fr/config_test.dynamic.dotted.default</em> already exist in active configuration.');
-
-    // Test installing a theme through the API that has existing configuration.
-    try {
-      \Drupal::service('theme_handler')->install(['config_clash_test_theme']);
-      $this->fail('Expected PreExistingConfigException not thrown.');
-    }
-    catch (PreExistingConfigException $e) {
-      $this->assertEqual($e->getExtension(), 'config_clash_test_theme');
-      $this->assertEqual($e->getConfigObjects(), [StorageInterface::DEFAULT_COLLECTION => ['config_test.dynamic.dotted.default'], 'language.fr' => ['config_test.dynamic.dotted.default']]);
-      $this->assertEqual($e->getMessage(), 'Configuration objects (config_test.dynamic.dotted.default, language/fr/config_test.dynamic.dotted.default) provided by config_clash_test_theme already exist in active configuration');
-    }
+    // Turn on the test module, which will attempt to replace the
+    // configuration data. This attempt to replace the active configuration
+    // should be ignored.
+    \Drupal::service('module_installer')->install(array('config_existing_default_config_test'));
+
+    // Verify that the test module has not been able to change the data.
+    $config = $this->config($config_name);
+    $this->assertIdentical($config->get(), $expected_profile_data);
+
+    // Disable and uninstall the test module.
+    \Drupal::service('module_installer')->uninstall(array('config_existing_default_config_test'));
+
+    // Verify that the data hasn't been altered by removing the test module.
+    $config = $this->config($config_name);
+    $this->assertIdentical($config->get(), $expected_profile_data);
   }
 }
diff --git a/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php b/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php
index 4970681..cc754d4 100644
--- a/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php
+++ b/core/modules/config/src/Tests/ConfigLanguageOverrideTest.php
@@ -39,7 +39,7 @@ function testConfigLanguageOverride() {
     // The language module implements a config factory override object that
     // overrides configuration when the Language module is enabled. This test ensures that
     // English overrides work.
-    \Drupal::languageManager()->setConfigOverrideLanguage(\Drupal::languageManager()->getLanguage('en'));
+    \Drupal::languageManager()->setConfigOverrideLanguage(language_load('en'));
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'en bar');
 
@@ -50,11 +50,11 @@ function testConfigLanguageOverride() {
     ConfigurableLanguage::createFromLangcode('fr')->save();
     ConfigurableLanguage::createFromLangcode('de')->save();
 
-    \Drupal::languageManager()->setConfigOverrideLanguage(\Drupal::languageManager()->getLanguage('fr'));
+    \Drupal::languageManager()->setConfigOverrideLanguage(language_load('fr'));
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'fr bar');
 
-    \Drupal::languageManager()->setConfigOverrideLanguage(\Drupal::languageManager()->getLanguage('de'));
+    \Drupal::languageManager()->setConfigOverrideLanguage(language_load('de'));
     $config = \Drupal::config('config_test.system');
     $this->assertIdentical($config->get('foo'), 'de bar');
 
@@ -94,7 +94,7 @@ function testConfigLanguageOverride() {
     $this->assertIdentical($config->get('value'), array('key' => 'override'));
 
     // Ensure renaming the config will rename the override.
-    \Drupal::languageManager()->setConfigOverrideLanguage(\Drupal::languageManager()->getLanguage('en'));
+    \Drupal::languageManager()->setConfigOverrideLanguage(language_load('en'));
     \Drupal::configFactory()->rename('config_test.foo', 'config_test.bar');
     $config = \Drupal::config('config_test.bar');
     $this->assertEqual($config->get('value'), array('key' => 'original'));
diff --git a/core/modules/config/src/Tests/ConfigOtherModuleTest.php b/core/modules/config/src/Tests/ConfigOtherModuleTest.php
index 082e485..5737d78 100644
--- a/core/modules/config/src/Tests/ConfigOtherModuleTest.php
+++ b/core/modules/config/src/Tests/ConfigOtherModuleTest.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\config\Tests;
 
-use Drupal\Core\Config\PreExistingConfigException;
-use Drupal\Core\Config\StorageInterface;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -59,18 +57,10 @@ public function testInstallOtherModuleFirst() {
     // Default configuration provided by config_test should still exist.
     $this->assertTrue(entity_load('config_test', 'dotted.default', TRUE), 'The configuration is not deleted.');
 
-    // Re-enable module to test that pre-existing default configuration throws
-    // an error.
-    $msg = "The expected PreExistingConfigException is thrown by reinstalling config_other_module_config_test.";
-    try {
-      $this->installModule('config_other_module_config_test');
-      $this->fail($msg);
-    }
-    catch (PreExistingConfigException $e) {
-      $this->pass($msg);
-      $this->assertEqual($e->getExtension(), 'config_other_module_config_test');
-      $this->assertEqual($e->getConfigObjects(), [StorageInterface::DEFAULT_COLLECTION => ['config_test.dynamic.other_module_test']]);
-    }
+    // Re-enable module to test that default config is unchanged.
+    $this->installModule('config_other_module_config_test');
+    $config_entity = entity_load('config_test', 'other_module_test', TRUE);
+    $this->assertEqual($config_entity->get('style'), "The piano ain't got no wrong notes.", 'Re-enabling the module does not install default config over the existing config entity.');
   }
 
   /**
diff --git a/core/modules/config/tests/config_clash_test_theme/config/install/config_test.dynamic.dotted.default.yml b/core/modules/config/tests/config_clash_test_theme/config/install/config_test.dynamic.dotted.default.yml
deleted file mode 100644
index eb94849..0000000
--- a/core/modules/config/tests/config_clash_test_theme/config/install/config_test.dynamic.dotted.default.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-# Clashes with default configuration provided by the config_test module.
-id: dotted.default
-label: 'Config install fail'
-weight: 0
-protected_property: Default
-# Intentionally commented out to verify default status behavior.
-# status: 1
diff --git a/core/modules/config/tests/config_clash_test_theme/config/install/language/fr/config_test.dynamic.dotted.default.yml b/core/modules/config/tests/config_clash_test_theme/config/install/language/fr/config_test.dynamic.dotted.default.yml
deleted file mode 100644
index e73dec0..0000000
--- a/core/modules/config/tests/config_clash_test_theme/config/install/language/fr/config_test.dynamic.dotted.default.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Clashes with default configuration provided by the config_test module.
-label: 'Je suis'
diff --git a/core/modules/config/tests/config_clash_test_theme/config_clash_test_theme.info.yml b/core/modules/config/tests/config_clash_test_theme/config_clash_test_theme.info.yml
deleted file mode 100644
index 2ff354d..0000000
--- a/core/modules/config/tests/config_clash_test_theme/config_clash_test_theme.info.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-name: 'Test theme for configuration clash detection'
-type: theme
-description: 'Test theme for configuration clash detection'
-version: VERSION
-base theme: classy
-core: 8.x
-regions:
-  content: Content
-  left: Left
-  right: Right
diff --git a/core/modules/config/tests/config_collection_clash_install_test/config/install/another_collection/config_collection_install_test.test.yml b/core/modules/config/tests/config_collection_clash_install_test/config/install/another_collection/config_collection_install_test.test.yml
deleted file mode 100644
index 0337f93..0000000
--- a/core/modules/config/tests/config_collection_clash_install_test/config/install/another_collection/config_collection_install_test.test.yml
+++ /dev/null
@@ -1 +0,0 @@
-collection: another_collection
diff --git a/core/modules/config/tests/config_collection_clash_install_test/config/install/collection/test1/config_collection_install_test.test.yml b/core/modules/config/tests/config_collection_clash_install_test/config/install/collection/test1/config_collection_install_test.test.yml
deleted file mode 100644
index 8bdebee..0000000
--- a/core/modules/config/tests/config_collection_clash_install_test/config/install/collection/test1/config_collection_install_test.test.yml
+++ /dev/null
@@ -1 +0,0 @@
-collection: collection.test1
diff --git a/core/modules/config/tests/config_collection_clash_install_test/config/install/collection/test2/config_collection_install_test.test.yml b/core/modules/config/tests/config_collection_clash_install_test/config/install/collection/test2/config_collection_install_test.test.yml
deleted file mode 100644
index b5ae44c..0000000
--- a/core/modules/config/tests/config_collection_clash_install_test/config/install/collection/test2/config_collection_install_test.test.yml
+++ /dev/null
@@ -1 +0,0 @@
-collection: collection.test2
diff --git a/core/modules/config/tests/config_collection_clash_install_test/config/install/entity/config_test.dynamic.dotted.default.yml b/core/modules/config/tests/config_collection_clash_install_test/config/install/entity/config_test.dynamic.dotted.default.yml
deleted file mode 100644
index f77c303..0000000
--- a/core/modules/config/tests/config_collection_clash_install_test/config/install/entity/config_test.dynamic.dotted.default.yml
+++ /dev/null
@@ -1 +0,0 @@
-label: entity
diff --git a/core/modules/config/tests/config_collection_clash_install_test/config_collection_clash_install_test.info.yml b/core/modules/config/tests/config_collection_clash_install_test/config_collection_clash_install_test.info.yml
deleted file mode 100644
index 8cdab05..0000000
--- a/core/modules/config/tests/config_collection_clash_install_test/config_collection_clash_install_test.info.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-# This should contain a copy of the configuration from the
-# config_collection_install_test module.
-name: 'Config collection clash test module'
-type: module
-package: Testing
-version: VERSION
-core: 8.x
-dependencies:
-  - config_collection_install_test
diff --git a/core/modules/config/tests/config_existing_default_config_test/config_existing_default_config_test.info.yml b/core/modules/config/tests/config_existing_default_config_test/config_existing_default_config_test.info.yml
new file mode 100644
index 0000000..75436be
--- /dev/null
+++ b/core/modules/config/tests/config_existing_default_config_test/config_existing_default_config_test.info.yml
@@ -0,0 +1,5 @@
+name: 'Configuration existing default config test'
+type: module
+package: Testing
+version: VERSION
+core: 8.x
diff --git a/core/modules/config/tests/config_install_fail_test/config/install/config_test.dynamic.dotted.default.yml b/core/modules/config/tests/config_install_fail_test/config/install/config_test.dynamic.dotted.default.yml
deleted file mode 100644
index eb94849..0000000
--- a/core/modules/config/tests/config_install_fail_test/config/install/config_test.dynamic.dotted.default.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-# Clashes with default configuration provided by the config_test module.
-id: dotted.default
-label: 'Config install fail'
-weight: 0
-protected_property: Default
-# Intentionally commented out to verify default status behavior.
-# status: 1
diff --git a/core/modules/config/tests/config_install_fail_test/config/install/language/fr/config_test.dynamic.dotted.default.yml b/core/modules/config/tests/config_install_fail_test/config/install/language/fr/config_test.dynamic.dotted.default.yml
deleted file mode 100644
index e73dec0..0000000
--- a/core/modules/config/tests/config_install_fail_test/config/install/language/fr/config_test.dynamic.dotted.default.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Clashes with default configuration provided by the config_test module.
-label: 'Je suis'
diff --git a/core/modules/config/tests/config_install_fail_test/config_install_fail_test.info.yml b/core/modules/config/tests/config_install_fail_test/config_install_fail_test.info.yml
deleted file mode 100644
index 44a9cf3..0000000
--- a/core/modules/config/tests/config_install_fail_test/config_install_fail_test.info.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-name: 'Configuration install fail test'
-type: module
-package: Testing
-version: VERSION
-core: 8.x
-dependencies:
-  - config_test
diff --git a/core/modules/config_translation/src/ConfigEntityMapper.php b/core/modules/config_translation/src/ConfigEntityMapper.php
index 08ce8a6..e9bdc60 100644
--- a/core/modules/config_translation/src/ConfigEntityMapper.php
+++ b/core/modules/config_translation/src/ConfigEntityMapper.php
@@ -11,7 +11,6 @@
 use Drupal\Core\Config\TypedConfigManagerInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\StringTranslation\TranslationInterface;
@@ -77,11 +76,9 @@ class ConfigEntityMapper extends ConfigNamesMapper {
    *   The string translation manager.
    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
    *   The entity manager.
-   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
-   *   The language manager.
    */
-  public function __construct($plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config, LocaleConfigManager $locale_config_manager, ConfigMapperManagerInterface $config_mapper_manager, RouteProviderInterface $route_provider, TranslationInterface $translation_manager, EntityManagerInterface $entity_manager, LanguageManagerInterface $language_manager) {
-    parent::__construct($plugin_id, $plugin_definition, $config_factory, $typed_config, $locale_config_manager, $config_mapper_manager, $route_provider, $translation_manager, $language_manager);
+  public function __construct($plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config, LocaleConfigManager $locale_config_manager, ConfigMapperManagerInterface $config_mapper_manager, RouteProviderInterface $route_provider, TranslationInterface $translation_manager, EntityManagerInterface $entity_manager) {
+    parent::__construct($plugin_id, $plugin_definition, $config_factory, $typed_config, $locale_config_manager, $config_mapper_manager, $route_provider, $translation_manager);
     $this->setType($plugin_definition['entity_type']);
 
     $this->entityManager = $entity_manager;
@@ -102,8 +99,7 @@ public static function create(ContainerInterface $container, array $configuratio
       $container->get('plugin.manager.config_translation.mapper'),
       $container->get('router.route_provider'),
       $container->get('string_translation'),
-      $container->get('entity.manager'),
-      $container->get('language_manager')
+      $container->get('entity.manager')
     );
   }
 
diff --git a/core/modules/config_translation/src/ConfigNamesMapper.php b/core/modules/config_translation/src/ConfigNamesMapper.php
index 95d7e39..e86d2b7 100644
--- a/core/modules/config_translation/src/ConfigNamesMapper.php
+++ b/core/modules/config_translation/src/ConfigNamesMapper.php
@@ -11,7 +11,6 @@
 use Drupal\Core\Config\TypedConfigManagerInterface;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\StringTranslation\TranslationInterface;
@@ -85,13 +84,6 @@ class ConfigNamesMapper extends PluginBase implements ConfigMapperInterface, Con
   protected $langcode = NULL;
 
   /**
-   * The language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface
-   */
-  protected $languageManager;
-
-  /**
    * Constructs a ConfigNamesMapper.
    *
    * @param $plugin_id
@@ -118,14 +110,12 @@ class ConfigNamesMapper extends PluginBase implements ConfigMapperInterface, Con
    *   The route provider.
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The string translation manager.
-   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
-   *   The language manager.
    *
    * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException
    *   Throws an exception if the route specified by the 'base_route_name' in
    *   the plugin definition could not be found by the route provider.
    */
-  public function __construct($plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config, LocaleConfigManager $locale_config_manager, ConfigMapperManagerInterface $config_mapper_manager, RouteProviderInterface $route_provider, TranslationInterface $string_translation, LanguageManagerInterface $language_manager) {
+  public function __construct($plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config, LocaleConfigManager $locale_config_manager, ConfigMapperManagerInterface $config_mapper_manager, RouteProviderInterface $route_provider, TranslationInterface $string_translation) {
     $this->pluginId = $plugin_id;
     $this->pluginDefinition = $plugin_definition;
     $this->routeProvider = $route_provider;
@@ -136,7 +126,6 @@ public function __construct($plugin_id, $plugin_definition, ConfigFactoryInterfa
     $this->configMapperManager = $config_mapper_manager;
 
     $this->stringTranslation = $string_translation;
-    $this->languageManager = $language_manager;
   }
 
   /**
@@ -153,8 +142,7 @@ public static function create(ContainerInterface $container, array $configuratio
       $container->get('locale.config.typed'),
       $container->get('plugin.manager.config_translation.mapper'),
       $container->get('router.route_provider'),
-      $container->get('string_translation'),
-      $container->get('language_manager')
+      $container->get('string_translation')
     );
   }
 
@@ -412,7 +400,7 @@ public function getLangcode() {
    */
   public function getLanguageWithFallback() {
     $langcode = $this->getLangcode();
-    $language = $this->languageManager->getLanguage($langcode);
+    $language = language_load($langcode);
     // If the language of the file is English but English is not a configured
     // language on the site, create a mock language object to represent this
     // language run-time. In this case, the title of the language is
diff --git a/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php b/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php
index f603740..b7146a3 100644
--- a/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php
+++ b/core/modules/config_translation/src/Form/ConfigTranslationDeleteForm.php
@@ -121,7 +121,7 @@ public function buildForm(array $form, FormStateInterface $form_state, Request $
     $mapper = $this->configMapperManager->createInstance($plugin_id);
     $mapper->populateFromRequest($request);
 
-    $language = $this->languageManager->getLanguage($langcode);
+    $language = language_load($langcode);
     if (!$language) {
       throw new NotFoundHttpException();
     }
diff --git a/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php b/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
index c36176c..6ab80f7 100644
--- a/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
+++ b/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
@@ -136,7 +136,7 @@ public function buildForm(array $form, FormStateInterface $form_state, Request $
     $mapper = $this->configMapperManager->createInstance($plugin_id);
     $mapper->populateFromRequest($request);
 
-    $language = $this->languageManager->getLanguage($langcode);
+    $language = language_load($langcode);
     if (!$language) {
       throw new NotFoundHttpException();
     }
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
index 0ef1b31..e1ce0f6 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationUiTest.php
@@ -329,7 +329,7 @@ public function testContactConfigEntityTranslation() {
     foreach ($this->langcodes as $langcode) {
       $langcode_prefixes = array_merge(array(''), $this->langcodes);
       foreach ($langcode_prefixes as $langcode_prefix) {
-        $this->drupalGet(ltrim("$langcode_prefix/$translation_base_url/$langcode/edit", '/'));
+        $this->drupalGet(ltrim("$langcode_prefix/$translation_base_url/$langcode/edit"));
         $this->assertFieldByName('translation[config_names][contact.form.feedback][label]', 'Website feedback - ' . $langcode);
         $this->assertText($label);
       }
@@ -348,7 +348,7 @@ public function testContactConfigEntityTranslation() {
 
     // Test that delete links work and operations perform properly.
     foreach ($this->langcodes as $langcode) {
-      $replacements = array('%label' => t('!label !entity_type', array('!label' => $label, '!entity_type' => Unicode::strtolower(t('Contact form')))), '@language' => \Drupal::languageManager()->getLanguage($langcode)->getName());
+      $replacements = array('%label' => t('!label !entity_type', array('!label' => $label, '!entity_type' => Unicode::strtolower(t('Contact form')))), '@language' => language_load($langcode)->getName());
 
       $this->drupalGet("$translation_base_url/$langcode/delete");
       $this->assertRaw(t('Are you sure you want to delete the @language translation of %label?', $replacements));
diff --git a/core/modules/config_translation/tests/src/Unit/ConfigEntityMapperTest.php b/core/modules/config_translation/tests/src/Unit/ConfigEntityMapperTest.php
index f2906d1..2b1c67e 100644
--- a/core/modules/config_translation/tests/src/Unit/ConfigEntityMapperTest.php
+++ b/core/modules/config_translation/tests/src/Unit/ConfigEntityMapperTest.php
@@ -47,13 +47,6 @@ class ConfigEntityMapperTest extends UnitTestCase {
    */
   protected $routeProvider;
 
-  /**
-   * The mocked language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface $language_manager|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $languageManager;
-
   protected function setUp() {
     $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
 
@@ -82,8 +75,6 @@ protected function setUp() {
       ->disableOriginalConstructor()
       ->getMock();
 
-    $this->languageManager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
-
     $this->configEntityMapper = new ConfigEntityMapper(
       'configurable_language',
       $definition,
@@ -93,8 +84,7 @@ protected function setUp() {
       $this->getMock('Drupal\config_translation\ConfigMapperManagerInterface'),
       $this->routeProvider,
       $this->getStringTranslationStub(),
-      $this->entityManager,
-      $this->languageManager
+      $this->entityManager
     );
   }
 
diff --git a/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php b/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php
index 59c1469..19cd758 100644
--- a/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php
+++ b/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php
@@ -81,13 +81,6 @@ class ConfigNamesMapperTest extends UnitTestCase {
    */
   protected $urlGenerator;
 
-  /**
-   * The mocked language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface $language_manager|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $languageManager;
-
   protected function setUp() {
     $this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
 
@@ -120,8 +113,6 @@ protected function setUp() {
       ->with('system.site_information_settings')
       ->will($this->returnValue($this->baseRoute));
 
-    $this->languageManager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
-
     $this->configNamesMapper = new TestConfigNamesMapper(
       'system.site_information_settings',
       $this->pluginDefinition,
@@ -130,8 +121,7 @@ protected function setUp() {
       $this->localeConfigManager,
       $this->configMapperManager,
       $this->routeProvider,
-      $this->getStringTranslationStub(),
-      $this->languageManager
+      $this->getStringTranslationStub()
     );
   }
 
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index 9700321..7444b6e 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -91,7 +91,7 @@ function contact_mail($key, &$message, $params) {
   $contact_message = $params['contact_message'];
   /** @var $sender \Drupal\user\UserInterface */
   $sender = $params['sender'];
-  $language = \Drupal::languageManager()->getLanguage($message['langcode']);
+  $language = language_load($message['langcode']);
 
   $variables = array(
     '!site-name' => \Drupal::config('system.site')->get('name'),
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index fd510b5..f1d01ef 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -21,7 +21,7 @@ function content_translation_help($route_name, RouteMatchInterface $route_match)
     case 'help.page.content_translation':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Content Translation module allows you to translate content, comments, custom blocks, taxonomy terms, users and other <a href="!field_help" title="Field module help, with background on content entities">content entities</a>. Together with the modules <a href="!language">Language</a>, <a href="!config-trans">Configuration Translation</a>, and <a href="!locale">Interface Translation</a>, it allows you to build multilingual websites. For more information, see <a href="!translation-entity">the online documentation for the Content Translation module</a>.', array('!locale' => (\Drupal::moduleHandler()->moduleExists('locale')) ? \Drupal::url('help.page', array('name' => 'locale')) : '#', '!config-trans' => (\Drupal::moduleHandler()->moduleExists('config_translation')) ? \Drupal::url('help.page', array('name' => 'config_translation')) : '#', '!language' => \Drupal::url('help.page', array('name' => 'language')), '!translation-entity' => 'https://drupal.org/documentation/modules/translation', '!field_help' => \Drupal::url('help.page', array('name' => 'field')))) . '</p>';
+      $output .= '<p>' . t('The Content Translation module allows you to translate content, comments, custom blocks, taxonomy terms, users and other <a href="!entity_help">content entities</a>. Together with the modules <a href="!language">Language</a>, <a href="!config-trans">Configuration Translation</a>, and <a href="!locale">Interface Translation</a>, it allows you to build multilingual websites. For more information, see <a href="!translation-entity">the online documentation for the Content Translation module</a>.', array('!locale' => (\Drupal::moduleHandler()->moduleExists('locale')) ? \Drupal::url('help.page', array('name' => 'locale')) : '#', '!config-trans' => (\Drupal::moduleHandler()->moduleExists('config_translation')) ? \Drupal::url('help.page', array('name' => 'config_translation')) : '#', '!language' => \Drupal::url('help.page', array('name' => 'language')), '!translation-entity' => 'https://drupal.org/documentation/modules/translation', '!entity_help' => \Drupal::url('help.page', array('name' => 'entity')))) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Enabling translation') . '</dt>';
diff --git a/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php b/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php
index 49efba9..015ae96 100644
--- a/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php
+++ b/core/modules/content_translation/src/Form/ContentTranslationDeleteForm.php
@@ -80,7 +80,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     // Remove any existing path alias for the removed translation.
     // @todo This should be taken care of by the Path module.
     if (\Drupal::moduleHandler()->moduleExists('path')) {
-      $path = $this->entity->urlInfo()->getInternalPath();
+      $path = $this->entity->getSystemPath();
       $conditions = array('source' => $path, 'langcode' => $this->language->getId());
       \Drupal::service('path.alias_storage')->delete($conditions);
     }
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php b/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
index 0dd98bf..1dfec07 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
@@ -65,7 +65,7 @@ class ContentTranslationContextualLinksTest extends WebTestBase {
   protected function setUp() {
     parent::setUp();
     // Set up an additional language.
-    $this->langcodes = array(\Drupal::languageManager()->getDefaultLanguage()->getId(), 'es');
+    $this->langcodes = array(language_default()->getId(), 'es');
     ConfigurableLanguage::createFromLangcode('es')->save();
 
     // Create a content type.
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationUITest.php b/core/modules/content_translation/src/Tests/ContentTranslationUITest.php
index 775df7a..0581893 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationUITest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationUITest.php
@@ -10,8 +10,6 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Url;
-use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Tests the Content Translation UI.
@@ -54,9 +52,9 @@ protected function doTestBasicTranslation() {
     $this->entityId = $this->createEntity($values[$default_langcode], $default_langcode);
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
     $this->assertTrue($entity, 'Entity found in the database.');
-    $this->drupalGet($entity->urlInfo());
+    $this->drupalGet($entity->getSystemPath());
     $this->assertResponse(200, 'Entity URL is valid.');
-    $this->drupalGet($entity->urlInfo('drupal:content-translation-overview'));
+    $this->drupalGet($entity->getSystemPath('drupal:content-translation-overview'));
     $this->assertNoText('Source language', 'Source language column correctly hidden.');
 
     $translation = $this->getTranslation($entity, $default_langcode);
@@ -69,48 +67,35 @@ protected function doTestBasicTranslation() {
 
     // Add a content translation.
     $langcode = 'it';
-    $language = ConfigurableLanguage::load($langcode);
     $values[$langcode] = $this->getNewEntityValues($langcode);
 
-    $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [
-      $entity->getEntityTypeId() => $entity->id(),
-      'source' => $default_langcode,
-      'target' => $langcode
-    ], array('language' => $language));
-    $this->drupalPostForm($add_url, $this->getEditValues($values, $langcode), $this->getFormSubmitActionForNewTranslation($entity, $langcode));
+    $content_translation_path = $entity->getSystemPath('drupal:content-translation-overview');
+    $path = $langcode . '/' . $content_translation_path . '/add/' . $default_langcode . '/' . $langcode;
+    $this->drupalPostForm($path, $this->getEditValues($values, $langcode), $this->getFormSubmitActionForNewTranslation($entity, $langcode));
     if ($this->testLanguageSelector) {
       $this->assertNoFieldByXPath('//select[@id="edit-langcode-0-value"]', NULL, 'Language selector correctly disabled on translations.');
     }
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
-    $this->drupalGet($entity->urlInfo('drupal:content-translation-overview'));
+    $this->drupalGet($entity->getSystemPath('drupal:content-translation-overview'));
     $this->assertNoText('Source language', 'Source language column correctly hidden.');
 
     // Switch the source language.
     $langcode = 'fr';
-    $language = ConfigurableLanguage::load($langcode);
     $source_langcode = 'it';
     $edit = array('source_langcode[source]' => $source_langcode);
-    $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [
-      $entity->getEntityTypeId() => $entity->id(),
-      'source' => $default_langcode,
-      'target' => $langcode
-    ], array('language' => $language));
+    $path = $langcode . '/' . $content_translation_path . '/add/' . $default_langcode . '/' . $langcode;
     // This does not save anything, it merely reloads the form and fills in the
     // fields with the values from the different source language.
-    $this->drupalPostForm($add_url, $edit, t('Change'));
+    $this->drupalPostForm($path, $edit, t('Change'));
     $this->assertFieldByXPath("//input[@name=\"{$this->fieldName}[0][value]\"]", $values[$source_langcode][$this->fieldName][0]['value'], 'Source language correctly switched.');
 
     // Add another translation and mark the other ones as outdated.
     $values[$langcode] = $this->getNewEntityValues($langcode);
     $edit = $this->getEditValues($values, $langcode) + array('content_translation[retranslate]' => TRUE);
-    $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [
-      $entity->getEntityTypeId() => $entity->id(),
-      'source' => $source_langcode,
-      'target' => $langcode
-    ], array('language' => $language));
-    $this->drupalPostForm($add_url, $edit, $this->getFormSubmitActionForNewTranslation($entity, $langcode));
+    $path = $langcode . '/' . $content_translation_path . '/add/' . $source_langcode . '/' . $langcode;
+    $this->drupalPostForm($path, $edit, $this->getFormSubmitActionForNewTranslation($entity, $langcode));
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
-    $this->drupalGet($entity->urlInfo('drupal:content-translation-overview'));
+    $this->drupalGet($entity->getSystemPath('drupal:content-translation-overview'));
     $this->assertText('Source language', 'Source language column correctly shown.');
 
     // Check that the entered values have been correctly stored.
@@ -130,15 +115,15 @@ protected function doTestBasicTranslation() {
    */
   protected function doTestTranslationOverview() {
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
-    $this->drupalGet($entity->urlInfo('drupal:content-translation-overview'));
+    $this->drupalGet($entity->getSystemPath('drupal:content-translation-overview'));
 
     foreach ($this->langcodes as $langcode) {
       if ($entity->hasTranslation($langcode)) {
         $language = new Language(array('id' => $langcode));
-        $view_path = $entity->url('canonical', array('language' => $language));
+        $view_path = \Drupal::urlGenerator()->generateFromPath($entity->getSystemPath(), array('language' => $language));
         $elements = $this->xpath('//table//a[@href=:href]', array(':href' => $view_path));
         $this->assertEqual((string) $elements[0], $entity->getTranslation($langcode)->label(), format_string('Label correctly shown for %language translation.', array('%language' => $langcode)));
-        $edit_path = $entity->url('edit-form', array('language' => $language));
+        $edit_path = \Drupal::urlGenerator()->generateFromPath($entity->getSystemPath('edit-form'), array('language' => $language));
         $elements = $this->xpath('//table//ul[@class="dropbutton"]/li/a[@href=:href]', array(':href' => $edit_path));
         $this->assertEqual((string) $elements[0], t('Edit'), format_string('Edit link correct for %language translation.', array('%language' => $langcode)));
       }
@@ -155,15 +140,15 @@ protected function doTestOutdatedStatus() {
 
     // Mark translations as outdated.
     $edit = array('content_translation[retranslate]' => TRUE);
-    $edit_path = $entity->urlInfo('edit-form', array('language' => $languages[$langcode]));
-    $this->drupalPostForm($edit_path, $edit, $this->getFormSubmitAction($entity, $langcode));
+    $path = $entity->getSystemPath('edit-form');
+    $this->drupalPostForm($path, $edit, $this->getFormSubmitAction($entity, $langcode), array('language' => $languages[$langcode]));
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
 
     // Check that every translation has the correct "outdated" status, and that
     // the Translation fieldset is open if the translation is "outdated".
     foreach ($this->langcodes as $added_langcode) {
-      $url = $entity->urlInfo('edit-form', array('language' => ConfigurableLanguage::load($added_langcode)));
-      $this->drupalGet($url);
+      $options = array('language' => $languages[$added_langcode]);
+      $this->drupalGet($path, $options);
       if ($added_langcode == $langcode) {
         $this->assertFieldByXPath('//input[@name="content_translation[retranslate]"]', FALSE, 'The retranslate flag is not checked by default.');
         $this->assertFalse($this->xpath('//details[@id="edit-content-translation" and @open="open"]'), 'The translation tab should be collapsed by default.');
@@ -172,8 +157,8 @@ protected function doTestOutdatedStatus() {
         $this->assertFieldByXPath('//input[@name="content_translation[outdated]"]', TRUE, 'The translate flag is checked by default.');
         $this->assertTrue($this->xpath('//details[@id="edit-content-translation" and @open="open"]'), 'The translation tab is correctly expanded when the translation is outdated.');
         $edit = array('content_translation[outdated]' => FALSE);
-        $this->drupalPostForm($url, $edit, $this->getFormSubmitAction($entity, $added_langcode));
-        $this->drupalGet($url);
+        $this->drupalPostForm($path, $edit, $this->getFormSubmitAction($entity, $added_langcode), $options);
+        $this->drupalGet($path, $options);
         $this->assertFieldByXPath('//input[@name="content_translation[retranslate]"]', FALSE, 'The retranslate flag is now shown.');
         $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
         $this->assertFalse($entity->translation[$added_langcode]['outdated'], 'The "outdated" status has been correctly stored.');
@@ -186,20 +171,20 @@ protected function doTestOutdatedStatus() {
    */
   protected function doTestPublishedStatus() {
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
+    $path = $entity->getSystemPath('edit-form');
 
     // Unpublish translations.
     foreach ($this->langcodes as $index => $langcode) {
       if ($index > 0) {
-        $url = $entity->urlInfo('edit-form', array('language' => ConfigurableLanguage::load($langcode)));
         $edit = array('content_translation[status]' => FALSE);
-        $this->drupalPostForm($url, $edit, $this->getFormSubmitAction($entity, $langcode));
+        $this->drupalPostForm($langcode . '/' . $path, $edit, $this->getFormSubmitAction($entity, $langcode));
         $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
         $this->assertFalse($entity->translation[$langcode]['status'], 'The translation has been correctly unpublished.');
       }
     }
 
     // Check that the last published translation cannot be unpublished.
-    $this->drupalGet($entity->urlInfo('edit-form'));
+    $this->drupalGet($path);
     $this->assertFieldByXPath('//input[@name="content_translation[status]" and @disabled="disabled"]', TRUE, 'The last translation is published and cannot be unpublished.');
   }
 
@@ -208,6 +193,7 @@ protected function doTestPublishedStatus() {
    */
   protected function doTestAuthoringInfo() {
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
+    $path = $entity->getSystemPath('edit-form');
     $values = array();
 
     // Post different authoring information for each translation.
@@ -221,8 +207,8 @@ protected function doTestAuthoringInfo() {
         'content_translation[name]' => $user->getUsername(),
         'content_translation[created]' => format_date($values[$langcode]['created'], 'custom', 'Y-m-d H:i:s O'),
       );
-      $url = $entity->urlInfo('edit-form', array('language' => ConfigurableLanguage::load($langcode)));
-      $this->drupalPostForm($url, $edit, $this->getFormSubmitAction($entity, $langcode));
+      $prefix = $index > 0 ? $langcode . '/' : '';
+      $this->drupalPostForm($prefix . $path, $edit, $this->getFormSubmitAction($entity, $langcode));
     }
 
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
@@ -238,7 +224,7 @@ protected function doTestAuthoringInfo() {
       'content_translation[name]' => $this->randomMachineName(12),
       'content_translation[created]' => '19/11/1978',
     );
-    $this->drupalPostForm($entity->urlInfo('edit-form'), $edit, $this->getFormSubmitAction($entity, $langcode));
+    $this->drupalPostForm($path, $edit, $this->getFormSubmitAction($entity, $langcode));
     $this->assertTrue($this->xpath('//div[contains(@class, "error")]//ul'), 'Invalid values generate a list of form errors.');
     $this->assertEqual($entity->translation[$langcode]['uid'], $values[$langcode]['uid'], 'Translation author correctly kept.');
     $this->assertEqual($entity->translation[$langcode]['created'], $values[$langcode]['created'], 'Translation date correctly kept.');
@@ -251,8 +237,8 @@ protected function doTestTranslationDeletion() {
     // Confirm and delete a translation.
     $langcode = 'fr';
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
-    $url = $entity->urlInfo('edit-form', array('language' => ConfigurableLanguage::load($langcode)));
-    $this->drupalPostForm($url, array(), t('Delete translation'));
+    $path = $entity->getSystemPath('edit-form');
+    $this->drupalPostForm($langcode . '/' . $path, array(), t('Delete translation'));
     $this->drupalPostForm(NULL, array(), t('Delete'));
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
     if ($this->assertTrue(is_object($entity), 'Entity found')) {
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php b/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php
index 709ee68..df14e15 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\content_translation\Tests;
 
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Url;
 use Drupal\user\UserInterface;
 
 /**
@@ -62,8 +61,10 @@ protected function setupEntity() {
 
     // Create a translation.
     $this->drupalLogin($this->translator);
-    $add_translation_url = Url::fromRoute('content_translation.translation_add_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $this->langcodes[2]]);
-    $this->drupalPostForm($add_translation_url, array(), t('Save'));
+    $path = $this->entity->getSystemPath('drupal:content-translation-overview');
+
+    $add_translation_path = $path . "/add/$default_langcode/{$this->langcodes[2]}";
+    $this->drupalPostForm($add_translation_path, array(), t('Save'));
     $this->rebuildContainer();
   }
 
@@ -85,11 +86,11 @@ function testWorkflows() {
 
     // Check that translation permissions governate the associated operations.
     $ops = array('create' => t('Add'), 'update' => t('Edit'), 'delete' => t('Delete'));
-    $translations_url = $this->entity->urlInfo('drupal:content-translation-overview');
+    $translations_path = $this->entity->getSystemPath('drupal:content-translation-overview');
     foreach ($ops as $current_op => $item) {
       $user = $this->drupalCreateUser(array($this->getTranslatePermission(), "$current_op content translations"));
       $this->drupalLogin($user);
-      $this->drupalGet($translations_url);
+      $this->drupalGet($translations_path);
 
       foreach ($ops as $op => $label) {
         if ($op != $current_op) {
@@ -118,23 +119,23 @@ protected function assertWorkflows(UserInterface $user, $expected_status) {
     $this->drupalLogin($user);
 
     // Check whether the user is allowed to access the entity form in edit mode.
-    $options = array('language' => $languages[$default_langcode], 'absolute' => TRUE);
-    $edit_url = $this->entity->urlInfo('edit-form', $options);
-    $this->drupalGet($edit_url, $options);
+    $edit_path = $this->entity->getSystemPath('edit-form');
+    $options = array('language' => $languages[$default_langcode]);
+    $this->drupalGet($edit_path, $options);
     $this->assertResponse($expected_status['edit'], format_string('The @user_label has the expected edit access.', $args));
 
     // Check whether the user is allowed to access the translation overview.
     $langcode = $this->langcodes[1];
-    $options = array('language' => $languages[$langcode], 'absolute' => TRUE);
-    $translations_url = $this->entity->url('drupal:content-translation-overview', $options);
-    $this->drupalGet($translations_url);
+    $translations_path = $this->entity->getSystemPath('drupal:content-translation-overview');
+    $options = array('language' => $languages[$langcode]);
+    $this->drupalGet($translations_path, $options);
     $this->assertResponse($expected_status['overview'], format_string('The @user_label has the expected translation overview access.', $args));
 
     // Check whether the user is allowed to create a translation.
-    $add_translation_url = Url::fromRoute('content_translation.translation_add_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $langcode], $options);
+    $add_translation_path = $translations_path . "/add/$default_langcode/$langcode";
     if ($expected_status['add_translation'] == 200) {
       $this->clickLink('Add');
-      $this->assertUrl($add_translation_url->toString(), array(), 'The translation overview points to the translation form when creating translations.');
+      $this->assertUrl($add_translation_path, $options, 'The translation overview points to the translation form when creating translations.');
       // Check that the translation form does not contain shared elements for
       // translators.
       if ($expected_status['edit'] == 403) {
@@ -142,37 +143,33 @@ protected function assertWorkflows(UserInterface $user, $expected_status) {
       }
     }
     else {
-      $this->drupalGet($add_translation_url);
+      $this->drupalGet($add_translation_path, $options);
     }
     $this->assertResponse($expected_status['add_translation'], format_string('The @user_label has the expected translation creation access.', $args));
 
     // Check whether the user is allowed to edit a translation.
     $langcode = $this->langcodes[2];
-    $options['language'] = $languages[$langcode];
-    $edit_translation_url = Url::fromRoute('content_translation.translation_edit_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options);
-    $options = ['language' => $languages[$langcode], 'absolute' => TRUE];
+    $edit_translation_path = $translations_path . "/edit/$langcode";
+    $options = array('language' => $languages[$langcode]);
     if ($expected_status['edit_translation'] == 200) {
-      $this->drupalGet($translations_url);
+      $this->drupalGet($translations_path, $options);
       $editor = $expected_status['edit'] == 200;
 
       if ($editor) {
         $this->clickLink('Edit', 2);
         // An editor should be pointed to the entity form in multilingual mode.
-
-        // We need a new expected edit path with a new language.
-        $expected_edit_path = $this->entity->url('edit-form', $options);
-        $this->assertUrl($expected_edit_path, [], 'The translation overview points to the edit form for editors when editing translations.');
+        $this->assertUrl($edit_path, $options, 'The translation overview points to the edit form for editors when editing translations.');
       }
       else {
         $this->clickLink('Edit');
         // While a translator should be pointed to the translation form.
-        $this->assertUrl($edit_translation_url->toString(), array(), 'The translation overview points to the translation form for translators when editing translations.');
+        $this->assertUrl($edit_translation_path, $options, 'The translation overview points to the translation form for translators when editing translations.');
         // Check that the translation form does not contain shared elements.
         $this->assertNoSharedElements();
       }
     }
     else {
-      $this->drupalGet($edit_translation_url);
+      $this->drupalGet($edit_translation_path, $options);
     }
     $this->assertResponse($expected_status['edit_translation'], format_string('The @user_label has the expected translation creation access.', $args));
   }
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
index 6374998..6d4280b 100644
--- a/core/modules/entity_reference/entity_reference.module
+++ b/core/modules/entity_reference/entity_reference.module
@@ -22,7 +22,7 @@ function entity_reference_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.entity_reference':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Entity Reference module allows you to create fields that contain links to other entities (such as content items, taxonomy terms, etc.) within the site. This allows you, for example, to include a link to a user within a content item. For more information, see <a href="!er_do">the online documentation for the Entity Reference module</a> and the <a href="!field_help">Field module help page</a>.', array('!field_help' => \Drupal::url('help.page', array('name' => 'field')), '!er_do' => 'https://drupal.org/documentation/modules/entityreference')) . '</p>';
+      $output .= '<p>' . t('The Entity Reference module allows you to create fields that contain links to other entities (such as content items, taxonomy terms, etc.) within the site. This allows you, for example, to include a link to a user within a content item. For more information, see <a href="!er_do">the online documentation for the Entity Reference module</a>, the <a href="!entity_help">Entity module help page</a>, and the <a href="!field_help">Field module help page</a>.', array('!field_help' => \Drupal::url('help.page', array('name' => 'field')),'!entity_help' => \Drupal::url('help.page', array('name' => 'entity')), '!er_do' => 'https://drupal.org/documentation/modules/entityreference')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Managing and displaying entity reference fields') . '</dt>';
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php b/core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php
index 2c90f7e..a1d7102 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php
+++ b/core/modules/entity_reference/src/Tests/EntityReferenceFieldTranslatedReferenceViewTest.php
@@ -121,11 +121,6 @@ protected function setUp() {
     $this->translatedLabel = $this->randomMachineName();
 
     $this->setUpLanguages();
-
-    // We setup languages, so we need to ensure that the language manager
-    // and language path processor is updated.
-    $this->rebuildContainer();
-
     $this->setUpContentTypes();
     $this->enableTranslation();
     $this->setUpEntityReferenceField();
@@ -136,14 +131,14 @@ protected function setUp() {
    * Tests if the translated entity is displayed in an entity reference field.
    */
   public function testTranslatedEntityReferenceDisplay() {
-    $url = $this->referrerEntity->urlInfo();
-    $translation_url = $this->referrerEntity->urlInfo('canonical', ['language' => ConfigurableLanguage::load($this->translateToLangcode)]);
+    $path = $this->referrerEntity->getSystemPath();
+    $translation_path = $this->translateToLangcode . '/' . $path;
 
-    $this->drupalGet($url);
+    $this->drupalGet($path);
     $this->assertText($this->labelOfNotTranslatedReference, 'The label of not translated reference is displayed.');
     $this->assertText($this->originalLabel, 'The default label of translated reference is displayed.');
     $this->assertNoText($this->translatedLabel, 'The translated label of translated reference is not displayed.');
-    $this->drupalGet($translation_url);
+    $this->drupalGet($translation_path);
     $this->assertText($this->labelOfNotTranslatedReference, 'The label of not translated reference is displayed.');
     $this->assertNoText($this->originalLabel, 'The default label of translated reference is not displayed.');
     $this->assertText($this->translatedLabel, 'The translated label of translated reference is displayed.');
diff --git a/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php b/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php
index 9ae79a7..da87544 100644
--- a/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php
+++ b/core/modules/entity_reference/src/Tests/Views/EntityReferenceRelationshipTest.php
@@ -122,12 +122,8 @@ public function testRelationship() {
     $this->executeView($view);
 
     foreach (array_keys($view->result) as $index) {
-      // Check that the actual ID of the entity is the expected one.
+      // Just check that the actual ID of the entity is the expected one.
       $this->assertEqual($view->result[$index]->id, $this->entities[$index + 1]->id());
-
-      // Also check that we have the correct result entity.
-      $this->assertEqual($view->result[$index]->_entity->id(), $this->entities[$index + 1]->id());
-
       // Test the forward relationship.
       // The second and third entity refer to the first one.
       // The value key on the result will be in the format
@@ -145,7 +141,6 @@ public function testRelationship() {
 
     foreach (array_keys($view->result) as $index) {
       $this->assertEqual($view->result[$index]->id, $this->entities[$index + 1]->id());
-      $this->assertEqual($view->result[$index]->_entity->id(), $this->entities[$index + 1]->id());
       // The second and third entity refer to the first one.
       $this->assertEqual($view->result[$index]->entity_test_entity_test__field_test_id, $index == 0 ? NULL : 1);
     }
diff --git a/core/modules/entity_reference/src/Tests/Views/SelectionTest.php b/core/modules/entity_reference/src/Tests/Views/SelectionTest.php
index 26cc00e..60d6f04 100644
--- a/core/modules/entity_reference/src/Tests/Views/SelectionTest.php
+++ b/core/modules/entity_reference/src/Tests/Views/SelectionTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\entity_reference\Tests\Views;
 
 use Drupal\simpletest\WebTestBase;
-use Drupal\views\Views;
 
 /**
  * Tests entity reference selection handler.
@@ -20,33 +19,18 @@ class SelectionTest extends WebTestBase {
   public static $modules = array('node', 'views', 'entity_reference', 'entity_reference_test', 'entity_test');
 
   /**
-   * Nodes for testing.
-   *
-   * @var array
-   */
-  protected $nodes = array();
-
-  /**
-   * The entity reference field to test.
-   *
-   * @var \Drupal\Core\Field\FieldDefinitionInterface
-   */
-  protected $field;
-
-  /**
-   * {@inheritdoc}
+   * Tests the selection handler.
    */
-  public function setUp() {
-    parent::setUp();
-
+  public function testSelectionHandler() {
     // Create nodes.
     $type = $this->drupalCreateContentType()->id();
     $node1 = $this->drupalCreateNode(array('type' => $type));
     $node2 = $this->drupalCreateNode(array('type' => $type));
     $node3 = $this->drupalCreateNode();
 
+    $nodes = array();
     foreach (array($node1, $node2, $node3) as $node) {
-      $this->nodes[$node->getType()][$node->id()] = $node->label();
+      $nodes[$node->getType()][$node->id()] = $node->label();
     }
 
     // Create a field.
@@ -76,72 +60,21 @@ public function setUp() {
       ),
     ));
     $field->save();
-    $this->field = $field;
-  }
 
-  /**
-   * Confirm the expected results are returned.
-   *
-   * @param array $result
-   *   Query results keyed by node type and nid.
-   */
-  protected function assertResults(array $result) {
+    // Get values from selection handler.
+    $handler = $this->container->get('plugin.manager.entity_reference.selection')->getSelectionHandler($field);
+    $result = $handler->getReferenceableEntities();
+
     $success = FALSE;
     foreach ($result as $node_type => $values) {
       foreach ($values as $nid => $label) {
-        if (!$success = $this->nodes[$node_type][$nid] == trim(strip_tags($label))) {
+        if (!$success = $nodes[$node_type][$nid] == trim(strip_tags($label))) {
           // There was some error, so break.
           break;
         }
       }
     }
-    $this->assertTrue($success, 'Views selection handler returned expected values.');
-  }
 
-  /**
-   * Tests the selection handler.
-   */
-  public function testSelectionHandler() {
-    // Get values from selection handler.
-    $handler = $this->container->get('plugin.manager.entity_reference.selection')->getSelectionHandler($this->field);
-    $result = $handler->getReferenceableEntities();
-    $this->assertResults($result);
-  }
-
-  /**
-   * Tests the selection handler with a relationship.
-   */
-  public function testSelectionHandlerRelationship() {
-    // Add a relationship to the view.
-    $view = Views::getView('test_entity_reference');
-    $view->setDisplay();
-    $view->displayHandlers->get('default')->setOption('relationships', array(
-      'test_relationship' => array(
-        'id' => 'uid',
-        'table' => 'users',
-        'field' => 'uid',
-      ),
-    ));
-
-    // Add a filter depending on the relationship to the test view.
-    $view->displayHandlers->get('default')->setOption('filters', array(
-      'uid' => array(
-        'id' => 'uid',
-        'table' => 'users',
-        'field' => 'uid',
-        'relationship' => 'test_relationship',
-      )
-    ));
-
-    // Set view to distinct so only one row per node is returned.
-    $query_options = $view->display_handler->getOption('query');
-    $query_options['options']['distinct'] = TRUE;
-    $view->display_handler->setOption('query', $query_options);
-    $view->save();
-
-    // Get values from the selection handler.
-    $handler = $this->container->get('plugin.manager.entity_reference.selection')->getSelectionHandler($this->field);
-    $result = $handler->getReferenceableEntities();
-    $this->assertResults($result);
+    $this->assertTrue($success, 'Views selection handler returned expected values.');
   }
 }
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 5f95d50..6d1b187 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -64,38 +64,22 @@
 function field_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.field':
-      $field_ui_url = \Drupal::moduleHandler()->moduleExists('field_ui') ? \Drupal::url('help.page', array('name' => 'field_ui')) : '#';
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Field module allows custom data fields to be defined for <em>entity</em> types (see below). The Field module takes care of storing, loading, editing, and rendering field data. Most users will not interact with the Field module directly, but will instead use the <a href="!field-ui-help">Field UI module</a> user interface. Module developers can use the Field API to make new entity types "fieldable" and thus allow fields to be attached to them. For more information, see the <a href="!field">online documentation for the Field module</a>.', array('!field-ui-help' => $field_ui_url, '!field' => 'https://drupal.org/documentation/modules/field')). '</p>';
-      $output .= '<h3>' . t('Terminology') . '</h3>';
-      $output .= '<dl>';
-      $output .= '<dt>' . t('Entities and entity types') . '</dt>';
-      $output .= '<dd>' . t('The website\'s content and configuration is managed using <em>entities</em>, which are grouped into <em>entity types</em>. <em>Content entity types</em> are the entity types for site content (such as the main site content, comments, custom blocks, taxonomy terms, and user accounts). <em>Configuration entity types</em> are used to store configuration information for your site, such as individual views in the Views module, and settings for your main site content types.') . '</dd>';
-      $output .= '<dt>' . t('Entity sub-types') . '</dt>';
-      $output .= '<dd>' . t('Some content entity types are further grouped into sub-types (for example, you could have article and page content types within the main site content entity type, and tag and category vocabularies within the taxonomy term entity type); other entity types, such as user accounts, do not have sub-types. Programmers use the term <em>bundle</em> for entity sub-types.') . '</dd>';
-      $output .= '<dt>' . t('Fields and field types') . '</dt>';
-      $output .= '<dd>' . t('Content entity types and sub-types store most of their text, file, and other information in <em>fields</em>. Fields are grouped by <em>field type</em>; field types define what type of data can be stored in that field, such as text, images, or taxonomy term references.') . '</dd>';
-      $output .= '<dt>' . t('Formatters and view modes') . '</dd>';
-      $output .= '<dd>' . t('Content entity types and sub-types can have one or more <em>view modes</em>, used for displaying the entity items. For instance, a content item could be viewed in full content mode on its own page, teaser mode in a list, or RSS mode in a feed. In each view mode, each field can be hidden or displayed, and if it is displayed, you can choose and configure the <em>formatter</em> that is used to display the field. For instance, a long text field can be displayed trimmed or full-length, and taxonomy term reference fields can be displayed in plain text or linked to the taxonomy term page.') . '</dd>';
-      $output .= '<dt>' . t('Widgets and form modes') . '</dd>';
-      $output .= '<dd>' . t('Content entity types and sub-types can have one or more <em>form modes</em>, used for editing. For instance, a content item could be edited in a compact format with only some fields editable, or a full format that allows all fields to be edited. In each form mode, each field can be hidden or displayed, and if it is displayed, you can choose and configure the <em>widget</em> that is used to edit the field. For instance, a taxonomy term reference field can be edited using a select list, radio buttons, or an autocomplete widget.') . '</dd>';
-      $output .= '</dl>';
+      $output .= '<p>' . t('The Field module allows custom data fields to be defined for <a href="!entity-help"><em>entity</em></a> types (entities include content items, comments, user accounts, and taxonomy terms). The Field module takes care of storing, loading, editing, and rendering field data. Most users will not interact with the Field module directly, but will instead use the <a href="!field-ui-help">Field UI module</a> user interface. Module developers can use the Field API to make new entity types "fieldable" and thus allow fields to be attached to them. For more information, see the <a href="!field">online documentation for the Field module</a>.', array('!entity-help' => \Drupal::url('help.page', array('name' => 'entity')), '!field-ui-help' => \Drupal::url('help.page', array('name' => 'field_ui')), '!field' => 'https://drupal.org/documentation/modules/field')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
-      $output .= '<dt>' . t('Enabling field types, widgets, and formatters') . '</dt>';
-      $output .= '<dd>' . t('The Field module provides the infrastructure for fields; the field types, formatters, and widgets are provided by Drupal core or additional modules. Some of the modules are required; the optional modules can be enabled from the <a href="!modules">Extend administration page</a>. Additional fields, formatters, and widgets may be provided by contributed modules, which you can find in the <a href="!contrib">contributed module section of Drupal.org</a>.', array('!modules' => \Drupal::url('system.modules_list'), '!contrib' => 'https://drupal.org/project/modules'));
+      $output .= '<dt>' . t('Enabling field types') . '</dt>';
+      $output .= '<dd>' . t('The Field module provides the infrastructure for fields and field attachment; the field types and input widgets themselves are provided by additional modules. Some of the modules are required; the optional modules can be enabled from the <a href="!modules">Extend administration page</a>. Additional fields and widgets may be provided by contributed modules, which you can find in the <a href="!contrib">contributed module section of Drupal.org</a>.', array('!modules' => \Drupal::url('system.modules_list'), '!contrib' => 'https://drupal.org/project/modules'));
 
-      // Make a list of all widget, formatter, and field modules currently
-      // enabled, ordered by displayed module name (module names are not
-      // translated).
+      // Make a list of all widget and field modules currently enabled, ordered
+      // by displayed module name (module names are not translated).
       $items = array();
       $info = system_get_info('module');
-      $widgets = \Drupal::service('plugin.manager.field.widget')->getDefinitions();
+      $field_widgets = \Drupal::service('plugin.manager.field.widget')->getDefinitions();
       $field_types = \Drupal::service('plugin.manager.field.field_type')->getUiDefinitions();
-      $formatters = \Drupal::service('plugin.manager.field.formatter')->getDefinitions();
       $providers = array();
-      foreach (array_merge($field_types, $widgets, $formatters) as $plugin) {
+      foreach (array_merge($field_types, $field_widgets) as $plugin) {
         $providers[] = $plugin['provider'];
       }
       $providers = array_unique($providers);
@@ -114,14 +98,13 @@ function field_help($route_name, RouteMatchInterface $route_match) {
         }
       }
       if ($items) {
-        $output .= ' ' . t('Currently enabled field, formatter, and widget modules:');
+        $output .= ' ' . t('Currently enabled field and input widget modules:');
         $item_list = array(
           '#theme' => 'item_list',
           '#items' => $items,
         );
         $output .= drupal_render($item_list);
       }
-      $output .= '</dd></dl>';
       return $output;
   }
 }
diff --git a/core/modules/field/src/Tests/FieldImportChangeTest.php b/core/modules/field/src/Tests/FieldImportChangeTest.php
index f2194f7..af06824 100644
--- a/core/modules/field/src/Tests/FieldImportChangeTest.php
+++ b/core/modules/field/src/Tests/FieldImportChangeTest.php
@@ -19,10 +19,6 @@ class FieldImportChangeTest extends FieldUnitTestBase {
   /**
    * Modules to enable.
    *
-   * The default configuration provided by field_test_config is imported by
-   * \Drupal\field\Tests\FieldUnitTestBase::setUp() when it installs field
-   * configuration.
-   *
    * @var array
    */
   public static $modules = array('field_test_config');
@@ -35,6 +31,8 @@ function testImportChange() {
     $field_id = "entity_test.entity_test.$field_storage_id";
     $field_config_name = "field.field.$field_id";
 
+    // Import default config.
+    $this->installConfig(array('field_test_config'));
     $active = $this->container->get('config.storage');
     $staging = $this->container->get('config.storage.staging');
     $this->copyConfig($active, $staging);
diff --git a/core/modules/field/src/Tests/FieldImportDeleteTest.php b/core/modules/field/src/Tests/FieldImportDeleteTest.php
index 030adfb..802d144 100644
--- a/core/modules/field/src/Tests/FieldImportDeleteTest.php
+++ b/core/modules/field/src/Tests/FieldImportDeleteTest.php
@@ -21,10 +21,6 @@ class FieldImportDeleteTest extends FieldUnitTestBase {
   /**
    * Modules to enable.
    *
-   * The default configuration provided by field_test_config is imported by
-   * \Drupal\field\Tests\FieldUnitTestBase::setUp() when it installs field
-   * configuration.
-   *
    * @var array
    */
   public static $modules = array('field_test_config');
@@ -57,6 +53,9 @@ public function testImportDelete() {
     // Create a second bundle for the 'Entity test' entity type.
     entity_test_create_bundle('test_bundle');
 
+    // Import default config.
+    $this->installConfig(array('field_test_config'));
+
     // Get the uuid's for the field storages.
     $field_storage_uuid = FieldStorageConfig::load($field_storage_id)->uuid();
     $field_storage_uuid_2 = FieldStorageConfig::load($field_storage_id_2)->uuid();
diff --git a/core/modules/field/src/Tests/TranslationTest.php b/core/modules/field/src/Tests/TranslationTest.php
index 4119b88..c03c65f 100644
--- a/core/modules/field/src/Tests/TranslationTest.php
+++ b/core/modules/field/src/Tests/TranslationTest.php
@@ -42,6 +42,7 @@ class TranslationTest extends FieldUnitTestBase {
    */
   protected $entity_type = 'test_entity';
 
+
   /**
    * An array defining the field storage to use in this test.
    *
@@ -70,9 +71,6 @@ class TranslationTest extends FieldUnitTestBase {
    */
   protected $field;
 
-  /**
-   * {@inheritdoc}
-   */
   protected function setUp() {
     parent::setUp();
 
@@ -189,17 +187,4 @@ function testTranslatableFieldSaveLoad() {
     }
   }
 
-  /**
-   * Tests field access.
-   *
-   * Regression test to verify that fieldAccess() can be called while only
-   * passing the required parameters.
-   *
-   * @see https://www.drupal.org/node/2404739
-   */
-  public function testFieldAccess() {
-    $access_control_handler = \Drupal::entityManager()->getAccessControlHandler($this->entity_type);
-    $this->assertTrue($access_control_handler->fieldAccess('view', $this->field));
-  }
-
 }
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index 8864bef..c314a6c 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -24,21 +24,42 @@ function field_ui_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.field_ui':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Field UI module provides an administrative user interface (UI) for managing and displaying fields. Fields can be attached to most content entity sub-types. Different field types, widgets, and formatters are provided by the modules enabled on your site, and managed by the Field module. For background information and terminology related to fields and entities, see the <a href="!field">Field module help page</a>. For more information about the Field UI, see <a href="!field_ui_docs">the online documentation for the Field UI module</a>.', array('!field' => \Drupal::url('help.page', array('name' => 'field')), '!field_ui_docs' => 'https://drupal.org/documentation/modules/field-ui')) . '</p>';
+      $output .= '<p>' . t('The Field UI module provides an administrative user interface (UI) for attaching and managing fields. Fields can be defined at the content-type level for content items and comments, at the vocabulary level for taxonomy terms, and at the site level for user accounts. Other modules may also enable fields to be defined for their data. Field types (text, image, number, etc.) are defined by modules, and collected and managed by the <a href="@field">Field module</a>. For more information, see the online handbook entry for <a href="@field_ui" target="_blank">Field UI module</a>.', array('@field' => \Drupal::url('help.page', array('name' => 'field')), '@field_ui' => 'http://drupal.org/documentation/modules/field-ui')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
-      $output .= '<dt>' . t('Creating a field') . '</dt>';
-      $output .= '<dd>' . t('On the <em>Manage fields</em> page for your entity type or sub-type, you can add, configure, and delete fields for that entity type or sub-type. Each field has a <em>machine name</em>, which is used internally to identify the field and must be unique across an entity type; once a field is created, you cannot change the machine name. Most fields have two types of settings. The field-level settings depend on the field type, and affect how the data in the field is stored. Once they are set, they can no longer be changed; examples include how many data values are allowed for the field and where files are stored. The sub-type-level settings are specific to each entity sub-type the field is used on, and they can be changed later; examples include the field label, help text, default value, and whether the field is required or not. You can return to these settings by choosing the <em>Edit</em> link for the field from the <em>Manage fields</em> page.');
-      $output .= '<dt>' . t('Re-using fields') . '</dt>';
-      $output .= '<dd>' . t('Once you have created a field, you can use it again in other sub-types of the same entity type. For instance, if you create a field for the article content type, you can also use it for the page content type, but you cannot use it for custom blocks or taxonomy terms. If there are fields available for re-use, after clicking <em>Add field</em> from the <em>Manage fields</em> page, you will see a list of available fields for re-use. After selecting a field for re-use, you can configure the sub-type-level settings.') . '</dd>';
-      $output .= '<dt>' . t('Configuring field editing') . '</dt>';
-      $output .= '<dd>' . t('On the <em>Manage form display</em> page of your entity type or sub-type, you can configure how the field data is edited by default and in each form mode. If your entity type has multiple form modes (on most sites, most entities do not), you can toggle between the form modes at the top of the page, and you can toggle whether each form mode uses the default settings or custom settings in the <em>Custom display settings</em> section. For each field in each form mode, you can select the widget to use for editing; some widgets have additional configuration options, such as the size for a text field, and these can be edited using the Edit button (which looks like a wheel). You can also change the order of the fields on the form. You can exclude a field from a form by choosing <em>Hidden</em> from the widget drop-down list, or by dragging it into the <em>Disabled</em> section.') . '</dd>';
-      $output .= '<dt>' . t('Configuring field display') . '</dt>';
-      $output .= '<dd>' . t('On the <em>Manage display</em> page of your entity type or sub-type, you can configure how each field is displayed by default and in each view mode. If your entity type has multiple view modes, you can toggle between the view modes at the top of the page, and you can toggle whether each view mode uses the default settings or custom settings in the <em>Custom display settings</em> section. For each field in each view mode, you can choose whether and how to display the label of the field from the <em>Label</em> drop-down list. You can also select the formatter to use for display; some formatters have configuration options, which you can edit using the Edit button (which looks like a wheel). You can also change the display order of fields. You can exclude a field from a specific view mode by choosing <em>Hidden</em> from the formatter drop-down list, or by dragging it into the <em>Disabled</em> section.') . '</dd>';
-      $output .= '<dt>' . t('Configuring view and form modes') . '</dt>';
-      $output .= '<dd>' . t('You can add, edit, and delete view modes for entities on the <a href="!view_modes">View modes page</a>, and you can add, edit, and delete form modes for entities on the <a href="!form_modes">Form modes page</a>. Once you have defined a view mode or form mode for an entity type, it will be available on the Manage display or Manage form display page for each sub-type of that entity.', array('!view_modes' => \Drupal::url('field_ui.entity_view_mode_list'), '!form_modes' => \Drupal::url('field_ui.entity_form_mode_list'))) . '</dd>';
-      $output .= '<dt>' . t('Listing fields') . '</dt>';
-      $output .= '<dd>' . t('There are two reports available that list the fields defined on your site. The <a href="!entity-list" title="Entities field list report">Entities</a> report lists all your fields, showing the field machine names, types, and the entity types or sub-types they are used on (each sub-type links to the Manage fields page). If the <a href="!views">Views</a> and <a href="!views-ui">Views UI</a> modules are enabled, the <a href="!views-list" title="Used in views field list report">Used in views</a> report lists each field that is used in a view, with a link to edit that view.', array('!entity-list' => \Drupal::url('field_ui.list'), '!views-list' => (\Drupal::moduleHandler()->moduleExists('views_ui')) ? \Drupal::url('views_ui.reports_fields') : '#', '!views' => (\Drupal::moduleHandler()->moduleExists('views')) ? \Drupal::url('help.page', array('name' => 'views')) : '#','!views-ui' => (\Drupal::moduleHandler()->moduleExists('views_ui')) ? \Drupal::url('help.page', array('name' => 'views_ui')) : '#')) . '</dd>';
+      $output .= '<dt>' . t('Planning fields') . '</dt>';
+      $output .= '<dd>' . t('There are several decisions you will need to make before defining a field for content, comments, etc.:') . '<dl>';
+      $output .= '<dt>' . t('What the field will be called') . '</dt>';
+      $output .= '<dd>' . t('A field has a <em>label</em> (the name displayed in the user interface) and a <em>machine name</em> (the name used internally). The label can be changed after you create the field, if needed, but the machine name cannot be changed after you have created the field.') . '</li>';
+      $output .= '<dt>' . t('What type of data the field will store') . '</dt>';
+      $output .= '<dd>' . t('Each field can store one type of data (text, number, file, etc.). When you define a field, you choose a particular <em>field type</em>, which corresponds to the type of data you want to store. The field type cannot be changed after you have created the field.') . '</dd>';
+      $output .= '<dt>' . t('How the data will be input and displayed') . '</dt>';
+      $output .= '<dd>' . t('Each field type has one or more available <em>widgets</em> associated with it; each widget provides a mechanism for data input when you are editing (text box, select list, file upload, etc.). Each field type also has one or more display options, which determine how the field is displayed to site visitors. The widget and display options can be changed after you have created the field.') . '</dd>';
+      $output .= '<dt>' . t('How many values the field will store') . '</dt>';
+      $output .= '<dd>' . t('You can store one value, a specific maximum number of values, or an unlimited number of values in each field. For example, an employee identification number field might store a single number, whereas a phone number field might store multiple phone numbers. This setting can be changed after you have created the field, but if you reduce the maximum number of values, you may lose information.') . '</dd>';
+      $output .= '</dl>';
+      $output .= '<dt>' . t('Reusing fields') . '</dt>';
+      $output .= '<dd>' . t('Once you have defined a field, you can reuse it. For example, if you define a custom image field for one content type, and you need to have an image field with the same parameters on another content type, you can add the same field to the second content type, in the <em>Re-use existing field</em> area of the user interface. You could also add this field to a taxonomy vocabulary, comments, user accounts, etc.') . '</dd>';
+      $output .= '<dd>' . t('Some settings of a reused field are unique to each use of the field; others are shared across all places you use the field. For example, the label of a text field is unique to each use, while the setting for the number of values is shared.') . '</dd>';
+      $output .= '<dd>' . t('There are two main reasons for reusing fields. First, reusing fields can save you time over defining new fields. Second, reusing fields also allows you to display, filter, group, and sort content together by field across content types. For example, the contributed Views module allows you to create lists and tables of content. So if you use the same field on multiple content types, you can create a View containing all of those content types together displaying that field, sorted by that field, and/or filtered by that field.') . '</dd>';
+      if ($module_handler->moduleExists('node')) {
+        $output .= '<dt>' . t('Fields on content items') . '</dt>';
+        $output .= '<dd>' . t('Fields on content items are defined at the content-type level, on the <em>Manage fields</em> tab of the content type edit page (which you can reach from the <a href="@types">Content types page</a>). When you define a field for a content type, each content item of that type will have that field added to it. Some fields, such as the Title and Body, are provided for you when you create a content type, or are provided on content types created by your installation profile.', array('@types' => \Drupal::url('node.overview_types'))) . '</dd>';
+      }
+      if ($module_handler->moduleExists('taxonomy')) {
+        $output .= '<dt>' . t('Fields on taxonomy terms') . '</dt>';
+        $output .= '<dd>' . t('Fields on taxonomy terms are defined at the taxonomy vocabulary level, on the <em>Manage fields</em> tab of the vocabulary edit page (which you can reach from the <a href="@taxonomy">Taxonomy page</a>). When you define a field for a vocabulary, each term in that vocabulary will have that field added to it. For example, you could define an image field for a vocabulary to store an icon with each term.', array('@taxonomy' => \Drupal::url('taxonomy.vocabulary_list'))) . '</dd>';
+      }
+      $output .= '<dt>' . t('Fields on user accounts') . '</dt>';
+      $output .= '<dd>' . t('Fields on user accounts are defined on a site-wide basis on the <a href="@fields">Manage fields tab</a> of the <a href="@accounts">Account settings</a> page. When you define a field for user accounts, each user account will have that field added to it. For example, you could add a long text field to allow users to include a biography.', array('@fields' => \Drupal::url('entity.user.field_ui_fields'), '@accounts' => \Drupal::url('entity.user.admin_form'))) . '</dd>';
+      if ($module_handler->moduleExists('comment')) {
+        $output .= '<dt>' . t('Fields on comments') . '</dt>';
+        $output .= '<dd>' . t('Fields on comments are defined at the comment entity level, on the <em>Manage fields</em> tab of the comment types edit page (which you can reach from the <a href="@types">Comment types page</a>). When you add a field for comments, each comment on an entity with that comment type will have that field added to it. For example, you could add a website field to the comments on forum posts, to allow forum commenters to add a link to their website.', array('@types' => \Drupal::url('comment.type_list'))) . '</dd>';
+      }
+      $output .= '<dt>' . t('Managing view modes') . '</dt>';
+      $output .= '<dd>' . t('Each content entity can have various "modes" for viewing. For instance, a content item could be viewed in full content mode on its own page, teaser mode in a list, or RSS mode in a feed. You can create, edit the names of, and delete view modes on the <a href="!view-modes">View modes page</a>. Once a view mode has been set up, you can choose and format fields for the view mode within each entity sub-type on the Manage display page. See the <a href="!field_ui">Field UI module help page</a> for more information.', array('!view-modes' => \Drupal::url('field_ui.entity_view_mode_list'), '!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')))) . '</dd>';
+      $output .= '<dt>' . t('Managing form modes') . '</dt>';
+      $output .= '<dd>' . t('Each content entity can have various editing forms appropriate for different situations, which are known as "form modes". For instance, you might want to define a quick editing mode that allows users to edit the most important fields, and a full editing mode that gives access to all the fields. You can create, edit the names of, and delete form modes on the <a href="!form-modes">Manage custom form modes page</a>. Once a form mode has been set up, you can choose which fields are available on that form within each entity sub-type on the Manage form display page. See the <a href="!field_ui">Field UI module help page</a> for more information.', array('!form-modes' => \Drupal::url('field_ui.entity_form_mode_list'), '!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')))) . '</dd>';
       $output .= '</dl>';
       return $output;
 
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index d48a407..9438f4a 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -929,7 +929,7 @@ function file_tokens($type, $tokens, array $data = array(), array $options = arr
 
   $url_options = array('absolute' => TRUE);
   if (isset($options['langcode'])) {
-    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
+    $url_options['language'] = language_load($options['langcode']);
     $langcode = $options['langcode'];
   }
   else {
diff --git a/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml b/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml
index 951e4a3..6ed487b 100644
--- a/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml
+++ b/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml
@@ -1,9 +1,6 @@
 langcode: en
 status: true
-dependencies:
-  enforced:
-    module:
-      - forum
+dependencies: {  }
 name: Forums
 vid: forums
 description: 'Forum navigation vocabulary'
diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index dbdbcc8..3f44993 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -46,7 +46,7 @@ function template_preprocess_image_widget(&$variables) {
  *   - item_attributes: An optional associative array of html attributes to be
  *     placed in the img tag.
  *   - image_style: An optional image style.
- *   - url: An optional \Drupal\Core\Url object.
+ *   - path: An optional array containing the link 'path' and link 'options'.
  */
 function template_preprocess_image_formatter(&$variables) {
   if ($variables['image_style']) {
@@ -79,4 +79,14 @@ function template_preprocess_image_formatter(&$variables) {
   foreach (array('width', 'height', 'alt') as $key) {
     $variables['image']["#$key"] = $item->$key;
   }
+
+  // The link path and link options are both optional, but for the options to be
+  // processed, the link path must at least be an empty string.
+  // @todo Add support for route names.
+  $variables['url'] = NULL;
+  if (isset($variables['path']['path'])) {
+    $path = $variables['path']['path'];
+    $options = isset($variables['path']['options']) ? $variables['path']['options'] : array();
+    $variables['url'] = _url($path, $options);
+  }
 }
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index dfa54c6..a408e05 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -139,7 +139,7 @@ function image_theme() {
       'file' => 'image.field.inc',
     ),
     'image_formatter' => array(
-      'variables' => array('item' => NULL, 'item_attributes' => NULL, 'url' => NULL, 'image_style' => NULL),
+      'variables' => array('item' => NULL, 'item_attributes' => NULL, 'path' => NULL, 'image_style' => NULL),
       'file' => 'image.field.inc',
     ),
   );
diff --git a/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php b/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php
index 3b47a3b..e9ab03e 100644
--- a/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php
+++ b/core/modules/image/src/Plugin/Field/FieldFormatter/ImageFormatter.php
@@ -178,14 +178,15 @@ public function settingsSummary() {
    */
   public function viewElements(FieldItemListInterface $items) {
     $elements = array();
-    $url = NULL;
 
     $image_link_setting = $this->getSetting('image_link');
     // Check if the formatter involves a link.
     if ($image_link_setting == 'content') {
       $entity = $items->getEntity();
       if (!$entity->isNew()) {
-        $url = $entity->urlInfo();
+        // @todo Remove when theme_image_formatter() has support for route name.
+        $uri['path'] = $entity->getSystemPath();
+        $uri['options'] = $entity->urlInfo()->getOptions();
       }
     }
     elseif ($image_link_setting == 'file') {
@@ -205,7 +206,10 @@ public function viewElements(FieldItemListInterface $items) {
       if ($item->entity) {
         if (isset($link_file)) {
           $image_uri = $item->entity->getFileUri();
-          $url = Url::fromUri(file_create_url($image_uri));
+          $uri = array(
+            'path' => file_create_url($image_uri),
+            'options' => array(),
+          );
         }
 
         // Extract field item attributes for the theme function, and unset them
@@ -218,7 +222,7 @@ public function viewElements(FieldItemListInterface $items) {
           '#item' => $item,
           '#item_attributes' => $item_attributes,
           '#image_style' => $image_style_setting,
-          '#url' => $url,
+          '#path' => isset($uri) ? $uri : '',
           '#cache' => array(
             'tags' => $cache_tags,
           ),
diff --git a/core/modules/image/src/Tests/ImageThemeFunctionTest.php b/core/modules/image/src/Tests/ImageThemeFunctionTest.php
index d722e77..06e9710 100644
--- a/core/modules/image/src/Tests/ImageThemeFunctionTest.php
+++ b/core/modules/image/src/Tests/ImageThemeFunctionTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\image\Tests;
 
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
-use Drupal\Core\Url;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -87,7 +86,9 @@ function testImageFormatterTheme() {
       '#theme' => 'image_formatter',
       '#image_style' => 'test',
       '#item' => $entity->image_test,
-      '#url' => Url::fromUri('base://' . $path),
+      '#path' => array(
+        'path' => $path,
+      ),
     );
 
     // Test using theme_image_formatter() with a NULL value for the alt option.
@@ -107,14 +108,13 @@ function testImageFormatterTheme() {
     // Link the image to a fragment on the page, and not a full URL.
     $fragment = $this->randomMachineName();
     $element = $base_element;
-    $element['#url'] = Url::fromRoute('<none>', [], ['fragment' => $fragment]);
+    $element['#path']['path'] = '';
+    $element['#path']['options'] = array(
+      'external' => TRUE,
+      'fragment' => $fragment,
+    );
     $this->drupalSetContent(drupal_render($element));
-    $elements = $this->xpath('//a[@href=:fragment]/img[@class="image-style-test" and @src=:url and @width=:width and @height=:height and @alt=""]', array(
-      ':fragment' => '#' . $fragment,
-      ':url' => $url,
-      ':width' => $image->getWidth(),
-      ':height' => $image->getHeight()
-    ));
+    $elements = $this->xpath('//a[@href=:fragment]/img[@class="image-style-test" and @src=:url and @width=:width and @height=:height and @alt=""]', array(':fragment' => '#' . $fragment, ':url' => $url, ':width' => $image->getWidth(), ':height' => $image->getHeight()));
     $this->assertEqual(count($elements), 1, 'theme_image_formatter() correctly renders a link fragment.');
   }
 
diff --git a/core/modules/image/templates/image-formatter.html.twig b/core/modules/image/templates/image-formatter.html.twig
index 63ca3c6..0283fcc 100644
--- a/core/modules/image/templates/image-formatter.html.twig
+++ b/core/modules/image/templates/image-formatter.html.twig
@@ -6,6 +6,7 @@
  * Available variables:
  * - image: A collection of image data.
  * - image_style: An optional image style.
+ * - path: An optional array containing the link 'path' and link 'options'.
  * - url: An optional URL the image can be linked to.
  *
  * @see template_preprocess_image_formatter()
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 89ab28b..d0b9aab 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -511,18 +511,11 @@ function language_field_info_alter(&$info) {
  * Implements hook_entity_field_access()
  */
 function language_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) {
-  // Only allow access to a langcode field if the entity it is attached to is
-  // configured to have an alterable language.
-  // Without items we can not decide whether or not to allow access.
-  if ($items) {
-    // Check if we are dealing with a langcode field.
-    $langcode_key = $items->getEntity()->getEntityType()->getKey('langcode');
-    if ($field_definition->getName() == $langcode_key) {
-      // Grant access depending on whether the entity language can be altered.
-      $entity = $items->getEntity();
-      $config = ContentLanguageSettings::loadByEntityTypeBundle($entity->getEntityTypeId(), $entity->bundle());
-      return AccessResult::forbiddenIf(!$config->isLanguageAlterable());
-    }
+  $langcode_key = $items->getEntity()->getEntityType()->getKey('langcode');
+  if ($field_definition->getName() == $langcode_key) {
+    $entity = $items->getEntity();
+    $config = ContentLanguageSettings::loadByEntityTypeBundle($entity->getEntityTypeId(), $entity->bundle());
+    return AccessResult::forbiddenIf(!$config->isLanguageAlterable());
   }
   return AccessResult::neutral();
 }
diff --git a/core/modules/language/src/Form/LanguageAddForm.php b/core/modules/language/src/Form/LanguageAddForm.php
index f78bb83..93f1445 100644
--- a/core/modules/language/src/Form/LanguageAddForm.php
+++ b/core/modules/language/src/Form/LanguageAddForm.php
@@ -117,7 +117,7 @@ public function validateCustom(array $form, FormStateInterface $form_state) {
       // Reuse the editing form validation routine if we add a custom language.
       $this->validateCommon($form['custom_language'], $form_state);
 
-      if ($language = $this->languageManager->getLanguage($langcode)) {
+      if ($language = language_load($langcode)) {
         $form_state->setErrorByName('langcode', $this->t('The language %language (%langcode) already exists.', array('%language' => $language->getName(), '%langcode' => $langcode)));
       }
     }
@@ -135,7 +135,7 @@ public function validatePredefined($form, FormStateInterface $form_state) {
       $form_state->setErrorByName('predefined_langcode', $this->t('Fill in the language details and save the language with <em>Add custom language</em>.'));
     }
     else {
-      if ($language = $this->languageManager->getLanguage($langcode)) {
+      if ($language = language_load($langcode)) {
         $form_state->setErrorByName('predefined_langcode', $this->t('The language %language (%langcode) already exists.', array('%language' => $language->getName(), '%langcode' => $langcode)));
       }
     }
diff --git a/core/modules/language/src/Form/LanguageDeleteForm.php b/core/modules/language/src/Form/LanguageDeleteForm.php
index 3842372..9f96673 100644
--- a/core/modules/language/src/Form/LanguageDeleteForm.php
+++ b/core/modules/language/src/Form/LanguageDeleteForm.php
@@ -101,7 +101,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $langcode = $this->entity->id();
 
     // Warn and redirect user when attempting to delete the default language.
-    if ($this->languageManager->getDefaultLanguage()->getId() == $langcode) {
+    if (language_default()->getId() == $langcode) {
       drupal_set_message($this->t('The default language cannot be deleted.'));
       $url = $this->urlGenerator->generateFromPath('admin/config/regional/language', array('absolute' => TRUE));
       return new RedirectResponse($url);
diff --git a/core/modules/language/src/LanguageListBuilder.php b/core/modules/language/src/LanguageListBuilder.php
index e392e75..42ec9d3 100644
--- a/core/modules/language/src/LanguageListBuilder.php
+++ b/core/modules/language/src/LanguageListBuilder.php
@@ -9,11 +9,7 @@
 
 use Drupal\Core\Config\Entity\DraggableListBuilder;
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines a class to build a listing of language entities.
@@ -28,39 +24,6 @@ class LanguageListBuilder extends DraggableListBuilder {
   protected $entitiesKey = 'languages';
 
   /**
-   * The language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface
-   */
-  protected $languageManager;
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
-    return new static(
-      $entity_type,
-      $container->get('entity.manager')->getStorage($entity_type->id()),
-      $container->get('language_manager')
-    );
-  }
-
-  /**
-   * Constructs a new EntityListController object.
-   *
-   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
-   *   The entity type definition.
-   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
-   *   The entity storage controller class.
-   * @param \Drupal\Core\Language\LanguageManagerInterface
-   *   The language manager.
-   */
-  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, LanguageManagerInterface $language_manager) {
-    parent::__construct($entity_type, $storage);
-    $this->languageManager = $language_manager;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function load() {
@@ -84,7 +47,7 @@ public function getFormId() {
    */
   public function getDefaultOperations(EntityInterface $entity) {
     $operations = parent::getDefaultOperations($entity);
-    $default = $this->languageManager->getDefaultLanguage();
+    $default = language_default();
 
     // Deleting the site default language is not allowed.
     if ($entity->id() == $default->getId()) {
@@ -126,9 +89,10 @@ public function buildForm(array $form, FormStateInterface $form_state) {
   public function submitForm(array &$form, FormStateInterface $form_state) {
     parent::submitForm($form, $form_state);
 
-    $this->languageManager->reset();
-    if ($this->languageManager instanceof ConfigurableLanguageManagerInterface) {
-      $this->languageManager->updateLockedLanguageWeights();
+    $language_manager = \Drupal::languageManager();
+    $language_manager->reset();
+    if ($language_manager instanceof ConfigurableLanguageManagerInterface) {
+      $language_manager->updateLockedLanguageWeights();
     }
 
     drupal_set_message(t('Configuration saved.'));
diff --git a/core/modules/language/src/Tests/LanguageSwitchingTest.php b/core/modules/language/src/Tests/LanguageSwitchingTest.php
index d0e2a0d..a39da66 100644
--- a/core/modules/language/src/Tests/LanguageSwitchingTest.php
+++ b/core/modules/language/src/Tests/LanguageSwitchingTest.php
@@ -163,6 +163,7 @@ protected function doTestLanguageBlockAnonymous($block_label) {
   /**
    * Test languge switcher links for domain based negotiation
    */
+
   function testLanguageBlockWithDomain() {
     // Add the Italian language.
     ConfigurableLanguage::createFromLangcode('it')->save();
@@ -241,33 +242,6 @@ function testLanguageLinkActiveClass() {
   }
 
   /**
-   * Check the path-admin class, as same as on default language.
-   */
-  function testLanguageBodyClass() {
-    $searched_class = 'path-admin';
-
-    // Add language.
-    $edit = array(
-      'predefined_langcode' => 'fr',
-    );
-    $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language'));
-
-    // Enable URL language detection and selection.
-    $edit = array('language_interface[enabled][language-url]' => '1');
-    $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
-
-    // Go to admin/config, check the class on default language.
-    $this->drupalGet('admin/config');
-    $class = $this->xpath('//body[contains(@class, :class)]', array(':class' => $searched_class));
-    $this->assertTrue(isset($class[0]), t('The path-admin class appears on default language.'));
-
-    // Go to admin/config, check the class on french language.
-    $this->drupalGet('fr/admin/config');
-    $class = $this->xpath('//body[contains(@class, :class)]', array(':class' => $searched_class));
-    $this->assertTrue(isset($class[0]), t('The path-admin class same as on default language.'));
-  }
-
-  /**
    * For authenticated users, the "active" class is set by JavaScript.
    *
    * @see testLanguageLinkActiveClass()
diff --git a/core/modules/locale/css/locale.admin.css b/core/modules/locale/css/locale.admin.css
index 741ab9b..d1ec0a7 100644
--- a/core/modules/locale/css/locale.admin.css
+++ b/core/modules/locale/css/locale.admin.css
@@ -36,6 +36,9 @@
   width: 50%;
   table-layout: fixed;
 }
+.locale-translate-edit-form tr .form-item {
+  white-space: normal;
+}
 .locale-translate-edit-form td {
   vertical-align: top
 }
diff --git a/core/modules/locale/src/Form/LocaleSettingsForm.php b/core/modules/locale/src/Form/LocaleSettingsForm.php
index 64460cc..4ff2c33 100644
--- a/core/modules/locale/src/Form/LocaleSettingsForm.php
+++ b/core/modules/locale/src/Form/LocaleSettingsForm.php
@@ -36,32 +36,32 @@ public function buildForm(array $form, FormStateInterface $form_state) {
 
     $form['update_interval_days'] = array(
       '#type' => 'radios',
-      '#title' => $this->t('Check for updates'),
+      '#title' => t('Check for updates'),
       '#default_value' => $config->get('translation.update_interval_days'),
       '#options' => array(
-        '0' => $this->t('Never (manually)'),
-        '7' => $this->t('Weekly'),
-        '30' => $this->t('Monthly'),
+        '0' => t('Never (manually)'),
+        '7' => t('Weekly'),
+        '30' => t('Monthly'),
       ),
-      '#description' => $this->t('Select how frequently you want to check for new interface translations for your currently installed modules and themes. <a href="@url">Check updates now</a>.', array('@url' => $this->url('locale.check_translation'))),
+      '#description' => t('Select how frequently you want to check for new interface translations for your currently installed modules and themes. <a href="@url">Check updates now</a>.', array('@url' => $this->url('locale.check_translation'))),
     );
 
     if ($directory = $config->get('translation.path')) {
-      $description = $this->t('Translation files are stored locally in the  %path directory. You can change this directory on the <a href="@url">File system</a> configuration page.', array('%path' => $directory, '@url' => $this->url('system.file_system_settings')));
+      $description = t('Translation files are stored locally in the  %path directory. You can change this directory on the <a href="@url">File system</a> configuration page.', array('%path' => $directory, '@url' => $this->url('system.file_system_settings')));
     }
     else {
-      $description = $this->t('Translation files will not be stored locally. Change the Interface translation directory on the <a href="@url">File system configuration</a> page.', array('@url' => $this->url('system.file_system_settings')));
+      $description = t('Translation files will not be stored locally. Change the Interface translation directory on the <a href="@url">File system configuration</a> page.', array('@url' => $this->url('system.file_system_settings')));
     }
     $form['#translation_directory'] = $directory;
     $form['use_source'] = array(
       '#type' => 'radios',
-      '#title' => $this->t('Translation source'),
+      '#title' => t('Translation source'),
       '#default_value' => $config->get('translation.use_source'),
       '#options' => array(
-        LOCALE_TRANSLATION_USE_SOURCE_REMOTE_AND_LOCAL => $this->t('Drupal translation server and local files'),
-        LOCALE_TRANSLATION_USE_SOURCE_LOCAL => $this->t('Local files only'),
+        LOCALE_TRANSLATION_USE_SOURCE_REMOTE_AND_LOCAL => t('Drupal translation server and local files'),
+        LOCALE_TRANSLATION_USE_SOURCE_LOCAL => t('Local files only'),
       ),
-      '#description' => $this->t('The source of translation files for automatic interface translation.') . ' ' . $description,
+      '#description' => t('The source of translation files for automatic interface translation.') . ' ' . $description,
     );
 
     if ($config->get('translation.overwrite_not_customized') == FALSE) {
@@ -75,14 +75,14 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     }
     $form['overwrite'] = array(
       '#type' => 'radios',
-      '#title' => $this->t('Import behavior'),
+      '#title' => t('Import behavior'),
       '#default_value' => $default,
       '#options' => array(
-        LOCALE_TRANSLATION_OVERWRITE_NONE => $this->t("Don't overwrite existing translations."),
-        LOCALE_TRANSLATION_OVERWRITE_NON_CUSTOMIZED => $this->t('Only overwrite imported translations, customized translations are kept.'),
-        LOCALE_TRANSLATION_OVERWRITE_ALL => $this->t('Overwrite existing translations.'),
+        LOCALE_TRANSLATION_OVERWRITE_NONE => t("Don't overwrite existing translations."),
+        LOCALE_TRANSLATION_OVERWRITE_NON_CUSTOMIZED => t('Only overwrite imported translations, customized translations are kept.'),
+        LOCALE_TRANSLATION_OVERWRITE_ALL => t('Overwrite existing translations.'),
       ),
-      '#description' => $this->t('How to treat existing translations when automatically updating the interface translations.'),
+      '#description' => t('How to treat existing translations when automatically updating the interface translations.'),
     );
 
     return parent::buildForm($form, $form_state);
diff --git a/core/modules/locale/src/LocaleConfigManager.php b/core/modules/locale/src/LocaleConfigManager.php
index 23eebdf..7bc846e 100644
--- a/core/modules/locale/src/LocaleConfigManager.php
+++ b/core/modules/locale/src/LocaleConfigManager.php
@@ -117,7 +117,7 @@ public function get($name) {
     $data_definition = $this->typedConfigManager->buildDataDefinition($definition, $data);
     // Unless the configuration has a explicit language code we assume English.
     $langcode = isset($default['langcode']) ? $default['langcode'] : 'en';
-    $wrapper = new LocaleTypedConfig($data_definition, $name, $langcode, $this, $this->typedConfigManager, $this->languageManager);
+    $wrapper = new LocaleTypedConfig($data_definition, $name, $langcode, $this, $this->typedConfigManager);
     $wrapper->setValue($data);
     return $wrapper;
   }
diff --git a/core/modules/locale/src/LocaleTypedConfig.php b/core/modules/locale/src/LocaleTypedConfig.php
index ca31a38..ee0b470 100644
--- a/core/modules/locale/src/LocaleTypedConfig.php
+++ b/core/modules/locale/src/LocaleTypedConfig.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\locale;
 
-use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\TypedData\ContextAwareInterface;
 use Drupal\Core\TypedData\DataDefinitionInterface;
 use Drupal\Core\Config\Schema\Element;
@@ -49,13 +48,6 @@ class LocaleTypedConfig extends Element {
   protected $typedConfigManager;
 
   /**
-   * The language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface
-   */
-  protected $languageManager;
-
-  /**
    * Constructs a configuration wrapper object.
    *
    * @param \Drupal\Core\TypedData\DataDefinitionInterface $definition
@@ -68,15 +60,12 @@ class LocaleTypedConfig extends Element {
    *   The locale configuration manager object.
    * @param \Drupal\locale\TypedConfigManagerInterface $typed_config;
    *   The typed configuration manager interface.
-   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
-   *   The language manager.
    */
-  public function __construct(DataDefinitionInterface $definition, $name, $langcode, LocaleConfigManager $locale_config, TypedConfigManagerInterface $typed_config, LanguageManagerInterface $language_manager) {
+  public function __construct(DataDefinitionInterface $definition, $name, $langcode, LocaleConfigManager $locale_config, TypedConfigManagerInterface $typed_config) {
     parent::__construct($definition, $name);
     $this->langcode = $langcode;
     $this->localeConfig = $locale_config;
     $this->typedConfigManager = $typed_config;
-    $this->languageManager = $language_manager;
   }
 
   /**
@@ -102,7 +91,7 @@ public function getTranslation($langcode) {
    * {@inheritdoc}
    */
   public function language() {
-    return $this->languageManager->getLanguage($this->langcode);
+    return language_load($this->langcode);
   }
 
   /**
diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_node.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_node.yml
index 80a851c..07d37ce 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_node.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_node.yml
@@ -50,6 +50,5 @@ migration_dependencies:
     - d6_node_type
     - d6_node_settings
     - d6_filter_format
-  optional:
     - d6_field_instance_widget_settings
     - d6_field_formatter_settings
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateAggregatorFeedTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateAggregatorFeedTest.php
index 214b0e8..769c994 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateAggregatorFeedTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateAggregatorFeedTest.php
@@ -50,6 +50,7 @@ public function testAggregatorFeedImport() {
     $this->assertEqual($feed->link->value, 'http://knowyourmeme.com');
     $this->assertEqual($feed->description->value, 'New items added to the News Feed');
     $this->assertEqual($feed->image->value, 'http://b.thumbs.redditmedia.com/harEHsUUZVajabtC.png');
+    $this->assertEqual($feed->hash->value, '');
     $this->assertEqual($feed->etag->value, '"213cc1365b96c310e92053c5551f0504"');
     $this->assertEqual($feed->modified->value, 0);
   }
diff --git a/core/modules/migrate_drupal/src/Tests/dependencies/MigrateDependenciesTest.php b/core/modules/migrate_drupal/src/Tests/dependencies/MigrateDependenciesTest.php
index 0e0193d..0fa8353 100644
--- a/core/modules/migrate_drupal/src/Tests/dependencies/MigrateDependenciesTest.php
+++ b/core/modules/migrate_drupal/src/Tests/dependencies/MigrateDependenciesTest.php
@@ -34,6 +34,8 @@ public function testMigrateDependenciesOrder() {
       'd6_node',
       'd6_node_type',
       'd6_node_settings',
+      'd6_field_instance_widget_settings',
+      'd6_field_formatter_settings',
       'd6_filter_format',
       'd6_user',
       'd6_comment_type',
diff --git a/core/modules/node/node.services.yml b/core/modules/node/node.services.yml
index 41a6c37..2586da3 100644
--- a/core/modules/node/node.services.yml
+++ b/core/modules/node/node.services.yml
@@ -5,7 +5,7 @@ services:
       - { name: event_subscriber }
   node.grant_storage:
     class: Drupal\node\NodeGrantDatabaseStorage
-    arguments: ['@database', '@module_handler', '@language_manager']
+    arguments: ['@database', '@module_handler']
     tags:
       - { name: backend_overridable }
   access_check.node.revision:
diff --git a/core/modules/node/src/NodeGrantDatabaseStorage.php b/core/modules/node/src/NodeGrantDatabaseStorage.php
index d9e8d5c..1c0c0f7 100644
--- a/core/modules/node/src/NodeGrantDatabaseStorage.php
+++ b/core/modules/node/src/NodeGrantDatabaseStorage.php
@@ -13,7 +13,6 @@
 use Drupal\Core\Database\Query\Condition;
 use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\user\Entity\User;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -40,26 +39,16 @@ class NodeGrantDatabaseStorage implements NodeGrantDatabaseStorageInterface {
   protected $moduleHandler;
 
   /**
-   * The language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface
-   */
-  protected $languageManager;
-
-  /**
    * Constructs a NodeGrantDatabaseStorage object.
    *
    * @param \Drupal\Core\Database\Connection $database
    *   The database connection.
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler.
-   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
-   *   The language manager.
    */
-  public function __construct(Connection $database, ModuleHandlerInterface $module_handler, LanguageManagerInterface $language_manager) {
+  public function __construct(Connection $database, ModuleHandlerInterface $module_handler) {
     $this->database = $database;
     $this->moduleHandler = $module_handler;
-    $this->languageManager = $language_manager;
   }
 
   /**
@@ -212,7 +201,7 @@ public function write(NodeInterface $node, array $grants, $realm = NULL, $delete
           continue;
         }
         if (isset($grant['langcode'])) {
-          $grant_languages = array($grant['langcode'] => $this->languageManager->getLanguage($grant['langcode']));
+          $grant_languages = array($grant['langcode'] => language_load($grant['langcode']));
         }
         else {
           $grant_languages = $node->getTranslationLanguages(TRUE);
diff --git a/core/modules/node/src/Plugin/Search/NodeSearch.php b/core/modules/node/src/Plugin/Search/NodeSearch.php
index 83140c1..47f1bc9 100644
--- a/core/modules/node/src/Plugin/Search/NodeSearch.php
+++ b/core/modules/node/src/Plugin/Search/NodeSearch.php
@@ -18,7 +18,6 @@
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Access\AccessibleInterface;
 use Drupal\Core\Database\Query\Condition;
@@ -67,13 +66,6 @@ class NodeSearch extends ConfigurableSearchPluginBase implements AccessibleInter
   protected $searchSettings;
 
   /**
-   * The language manager.
-   *
-   * @var \Drupal\Core\Language\LanguageManagerInterface
-   */
-  protected $languageManager;
-
-  /**
    * The Drupal account to use for checking for access to advanced search.
    *
    * @var \Drupal\Core\Session\AccountInterface
@@ -119,7 +111,6 @@ static public function create(ContainerInterface $container, array $configuratio
       $container->get('entity.manager'),
       $container->get('module_handler'),
       $container->get('config.factory')->get('search.settings'),
-      $container->get('language_manager'),
       $container->get('current_user')
     );
   }
@@ -141,17 +132,14 @@ static public function create(ContainerInterface $container, array $configuratio
    *   A module manager object.
    * @param \Drupal\Core\Config\Config $search_settings
    *   A config object for 'search.settings'.
-   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
-   *   The language manager.
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The $account object to use for checking for access to advanced search.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, Connection $database, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, Config $search_settings, LanguageManagerInterface $language_manager, AccountInterface $account = NULL) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, Connection $database, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, Config $search_settings, AccountInterface $account = NULL) {
     $this->database = $database;
     $this->entityManager = $entity_manager;
     $this->moduleHandler = $module_handler;
     $this->searchSettings = $search_settings;
-    $this->languageManager = $language_manager;
     $this->account = $account;
     parent::__construct($configuration, $plugin_id, $plugin_definition);
   }
@@ -314,7 +302,7 @@ protected function prepareResults(StatementInterface $found) {
 
       $extra = $this->moduleHandler->invokeAll('node_search_result', array($node, $item->langcode));
 
-      $language = $this->languageManager->getLanguage($item->langcode);
+      $language = language_load($item->langcode);
       $username = array(
         '#theme' => 'username',
         '#account' => $node->getOwner(),
@@ -498,7 +486,7 @@ public function searchFormAlter(array &$form, FormStateInterface $form_state) {
 
     // Add languages.
     $language_options = array();
-    $language_list = $this->languageManager->getLanguages(LanguageInterface::STATE_ALL);
+    $language_list = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
     foreach ($language_list as $langcode => $language) {
       // Make locked languages appear special in the list.
       $language_options[$langcode] = $language->isLocked() ? t('- @name -', array('@name' => $language->getName())) : $language->getName();
diff --git a/core/modules/node/src/Plugin/views/field/Language.php b/core/modules/node/src/Plugin/views/field/Language.php
index 10acf52..9e55ce9 100644
--- a/core/modules/node/src/Plugin/views/field/Language.php
+++ b/core/modules/node/src/Plugin/views/field/Language.php
@@ -44,7 +44,7 @@ public function render(ResultRow $values) {
     // @todo: Drupal Core dropped native language until config translation is
     // ready, see http://drupal.org/node/1616594.
     $value = $this->getValue($values);
-    $language = \Drupal::languageManager()->getLanguage($value);
+    $language = language_load($value);
     $value = $language ? $language->getName() : '';
     return $this->renderLink($value, $values);
   }
diff --git a/core/modules/node/src/Tests/NodeTranslationUITest.php b/core/modules/node/src/Tests/NodeTranslationUITest.php
index c9014ef..153e87c 100644
--- a/core/modules/node/src/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/src/Tests/NodeTranslationUITest.php
@@ -10,7 +10,6 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\content_translation\Tests\ContentTranslationUITest;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Url;
 
 /**
  * Tests the Node Translation UI.
@@ -93,6 +92,7 @@ protected function getFormSubmitAction(EntityInterface $entity, $langcode) {
    */
   protected function doTestPublishedStatus() {
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
+    $path = $entity->getSystemPath('edit-form');
     $languages = $this->container->get('language_manager')->getLanguages();
 
     $actions = array(
@@ -104,9 +104,7 @@ protected function doTestPublishedStatus() {
       // (Un)publish the node translations and check that the translation
       // statuses are (un)published accordingly.
       foreach ($this->langcodes as $langcode) {
-        $options = array('language' => $languages[$langcode]);
-        $url = $entity->urlInfo('edit-form', $options);
-        $this->drupalPostForm($url, array(), $action . $this->getFormSubmitSuffix($entity, $langcode), $options);
+        $this->drupalPostForm($path, array(), $action . $this->getFormSubmitSuffix($entity, $langcode), array('language' => $languages[$langcode]));
       }
       $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
       foreach ($this->langcodes as $langcode) {
@@ -125,6 +123,7 @@ protected function doTestPublishedStatus() {
    */
   protected function doTestAuthoringInfo() {
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
+    $path = $entity->getSystemPath('edit-form');
     $languages = $this->container->get('language_manager')->getLanguages();
     $values = array();
 
@@ -144,9 +143,7 @@ protected function doTestAuthoringInfo() {
         'sticky[value]' => $values[$langcode]['sticky'],
         'promote[value]' => $values[$langcode]['promote'],
       );
-      $options = array('language' => $languages[$langcode]);
-      $url = $entity->urlInfo('edit-form', $options);
-      $this->drupalPostForm($url, $edit, $this->getFormSubmitAction($entity, $langcode), $options);
+      $this->drupalPostForm($path, $edit, $this->getFormSubmitAction($entity, $langcode), array('language' => $languages[$langcode]));
     }
 
     $entity = entity_load($this->entityTypeId, $this->entityId, TRUE);
@@ -294,7 +291,7 @@ function testTranslationRendering() {
     $this->doTestTranslations('node/' . $node->id(), $values);
 
     // Test that the node page has the correct alternate hreflang links.
-    $this->doTestAlternateHreflangLinks($node->urlInfo());
+    $this->doTestAlternateHreflangLinks('node/' . $node->id());
   }
 
   /**
@@ -316,23 +313,20 @@ protected function doTestTranslations($path, array $values) {
   /**
    * Tests that the given path provides the correct alternate hreflang links.
    *
-   * @param \Drupal\Core\Url $url
+   * @param string $path
    *   The path to be tested.
    */
-  protected function doTestAlternateHreflangLinks(Url $url) {
+  protected function doTestAlternateHreflangLinks($path) {
     $languages = $this->container->get('language_manager')->getLanguages();
-    $url->setAbsolute();
-    $urls = [];
     foreach ($this->langcodes as $langcode) {
-      $language_url = clone $url;
-      $urls[$langcode] = $language_url->setOption('language', $languages[$langcode]);
+      $urls[$langcode] = _url($path, array('absolute' => TRUE, 'language' => $languages[$langcode]));
     }
     foreach ($this->langcodes as $langcode) {
-      $this->drupalGet($urls[$langcode]);
-      foreach ($urls as $alternate_langcode => $language_url) {
+      $this->drupalGet($path, array('language' => $languages[$langcode]));
+      foreach ($urls as $alternate_langcode => $url) {
         // Retrieve desired link elements from the HTML head.
         $links = $this->xpath('head/link[@rel = "alternate" and @href = :href and @hreflang = :hreflang]',
-          array(':href' => $language_url->toString(), ':hreflang' => $alternate_langcode));
+          array(':href' => $url, ':hreflang' => $alternate_langcode));
         $this->assert(isset($links[0]), format_string('The %langcode node translation has the correct alternate hreflang link for %alternate_langcode: %link.', array('%langcode' => $langcode, '%alternate_langcode' => $alternate_langcode, '%link' => $url)));
       }
     }
diff --git a/core/modules/node/src/Tests/NodeViewLanguageTest.php b/core/modules/node/src/Tests/NodeViewLanguageTest.php
index b53f3e5..733b10d 100644
--- a/core/modules/node/src/Tests/NodeViewLanguageTest.php
+++ b/core/modules/node/src/Tests/NodeViewLanguageTest.php
@@ -38,7 +38,7 @@ public function testViewLanguage() {
     // Create a node in Spanish.
     $node = $this->drupalCreateNode(array('langcode' => 'es'));
 
-    $this->drupalGet($node->urlInfo());
+    $this->drupalGet($node->getSystemPath());
     $this->assertText('Spanish','The language field is displayed properly.');
   }
 
diff --git a/core/modules/node/src/Tests/NodeViewTest.php b/core/modules/node/src/Tests/NodeViewTest.php
index 2281dd8..426fec1 100644
--- a/core/modules/node/src/Tests/NodeViewTest.php
+++ b/core/modules/node/src/Tests/NodeViewTest.php
@@ -21,16 +21,16 @@ class NodeViewTest extends NodeTestBase {
   public function testHtmlHeadLinks() {
     $node = $this->drupalCreateNode();
 
-    $this->drupalGet($node->urlInfo());
+    $this->drupalGet($node->getSystemPath());
 
     $result = $this->xpath('//link[@rel = "version-history"]');
-    $this->assertEqual($result[0]['href'], $node->url('version-history'));
+    $this->assertEqual($result[0]['href'], _url("node/{$node->id()}/revisions"));
 
     $result = $this->xpath('//link[@rel = "edit-form"]');
-    $this->assertEqual($result[0]['href'], $node->url('edit-form'));
+    $this->assertEqual($result[0]['href'], _url("node/{$node->id()}/edit"));
 
     $result = $this->xpath('//link[@rel = "canonical"]');
-    $this->assertEqual($result[0]['href'], $node->url());
+    $this->assertEqual($result[0]['href'], _url("node/{$node->id()}"));
   }
 
 }
diff --git a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
index c06271d..cff3fa6 100644
--- a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
+++ b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php
@@ -59,7 +59,7 @@ public function insert() {
     if ($this->alias) {
       $entity = $this->getEntity();
 
-      if ($path = \Drupal::service('path.alias_storage')->save($entity->urlInfo()->getInternalPath(), $this->alias, $this->getLangcode())) {
+      if ($path = \Drupal::service('path.alias_storage')->save($entity->getSystemPath(), $this->alias, $this->getLangcode())) {
         $this->pid = $path['pid'];
       }
     }
@@ -76,7 +76,8 @@ public function update() {
     // Only save a non-empty alias.
     elseif ($this->alias) {
       $entity = $this->getEntity();
-      \Drupal::service('path.alias_storage')->save($entity->urlInfo()->getInternalPath(), $this->alias, $this->getLangcode(), $this->pid);
+
+      \Drupal::service('path.alias_storage')->save($entity->getSystemPath(), $this->alias, $this->getLangcode(), $this->pid);
     }
   }
 
@@ -86,7 +87,7 @@ public function update() {
   public function delete() {
     // Delete all aliases associated with this entity.
     $entity = $this->getEntity();
-    \Drupal::service('path.alias_storage')->delete(array('source' => $entity->urlInfo()->getInternalPath()));
+    \Drupal::service('path.alias_storage')->delete(array('source' => $entity->getSystemPath()));
   }
 
   /**
diff --git a/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php b/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
index 03f15b3..6107b18 100644
--- a/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
+++ b/core/modules/path/src/Plugin/Field/FieldWidget/PathWidget.php
@@ -33,7 +33,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $entity = $items->getEntity();
     $path = array();
     if (!$entity->isNew()) {
-      $conditions = array('source' => $entity->urlInfo()->getInternalPath());
+      $conditions = array('source' => $entity->getSystemPath());
       if ($items->getLangcode() != LanguageInterface::LANGCODE_NOT_SPECIFIED) {
         $conditions['langcode'] = $items->getLangcode();
       }
@@ -44,7 +44,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     }
     $path += array(
       'pid' => NULL,
-      'source' => !$entity->isNew() ? $entity->urlInfo()->getInternalPath() : NULL,
+      'source' => !$entity->isNew() ? $entity->getSystemPath() : NULL,
       'alias' => '',
       'langcode' => $items->getLangcode(),
     );
diff --git a/core/modules/rdf/src/Tests/StandardProfileTest.php b/core/modules/rdf/src/Tests/StandardProfileTest.php
index 6670a07..40b58fb 100644
--- a/core/modules/rdf/src/Tests/StandardProfileTest.php
+++ b/core/modules/rdf/src/Tests/StandardProfileTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\rdf\Tests;
 
-use Drupal\Core\Url;
 use Drupal\node\NodeInterface;
 use Drupal\simpletest\WebTestBase;
 
@@ -201,7 +200,8 @@ public function testRdfaOutput() {
    */
   protected function doFrontPageRdfaTests() {
     // Feed the HTML into the parser.
-    $graph = $this->getRdfGraph(Url::fromRoute('<front>'));
+    $path = 'node';
+    $graph = $this->getRdfGraph($path);
 
     // Ensure that both articles are listed.
     $this->assertEqual(2, count($graph->allOfType('http://schema.org/Article')), 'Two articles found on front page.');
@@ -240,7 +240,7 @@ protected function doFrontPageRdfaTests() {
    */
   protected function doArticleRdfaTests() {
     // Feed the HTML into the parser.
-    $graph = $this->getRdfGraph($this->article->urlInfo());
+    $graph = $this->getRdfGraph($this->article->getSystemPath());
 
     // Type.
     $this->assertEqual($graph->type($this->articleUri), 'schema:Article', 'Article type was found (schema:Article).');
@@ -277,7 +277,7 @@ protected function doPageRdfaTests() {
     $node_type->save();
 
     // Feed the HTML into the parser.
-    $graph = $this->getRdfGraph($this->page->urlInfo());
+    $graph = $this->getRdfGraph($this->page->getSystemPath());
 
     // Type.
     $this->assertEqual($graph->type($this->pageUri), 'schema:WebPage', 'Page type was found (schema:WebPage).');
@@ -293,7 +293,7 @@ protected function doUserRdfaTests() {
     $this->drupalLogin($this->rootUser);
 
     // Feed the HTML into the parser.
-    $graph = $this->getRdfGraph($this->adminUser->urlInfo());
+    $graph = $this->getRdfGraph($this->adminUser->getSystemPath());
 
     // User type.
     $this->assertEqual($graph->type($this->authorUri), 'schema:Person', "User type was found (schema:Person) on user page.");
@@ -313,7 +313,7 @@ protected function doUserRdfaTests() {
    */
   protected function doTermRdfaTests() {
     // Feed the HTML into the parser.
-    $graph = $this->getRdfGraph($this->term->urlInfo());
+    $graph = $this->getRdfGraph($this->term->getSystemPath());
 
     // Term type.
     $this->assertEqual($graph->type($this->termUri), 'schema:Thing', "Term type was found (schema:Thing) on term page.");
@@ -517,16 +517,16 @@ protected function saveComment($nid, $uid, $contact = NULL, $pid = 0) {
   /**
    * Get the EasyRdf_Graph object for a page.
    *
-   * @param \Drupal\Core\Url $url
-   *   The URL object for the page.
+   * @param string $path
+   *   The relative path to the page being tested.
    *
    * @return \EasyRdf_Graph
    *   The RDF graph object.
    */
-  protected function getRdfGraph(Url $url) {
+  protected function getRdfGraph($path) {
     $parser = new \EasyRdf_Parser_Rdfa();
     $graph = new \EasyRdf_Graph();
-    $parser->parse($graph, $this->drupalGet($url), 'rdfa', $this->baseUri);
+    $parser->parse($graph, $this->drupalGet($path), 'rdfa', $this->baseUri);
     return $graph;
   }
 }
diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module
index b02e523..600ce73 100644
--- a/core/modules/responsive_image/responsive_image.module
+++ b/core/modules/responsive_image/responsive_image.module
@@ -31,7 +31,7 @@ function responsive_image_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dt>' . t('Defining responsive image mappings') . '</dt>';
       $output .= '<dd>' . t('By creating responsive image mappings you define the image styles that are being used to output images at certain breakpoints. On the <a href="!responsive_image_mapping">Responsive image mappings</a> page, click <em>Add responsive image mapping</em> to create a new mapping. First chose a label and a breakpoint group and click Save. After that you can choose the image styles that will be used for each breakpoint. Image styles can be defined on the <a href="!image_styles">Image styles page</a> that is provided by the <a href="!image_help">Image module</a>. Breakpoints are defined in the configuration files of the theme. See the <a href="!breakpoint_help">help page of the Breakpoint module</a> for more information.', array('!responsive_image_mapping' => \Drupal::url('responsive_image.mapping_page'), '!image_styles' => \Drupal::url('image.style_list'),'!image_help' => \Drupal::url('help.page', array('name' => 'image')), '!breakpoint_help' => \Drupal::url('help.page', array('name' => 'breakpoint')))) . '</dd>';
       $output .= '<dt>' . t('Using responsive image mappings in Image fields') . '</dt>';
-      $output .= '<dd>' . t('After defining responsive image mappings, you can use them in the display settings for your Image fields, so that the site displays responsive images using the HTML5 picture tag. Open the Manage display page for the entity type (content type, taxonomy vocabulary, etc.) that the Image field is attached to. Choose the format <em>Responsive image</em>, click the Edit icon, and select one of the responsive image mappings that you have created. For general information on how to manage fields and their display see the <a href="!field_ui">Field UI module help page</a>. For background information about entities and fields see the <a href="!field_help">Field module help page</a>.', array('!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')),'!field_help' => \Drupal::url('help.page', array('name' => 'field')))) . '</dd>';
+      $output .= '<dd>' . t('After defining responsive image mappings, you can use them in the display settings for your Image fields, so that the site displays responsive images using the HTML5 picture tag. Open the Manage display page for the entity type (content type, taxonomy vocabulary, etc.) that the Image field is attached to. Choose the format <em>Responsive image</em>, click the Edit icon, and select one of the responsive image mappings that you have created. For general information on how to manage fields and their display see the <a href="!field_ui">help page of the Field UI module</a>. For information about entities see the <a href="!entity_help">help page of the Entity module</a>.', array('!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')),'!entity_help' => \Drupal::url('help.page', array('name' => 'entity')))) . '</dd>';
       $output .= '</dl>';
       break;
 
@@ -88,7 +88,7 @@ function responsive_image_theme() {
     'responsive_image_formatter' => array(
       'variables' => array(
         'item' => NULL,
-        'url' => NULL,
+        'path' => NULL,
         'image_style' => NULL,
         'mapping_id' => array(),
       ),
@@ -125,7 +125,7 @@ function theme_responsive_image_formatter($variables) {
       '#theme' => 'image_formatter',
       '#item' => $item,
       '#image_style' => $variables['image_style'],
-      '#url' => $variables['url'],
+      '#path' => $variables['path'],
     );
     return drupal_render($image_formatter);
   }
diff --git a/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php b/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php
index ed6bcf0..a1308e9 100644
--- a/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php
+++ b/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php
@@ -13,7 +13,6 @@
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Core\Url;
 use Drupal\image\Plugin\Field\FieldFormatter\ImageFormatterBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -174,10 +173,11 @@ public function settingsSummary() {
    */
   public function viewElements(FieldItemListInterface $items) {
     $elements = array();
-    $url = NULL;
     // Check if the formatter involves a link.
     if ($this->getSetting('image_link') == 'content') {
-      $url = $items->getEntity()->urlInfo();
+      $uri = $items->getEntity()->urlInfo();
+      // @todo Remove when theme_responsive_image_formatter() has support for route name.
+      $uri['path'] = $items->getEntity()->getSystemPath();
     }
     elseif ($this->getSetting('image_link') == 'file') {
       $link_file = TRUE;
@@ -214,7 +214,10 @@ public function viewElements(FieldItemListInterface $items) {
 
     foreach ($items as $delta => $item) {
       if (isset($link_file)) {
-        $url = Url::fromUri(file_create_url($item->entity->getFileUri()));
+        $uri = array(
+          'path' => file_create_url($item->entity->getFileUri()),
+          'options' => array(),
+        );
       }
       $elements[$delta] = array(
         '#theme' => 'responsive_image_formatter',
@@ -226,7 +229,7 @@ public function viewElements(FieldItemListInterface $items) {
         '#item' => $item,
         '#image_style' => $fallback_image_style,
         '#mapping_id' => $responsive_image_mapping ? $responsive_image_mapping->id() : '',
-        '#url' => $url,
+        '#path' => isset($uri) ? $uri : '',
         '#cache' => array(
           'tags' => $cache_tags,
         )
diff --git a/core/modules/rest/rest.module b/core/modules/rest/rest.module
index 0f9a3ca..99870fa 100644
--- a/core/modules/rest/rest.module
+++ b/core/modules/rest/rest.module
@@ -15,7 +15,7 @@ function rest_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.rest':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The RESTful Web Services module provides a framework for exposing REST resources on your site. It provides support for content entities (see the <a href="!field">Field module help page</a> for more information about entities) such as content, users, taxonomy terms, etc.; REST support for content items of the Node module is enabled by default, and support for other types of content entities can be enabled. Other modules may add support for other types of REST resources. For more information, see the <a href="!rest">online documentation for the RESTful Web Services module</a>.', array('!rest' => 'https://drupal.org/documentation/modules/rest', '!field' => \Drupal::url('help.page', array('name' => 'field')))) . '</p>';
+      $output .= '<p>' . t('The RESTful Web Services module provides a framework for exposing REST resources on your site. It provides support for content entities (see the <a href="!entity">Entity module help page</a> for more information about entities) such as content, users, taxonomy terms, etc.; REST support for content items of the Node module is enabled by default, and support for other types of content entities can be enabled. Other modules may add support for other types of REST resources. For more information, see the <a href="!rest">online documentation for the RESTful Web Services module</a>.', array('!rest' => 'https://drupal.org/documentation/modules/rest', '!entity' => \Drupal::url('help.page', array('name' => 'entity')))) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Installing supporting modules') . '</dt>';
diff --git a/core/modules/rest/src/Tests/AuthTest.php b/core/modules/rest/src/Tests/AuthTest.php
index c8a8e3b..bf51c00 100644
--- a/core/modules/rest/src/Tests/AuthTest.php
+++ b/core/modules/rest/src/Tests/AuthTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\rest\Tests;
 
-use Drupal\Core\Url;
 use Drupal\rest\Tests\RESTTestBase;
 
 /**
@@ -38,7 +37,7 @@ public function testRead() {
     $entity->save();
 
     // Try to read the resource as an anonymous user, which should not work.
-    $this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
     $this->assertResponse('401', 'HTTP response code is 401 when the request is not authenticated and the user is anonymous.');
     $this->assertRaw(json_encode(['error' => 'A fatal error occurred: No authentication credentials provided.']));
 
@@ -55,7 +54,7 @@ public function testRead() {
 
     // Try to read the resource with session cookie authentication, which is
     // not enabled and should not work.
-    $this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
     $this->assertResponse('401', 'HTTP response code is 401 when the request is authenticated but not authorized.');
 
     // Ensure that cURL settings/headers aren't carried over to next request.
@@ -63,7 +62,7 @@ public function testRead() {
 
     // Now read it with the Basic authentication which is enabled and should
     // work.
-    $this->basicAuthGet($entity->urlInfo(), $account->getUsername(), $account->pass_raw);
+    $this->basicAuthGet($entity->getSystemPath(), $account->getUsername(), $account->pass_raw);
     $this->assertResponse('200', 'HTTP response code is 200 for successfully authorized requests.');
     $this->curlClose();
   }
@@ -74,8 +73,8 @@ public function testRead() {
    * We do not use \Drupal\simpletest\WebTestBase::drupalGet because we need to
    * set curl settings for basic authentication.
    *
-   * @param \Drupal\Core\Url $url
-   *   An Url object.
+   * @param string $path
+   *   The request path.
    * @param string $username
    *   The user name to authenticate with.
    * @param string $password
@@ -84,18 +83,18 @@ public function testRead() {
    * @return string
    *   Curl output.
    */
-  protected function basicAuthGet(Url $url, $username, $password) {
+  protected function basicAuthGet($path, $username, $password) {
     $out = $this->curlExec(
       array(
         CURLOPT_HTTPGET => TRUE,
-        CURLOPT_URL => $url->setAbsolute()->toString(),
+        CURLOPT_URL => _url($path, array('absolute' => TRUE)),
         CURLOPT_NOBODY => FALSE,
         CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
         CURLOPT_USERPWD => $username . ':' . $password,
       )
     );
 
-    $this->verbose('GET request to: ' . $url->toString() .
+    $this->verbose('GET request to: ' . $path .
       '<hr />' . $out);
 
     return $out;
diff --git a/core/modules/rest/src/Tests/DeleteTest.php b/core/modules/rest/src/Tests/DeleteTest.php
index c4c6a90..ada84e2 100644
--- a/core/modules/rest/src/Tests/DeleteTest.php
+++ b/core/modules/rest/src/Tests/DeleteTest.php
@@ -44,7 +44,7 @@ public function testDelete() {
       $entity = $this->entityCreate($entity_type);
       $entity->save();
       // Delete it over the REST API.
-      $response = $this->httpRequest($entity->urlInfo(), 'DELETE');
+      $response = $this->httpRequest($entity->getSystemPath(), 'DELETE');
       // Clear the static cache with entity_load(), otherwise we won't see the
       // update.
       $entity = entity_load($entity_type, $entity->id(), TRUE);
@@ -62,7 +62,7 @@ public function testDelete() {
       // Re-save entity to the database.
       $entity = $this->entityCreate($entity_type);
       $entity->save();
-      $this->httpRequest($entity->urlInfo(), 'DELETE');
+      $this->httpRequest($entity->getSystemPath(), 'DELETE');
       $this->assertResponse(403);
       $this->assertNotIdentical(FALSE, entity_load($entity_type, $entity->id(), TRUE), 'The ' . $entity_type . ' entity is still in the database.');
     }
diff --git a/core/modules/rest/src/Tests/RESTTestBase.php b/core/modules/rest/src/Tests/RESTTestBase.php
index 6f90925..105df19 100644
--- a/core/modules/rest/src/Tests/RESTTestBase.php
+++ b/core/modules/rest/src/Tests/RESTTestBase.php
@@ -8,7 +8,6 @@
 namespace Drupal\rest\Tests;
 
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\Url;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -63,12 +62,12 @@ protected function setUp() {
   /**
    * Helper function to issue a HTTP request with simpletest's cURL.
    *
-   * @param string|\Drupal\Core\Url $url
-   *   A relative URL string or a Url object.
+   * @param string $url
+   *   The relative URL, e.g. "entity/node/1"
    * @param string $method
    *   HTTP method, one of GET, POST, PUT or DELETE.
    * @param array $body
-   *   The body for POST and PUT.
+   *   Either the body for POST and PUT or additional URL parameters for GET.
    * @param string $mime_type
    *   The MIME type of the transmitted content.
    */
@@ -80,22 +79,14 @@ protected function httpRequest($url, $method, $body = NULL, $mime_type = NULL) {
       // GET the CSRF token first for writing requests.
       $token = $this->drupalGet('rest/session/token');
     }
-
-    // Convert to absolute URL.
-    if ($url instanceof Url) {
-      $url = $url->setAbsolute()->toString();
-    }
-    else {
-      $url = _url($url, array('absolute' => TRUE));
-    }
-
     switch ($method) {
       case 'GET':
         // Set query if there are additional GET parameters.
+        $options = isset($body) ? array('absolute' => TRUE, 'query' => $body) : array('absolute' => TRUE);
         $curl_options = array(
           CURLOPT_HTTPGET => TRUE,
           CURLOPT_CUSTOMREQUEST => 'GET',
-          CURLOPT_URL => $url,
+          CURLOPT_URL => _url($url, $options),
           CURLOPT_NOBODY => FALSE,
           CURLOPT_HTTPHEADER => array('Accept: ' . $mime_type),
         );
@@ -106,7 +97,7 @@ protected function httpRequest($url, $method, $body = NULL, $mime_type = NULL) {
           CURLOPT_HTTPGET => FALSE,
           CURLOPT_POST => TRUE,
           CURLOPT_POSTFIELDS => $body,
-          CURLOPT_URL => $url,
+          CURLOPT_URL => _url($url, array('absolute' => TRUE)),
           CURLOPT_NOBODY => FALSE,
           CURLOPT_HTTPHEADER => array(
             'Content-Type: ' . $mime_type,
@@ -120,7 +111,7 @@ protected function httpRequest($url, $method, $body = NULL, $mime_type = NULL) {
           CURLOPT_HTTPGET => FALSE,
           CURLOPT_CUSTOMREQUEST => 'PUT',
           CURLOPT_POSTFIELDS => $body,
-          CURLOPT_URL => $url,
+          CURLOPT_URL => _url($url, array('absolute' => TRUE)),
           CURLOPT_NOBODY => FALSE,
           CURLOPT_HTTPHEADER => array(
             'Content-Type: ' . $mime_type,
@@ -134,7 +125,7 @@ protected function httpRequest($url, $method, $body = NULL, $mime_type = NULL) {
           CURLOPT_HTTPGET => FALSE,
           CURLOPT_CUSTOMREQUEST => 'PATCH',
           CURLOPT_POSTFIELDS => $body,
-          CURLOPT_URL => $url,
+          CURLOPT_URL => _url($url, array('absolute' => TRUE)),
           CURLOPT_NOBODY => FALSE,
           CURLOPT_HTTPHEADER => array(
             'Content-Type: ' . $mime_type,
@@ -147,7 +138,7 @@ protected function httpRequest($url, $method, $body = NULL, $mime_type = NULL) {
         $curl_options = array(
           CURLOPT_HTTPGET => FALSE,
           CURLOPT_CUSTOMREQUEST => 'DELETE',
-          CURLOPT_URL => $url,
+          CURLOPT_URL => _url($url, array('absolute' => TRUE)),
           CURLOPT_NOBODY => FALSE,
           CURLOPT_HTTPHEADER => array('X-CSRF-Token: ' . $token),
         );
diff --git a/core/modules/rest/src/Tests/ReadTest.php b/core/modules/rest/src/Tests/ReadTest.php
index 3152220..8c5a670 100644
--- a/core/modules/rest/src/Tests/ReadTest.php
+++ b/core/modules/rest/src/Tests/ReadTest.php
@@ -44,7 +44,7 @@ public function testRead() {
       $entity = $this->entityCreate($entity_type);
       $entity->save();
       // Read it over the REST API.
-      $response = $this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+      $response = $this->httpRequest($entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
       $this->assertResponse('200', 'HTTP response code is correct.');
       $this->assertHeader('content-type', $this->defaultMimeType);
       $data = Json::decode($response);
@@ -53,7 +53,7 @@ public function testRead() {
       $this->assertEqual($data['uuid'][0]['value'], $entity->uuid(), 'Entity UUID is correct');
 
       // Try to read the entity with an unsupported mime format.
-      $response = $this->httpRequest($entity->urlInfo(), 'GET', NULL, 'application/wrongformat');
+      $response = $this->httpRequest($entity->getSystemPath(), 'GET', NULL, 'application/wrongformat');
       $this->assertResponse(200);
       $this->assertHeader('Content-type', 'text/html; charset=UTF-8');
 
@@ -70,7 +70,7 @@ public function testRead() {
       if ($entity_type == 'entity_test') {
         $entity->field_test_text->value = 'no access value';
         $entity->save();
-        $response = $this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+        $response = $this->httpRequest($entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
         $this->assertResponse(200);
         $this->assertHeader('content-type', $this->defaultMimeType);
         $data = Json::decode($response);
@@ -79,14 +79,14 @@ public function testRead() {
 
       // Try to read an entity without proper permissions.
       $this->drupalLogout();
-      $response = $this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+      $response = $this->httpRequest($entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
       $this->assertResponse(403);
       $this->assertIdentical('{}', $response);
     }
     // Try to read a resource which is not REST API enabled.
     $account = $this->drupalCreateUser();
     $this->drupalLogin($account);
-    $response = $this->httpRequest($account->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+    $response = $this->httpRequest($account->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
     // AcceptHeaderMatcher considers the canonical, non-REST route a match, but
     // a lower quality one: no format restrictions means there's always a match,
     // and hence when there is no matching REST route, the non-REST route is
@@ -114,7 +114,7 @@ public function testResourceStructure() {
     $entity->save();
 
     // Read it over the REST API.
-    $response = $this->httpRequest($entity->urlInfo(), 'GET', NULL, 'application/json');
+    $response = $this->httpRequest($entity->getSystemPath(), 'GET', NULL, 'application/json');
     $this->assertResponse('200', 'HTTP response code is correct.');
   }
 
diff --git a/core/modules/rest/src/Tests/ResourceTest.php b/core/modules/rest/src/Tests/ResourceTest.php
index be02617..6814587 100644
--- a/core/modules/rest/src/Tests/ResourceTest.php
+++ b/core/modules/rest/src/Tests/ResourceTest.php
@@ -55,7 +55,7 @@ public function testFormats() {
     $this->rebuildCache();
 
     // Verify that accessing the resource returns 401.
-    $response = $this->httpRequest($this->entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+    $response = $this->httpRequest($this->entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
     // AcceptHeaderMatcher considers the canonical, non-REST route a match, but
     // a lower quality one: no format restrictions means there's always a match,
     // and hence when there is no matching REST route, the non-REST route is
@@ -84,7 +84,7 @@ public function testAuthentication() {
     $this->rebuildCache();
 
     // Verify that accessing the resource returns 401.
-    $response = $this->httpRequest($this->entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
+    $response = $this->httpRequest($this->entity->getSystemPath(), 'GET', NULL, $this->defaultMimeType);
     // AcceptHeaderMatcher considers the canonical, non-REST route a match, but
     // a lower quality one: no format restrictions means there's always a match,
     // and hence when there is no matching REST route, the non-REST route is
diff --git a/core/modules/rest/src/Tests/UpdateTest.php b/core/modules/rest/src/Tests/UpdateTest.php
index 6046ce9..6f58844 100644
--- a/core/modules/rest/src/Tests/UpdateTest.php
+++ b/core/modules/rest/src/Tests/UpdateTest.php
@@ -57,7 +57,7 @@ public function testPatchUpdate() {
     $serialized = $serializer->serialize($patch_entity, $this->defaultFormat, $context);
 
     // Update the entity over the REST API.
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(204);
 
     // Re-load updated entity from the database.
@@ -69,7 +69,7 @@ public function testPatchUpdate() {
     $normalized = $serializer->normalize($patch_entity, $this->defaultFormat, $context);
     unset($normalized['field_test_text']);
     $serialized = $serializer->encode($normalized, $this->defaultFormat);
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(204);
 
     $entity = entity_load($entity_type, $entity->id(), TRUE);
@@ -80,7 +80,7 @@ public function testPatchUpdate() {
     $serialized = $serializer->encode($normalized, $this->defaultFormat);
 
     // Update the entity over the REST API.
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(204);
 
     // Re-load updated entity from the database.
@@ -94,7 +94,7 @@ public function testPatchUpdate() {
     $entity->save();
 
     // Try to empty a field that is access protected.
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(403);
 
     // Re-load the entity from the database.
@@ -105,7 +105,7 @@ public function testPatchUpdate() {
     $normalized = $serializer->normalize($patch_entity, $this->defaultFormat, $context);
     $normalized['field_test_text'][0]['value'] = 'no access value';
     $serialized = $serializer->serialize($normalized, $this->defaultFormat, $context);
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(403);
 
     // Re-load the entity from the database.
@@ -118,7 +118,7 @@ public function testPatchUpdate() {
       'format' => 'full_html',
     ));
     $serialized = $serializer->serialize($patch_entity, $this->defaultFormat, $context);
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(422);
 
     // Re-load the entity from the database.
@@ -130,7 +130,7 @@ public function testPatchUpdate() {
     $entity->save();
 
     // Try to send no data at all, which does not make sense on PATCH requests.
-    $this->httpRequest($entity->urlInfo(), 'PATCH', NULL, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', NULL, $this->defaultMimeType);
     $this->assertResponse(400);
 
     // Try to update a non-existing entity with ID 9999.
@@ -143,20 +143,20 @@ public function testPatchUpdate() {
     // Send a UUID that is too long.
     $entity->set('uuid', $this->randomMachineName(129));
     $invalid_serialized = $serializer->serialize($entity, $this->defaultFormat, $context);
-    $response = $this->httpRequest($entity->urlInfo(), 'PATCH', $invalid_serialized, $this->defaultMimeType);
+    $response = $this->httpRequest($entity->getSystemPath(), 'PATCH', $invalid_serialized, $this->defaultMimeType);
     $this->assertResponse(422);
     $error = Json::decode($response);
     $this->assertEqual($error['error'], "Unprocessable Entity: validation failed.\nuuid.0.value: <em class=\"placeholder\">UUID</em>: may not be longer than 128 characters.\n");
 
     // Try to update an entity without proper permissions.
     $this->drupalLogout();
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(403);
 
     // Try to update a resource which is not REST API enabled.
     $this->enableService(FALSE);
     $this->drupalLogin($account);
-    $this->httpRequest($entity->urlInfo(), 'PATCH', $serialized, $this->defaultMimeType);
+    $this->httpRequest($entity->getSystemPath(), 'PATCH', $serialized, $this->defaultMimeType);
     $this->assertResponse(405);
   }
 
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index 7b12fbf..8b042af 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -27,7 +27,6 @@
 use Drupal\Core\StreamWrapper\PublicStream;
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\block\Entity\Block;
-use Drupal\Core\Url;
 use Symfony\Component\HttpFoundation\Request;
 use Drupal\user\Entity\Role;
 
@@ -1458,7 +1457,7 @@ protected function isInChildSite() {
   /**
    * Retrieves a Drupal path or an absolute path.
    *
-   * @param \Drupal\Core\Url|string $path
+   * @param $path
    *   Drupal path or URL to load into internal browser
    * @param $options
    *   Options to be forwarded to the url generator.
@@ -1470,13 +1469,11 @@ protected function isInChildSite() {
    *   The retrieved HTML string, also available as $this->getRawContent()
    */
   protected function drupalGet($path, array $options = array(), array $headers = array()) {
-    if ($path instanceof Url) {
-      $url = $path->setAbsolute()->toString();
-    }
+    $options['absolute'] = TRUE;
+
     // The URL generator service is not necessarily available yet; e.g., in
     // interactive installer tests.
-    else if ($this->container->has('url_generator')) {
-      $options['absolute'] = TRUE;
+    if ($this->container->has('url_generator')) {
       $url = $this->container->get('url_generator')->generateFromPath($path, $options);
     }
     else {
@@ -2485,8 +2482,8 @@ protected function drupalSetSettings($settings) {
   /**
    * Passes if the internal browser's URL matches the given path.
    *
-   * @param \Drupal\Core\Url|string $path
-   *   The expected system path or URL.
+   * @param $path
+   *   The expected system path.
    * @param $options
    *   (optional) Any additional options to pass for $path to the url generator.
    * @param $message
@@ -2503,23 +2500,17 @@ protected function drupalSetSettings($settings) {
    *   TRUE on pass, FALSE on fail.
    */
   protected function assertUrl($path, array $options = array(), $message = '', $group = 'Other') {
-    if ($path instanceof Url)  {
-      $url = $path->setAbsolute()->toString();
-    }
-    else {
-      $options['absolute'] = TRUE;
-      $url = $this->container->get('url_generator')->generateFromPath($path, $options);
-    }
     if (!$message) {
       $message = String::format('Expected @url matches current URL (@current_url).', array(
-        '@url' => var_export($url, TRUE),
+        '@url' => var_export($this->container->get('url_generator')->generateFromPath($path, $options), TRUE),
         '@current_url' => $this->getUrl(),
       ));
     }
+    $options['absolute'] = TRUE;
     // Paths in query strings can be encoded or decoded with no functional
     // difference, decode them for comparison purposes.
     $actual_url = urldecode($this->getUrl());
-    $expected_url = urldecode($url);
+    $expected_url = urldecode($this->container->get('url_generator')->generateFromPath($path, $options));
     return $this->assertEqual($actual_url, $expected_url, $message, $group);
   }
 
diff --git a/core/modules/system/css/system.theme.css b/core/modules/system/css/system.theme.css
index 9e54c61..37623e6 100644
--- a/core/modules/system/css/system.theme.css
+++ b/core/modules/system/css/system.theme.css
@@ -50,6 +50,7 @@ tr.odd .form-item,
 tr.even .form-item {
   margin-top: 0;
   margin-bottom: 0;
+  white-space: nowrap;
 }
 .form-composite > .fieldset-wrapper > .description,
 .form-item .description {
diff --git a/core/modules/system/src/Controller/ThemeController.php b/core/modules/system/src/Controller/ThemeController.php
index 7126a7e..26083cb 100644
--- a/core/modules/system/src/Controller/ThemeController.php
+++ b/core/modules/system/src/Controller/ThemeController.php
@@ -8,7 +8,6 @@
 namespace Drupal\system\Controller;
 
 use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Extension\ThemeHandlerInterface;
 use Drupal\Core\Routing\RouteBuilderIndicatorInterface;
@@ -121,28 +120,12 @@ public function install(Request $request) {
     $theme = $request->get('theme');
 
     if (isset($theme)) {
-      try {
-        if ($this->themeHandler->install(array($theme))) {
-          $themes = $this->themeHandler->listInfo();
-          drupal_set_message($this->t('The %theme theme has been installed.', array('%theme' => $themes[$theme]->info['name'])));
-        }
-        else {
-          drupal_set_message($this->t('The %theme theme was not found.', array('%theme' => $theme)), 'error');
-        }
+      if ($this->themeHandler->install(array($theme))) {
+        $themes = $this->themeHandler->listInfo();
+        drupal_set_message($this->t('The %theme theme has been installed.', array('%theme' => $themes[$theme]->info['name'])));
       }
-      catch (PreExistingConfigException $e) {
-        $config_objects = $e->flattenConfigObjects($e->getConfigObjects());
-        drupal_set_message(
-          $this->formatPlural(
-            count($config_objects),
-            'Unable to install @extension, %config_names already exists in active configuration.',
-            'Unable to install @extension, %config_names already exist in active configuration.',
-            array(
-              '%config_names' => implode(', ', $config_objects),
-              '@extension' => $theme,
-            )),
-          'error'
-        );
+      else {
+        drupal_set_message($this->t('The %theme theme was not found.', array('%theme' => $theme)), 'error');
       }
 
       return $this->redirect('system.themes_page');
diff --git a/core/modules/system/src/Form/ModulesListConfirmForm.php b/core/modules/system/src/Form/ModulesListConfirmForm.php
index b3c7977..24f1b4b 100644
--- a/core/modules/system/src/Form/ModulesListConfirmForm.php
+++ b/core/modules/system/src/Form/ModulesListConfirmForm.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\system\Form;
 
-use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Extension\ModuleInstallerInterface;
 use Drupal\Core\Form\ConfirmFormBase;
@@ -158,24 +157,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       // the form doesn't allow modules with unmet dependencies, so the only way
       // this can happen is if the filesystem changed between form display and
       // submit, in which case the user has bigger problems.
-      try {
-        $this->moduleInstaller->install(array_keys($this->modules['install']));
-      }
-      catch (PreExistingConfigException $e) {
-        $config_objects = $e->flattenConfigObjects($e->getConfigObjects());
-        drupal_set_message(
-          $this->formatPlural(
-            count($config_objects),
-            'Unable to install @extension, %config_names already exists in active configuration.',
-            'Unable to install @extension, %config_names already exist in active configuration.',
-            array(
-              '%config_names' => implode(', ', $config_objects),
-              '@extension' => $this->modules['install'][$e->getExtension()]
-            )),
-          'error'
-        );
-        return;
-      }
+      $this->moduleInstaller->install(array_keys($this->modules['install']));
     }
 
     // Gets module list after install process, flushes caches and displays a
diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php
index 2e80482..2486ca4 100644
--- a/core/modules/system/src/Form/ModulesListForm.php
+++ b/core/modules/system/src/Form/ModulesListForm.php
@@ -9,7 +9,6 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Controller\TitleResolverInterface;
 use Drupal\Core\Access\AccessManagerInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
@@ -518,24 +517,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
 
     // There seem to be no dependencies that would need approval.
     if (!empty($modules['install'])) {
-      try {
-        $this->moduleInstaller->install(array_keys($modules['install']));
-      }
-      catch (PreExistingConfigException $e) {
-        $config_objects = $e->flattenConfigObjects($e->getConfigObjects());
-        drupal_set_message(
-          $this->formatPlural(
-            count($config_objects),
-            'Unable to install @extension, %config_names already exists in active configuration.',
-            'Unable to install @extension, %config_names already exist in active configuration.',
-            array(
-              '%config_names' => implode(', ', $config_objects),
-              '@extension' => $modules['install'][$e->getExtension()]
-            )),
-          'error'
-        );
-        return;
-      }
+      $this->moduleInstaller->install(array_keys($modules['install']));
     }
 
     // Gets module list after install process, flushes caches and displays a
diff --git a/core/modules/system/src/Tests/Cache/PageCacheTagsTestBase.php b/core/modules/system/src/Tests/Cache/PageCacheTagsTestBase.php
index f438533..864fd93 100644
--- a/core/modules/system/src/Tests/Cache/PageCacheTagsTestBase.php
+++ b/core/modules/system/src/Tests/Cache/PageCacheTagsTestBase.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\system\Tests\Cache;
 
-use Drupal\Component\Utility\UrlHelper;
 use Drupal\simpletest\WebTestBase;
 use Drupal\Component\Utility\String;
 
@@ -54,8 +53,7 @@ protected function verifyPageCache($path, $hit_or_miss, $tags = FALSE) {
     $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), $hit_or_miss, $message);
 
     if ($hit_or_miss === 'HIT' && is_array($tags)) {
-      $absolute_url = UrlHelper::isExternal($path) ? $path : _url($path, array('absolute' => TRUE));
-      $cid_parts = array($absolute_url, 'html');
+      $cid_parts = array(_url($path, array('absolute' => TRUE)), 'html');
       $cid = implode(':', $cid_parts);
       $cache_entry = \Drupal::cache('render')->get($cid);
       sort($cache_entry->tags);
diff --git a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
index ccdabad..658136c 100644
--- a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
@@ -277,8 +277,8 @@ protected function createReferenceTestEntities($referenced_entity) {
    */
   public function testReferencedEntity() {
     $entity_type = $this->entity->getEntityTypeId();
-    $referencing_entity_path = $this->referencing_entity->url('canonical', array('absolute' => TRUE));
-    $non_referencing_entity_path = $this->non_referencing_entity->url('canonical', array('absolute' => TRUE));
+    $referencing_entity_path = $this->referencing_entity->getSystemPath();
+    $non_referencing_entity_path = $this->non_referencing_entity->getSystemPath();
     $listing_path = 'entity_test/list/' . $entity_type . '_reference/' . $entity_type . '/' . $this->entity->id();
     $empty_entity_listing_path = 'entity_test/list_empty/' . $entity_type;
     $nonempty_entity_listing_path = 'entity_test/list_labels_alphabetically/' . $entity_type;
diff --git a/core/modules/system/src/Tests/Entity/EntityWithUriCacheTagsTestBase.php b/core/modules/system/src/Tests/Entity/EntityWithUriCacheTagsTestBase.php
index bbc240c..45dfcf5 100644
--- a/core/modules/system/src/Tests/Entity/EntityWithUriCacheTagsTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityWithUriCacheTagsTestBase.php
@@ -24,7 +24,7 @@
    * - "<entity_type>:<entity ID>"
    */
   public function testEntityUri() {
-    $entity_url = $this->entity->urlInfo()->setAbsolute()->toString();
+    $entity_path = $this->entity->getSystemPath();
     $entity_type = $this->entity->getEntityTypeId();
 
     // Selects the view mode that will be used.
@@ -37,10 +37,10 @@ public function testEntityUri() {
 
 
     $this->pass("Test entity.", 'Debug');
-    $this->verifyPageCache($entity_url, 'MISS');
+    $this->verifyPageCache($entity_path, 'MISS');
 
     // Verify a cache hit, but also the presence of the correct cache tags.
-    $this->verifyPageCache($entity_url, 'HIT');
+    $this->verifyPageCache($entity_path, 'HIT');
 
     // Also verify the existence of an entity render cache entry, if this entity
     // type supports render caching.
@@ -54,20 +54,20 @@ public function testEntityUri() {
     // Verify that after modifying the entity, there is a cache miss.
     $this->pass("Test modification of entity.", 'Debug');
     $this->entity->save();
-    $this->verifyPageCache($entity_url, 'MISS');
+    $this->verifyPageCache($entity_path, 'MISS');
 
     // Verify a cache hit.
-    $this->verifyPageCache($entity_url, 'HIT');
+    $this->verifyPageCache($entity_path, 'HIT');
 
 
     // Verify that after modifying the entity's display, there is a cache miss.
     $this->pass("Test modification of entity's '$view_mode' display.", 'Debug');
     $entity_display = entity_get_display($entity_type, $this->entity->bundle(), $view_mode);
     $entity_display->save();
-    $this->verifyPageCache($entity_url, 'MISS');
+    $this->verifyPageCache($entity_path, 'MISS');
 
     // Verify a cache hit.
-    $this->verifyPageCache($entity_url, 'HIT');
+    $this->verifyPageCache($entity_path, 'HIT');
 
 
     $bundle_entity_type = $this->entity->getEntityType()->getBundleEntityType();
@@ -77,10 +77,10 @@ public function testEntityUri() {
       $this->pass("Test modification of entity's bundle entity.", 'Debug');
       $bundle_entity = entity_load($bundle_entity_type, $this->entity->bundle());
       $bundle_entity->save();
-      $this->verifyPageCache($entity_url, 'MISS');
+      $this->verifyPageCache($entity_path, 'MISS');
 
       // Verify a cache hit.
-      $this->verifyPageCache($entity_url, 'HIT');
+      $this->verifyPageCache($entity_path, 'HIT');
     }
 
 
@@ -91,10 +91,10 @@ public function testEntityUri() {
       $field_storage_name = $this->entity->getEntityTypeId() . '.configurable_field';
       $field_storage = FieldStorageConfig::load($field_storage_name);
       $field_storage->save();
-      $this->verifyPageCache($entity_url, 'MISS');
+      $this->verifyPageCache($entity_path, 'MISS');
 
       // Verify a cache hit.
-      $this->verifyPageCache($entity_url, 'HIT');
+      $this->verifyPageCache($entity_path, 'HIT');
 
       // Verify that after modifying a configurable field on the entity, there
       // is a cache miss.
@@ -102,10 +102,10 @@ public function testEntityUri() {
       $field_name = $this->entity->getEntityTypeId() . '.' . $this->entity->bundle() . '.configurable_field';
       $field = FieldConfig::load($field_name);
       $field->save();
-      $this->verifyPageCache($entity_url, 'MISS');
+      $this->verifyPageCache($entity_path, 'MISS');
 
       // Verify a cache hit.
-      $this->verifyPageCache($entity_url, 'HIT');
+      $this->verifyPageCache($entity_path, 'HIT');
     }
 
 
@@ -113,26 +113,26 @@ public function testEntityUri() {
     // a cache miss.
     $this->pass("Test invalidation of entity's cache tag.", 'Debug');
     Cache::invalidateTags($this->entity->getCacheTags());
-    $this->verifyPageCache($entity_url, 'MISS');
+    $this->verifyPageCache($entity_path, 'MISS');
 
     // Verify a cache hit.
-    $this->verifyPageCache($entity_url, 'HIT');
+    $this->verifyPageCache($entity_path, 'HIT');
 
 
     // Verify that after invalidating the generic entity type's view cache tag
     // directly, there is a cache miss.
     $this->pass("Test invalidation of entity's 'view' cache tag.", 'Debug');
     Cache::invalidateTags($view_cache_tag);
-    $this->verifyPageCache($entity_url, 'MISS');
+    $this->verifyPageCache($entity_path, 'MISS');
 
     // Verify a cache hit.
-    $this->verifyPageCache($entity_url, 'HIT');
+    $this->verifyPageCache($entity_path, 'HIT');
 
 
     // Verify that after deleting the entity, there is a cache miss.
     $this->pass('Test deletion of entity.', 'Debug');
     $this->entity->delete();
-    $this->verifyPageCache($entity_url, 'MISS');
+    $this->verifyPageCache($entity_path, 'MISS');
     $this->assertResponse(404);
   }
 
diff --git a/core/modules/system/src/Tests/Installer/InstallerTest.php b/core/modules/system/src/Tests/Installer/InstallerTest.php
index b17e3e7..ee53a4e 100644
--- a/core/modules/system/src/Tests/Installer/InstallerTest.php
+++ b/core/modules/system/src/Tests/Installer/InstallerTest.php
@@ -39,7 +39,7 @@ protected function setUpLanguage() {
     // Test that \Drupal\Core\Render\BareHtmlPageRenderer adds assets and
     // metatags as expected to the first page of the installer.
     $this->assertRaw('core/themes/seven/css/components/buttons.css');
-    $this->assertRaw('<meta charset="utf-8" />');
+    $this->assertRaw('<meta name="charset" charset="utf-8" />');
     parent::setUpLanguage();
   }
 }
diff --git a/core/modules/system/src/Tests/KeyValueStore/KeyValueContentEntityStorageTest.php b/core/modules/system/src/Tests/KeyValueStore/KeyValueContentEntityStorageTest.php
index 66fd3c2..6ab645f 100644
--- a/core/modules/system/src/Tests/KeyValueStore/KeyValueContentEntityStorageTest.php
+++ b/core/modules/system/src/Tests/KeyValueStore/KeyValueContentEntityStorageTest.php
@@ -37,7 +37,7 @@ protected function setUp() {
    * Tests CRUD operations.
    */
   function testCRUD() {
-    $default_langcode = \Drupal::languageManager()->getDefaultLanguage()->getId();
+    $default_langcode = language_default()->getId();
     // Verify default properties on a newly created empty entity.
     $empty = entity_create('entity_test_label');
     $this->assertIdentical($empty->id->value, NULL);
diff --git a/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php b/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php
index a21a0db..737a362 100644
--- a/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php
+++ b/core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php
@@ -19,8 +19,8 @@
   /**
    * Assert that a given path shows certain breadcrumb links.
    *
-   * @param \Drupal\Core\Url|string $goto
-   *   (optional) A path or URL to pass to
+   * @param string $goto
+   *   (optional) A system path to pass to
    *   Drupal\simpletest\WebTestBase::drupalGet().
    * @param array $trail
    *   An associative array whose keys are expected breadcrumb link paths and
@@ -68,9 +68,7 @@ protected function assertBreadcrumbParts($trail) {
     // this test would go into an infinite loop, so we need to check that too.
     while ($trail && !empty($parts)) {
       foreach ($trail as $path => $title) {
-        // If the path is empty or does not start with a leading /, assume it
-        // is an internal path that needs to be passed through _url().
-        $url = $path == '' || $path[0] != '/' ? _url($path) : $path;
+        $url = _url($path);
         $part = array_shift($parts);
         $pass = ($pass && $part['href'] === $url && $part['text'] === String::checkPlain($title));
       }
diff --git a/core/modules/system/src/Tests/Page/DefaultMetatagsTest.php b/core/modules/system/src/Tests/Page/DefaultMetatagsTest.php
index beb43c0..5739137 100644
--- a/core/modules/system/src/Tests/Page/DefaultMetatagsTest.php
+++ b/core/modules/system/src/Tests/Page/DefaultMetatagsTest.php
@@ -22,11 +22,12 @@ class DefaultMetatagsTest extends WebTestBase {
   public function testMetaTag() {
     $this->drupalGet('');
     // Ensures that the charset metatag is on the page.
-    $result = $this->xpath('//meta[@charset="utf-8"]');
+    $result = $this->xpath('//meta[@name="charset" and @charset="utf-8"]');
     $this->assertEqual(count($result), 1);
 
     // Ensure that the charset one is the first metatag.
     $result = $this->xpath('//meta');
+    $this->assertEqual((string) $result[0]->attributes()->name, 'charset');
     $this->assertEqual((string) $result[0]->attributes()->charset, 'utf-8');
 
     // Ensure that the shortcut icon is on the page.
diff --git a/core/modules/system/src/Tests/Pager/PagerTest.php b/core/modules/system/src/Tests/Pager/PagerTest.php
index 6595de3..7076291 100644
--- a/core/modules/system/src/Tests/Pager/PagerTest.php
+++ b/core/modules/system/src/Tests/Pager/PagerTest.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\system\Tests\Pager\PagerTest.
+ * Definition of Drupal\system\Tests\Pager\PagerTest.
  */
 
 namespace Drupal\system\Tests\Pager;
@@ -21,7 +21,7 @@ class PagerTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('dblog', 'pager_test');
+  public static $modules = array('dblog');
 
   protected $profile = 'testing';
 
@@ -63,25 +63,6 @@ function testActiveClass() {
   }
 
   /**
-   * Test proper functioning of the query parameters.
-   */
-  protected function testPagerQueryParameters() {
-    // First page.
-    $this->drupalGet('pager-test/query-parameters');
-    $this->assertText(t('Pager calls: 0'), 'Initial call to pager shows 0 calls.');
-
-    // Go to last page, the count of pager calls need to go to 1.
-    $elements = $this->xpath('//li[contains(@class, :class)]/a', array(':class' => 'pager__item--last'));
-    $this->drupalGet($GLOBALS['base_root'] . $elements[0]['href'], array('external' => TRUE));
-    $this->assertText(t('Pager calls: 1'), 'First link call to pager shows 1 calls.');
-
-    // Go back to first page, the count of pager calls need to go to 2.
-    $elements = $this->xpath('//li[contains(@class, :class)]/a', array(':class' => 'pager__item--first'));
-    $this->drupalGet($GLOBALS['base_root'] . $elements[0]['href'], array('external' => TRUE));
-    $this->assertText(t('Pager calls: 2'), 'Second link call to pager shows 2 calls.');
-  }
-
-  /**
    * Asserts pager items and links.
    *
    * @param int $current_page
diff --git a/core/modules/system/src/Tests/Theme/TwigEnvironmentTest.php b/core/modules/system/src/Tests/Theme/TwigEnvironmentTest.php
index 8edb4b2..6ecabec 100644
--- a/core/modules/system/src/Tests/Theme/TwigEnvironmentTest.php
+++ b/core/modules/system/src/Tests/Theme/TwigEnvironmentTest.php
@@ -33,7 +33,7 @@ public function testInlineTemplate() {
     /** @var \Drupal\Core\Template\TwigEnvironment $environment */
     $environment = \Drupal::service('twig');
     $this->assertEqual($environment->renderInline('test-no-context'), 'test-no-context');
-    $this->assertEqual($environment->renderInline('test-with-context {{ llama }}', array('llama' => 'muuh')), 'test-with-context muuh');
+    $this->assertEqual($environment->renderInline('test-with-context {{ lama }}', array('lama' => 'muuh')), 'test-with-context muuh');
 
     $element = array();
     $unsafe_string = '<script>alert(\'Danger! High voltage!\');</script>';
@@ -56,8 +56,8 @@ public function testInlineTemplate() {
     $element = array();
     $element['test'] = array(
       '#type' => 'inline_template',
-      '#template' => 'test-with-context {{ llama }}',
-      '#context' => array('llama' => 'muuh'),
+      '#template' => 'test-with-context {{ lama }}',
+      '#context' => array('lama' => 'muuh'),
     );
     $element_copy = $element;
     // Render it twice so that twig caching is triggered.
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 7167fcb..66ffff9 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -535,7 +535,7 @@ function hook_tokens($type, $tokens, array $data = array(), array $options = arr
 
   $url_options = array('absolute' => TRUE);
   if (isset($options['langcode'])) {
-    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
+    $url_options['language'] = language_load($options['langcode']);
     $langcode = $options['langcode'];
   }
   else {
@@ -608,7 +608,7 @@ function hook_tokens_alter(array &$replacements, array $context) {
   $options = $context['options'];
 
   if (isset($options['langcode'])) {
-    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
+    $url_options['language'] = language_load($options['langcode']);
     $langcode = $options['langcode'];
   }
   else {
diff --git a/core/modules/system/system.links.menu.yml b/core/modules/system/system.links.menu.yml
index 9563f83..1a0028f 100644
--- a/core/modules/system/system.links.menu.yml
+++ b/core/modules/system/system.links.menu.yml
@@ -115,7 +115,7 @@ system.admin_config_system:
 system.site_information_settings:
   title: 'Site information'
   parent: system.admin_config_system
-  description: 'Change site name, email address, slogan, default front page, and error pages.'
+  description: 'Change site name, email address, slogan, default front page, and number of posts per page, error pages.'
   route_name: system.site_information_settings
   weight: -20
 system.cron_settings:
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 7c67714..255449e 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -551,6 +551,7 @@ function system_page_attachments(array &$page) {
     'system_meta_content_type' => array(
       '#tag' => 'meta',
       '#attributes' => array(
+        'name' => 'charset',
         'charset' => 'utf-8',
       ),
       // Security: This always has to be output first.
diff --git a/core/modules/system/system.tokens.inc b/core/modules/system/system.tokens.inc
index 9e9d03d..ff78335 100644
--- a/core/modules/system/system.tokens.inc
+++ b/core/modules/system/system.tokens.inc
@@ -92,7 +92,7 @@ function system_tokens($type, $tokens, array $data = array(), array $options = a
 
   $url_options = array('absolute' => TRUE);
   if (isset($options['langcode'])) {
-    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
+    $url_options['language'] = language_load($options['langcode']);
     $langcode = $options['langcode'];
   }
   else {
diff --git a/core/modules/system/tests/modules/pager_test/pager_test.info.yml b/core/modules/system/tests/modules/pager_test/pager_test.info.yml
deleted file mode 100644
index 54a4a40..0000000
--- a/core/modules/system/tests/modules/pager_test/pager_test.info.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-type: module
-core: 8.x
-name: 'Pager Test'
-description: 'Support module for pager tests.'
-package: Testing
-version: VERSION
diff --git a/core/modules/system/tests/modules/pager_test/pager_test.routing.yml b/core/modules/system/tests/modules/pager_test/pager_test.routing.yml
deleted file mode 100644
index 9720507..0000000
--- a/core/modules/system/tests/modules/pager_test/pager_test.routing.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-pager_test.query_parameters:
-  path: '/pager-test/query-parameters'
-  defaults:
-    _title: 'Pager using query parameters for testing'
-    _controller: '\Drupal\pager_test\Controller\PagerTestController::queryParameters'
-  requirements:
-    _access: 'TRUE'
diff --git a/core/modules/system/tests/modules/pager_test/src/Controller/PagerTestController.php b/core/modules/system/tests/modules/pager_test/src/Controller/PagerTestController.php
deleted file mode 100644
index 3a22070..0000000
--- a/core/modules/system/tests/modules/pager_test/src/Controller/PagerTestController.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\pager_test\Controller\PagerTestController.
- */
-
-namespace Drupal\pager_test\Controller;
-
-use Drupal\Core\Controller\ControllerBase;
-
-/**
- * Controller routine for testing the pager.
- */
-class PagerTestController extends ControllerBase {
-
-  /**
-   * Returns a pager with 'parameters' variable.
-   *
-   * The 'pager_calls' parameter counts the calls to the pager, subsequent
-   * to the initial call.
-   */
-  public function queryParameters() {
-
-    // Example query.
-    $header_0 = array(
-      array('data' => 'wid'),
-      array('data' => 'type'),
-      array('data' => 'timestamp'),
-    );
-    $query_0 = db_select('watchdog', 'd')->extend('Drupal\Core\Database\Query\PagerSelectExtender')->element(0);
-    $query_0->fields('d', array('wid', 'type', 'timestamp'));
-    $result_0 = $query_0
-      ->limit(5)
-      ->orderBy('d.wid')
-      ->execute();
-    $rows_0 = array();
-    foreach ($result_0 as $row) {
-      $rows_0[] = array('data' => (array) $row);
-    }
-    $build['pager_table_0'] = array(
-      '#theme' => 'table',
-      '#header' => $header_0,
-      '#rows' => $rows_0,
-      '#empty' => $this->t("There are no watchdog records found in the db"),
-    );
-
-    // Counter of calls to the current pager.
-    $query_params = pager_get_query_parameters();
-    $pager_calls = isset($query_params['pager_calls']) ? ($query_params['pager_calls'] ? $query_params['pager_calls'] : 0) : 0;
-    $build['l_pager_pager_0'] = array('#markup' => $this->t('Pager calls: @pager_calls', array('@pager_calls' => $pager_calls)));
-
-    // Pager.
-    $build['pager_pager_0'] = array(
-      '#theme' => 'pager',
-      '#element' => 0,
-      '#parameters' => array(
-        'pager_calls' => ++$pager_calls,
-      ),
-    );
-
-    return $build;
-  }
-}
diff --git a/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php b/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php
index abaaa4c..9deae9f 100644
--- a/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php
+++ b/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php
@@ -16,7 +16,6 @@
  * Controller providing page callbacks for the action admin interface.
  */
 class SessionTestController extends ControllerBase {
-
   /**
    * Prints the stored session value to the screen.
    *
@@ -124,5 +123,4 @@ public function setMessageButDontSave() {
   public function isLoggedIn() {
     return ['#markup' => $this->t('User is logged in.')];
   }
-
 }
diff --git a/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php b/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php
index 335ed83..cf42211 100644
--- a/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php
+++ b/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php
@@ -63,8 +63,8 @@ public function testInlineTemplate() {
     $element = array();
     $element['test'] = array(
       '#type' => 'inline_template',
-      '#template' => 'test-with-context {{ llama }}',
-      '#context' => array('llama' => 'muuh'),
+      '#template' => 'test-with-context {{ lama }}',
+      '#context' => array('lama' => 'muuh'),
     );
     return $element;
   }
diff --git a/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php b/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php
index 4a935c4..e813ced 100644
--- a/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php
+++ b/core/modules/taxonomy/src/Tests/TaxonomyTranslationTestTrait.php
@@ -55,7 +55,6 @@
    */
   protected function setupLanguages() {
     ConfigurableLanguage::createFromLangcode($this->translateToLangcode)->save();
-    $this->rebuildContainer();
   }
 
   /**
diff --git a/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php b/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php
index 0da6816..903e651 100644
--- a/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php
+++ b/core/modules/taxonomy/src/Tests/TermTranslationBreadcrumbTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\taxonomy\Tests;
 
-use Drupal\Core\Url;
 use Drupal\system\Tests\Menu\AssertBreadcrumbTrait;
 
 /**
@@ -60,32 +59,31 @@ protected function setUp() {
    */
   public function testTranslatedBreadcrumbs() {
     // Ensure non-translated breadcrumb is correct.
-    $breadcrumb = array(Url::fromRoute('<front>')->toString() => 'Home');
+    $breadcrumb = array('' => 'Home');
     foreach ($this->terms as $term) {
-      $breadcrumb[$term->url()] = $term->label();
+      $breadcrumb[$term->getSystemPath()] = $term->label();
     }
     // The last item will not be in the breadcrumb.
     array_pop($breadcrumb);
 
     // Check the breadcrumb on the leaf term page.
     $term = $this->getLeafTerm();
-    $this->assertBreadcrumb($term->urlInfo(), $breadcrumb, $term->label());
-
-    $languages = \Drupal::languageManager()->getLanguages();
+    $this->assertBreadcrumb($term->getSystemPath(), $breadcrumb, $term->label());
 
     // Construct the expected translated breadcrumb.
-    $breadcrumb = array(Url::fromRoute('<front>', [], ['language' => $languages[$this->translateToLangcode]])->toString() => 'Home');
+    $breadcrumb = array($this->translateToLangcode => 'Home');
     foreach ($this->terms as $term) {
       $translated = $term->getTranslation($this->translateToLangcode);
-      $url = $translated->url('canonical', ['language' => $languages[$this->translateToLangcode]]);
-      $breadcrumb[$url] = $translated->label();
+      $path = $this->translateToLangcode . '/' . $translated->getSystemPath();
+      $breadcrumb[$path] = $translated->label();
     }
     array_pop($breadcrumb);
 
     // Check for the translated breadcrumb on the translated leaf term page.
     $term = $this->getLeafTerm();
     $translated = $term->getTranslation($this->translateToLangcode);
-    $this->assertBreadcrumb($translated->urlInfo('canonical', ['language' => $languages[$this->translateToLangcode]]), $breadcrumb, $translated->label());
+    $path = $this->translateToLangcode . '/' . $translated->getSystemPath();
+    $this->assertBreadcrumb($path, $breadcrumb, $translated->label());
   }
 
   /**
diff --git a/core/modules/taxonomy/src/Tests/Views/TaxonomyDefaultArgumentTest.php b/core/modules/taxonomy/src/Tests/Views/TaxonomyDefaultArgumentTest.php
index be4a9fc..bb0deea 100644
--- a/core/modules/taxonomy/src/Tests/Views/TaxonomyDefaultArgumentTest.php
+++ b/core/modules/taxonomy/src/Tests/Views/TaxonomyDefaultArgumentTest.php
@@ -31,10 +31,7 @@ class TaxonomyDefaultArgumentTest extends TaxonomyTestBase {
   public function testNodePath() {
     $view = Views::getView('taxonomy_default_argument_test');
 
-    $request = Request::create($this->nodes[0]->url());
-    $request->server->set('SCRIPT_NAME', $GLOBALS['base_path'] . 'index.php');
-    $request->server->set('SCRIPT_FILENAME', 'index.php');
-
+    $request = Request::create($this->nodes[0]->getSystemPath());
     $response = $this->container->get('http_kernel')->handle($request, HttpKernelInterface::SUB_REQUEST);
     $view->setRequest($request);
     $view->setResponse($response);
@@ -47,10 +44,7 @@ public function testNodePath() {
   public function testTermPath() {
     $view = Views::getView('taxonomy_default_argument_test');
 
-    $request = Request::create($this->term1->url());
-    $request->server->set('SCRIPT_NAME', $GLOBALS['base_path'] . 'index.php');
-    $request->server->set('SCRIPT_FILENAME', 'index.php');
-
+    $request = Request::create($this->term1->getSystemPath());
     $response = $this->container->get('http_kernel')->handle($request, HttpKernelInterface::SUB_REQUEST);
     $view->setRequest($request);
     $view->setResponse($response);
diff --git a/core/modules/telephone/src/Tests/TelephoneFieldTest.php b/core/modules/telephone/src/Tests/TelephoneFieldTest.php
index f79c80e..02e3bcf 100644
--- a/core/modules/telephone/src/Tests/TelephoneFieldTest.php
+++ b/core/modules/telephone/src/Tests/TelephoneFieldTest.php
@@ -49,7 +49,7 @@ protected function setUp() {
    */
   function testTelephoneField() {
 
-    // Add the telephone field to the article content type.
+    // Add the telepone field to the article content type.
     entity_create('field_storage_config', array(
       'field_name' => 'field_telephone',
       'entity_type' => 'node',
diff --git a/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php b/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php
index e5fe99e..6fad815 100644
--- a/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php
+++ b/core/modules/toolbar/src/Tests/ToolbarAdminMenuTest.php
@@ -9,7 +9,6 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -450,7 +449,7 @@ function testSubtreesJsonRequest() {
     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
 
     // Get a page with the new language langcode in the URL.
-    $this->drupalGet('xx/test-page');
+    $this->drupalGet('/xx/test-page');
     // Request a new page to refresh the drupalSettings object.
     $subtrees_hash = $this->getSubtreesHash();
 
@@ -464,15 +463,18 @@ function testSubtreesJsonRequest() {
   function testLanguageSwitching() {
     // Create a new language with the langcode 'xx'.
     $langcode = 'xx';
-    $language = ConfigurableLanguage::createFromLangcode($langcode);
-    $language->save();
-    // The language path processor is just registered for more than one
-    // configured language, so rebuild the container now that we are
-    // multilingual.
-    $this->rebuildContainer();
+    // The English name for the language. This will be translated.
+    $name = $this->randomMachineName(16);
+    $edit = array(
+      'predefined_langcode' => 'custom',
+      'langcode' => $langcode,
+      'label' => $name,
+      'direction' => LanguageInterface::DIRECTION_LTR,
+    );
+    $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add custom language'));
 
     // Get a page with the new language langcode in the URL.
-    $this->drupalGet('test-page', array('language' => $language));
+    $this->drupalGet('/xx/test-page');
     // Assert different hash.
     $new_subtree_hash = $this->getSubtreesHash();
 
diff --git a/core/modules/user/config/install/user.mail.yml b/core/modules/user/config/install/user.mail.yml
index 436ff53..bfad0e3 100644
--- a/core/modules/user/config/install/user.mail.yml
+++ b/core/modules/user/config/install/user.mail.yml
@@ -10,6 +10,12 @@ register_admin_created:
 register_no_approval_required:
   body: "[user:name],\n\nThank you for registering at [site:name]. You may now log in by clicking this link or copying and pasting it to your browser:\n\n[user:one-time-login-url]\n\nThis link can only be used once to log in and will lead you to a page where you can set your password.\n\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\n\nusername: [user:name]\npassword: Your password\n\n--  [site:name] team"
   subject: 'Account details for [user:name] at [site:name]'
+register_password_set:
+  body: "[user:name],\n\nThank you for registering at [site:name]. You may now log in and verify your account by clicking this link or copying and pasting it to your browser:\n\n[user:one-time-login-url]\n\nThis link can only be used once. You will be able to log in at [site:login-url] in the future using:\n\nusername: [user:name]\npassword: Your password\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name]'
+register_password_set_activation:
+  body: "[user:name],\n\nYour account at [site:name] has been activated.\n\nYou will be able to log in to [site:login-url] in the future using:\n\nusername: [user:name]\npassword: your password.\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name]'
 register_pending_approval:
   body: "[user:name],\n\nThank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been approved, you will receive another email containing information about how to log in, set your password, and other details.\n\n\n--  [site:name] team"
   subject: 'Account details for [user:name] at [site:name] (pending admin approval)'
diff --git a/core/modules/user/config/schema/user.schema.yml b/core/modules/user/config/schema/user.schema.yml
index 772deea..4a65003 100644
--- a/core/modules/user/config/schema/user.schema.yml
+++ b/core/modules/user/config/schema/user.schema.yml
@@ -76,6 +76,12 @@ user.mail:
   register_no_approval_required:
     type: mail
     label: 'Registration confirmation (No approval required)'
+  register_password_set:
+    type: mail
+    label: 'Registration with password confirmation (No approval required)'
+  register_password_set_activation:
+    type: mail
+    label: 'Registration with password activation'
   register_pending_approval:
     type: mail
     label: 'Registration confirmation (Pending approval)'
diff --git a/core/modules/user/css/user.admin.css b/core/modules/user/css/user.admin.css
index ba872d0..09387a3 100644
--- a/core/modules/user/css/user.admin.css
+++ b/core/modules/user/css/user.admin.css
@@ -13,6 +13,10 @@
   padding-left: 0;
   padding-right: 1.5em;
 }
+#permissions tr.odd .form-item,
+#permissions tr.even .form-item {
+  white-space: normal;
+}
 
 #user-admin-settings .details-description {
   font-size: 0.85em;
diff --git a/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php
index 7ed3cbd..282c406 100644
--- a/core/modules/user/src/AccountForm.php
+++ b/core/modules/user/src/AccountForm.php
@@ -174,7 +174,9 @@ public function form(array $form, FormStateInterface $form_state) {
         $form['#validate'][] = 'user_validate_current_pass';
       }
     }
-    elseif (!$config->get('verify_mail') || $admin) {
+    // Show the password fields on registration when verify_mail is false,
+    // or verify_mail & password_register are set or the user is an admin.
+    elseif (!$config->get('verify_mail') || ($config->get('verify_mail') && $config->get('password_register')) || $admin) {
       $form['account']['pass'] = array(
         '#type' => 'password_confirm',
         '#size' => 25,
diff --git a/core/modules/user/src/AccountSettingsForm.php b/core/modules/user/src/AccountSettingsForm.php
index 2b91877..9790383 100644
--- a/core/modules/user/src/AccountSettingsForm.php
+++ b/core/modules/user/src/AccountSettingsForm.php
@@ -145,6 +145,22 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#default_value' => $config->get('verify_mail'),
       '#description' => $this->t('New users will be required to validate their email address prior to logging into the site, and will be assigned a system-generated password. With this setting disabled, users will be logged in immediately upon registering, and may select their own passwords during registration.')
     );
+    $form['registration_cancellation']['user_password_register'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Require people to choose a password during registration.'),
+      '#description' => t('If <em>Require e-mail verification</em> is disabled, this setting is automatically enabled.'),
+      '#default_value' => $config->get('password_register'),
+      '#states' => array(
+        // Disable this option if email_verification is unchecked.
+        'disabled' => array(
+        'input[name="user_email_verification"]' => array('checked' => FALSE),
+        ),
+        // Enable this option if email_verification is checked.
+        'enabled' => array(
+        'input[name="user_email_verification"]' => array('checked' => TRUE),
+        ),
+      )
+    );
     $form['registration_cancellation']['user_password_strength'] = array(
       '#type' => 'checkbox',
       '#title' => $this->t('Enable password strength indicator'),
@@ -278,6 +294,45 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#rows' => 15,
     );
 
+    $form['email_password_set_activation'] = array(
+      '#type' => 'details',
+      '#title' => t('Welcome (password set at registration)'),
+      '#collapsed' => TRUE,
+      '#description' => t('Edit the welcome e-mail messages sent to new members upon registering, when no administrator approval is required and password has already been set.') . ' ' . $email_token_help,
+      '#group' => 'email',
+    );
+    $form['email_password_set_activation']['user_mail_register_password_set_activation_subject'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Subject'),
+      '#default_value' => $mail_config->get('register_password_set_activation.subject'),
+      '#maxlength' => 180,
+    );
+    $form['email_password_set_activation']['user_mail_register_password_set_activation_body'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Body'),
+      '#default_value' => $mail_config->get('register_password_set_activation.body'),
+      '#rows' => 15,
+    );
+    $form['email_password_set'] = array(
+      '#type' => 'details',
+      '#title' => t('Account activation (password set at registration)'),
+      '#collapsed' => TRUE,
+      '#description' => t('Edit the activation e-mail messages sent to new members upon registering, when no administrator approval is required and password has already been set during registration.') . ' ' . $email_token_help,
+      '#group' => 'email',
+    );
+    $form['email_password_set']['user_mail_register_password_set_subject'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Subject'),
+      '#default_value' => $mail_config->get('register_password_set.subject'),
+      '#maxlength' => 180,
+    );
+    $form['email_password_set']['user_mail_register_password_set_body'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Body'),
+      '#default_value' => $mail_config->get('register_password_set.body'),
+      '#rows' => 15,
+    );
+
     $form['email_password_reset'] = array(
       '#type' => 'details',
       '#title' => $this->t('Password recovery'),
@@ -431,6 +486,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       ->set('register', $form_state->getValue('user_register'))
       ->set('password_strength', $form_state->getValue('user_password_strength'))
       ->set('verify_mail', $form_state->getValue('user_email_verification'))
+      ->set('password_register', $form_state->getValue('user_password_register'))
       ->set('signatures', $form_state->getValue('user_signatures'))
       ->set('cancel_method', $form_state->getValue('user_cancel_method'))
       ->set('notify.status_activated', $form_state->getValue('user_mail_status_activated_notify'))
@@ -446,6 +502,10 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       ->set('register_admin_created.subject', $form_state->getValue('user_mail_register_admin_created_subject'))
       ->set('register_no_approval_required.body', $form_state->getValue('user_mail_register_no_approval_required_body'))
       ->set('register_no_approval_required.subject', $form_state->getValue('user_mail_register_no_approval_required_subject'))
+      ->set('register_password_set_activation.body', $form_state->getValue('user_mail_register_password_set_activation_body'))
+      ->set('register_password_set_activation.subject', $form_state->getValue('user_mail_register_password_set_activation_subject'))
+      ->set('register_password_set.body', $form_state->getValue('user_mail_register_password_set_body'))
+      ->set('register_password_set.subject', $form_state->getValue('user_mail_register_password_set_subject'))
       ->set('register_pending_approval.body', $form_state->getValue('user_mail_register_pending_approval_body'))
       ->set('register_pending_approval.subject', $form_state->getValue('user_mail_register_pending_approval_subject'))
       ->set('status_activated.body', $form_state->getValue('user_mail_status_activated_body'))
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 98c1641..055c991 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -139,6 +139,16 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
       if ($this->status->value != $this->original->status->value) {
         // The user's status is changing; conditionally send notification email.
         $op = $this->status->value == 1 ? 'status_activated' : 'status_blocked';
+
+        // Send the password_set activation e-mail to the user
+        // if the account never signed in and if we are
+        // called from the user_register_form and password_register
+        // is set to enabled.
+        if (!$this->login->value && \Drupal::config('user.settings')->get('password_register') && !$this->original->status->value && $this->status->value) {
+          $op = 'register_password_set_activation';
+        }
+
+        // Notify the user.
         _user_mail_notify($op, $this);
       }
     }
@@ -372,13 +382,13 @@ public function getTimeZone() {
    * {@inheritdoc}
    */
   function getPreferredLangcode($fallback_to_default = TRUE) {
-    $language_list = $this->languageManager()->getLanguages();
+    $language_list = \Drupal::languageManager()->getLanguages();
     $preferred_langcode = $this->get('preferred_langcode')->value;
     if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
       return $language_list[$preferred_langcode]->getId();
     }
     else {
-      return $fallback_to_default ? $this->languageManager()->getDefaultLanguage()->getId() : '';
+      return $fallback_to_default ? language_default()->getId() : '';
     }
   }
 
@@ -386,13 +396,13 @@ function getPreferredLangcode($fallback_to_default = TRUE) {
    * {@inheritdoc}
    */
   function getPreferredAdminLangcode($fallback_to_default = TRUE) {
-    $language_list = $this->languageManager()->getLanguages();
+    $language_list = \Drupal::languageManager()->getLanguages();
     $preferred_langcode = $this->get('preferred_admin_langcode')->value;
     if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
       return $language_list[$preferred_langcode]->getId();
     }
     else {
-      return $fallback_to_default ? $this->languageManager()->getDefaultLanguage()->getId() : '';
+      return $fallback_to_default ? language_default()->getId() : '';
     }
   }
 
diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserMailUnique.php b/core/modules/user/src/Plugin/Validation/Constraint/UserMailUnique.php
index e541518..e9190ae 100644
--- a/core/modules/user/src/Plugin/Validation/Constraint/UserMailUnique.php
+++ b/core/modules/user/src/Plugin/Validation/Constraint/UserMailUnique.php
@@ -25,6 +25,6 @@ class UserMailUnique extends Constraint {
    * {@inheritdoc}
    */
   public function validatedBy() {
-    return '\Drupal\Core\Validation\Plugin\Validation\Constraint\UniqueFieldValueValidator';
+    return '\Drupal\user\Plugin\Validation\Constraint\UserUniqueValidator';
   }
 }
diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php b/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php
index 0a65d32..597a42e 100644
--- a/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php
+++ b/core/modules/user/src/Plugin/Validation/Constraint/UserNameUnique.php
@@ -25,6 +25,6 @@ class UserNameUnique extends Constraint {
    * {@inheritdoc}
    */
   public function validatedBy() {
-    return '\Drupal\Core\Validation\Plugin\Validation\Constraint\UniqueFieldValueValidator';
+    return '\Drupal\user\Plugin\Validation\Constraint\UserUniqueValidator';
   }
 }
diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php b/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php
new file mode 100644
index 0000000..1c65d06
--- /dev/null
+++ b/core/modules/user/src/Plugin/Validation/Constraint/UserUniqueValidator.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Plugin\Validation\Constraint\UserUniqueValidator.
+ */
+
+namespace Drupal\user\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the unique user property constraint, such as name and email.
+ */
+class UserUniqueValidator extends ConstraintValidator {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($items, Constraint $constraint) {
+    if (!isset($items)) {
+      return;
+    }
+    $field_name = $items->getFieldDefinition()->getName();
+
+    $value_taken = (bool) \Drupal::entityQuery('user')
+      // The UID could be NULL, so we cast it to 0 in that case.
+      ->condition('uid', (int) $items->getEntity()->id(), '<>')
+      ->condition($field_name, db_like($items->first()->value), 'LIKE')
+      ->range(0, 1)
+      ->count()
+      ->execute();
+
+    if ($value_taken) {
+      $this->context->addViolation($constraint->message, array("%value" => $items->value));
+    }
+  }
+}
diff --git a/core/modules/user/src/Plugin/views/field/Language.php b/core/modules/user/src/Plugin/views/field/Language.php
index bf5abaa..7e7c0ed 100644
--- a/core/modules/user/src/Plugin/views/field/Language.php
+++ b/core/modules/user/src/Plugin/views/field/Language.php
@@ -30,7 +30,7 @@ protected function renderLink($data, ResultRow $values) {
       }
     }
     if (empty($data)) {
-      $lang = \Drupal::languageManager()->getDefaultLanguage();
+      $lang = language_default();
     }
     else {
       $lang = \Drupal::languageManager()->getLanguages();
diff --git a/core/modules/user/src/Plugin/views/filter/Roles.php b/core/modules/user/src/Plugin/views/filter/Roles.php
index f878785..014425d 100644
--- a/core/modules/user/src/Plugin/views/filter/Roles.php
+++ b/core/modules/user/src/Plugin/views/filter/Roles.php
@@ -7,9 +7,7 @@
 
 namespace Drupal\user\Plugin\views\filter;
 
-use Drupal\user\RoleStorageInterface;
 use Drupal\views\Plugin\views\filter\ManyToOne;
-use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Filter handler for user roles.
@@ -20,42 +18,6 @@
  */
 class Roles extends ManyToOne {
 
-  /**
-   * The role storage.
-   *
-   * @var \Drupal\user\RoleStorageInterface
-   */
-  protected $roleStorage;
-
-  /**
-   * Constructs a Roles object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\user\RoleStorageInterface $role_storage
-   *   The role storage.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, RoleStorageInterface $role_storage) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->roleStorage = $role_storage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('entity.manager')->getStorage('user_role')
-    );
-  }
-
   public function getValueOptions() {
     $this->valueOptions = user_role_names(TRUE);
     unset($this->valueOptions[DRUPAL_AUTHENTICATED_RID]);
@@ -71,16 +33,4 @@ function operators() {
     return $operators;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    $dependencies = array();
-    foreach ($this->value as $role_id) {
-      $role = $this->roleStorage->load($role_id);
-      $dependencies[$role->getConfigDependencyKey()][] = $role->getConfigDependencyName();
-    }
-    return $dependencies;
-  }
-
 }
diff --git a/core/modules/user/src/RegisterForm.php b/core/modules/user/src/RegisterForm.php
index bbf131e..4d155e8 100644
--- a/core/modules/user/src/RegisterForm.php
+++ b/core/modules/user/src/RegisterForm.php
@@ -75,15 +75,23 @@ protected function actions(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
+    $config = \Drupal::config('user.settings');
     $admin = $form_state->getValue('administer_users');
 
-    if (!\Drupal::config('user.settings')->get('verify_mail') || $admin) {
+    if (!$config->get('verify_mail') || ($config->get('verify_mail') && $config->get('password_register')) || $admin) {
       $pass = $form_state->getValue('pass');
     }
     else {
       $pass = user_password();
     }
 
+    // If we are not an admin and we try to register and password_register
+    // is set, make sure the status is set to disabled before we save
+    // the newly created account.
+    if ($config->get('verify_mail') && $config->get('password_register') && $form_state->getValue('uid') && !$admin) {
+      $form_state->setValue('status', NULL);
+    }
+
     // Remove unneeded values.
     $form_state->cleanValues();
 
@@ -118,11 +126,20 @@ public function save(array $form, FormStateInterface $form_state) {
     if ($admin && !$notify) {
       drupal_set_message($this->t('Created a new user account for <a href="@url">%name</a>. No email has been sent.', array('@url' => $account->url(), '%name' => $account->getUsername())));
     }
+    // E-mail verification enabled, but users set a password during registration.
+    elseif (!$admin && (\Drupal::config('user.settings')->get('register') == USER_REGISTER_VISITORS && config('user.settings')->get('password_register') && !$account->status)) {
+      // Notify the user.
+      _user_mail_notify('register_password_set', $account);
+
+      drupal_set_message($this->t('A welcome message with further instructions has been sent to your e-mail address.'));
+      $form_state->setRedirect('');
+    }
     // No email verification required; log in user immediately.
     elseif (!$admin && !\Drupal::config('user.settings')->get('verify_mail') && $account->isActive()) {
       _user_mail_notify('register_no_approval_required', $account);
       user_login_finalize($account);
       drupal_set_message($this->t('Registration successful. You are now logged in.'));
+
       $form_state->setRedirect('<front>');
     }
     // No administrator approval required.
diff --git a/core/modules/user/src/Tests/UserEntityCallbacksTest.php b/core/modules/user/src/Tests/UserEntityCallbacksTest.php
index cf8af85..5c4e93c 100644
--- a/core/modules/user/src/Tests/UserEntityCallbacksTest.php
+++ b/core/modules/user/src/Tests/UserEntityCallbacksTest.php
@@ -48,4 +48,10 @@ function testLabelCallback() {
     $this->assertEqual($this->anonymous->label(), $name, 'The variable anonymous should be used for name of uid 0');
   }
 
+  /**
+   * Test URI callback.
+   */
+  function testUriCallback() {
+    $this->assertEqual('user/' . $this->account->id(), $this->account->getSystemPath(), 'Correct user URI.');
+  }
 }
diff --git a/core/modules/user/src/Tests/UserRegistrationTest.php b/core/modules/user/src/Tests/UserRegistrationTest.php
index 853891a..a18b7da 100644
--- a/core/modules/user/src/Tests/UserRegistrationTest.php
+++ b/core/modules/user/src/Tests/UserRegistrationTest.php
@@ -121,6 +121,51 @@ function testRegistrationWithoutEmailVerification() {
     $this->assertText(t('Member for'), 'User can log in after administrator approval.');
   }
 
+  function testRegistrationWithPasswordSet() {
+    $config = config('user.settings');
+
+    // Require e-mail verification, but let's users choose a password during registration
+    // and allow registration by site visitors without administrator approval.
+    $config
+      ->set('verify_mail', TRUE)
+      ->set('register', USER_REGISTER_VISITORS)
+      ->set('password_register', TRUE)
+      ->save();
+
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+    $edit['pass[pass1]'] = $new_pass = $this->randomName();
+    $edit['pass[pass2]'] = $new_pass;
+
+    // Create a new user.
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $this->assertText(t('A welcome message with further instructions has been sent to your e-mail address.'), 'Send e-mail to user after registering.');
+
+    // Make sure the user is still blocked.
+    $this->container->get('plugin.manager.entity')->getStorageController('user')->resetCache();
+    $accounts = entity_load_multiple_by_properties('user', array('name' => $name, 'mail' => $mail, 'status' => 0));
+    $new_user = reset($accounts);
+    $this->assertFalse($new_user->status->value, t('New account is blocked until approved via e-mail confirmation.'));
+
+    // Try to login before activating the account via e-mail.
+    $edit2 = array();
+    $edit2['name'] = $name;
+    $edit2['pass'] = $new_pass;
+    $this->drupalPost('user/login', $edit2, t('Log in'));
+    $this->assertText(t('The username @name has not been activated or is blocked.', array('@name' => $name)), t('User cannot login yet.'));
+
+    // Try to activate the user.
+    $_emails = $this->drupalGetMails();
+    $email = end($_emails);
+    $one_time_link = array();
+    preg_match('@user/reset/[0-9]+/([0-9]+)/([a-zA-Z0-9_\-]+)\n@', $email['body'], $one_time_link);
+
+    $_uid = $new_user->id();
+    $this->drupalGet("user/reset/$_uid/$one_time_link[1]/$one_time_link[2]");
+    $this->assertText(t('You have just used your one-time login link. Your account is now active.'), t('User account activated.'));
+  }
+
   function testRegistrationEmailDuplicates() {
     // Don't require email verification and allow registration by site visitors
     // without administrator approval.
diff --git a/core/modules/user/src/Tests/Views/HandlerFilterRolesTest.php b/core/modules/user/src/Tests/Views/HandlerFilterRolesTest.php
deleted file mode 100644
index 6ed889b..0000000
--- a/core/modules/user/src/Tests/Views/HandlerFilterRolesTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\user\Tests\Views\HandlerFilterRolesTest.
- */
-
-namespace Drupal\user\Tests\Views;
-
-use Drupal\Component\Utility\String;
-use Drupal\user\Entity\Role;
-use Drupal\user\Tests\Views\UserUnitTestBase;
-use Drupal\views\Entity\View;
-use Drupal\views\Views;
-
-/**
- * Tests the roles filter handler.
- *
- * @group user
- *
- * @see \Drupal\user\Plugin\views\filter\Roles
- */
-class HandlerFilterRolesTest extends UserUnitTestBase {
-
-  /**
-   * Views used by this test.
-   *
-   * @var array
-   */
-  public static $testViews = array('test_user_name');
-
-  /**
-   * Tests that role filter dependencies are calculated correctly.
-   */
-  public function testDependencies() {
-    $role = Role::create(['id' => 'test_user_role']);
-    $role->save();
-    $view = View::load('test_user_name');
-    $expected = [
-      'module' => ['user'],
-    ];
-    $this->assertEqual($expected, $view->getDependencies());
-
-    $display = &$view->getDisplay('default');
-    $display['display_options']['filters']['roles_target_id'] = [
-      'id' => 'roles_target_id',
-      'table' => 'user__roles',
-      'field' => 'roles_target_id',
-      'value' => [
-        'test_user_role' => 'test_user_role',
-      ],
-      'plugin_id' => 'user_roles',
-    ];
-    $view->save();
-    $expected['config'][] = 'user.role.test_user_role';
-    $this->assertEqual($expected, $view->getDependencies());
-
-    $view = View::load('test_user_name');
-    $display = &$view->getDisplay('default');
-    $display['display_options']['filters']['roles_target_id'] = [
-      'id' => 'roles_target_id',
-      'table' => 'user__roles',
-      'field' => 'roles_target_id',
-      'value' => [],
-      'plugin_id' => 'user_roles',
-    ];
-    $view->save();
-    unset($expected['config']);
-    $this->assertEqual($expected, $view->getDependencies());
-  }
-
-}
diff --git a/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php b/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php
index 22d2ea4..b58f86b 100644
--- a/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php
+++ b/core/modules/user/tests/src/Unit/Menu/UserLocalTasksTest.php
@@ -47,10 +47,13 @@ public function getUserAdminRoutes() {
    *
    * @dataProvider getUserLoginRoutes
    */
-  public function testUserLoginLocalTasks($route) {
+  public function testUserLoginLocalTasks($route, $subtask = array()) {
     $tasks = array(
-      0 => array('user.register', 'user.pass', 'user.login',),
+      0 => array('user.page', 'user.register', 'user.pass',),
     );
+    if ($subtask) {
+      $tasks[] = $subtask;
+    }
     $this->assertLocalTasks($route, $tasks);
   }
 
@@ -59,7 +62,8 @@ public function testUserLoginLocalTasks($route) {
    */
   public function getUserLoginRoutes() {
     return array(
-      array('user.login'),
+      array('user.page', array('user.login',)),
+      array('user.login', array('user.login',)),
       array('user.register'),
       array('user.pass'),
     );
diff --git a/core/modules/user/user.links.task.yml b/core/modules/user/user.links.task.yml
index be51381..9d9661d 100644
--- a/core/modules/user/user.links.task.yml
+++ b/core/modules/user/user.links.task.yml
@@ -1,3 +1,4 @@
+
 entity.user_role.edit_form:
   title: 'Edit'
   route_name: entity.user_role.edit_form
@@ -8,22 +9,24 @@ user.account_settings_tab:
   title: 'Settings'
   base_route: entity.user.admin_form
 
+user.page:
+  route_name: user.page
+  base_route: user.page
+  title: 'Log in'
+  weight: -10
 user.register:
   route_name: user.register
   base_route: user.page
   title: 'Create new account'
-
 user.pass:
   route_name: user.pass
   base_route: user.page
   title: 'Reset your password'
-
 # Other authentication methods may add pages below user/login/.
 user.login:
   route_name: user.login
-  base_route: user.page
-  title: 'Log in'
-  weight: -10
+  parent_id: user.page
+  title: 'Username and password'
 
 entity.user.canonical:
   route_name: entity.user.canonical
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index b3fe322..080a3f6 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -62,7 +62,7 @@ function user_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dt>' . t('Managing 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 settings, and account cancellation settings. On this page you can also manage settings for account personalization (including signatures), and adapt the text for the email messages that users receive when they register or request a password recovery. You may also set which role is automatically assigned new permissions whenever a module is enabled (the Administrator role).', array('!accounts'  => \Drupal::url('entity.user.admin_form'))) . '</dd>';
       $output .= '<dt>' . t('Managing user account fields') . '</dt>';
-      $output .= '<dd>' . t('Because User accounts are an entity type, you can extend them by adding fields through the Manage fields tab on the <a href="!accounts">Account settings page</a>. By adding fields for e.g., a picture, a biography, or address, you can a create a custom profile for the users of the website. For background information on entities and fields, see the <a href="!field_help">Field module help page</a>.', array('!field_help'=>\Drupal::url('help.page', array('name' => 'field')), '!accounts' => \Drupal::url('entity.user.admin_form'))) . '</dd>';
+      $output .= '<dd>' . t('Because User accounts are an <a href="!entity_help">entity type</a>, you can extend them by adding <a href="!field_help">fields</a> through the Manage fields tab on the <a href="!accounts">Account settings page</a>. By adding fields for e.g., a picture, a biography, or address, you can a create a custom profile for the users of the website.', array('!entity_help' => \Drupal::url('help.page', array('name' => 'entity')),'!field_help'=>\Drupal::url('help.page', array('name' => 'field')), '!accounts' => \Drupal::url('entity.user.admin_form'))) . '</dd>';
       $output .= '</dl>';
       return $output;
 
@@ -1249,6 +1249,8 @@ function user_role_revoke_permissions($rid, array $permissions = array()) {
  *     self-registers.
  *   - 'register_pending_approval': Welcome message, user pending admin
  *     approval.
+ *   - 'register_password_set': Welcome message, password set.
+ *   - 'register_password_set_activation': Activation message, password set.
  *   - 'password_reset': Password recovery request.
  *   - 'status_activated': Account activated.
  *   - 'status_blocked': Account blocked.
diff --git a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
index 31eee11..7c947eb 100644
--- a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
+++ b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
@@ -1444,9 +1444,6 @@ protected function renderAsLink($alter, $text, $tokens) {
       $options['entity_type'] = $alter['entity_type'];
     }
 
-    // @todo Add proper support for url objects, see
-    //   https://www.drupal.org/node/2404603
-    //   This means for example taking into account the options.
     if (isset($options['url']) && $options['url'] instanceof Url) {
       $value .= $this->linkGenerator()->generate($text, $options['url']);
     }
diff --git a/core/modules/views/src/Plugin/views/field/LanguageField.php b/core/modules/views/src/Plugin/views/field/LanguageField.php
index 2933ae7..5792bd0 100644
--- a/core/modules/views/src/Plugin/views/field/LanguageField.php
+++ b/core/modules/views/src/Plugin/views/field/LanguageField.php
@@ -43,7 +43,7 @@ public function render(ResultRow $values) {
     // @todo: Drupal Core dropped native language until config translation is
     // ready, see http://drupal.org/node/1616594.
     $value = $this->getValue($values);
-    $language = \Drupal::languageManager()->getLanguage($value);
+    $language = language_load($value);
     return $language ? $language->getName() : '';
   }
 
diff --git a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
index 1c254dc..98e7e50 100644
--- a/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
+++ b/core/modules/views/src/Plugin/views/query/QueryPluginBase.php
@@ -277,8 +277,8 @@ public function getEntityTableInfo() {
       );
 
       // Include the entity provider.
-      if (!empty($base_table_data['table']['provider'])) {
-        $entity_tables[$base_table_data['table']['entity type']]['provider'] = $base_table_data['table']['provider'];
+      if (!empty($table_data['table']['provider'])) {
+        $entity_tables[$table_data['table']['entity type']]['provider'] = $table_data['table']['provider'];
       }
     }
 
@@ -286,7 +286,7 @@ public function getEntityTableInfo() {
     foreach ((array) $this->view->relationship as $relationship_id => $relationship) {
       $table_data = $views_data->get($relationship->definition['base']);
       if (isset($table_data['table']['entity type'])) {
-        $entity_tables[$relationship_id . '__' . $relationship->tableAlias] = array(
+        $entity_tables[$table_data['table']['entity type']] = array(
           'base' => $relationship->definition['base'],
           'relationship_id' => $relationship_id,
           'alias' => $relationship->alias,
@@ -296,7 +296,7 @@ public function getEntityTableInfo() {
 
         // Include the entity provider.
         if (!empty($table_data['table']['provider'])) {
-          $entity_tables[$relationship_id . '__' . $relationship->tableAlias]['provider'] = $table_data['table']['provider'];
+          $entity_tables[$table_data['table']['entity type']]['provider'] = $table_data['table']['provider'];
         }
       }
     }
diff --git a/core/modules/views/src/Plugin/views/query/Sql.php b/core/modules/views/src/Plugin/views/query/Sql.php
index 7a6706c..3aed415 100644
--- a/core/modules/views/src/Plugin/views/query/Sql.php
+++ b/core/modules/views/src/Plugin/views/query/Sql.php
@@ -1254,7 +1254,7 @@ public function query($get_count = FALSE) {
       }
 
       foreach ($entity_information as $entity_type_id => $info) {
-        $entity_type = \Drupal::entityManager()->getDefinition($info['entity_type']);
+        $entity_type = \Drupal::entityManager()->getDefinition($entity_type_id);
         $base_field = empty($table['revision']) ? $entity_type->getKey('id') : $entity_type->getKey('revision');
         $this->addField($info['alias'], $base_field, '', $params);
       }
@@ -1468,40 +1468,30 @@ function loadEntities(&$results) {
       return;
     }
 
-    // Extract all entity types from entity_information.
-    $entity_types = array();
-    foreach ($entity_information as $info) {
-      $entity_type = $info['entity_type'];
-      if (!isset($entity_types[$entity_type])) {
-        $entity_types[$entity_type] = \Drupal::entityManager()->getDefinition($entity_type);
-      }
-    }
-
     // Assemble a list of entities to load.
     $ids_by_type = array();
-    foreach ($entity_information as $info) {
-      $relationship_id = $info['relationship_id'];
-      $entity_type = $info['entity_type'];
-      $entity_info = $entity_types[$entity_type];
+    foreach ($entity_information as $entity_type => $info) {
+      $entity_info = \Drupal::entityManager()->getDefinition($entity_type);
       $id_key = empty($table['revision']) ? $entity_info->getKey('id') : $entity_info->getKey('revision');
       $id_alias = $this->getFieldAlias($info['alias'], $id_key);
 
       foreach ($results as $index => $result) {
         // Store the entity id if it was found.
         if (isset($result->{$id_alias}) && $result->{$id_alias} != '') {
-          $ids_by_type[$entity_type][$index][$relationship_id] = $result->$id_alias;
+          $ids_by_type[$entity_type][$index] = $result->$id_alias;
         }
       }
     }
 
     // Load all entities and assign them to the correct result row.
     foreach ($ids_by_type as $entity_type => $ids) {
-      $flat_ids = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($ids)), FALSE);
+      $info = $entity_information[$entity_type];
+      $relationship_id = $info['relationship_id'];
 
       // Drupal core currently has no way to load multiple revisions. Sad.
-      if (isset($entity_table_info[$entity_type]['revision']) && $entity_table_info[$entity_type]['revision'] == TRUE) {
+      if ($info['revision']) {
         $entities = array();
-        foreach ($flat_ids as $revision_id) {
+        foreach ($ids as $revision_id) {
           $entity = entity_revision_load($entity_type, $revision_id);
           if ($entity) {
             $entities[$revision_id] = $entity;
@@ -1509,24 +1499,22 @@ function loadEntities(&$results) {
         }
       }
       else {
-        $entities = entity_load_multiple($entity_type, $flat_ids);
+        $entities = entity_load_multiple($entity_type, $ids);
       }
 
-      foreach ($ids as $index => $relationships) {
-        foreach ($relationships as $relationship_id => $entity_id) {
-          if (isset($entities[$entity_id])) {
-            $entity = $entities[$entity_id];
-          }
-          else {
-            $entity = NULL;
-          }
+      foreach ($ids as $index => $id) {
+        if (isset($entities[$id])) {
+          $entity = $entities[$id];
+        }
+        else {
+          $entity = NULL;
+        }
 
-          if ($relationship_id == 'none') {
-            $results[$index]->_entity = $entity;
-          }
-          else {
-            $results[$index]->_relationship_entities[$relationship_id] = $entity;
-          }
+        if ($relationship_id == 'none') {
+          $results[$index]->_entity = $entity;
+        }
+        else {
+          $results[$index]->_relationship_entities[$relationship_id] = $entity;
         }
       }
     }
diff --git a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
index cdf0723..bbf06ce 100644
--- a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
@@ -655,7 +655,7 @@ protected function instantiateView($form, FormStateInterface $form_state) {
       'label' => $form_state->getValue('label'),
       'description' => $form_state->getValue('description'),
       'base_table' => $this->base_table,
-      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
+      'langcode' => language_default()->getId(),
     );
 
     $view = entity_create('view', $values);
diff --git a/core/modules/views_ui/css/views_ui.admin.theme.css b/core/modules/views_ui/css/views_ui.admin.theme.css
index c195cce..f423263 100644
--- a/core/modules/views_ui/css/views_ui.admin.theme.css
+++ b/core/modules/views_ui/css/views_ui.admin.theme.css
@@ -595,9 +595,6 @@ td.group-title {
   margin: 0;
   padding: 0;
 }
-.views-displays .tabs.secondary .action-list input.form-submit:hover {
-  box-shadow: none;
-}
 
 .views-displays .tabs.secondary .action-list li:hover {
   background-color: #ddd;
diff --git a/core/modules/views_ui/src/Controller/ViewsUIController.php b/core/modules/views_ui/src/Controller/ViewsUIController.php
index b73333c..7649dd8 100644
--- a/core/modules/views_ui/src/Controller/ViewsUIController.php
+++ b/core/modules/views_ui/src/Controller/ViewsUIController.php
@@ -13,7 +13,6 @@
 use Drupal\Core\Url;
 use Drupal\views\ViewExecutable;
 use Drupal\views\ViewEntityInterface;
-use Drupal\views\Views;
 use Drupal\views_ui\ViewUI;
 use Drupal\views\ViewsData;
 use Symfony\Component\DependencyInjection\ContainerInterface;
diff --git a/core/modules/views_ui/src/Tests/ReportTest.php b/core/modules/views_ui/src/Tests/ReportTest.php
deleted file mode 100644
index a4a4b2f..0000000
--- a/core/modules/views_ui/src/Tests/ReportTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_ui\Tests\ReportTest.
- */
-
-namespace Drupal\views_ui\Tests;
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests existence of the views plugin report.
- *
- * @group views_ui
- */
-class ReportTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('views', 'views_ui');
-
-  /**
-   * Stores an admin user used by the different tests.
-   *
-   * @var \Drupal\user\User
-   */
-  protected $adminUser;
-
-  protected function setUp() {
-    parent::setUp();
-    $this->adminUser = $this->drupalCreateUser(array('administer views'));
-  }
-
-  /**
-   * Tests the existence of the views plugin report.
-   */
-  public function testReport() {
-    $this->drupalLogin($this->adminUser);
-
-    // Test the report page.
-    $this->drupalGet('admin/reports/views-plugins');
-    $this->assertResponse(200, "Views report page exists");
-  }
-
-}
diff --git a/core/modules/views_ui/src/ViewUI.php b/core/modules/views_ui/src/ViewUI.php
index 2f3e417..e2819d6 100644
--- a/core/modules/views_ui/src/ViewUI.php
+++ b/core/modules/views_ui/src/ViewUI.php
@@ -710,20 +710,10 @@ public function renderPreview($display_id, $args = array()) {
           }
 
           if ($show_stats) {
-            $rows['statistics'][] = array(
-              array('data' => array('#type' => 'inline_template', '#template' => "<strong>{% trans 'Query build time' %}</strong>")),
-              t('@time ms', array('@time' => intval($this->executable->build_time * 100000) / 100)),
-            );
-
-            $rows['statistics'][] = array(
-              array('data' => array('#type' => 'inline_template', '#template' => "<strong>{% trans 'Query execute time' %}</strong>")),
-              t('@time ms', array('@time' => intval($this->executable->execute_time * 100000) / 100)),
-            );
+            $rows['statistics'][] = array('<strong>' . t('Query build time') . '</strong>', t('@time ms', array('@time' => intval($this->executable->build_time * 100000) / 100)));
+            $rows['statistics'][] = array('<strong>' . t('Query execute time') . '</strong>', t('@time ms', array('@time' => intval($this->executable->execute_time * 100000) / 100)));
+            $rows['statistics'][] = array('<strong>' . t('View render time') . '</strong>', t('@time ms', array('@time' => intval($this->executable->render_time * 100000) / 100)));
 
-            $rows['statistics'][] = array(
-              array('data' => array('#type' => 'inline_template', '#template' => "<strong>{% trans 'View render time' %}</strong>")),
-              t('@time ms', array('@time' => intval($this->executable->render_time * 100000) / 100)),
-            );
           }
           \Drupal::moduleHandler()->alter('views_preview_info', $rows, $this->executable);
         }
diff --git a/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyBuilderTest.php b/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyBuilderTest.php
index 83435b1..45074a5 100644
--- a/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyBuilderTest.php
+++ b/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyBuilderTest.php
@@ -165,19 +165,6 @@ public function testMethod($parameter)
   }
 
   /**
-   * @covers ::build()
-   */
-  public function testBuildWithNestedInterface() {
-    $class = 'Drupal\Tests\Component\ProxyBuilder\TestServiceWithChildInterfaces';
-
-    $result = $this->proxyBuilder->build($class);
-    $method_body = '';
-
-    $interface_string = ' implements \Drupal\Tests\Component\ProxyBuilder\TestChildInterface';
-    $this->assertEquals($this->buildExpectedClass($class, $method_body, $interface_string), $result);
-  }
-
-  /**
    * @covers ::buildMethod()
    * @covers ::buildParameter()
    * @covers ::buildMethodBody()
@@ -361,14 +348,3 @@ public static function testMethod($parameter) {
 
 }
 
-interface TestBaseInterface {
-
-}
-
-interface TestChildInterface extends TestBaseInterface {
-
-}
-
-class TestServiceWithChildInterfaces implements TestChildInterface {
-
-}
diff --git a/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyDumperTest.php b/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyDumperTest.php
index 3c5066a..d8fed50 100644
--- a/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyDumperTest.php
+++ b/core/tests/Drupal/Tests/Component/ProxyBuilder/ProxyDumperTest.php
@@ -85,9 +85,6 @@ public function testGetProxyFactoryCode() {
     $this->assertEquals($expected, $result);
   }
 
-  /**
-   * @covers ::getProxyCode()
-   */
   public function testGetProxyCode() {
     $definition = new Definition('Drupal\Tests\Component\ProxyBuilder\TestService');
     $definition->setLazy(TRUE);
@@ -102,26 +99,6 @@ public function testGetProxyCode() {
     $this->assertEquals($class, $result);
   }
 
-  /**
-   * @covers ::getProxyCode()
-   */
-  public function testGetProxyCodeWithSameClassMultipleTimes() {
-    $definition = new Definition('Drupal\Tests\Component\ProxyBuilder\TestService');
-    $definition->setLazy(TRUE);
-
-    $class = 'class Drupal_Tests_Component_ProxyBuilder_TestService_Proxy {}';
-    $this->proxyBuilder->expects($this->once())
-      ->method('build')
-      ->with('Drupal\Tests\Component\ProxyBuilder\TestService')
-      ->willReturn($class);
-
-    $result = $this->proxyDumper->getProxyCode($definition);
-    $this->assertEquals($class, $result);
-
-    $result = $this->proxyDumper->getProxyCode($definition);
-    $this->assertEquals('', $result);
-  }
-
 }
 
 class TestService {
diff --git a/core/tests/Drupal/Tests/Core/EventSubscriber/RedirectResponseSubscriberTest.php b/core/tests/Drupal/Tests/Core/EventSubscriber/RedirectResponseSubscriberTest.php
index 9ff5414..69abba5 100644
--- a/core/tests/Drupal/Tests/Core/EventSubscriber/RedirectResponseSubscriberTest.php
+++ b/core/tests/Drupal/Tests/Core/EventSubscriber/RedirectResponseSubscriberTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\Tests\Core\EventSubscriber;
 
 use Drupal\Core\EventSubscriber\RedirectResponseSubscriber;
-use Drupal\Core\Routing\RequestContext;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\EventDispatcher\EventDispatcher;
 use Symfony\Component\HttpFoundation\RedirectResponse;
@@ -24,12 +23,28 @@
 class RedirectResponseSubscriberTest extends UnitTestCase {
 
   /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $GLOBALS['base_url'] = 'http://example.com/drupal';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function tearDown() {
+    unset($GLOBALS['base_url']);
+    parent::tearDown();
+  }
+
+  /**
    * Test destination detection and redirection.
    *
    * @param Request $request
    *   The request object with destination query set.
-   * @param string|bool $expected
-   *   The expected target URL or FALSE.
+   * @param bool $expected
+   *   Whether or not a redirect will occur.
    *
    * @covers ::checkRedirectUrl
    * @dataProvider providerTestDestinationRedirect
@@ -45,28 +60,19 @@ public function testDestinationRedirect(Request $request, $expected) {
 
     if ($expected) {
       $url_generator
-        ->expects($this->any())
+        ->expects($this->once())
         ->method('generateFromPath')
-          ->willReturnMap([
-            ['test', ['query' => [], 'fragment' => '', 'absolute' => TRUE], 'http://example.com/drupal/test']
-          ]);
+          ->will($this->returnValue('success'));
     }
 
-    $request_context = $this->getMockBuilder('Drupal\Core\Routing\RequestContext')
-      ->disableOriginalConstructor()
-      ->getMock();
-    $request_context->expects($this->any())
-      ->method('getCompleteBaseUrl')
-      ->willReturn('http://example.com/drupal');
-
-    $listener = new RedirectResponseSubscriber($url_generator, $request_context);
+    $listener = new RedirectResponseSubscriber($url_generator);
     $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'checkRedirectUrl'));
     $event = new FilterResponseEvent($kernel, $request, HttpKernelInterface::SUB_REQUEST, $response);
     $dispatcher->dispatch(KernelEvents::RESPONSE, $event);
 
     $target_url = $event->getResponse()->getTargetUrl();
     if ($expected) {
-      $this->assertEquals($expected, $target_url);
+      $this->assertEquals('success', $target_url);
     }
     else {
       $this->assertEquals('http://example.com/drupal', $target_url);
@@ -84,9 +90,9 @@ public static function providerTestDestinationRedirect() {
       array(new Request(array('destination' => 'http://example.com')), FALSE),
       array(new Request(array('destination' => 'http://example.com/foobar')), FALSE),
       array(new Request(array('destination' => 'http://example.ca/drupal')), FALSE),
-      array(new Request(array('destination' => 'test')), 'http://example.com/drupal/test'),
-      array(new Request(array('destination' => 'http://example.com/drupal/')), 'http://example.com/drupal/'),
-      array(new Request(array('destination' => 'http://example.com/drupal/test')), 'http://example.com/drupal/test'),
+      array(new Request(array('destination' => 'test')), TRUE),
+      array(new Request(array('destination' => 'http://example.com/drupal/')), TRUE),
+      array(new Request(array('destination' => 'http://example.com/drupal/test')), TRUE),
     );
   }
 }
diff --git a/core/themes/classy/templates/links.html.twig b/core/themes/classy/templates/links.html.twig
deleted file mode 100644
index 56c7ec2..0000000
--- a/core/themes/classy/templates/links.html.twig
+++ /dev/null
@@ -1,60 +0,0 @@
-{#
-/**
- * @file
- * Default theme implementation for a set of links.
- *
- * Available variables:
- * - attributes: Attributes for the UL containing the list of links.
- * - links: Links to be output.
- *   Each link will have the following elements:
- *   - title: The link text.
- *   - href: The link URL. If omitted, the 'title' is shown as a plain text
- *     item in the links list. If 'href' is supplied, the entire link is passed
- *     to l() as its $options parameter.
- *   - html: (optional) Whether or not 'title' is HTML. If set, the title will
- *     not be passed through \Drupal\Component\Utility\String::checkPlain().
- *   - attributes: (optional) HTML attributes for the anchor, or for the <span>
- *     tag if no 'href' is supplied.
- *   - link_key: The link CSS class.
- * - heading: (optional) A heading to precede the links.
- *   - text: The heading text.
- *   - level: The heading level (e.g. 'h2', 'h3').
- *   - attributes: (optional) A keyed list of attributes for the heading.
- *   If the heading is a string, it will be used as the text of the heading and
- *   the level will default to 'h2'.
- *
- *   Headings should be used on navigation menus and any list of links that
- *   consistently appears on multiple pages. To make the heading invisible use
- *   the 'visually-hidden' CSS class. Do not use 'display:none', which
- *   removes it from screen readers and assistive technology. Headings allow
- *   screen reader and keyboard only users to navigate to or skip the links.
- *   See http://juicystudio.com/article/screen-readers-display-none.php and
- *   http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
- *
- * @see template_preprocess_links()
- *
- * @ingroup themeable
- */
-#}
-{% if links -%}
-  {%- if heading -%}
-    {%- if heading.level -%}
-      <{{ heading.level }}{{ heading.attributes }}>{{ heading.text }}</{{ heading.level }}>
-    {%- else -%}
-      <h2{{ heading.attributes }}>{{ heading.text }}</h2>
-    {%- endif -%}
-  {%- endif -%}
-  <ul{{ attributes }}>
-    {%- for key, item in links -%}
-      <li{{ item.attributes.addClass(key|clean_class) }}>
-        {%- if item.link -%}
-          {{ item.link }}
-        {%- elseif item.text_attributes -%}
-          <span{{ item.text_attributes }}>{{ item.text }}</span>
-        {%- else -%}
-          {{ item.text }}
-        {%- endif -%}
-      </li>
-    {%- endfor -%}
-  </ul>
-{%- endif %}
diff --git a/core/themes/seven/css/components/field-ui.css b/core/themes/seven/css/components/field-ui.css
index 9dd396e..7517ca2 100644
--- a/core/themes/seven/css/components/field-ui.css
+++ b/core/themes/seven/css/components/field-ui.css
@@ -18,6 +18,9 @@
 #field-display-overview .field-plugin-settings-edit-form .form-submit {
   margin-bottom: 0;
 }
+#field-display-overview .form-item-fields-field-image-settings-edit-form-settings-image-style {
+  white-space: normal;
+}
 #field-display-overview .form-item-fields-field-image-settings-edit-form-settings-image-style .description {
   display: inline-block;
   margin-left: 1em; /* LTR */
