diff --git a/core/CHANGELOG.txt b/core/CHANGELOG.txt
index d4f0847642f43b522220bf714b316545f76420a4..8350c3a29adcb2116c11cdc75a2efb700b93ebd0 100644
--- a/core/CHANGELOG.txt
+++ b/core/CHANGELOG.txt
@@ -1,4 +1,3 @@
-
 Drupal 8.0, xxxx-xx-xx (development version)
 ----------------------
 - Added Twig as the default template engine and converted all .tpl.php templates
@@ -43,6 +42,7 @@ Drupal 8.0, xxxx-xx-xx (development version)
       * Poll
       * Profile
       * Trigger
+- Removed the Overlay module from core.
 - Removed the Garland theme from core.
 - Removed the Statistics module's accesslog functionality and reports from core.
 - Removed backwards-compatibility with 'magic_quotes_gpc'/'magic_quotes_runtime'
@@ -52,6 +52,7 @@ Drupal 8.0, xxxx-xx-xx (development version)
 - JavaScript changes:
     * Updated to jQuery 2.0.3
     * Updated to jQuery UI 1.10.2
+    * Removed jquery.bbq
 - Tremendously improved language support all around.
     * Great language improvements for users:
       * Improved language selection with user preference detection in the
diff --git a/core/MAINTAINERS.txt b/core/MAINTAINERS.txt
index 8c69cdb88281a25b99b5f8d3312b0bacb97567b2..0b7bb9680dac76af52459ff0e82c253883f650a8 100644
--- a/core/MAINTAINERS.txt
+++ b/core/MAINTAINERS.txt
@@ -330,9 +330,6 @@ Number module
 Options module
 - Yves Chedemois 'yched' http://drupal.org/user/39567
 
-Overlay module
-- ?
-
 Path module
 - ?
 
diff --git a/core/assets/vendor/jquery-bbq/jquery.ba-bbq.js b/core/assets/vendor/jquery-bbq/jquery.ba-bbq.js
deleted file mode 100644
index 1b02aca52af6296b818046183c527f504fe588d9..0000000000000000000000000000000000000000
--- a/core/assets/vendor/jquery-bbq/jquery.ba-bbq.js
+++ /dev/null
@@ -1,1380 +0,0 @@
-/*!
- * jQuery BBQ: Back Button & Query Library - v1.3pre - 8/26/2010
- * http://benalman.com/projects/jquery-bbq-plugin/
- *
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-
-// Script: jQuery BBQ: Back Button & Query Library
-//
-// *Version: 1.3pre, Last updated: 8/26/2010*
-//
-// Project Home - http://benalman.com/projects/jquery-bbq-plugin/
-// GitHub       - http://github.com/cowboy/jquery-bbq/
-// Source       - http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.js
-// (Minified)   - http://github.com/cowboy/jquery-bbq/raw/master/jquery.ba-bbq.min.js (2.2kb gzipped)
-//
-// About: License
-//
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-//
-// About: Examples
-//
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-//
-// Basic AJAX     - http://benalman.com/code/projects/jquery-bbq/examples/fragment-basic/
-// Advanced AJAX  - http://benalman.com/code/projects/jquery-bbq/examples/fragment-advanced/
-// jQuery UI Tabs - http://benalman.com/code/projects/jquery-bbq/examples/fragment-jquery-ui-tabs/
-// Deparam        - http://benalman.com/code/projects/jquery-bbq/examples/deparam/
-//
-// About: Support and Testing
-//
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-//
-// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
-//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
-// Unit Tests      - http://benalman.com/code/projects/jquery-bbq/unit/
-//
-// About: Release History
-//
-// 1.3pre - (8/26/2010) Integrated <jQuery hashchange event> v1.3, which adds
-//         document.title and document.domain support in IE6/7, BlackBerry
-//         support, better Iframe hiding for accessibility reasons, and the new
-//         <jQuery.fn.hashchange> "shortcut" method. Added the
-//         <jQuery.param.sorted> method which reduces the possibility of
-//         extraneous hashchange event triggering. Added the
-//         <jQuery.param.fragment.ajaxCrawlable> method which can be used to
-//         enable Google "AJAX Crawlable mode."
-// 1.2.1 - (2/17/2010) Actually fixed the stale window.location Safari bug from
-//         <jQuery hashchange event> in BBQ, which was the main reason for the
-//         previous release!
-// 1.2   - (2/16/2010) Integrated <jQuery hashchange event> v1.2, which fixes a
-//         Safari bug, the event can now be bound before DOM ready, and IE6/7
-//         page should no longer scroll when the event is first bound. Also
-//         added the <jQuery.param.fragment.noEscape> method, and reworked the
-//         <hashchange event (BBQ)> internal "add" method to be compatible with
-//         changes made to the jQuery 1.4.2 special events API.
-// 1.1.1 - (1/22/2010) Integrated <jQuery hashchange event> v1.1, which fixes an
-//         obscure IE8 EmulateIE7 meta tag compatibility mode bug.
-// 1.1   - (1/9/2010) Broke out the jQuery BBQ event.special <hashchange event>
-//         functionality into a separate plugin for users who want just the
-//         basic event & back button support, without all the extra awesomeness
-//         that BBQ provides. This plugin will be included as part of jQuery BBQ,
-//         but also be available separately. See <jQuery hashchange event>
-//         plugin for more information. Also added the <jQuery.bbq.removeState>
-//         method and added additional <jQuery.deparam> examples.
-// 1.0.3 - (12/2/2009) Fixed an issue in IE 6 where location.search and
-//         location.hash would report incorrectly if the hash contained the ?
-//         character. Also <jQuery.param.querystring> and <jQuery.param.fragment>
-//         will no longer parse params out of a URL that doesn't contain ? or #,
-//         respectively.
-// 1.0.2 - (10/10/2009) Fixed an issue in IE 6/7 where the hidden IFRAME caused
-//         a "This page contains both secure and nonsecure items." warning when
-//         used on an https:// page.
-// 1.0.1 - (10/7/2009) Fixed an issue in IE 8. Since both "IE7" and "IE8
-//         Compatibility View" modes erroneously report that the browser
-//         supports the native window.onhashchange event, a slightly more
-//         robust test needed to be added.
-// 1.0   - (10/2/2009) Initial release
-
-(function($,window){
-  '$:nomunge'; // Used by YUI compressor.
-
-  // Some convenient shortcuts.
-  var undefined,
-    aps = Array.prototype.slice,
-    decode = decodeURIComponent,
-
-    // Method / object references.
-    jq_param = $.param,
-    jq_param_sorted,
-    jq_param_fragment,
-    jq_deparam,
-    jq_deparam_fragment,
-    jq_bbq = $.bbq = $.bbq || {},
-    jq_bbq_pushState,
-    jq_bbq_getState,
-    jq_elemUrlAttr,
-    special = $.event.special,
-
-    // Reused strings.
-    str_hashchange = 'hashchange',
-    str_querystring = 'querystring',
-    str_fragment = 'fragment',
-    str_elemUrlAttr = 'elemUrlAttr',
-    str_href = 'href',
-    str_src = 'src',
-
-    // Reused RegExp.
-    re_params_querystring = /^.*\?|#.*$/g,
-    re_params_fragment,
-    re_fragment,
-    re_no_escape,
-
-    ajax_crawlable,
-    fragment_prefix,
-
-    // Used by jQuery.elemUrlAttr.
-    elemUrlAttr_cache = {};
-
-  // A few commonly used bits, broken out to help reduce minified file size.
-
-  function is_string( arg ) {
-    return typeof arg === 'string';
-  };
-
-  // Why write the same function twice? Let's curry! Mmmm, curry..
-
-  function curry( func ) {
-    var args = aps.call( arguments, 1 );
-
-    return function() {
-      return func.apply( this, args.concat( aps.call( arguments ) ) );
-    };
-  };
-
-  // Get location.hash (or what you'd expect location.hash to be) sans any
-  // leading #. Thanks for making this necessary, Firefox!
-  function get_fragment( url ) {
-    return url.replace( re_fragment, '$2' );
-  };
-
-  // Get location.search (or what you'd expect location.search to be) sans any
-  // leading #. Thanks for making this necessary, IE6!
-  function get_querystring( url ) {
-    return url.replace( /(?:^[^?#]*\?([^#]*).*$)?.*/, '$1' );
-  };
-
-  // Section: Param (to string)
-  //
-  // Method: jQuery.param.querystring
-  //
-  // Retrieve the query string from a URL or if no arguments are passed, the
-  // current window.location.href.
-  //
-  // Usage:
-  //
-  // > jQuery.param.querystring( [ url ] );
-  //
-  // Arguments:
-  //
-  //  url - (String) A URL containing query string params to be parsed. If url
-  //    is not passed, the current window.location.href is used.
-  //
-  // Returns:
-  //
-  //  (String) The parsed query string, with any leading "?" removed.
-  //
-
-  // Method: jQuery.param.querystring (build url)
-  //
-  // Merge a URL, with or without pre-existing query string params, plus any
-  // object, params string or URL containing query string params into a new URL.
-  //
-  // Usage:
-  //
-  // > jQuery.param.querystring( url, params [, merge_mode ] );
-  //
-  // Arguments:
-  //
-  //  url - (String) A valid URL for params to be merged into. This URL may
-  //    contain a query string and/or fragment (hash).
-  //  params - (String) A params string or URL containing query string params to
-  //    be merged into url.
-  //  params - (Object) A params object to be merged into url.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  //
-  //    * 0: params in the params argument will override any query string
-  //         params in url.
-  //    * 1: any query string params in url will override params in the params
-  //         argument.
-  //    * 2: params argument will completely replace any query string in url.
-  //
-  // Returns:
-  //
-  //  (String) A URL with a urlencoded query string in the format '?a=b&c=d&e=f'.
-
-  // Method: jQuery.param.fragment
-  //
-  // Retrieve the fragment (hash) from a URL or if no arguments are passed, the
-  // current window.location.href.
-  //
-  // Usage:
-  //
-  // > jQuery.param.fragment( [ url ] );
-  //
-  // Arguments:
-  //
-  //  url - (String) A URL containing fragment (hash) params to be parsed. If
-  //    url is not passed, the current window.location.href is used.
-  //
-  // Returns:
-  //
-  //  (String) The parsed fragment (hash) string, with any leading "#" removed.
-
-  // Method: jQuery.param.fragment (build url)
-  //
-  // Merge a URL, with or without pre-existing fragment (hash) params, plus any
-  // object, params string or URL containing fragment (hash) params into a new
-  // URL.
-  //
-  // Usage:
-  //
-  // > jQuery.param.fragment( url, params [, merge_mode ] );
-  //
-  // Arguments:
-  //
-  //  url - (String) A valid URL for params to be merged into. This URL may
-  //    contain a query string and/or fragment (hash).
-  //  params - (String) A params string or URL containing fragment (hash) params
-  //    to be merged into url.
-  //  params - (Object) A params object to be merged into url.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  //
-  //    * 0: params in the params argument will override any fragment (hash)
-  //         params in url.
-  //    * 1: any fragment (hash) params in url will override params in the
-  //         params argument.
-  //    * 2: params argument will completely replace any query string in url.
-  //
-  // Returns:
-  //
-  //  (String) A URL with a urlencoded fragment (hash) in the format '#a=b&c=d&e=f'.
-
-  function jq_param_sub( is_fragment, get_func, url, params, merge_mode ) {
-    var result,
-      qs,
-      matches,
-      url_params,
-      hash;
-
-    if ( params !== undefined ) {
-      // Build URL by merging params into url string.
-
-      // matches[1] = url part that precedes params, not including trailing ?/#
-      // matches[2] = params, not including leading ?/#
-      // matches[3] = if in 'querystring' mode, hash including leading #, otherwise ''
-      matches = url.match( is_fragment ? re_fragment : /^([^#?]*)\??([^#]*)(#?.*)/ );
-
-      // Get the hash if in 'querystring' mode, and it exists.
-      hash = matches[3] || '';
-
-      if ( merge_mode === 2 && is_string( params ) ) {
-        // If merge_mode is 2 and params is a string, merge the fragment / query
-        // string into the URL wholesale, without converting it into an object.
-        qs = params.replace( is_fragment ? re_params_fragment : re_params_querystring, '' );
-
-      } else {
-        // Convert relevant params in url to object.
-        url_params = jq_deparam( matches[2] );
-
-        params = is_string( params )
-
-          // Convert passed params string into object.
-          ? jq_deparam[ is_fragment ? str_fragment : str_querystring ]( params )
-
-          // Passed params object.
-          : params;
-
-        qs = merge_mode === 2 ? params                              // passed params replace url params
-          : merge_mode === 1  ? $.extend( {}, params, url_params )  // url params override passed params
-          : $.extend( {}, url_params, params );                     // passed params override url params
-
-        // Convert params object into a sorted params string.
-        qs = jq_param_sorted( qs );
-
-        // Unescape characters specified via $.param.noEscape. Since only hash-
-        // history users have requested this feature, it's only enabled for
-        // fragment-related params strings.
-        if ( is_fragment ) {
-          qs = qs.replace( re_no_escape, decode );
-        }
-      }
-
-      // Build URL from the base url, querystring and hash. In 'querystring'
-      // mode, ? is only added if a query string exists. In 'fragment' mode, #
-      // is always added.
-      result = matches[1] + ( is_fragment ? fragment_prefix : qs || !matches[1] ? '?' : '' ) + qs + hash;
-
-    } else {
-      // If URL was passed in, parse params from URL string, otherwise parse
-      // params from window.location.href.
-      result = get_func( url !== undefined ? url : location.href );
-    }
-
-    return result;
-  };
-
-  jq_param[ str_querystring ]                  = curry( jq_param_sub, 0, get_querystring );
-  jq_param[ str_fragment ] = jq_param_fragment = curry( jq_param_sub, 1, get_fragment );
-
-  // Method: jQuery.param.sorted
-  //
-  // Returns a params string equivalent to that returned by the internal
-  // jQuery.param method, but sorted, which makes it suitable for use as a
-  // cache key.
-  //
-  // For example, in most browsers jQuery.param({z:1,a:2}) returns "z=1&a=2"
-  // and jQuery.param({a:2,z:1}) returns "a=2&z=1". Even though both the
-  // objects being serialized and the resulting params strings are equivalent,
-  // if these params strings were set into the location.hash fragment
-  // sequentially, the hashchange event would be triggered unnecessarily, since
-  // the strings are different (even though the data described by them is the
-  // same). By sorting the params string, unecessary hashchange event triggering
-  // can be avoided.
-  //
-  // Usage:
-  //
-  // > jQuery.param.sorted( obj [, traditional ] );
-  //
-  // Arguments:
-  //
-  //  obj - (Object) An object to be serialized.
-  //  traditional - (Boolean) Params deep/shallow serialization mode. See the
-  //    documentation at http://api.jquery.com/jQuery.param/ for more detail.
-  //
-  // Returns:
-  //
-  //  (String) A sorted params string.
-
-  jq_param.sorted = jq_param_sorted = function( a, traditional ) {
-    var arr = [],
-      obj = {};
-
-    $.each( jq_param( a, traditional ).split( '&' ), function(i,v){
-      var key = v.replace( /(?:%5B|=).*$/, '' ),
-        key_obj = obj[ key ];
-
-      if ( !key_obj ) {
-        key_obj = obj[ key ] = [];
-        arr.push( key );
-      }
-
-      key_obj.push( v );
-    });
-
-    return $.map( arr.sort(), function(v){
-      return obj[ v ];
-    }).join( '&' );
-  };
-
-  // Method: jQuery.param.fragment.noEscape
-  //
-  // Specify characters that will be left unescaped when fragments are created
-  // or merged using <jQuery.param.fragment>, or when the fragment is modified
-  // using <jQuery.bbq.pushState>. This option only applies to serialized data
-  // object fragments, and not set-as-string fragments. Does not affect the
-  // query string. Defaults to ",/" (comma, forward slash).
-  //
-  // Note that this is considered a purely aesthetic option, and will help to
-  // create URLs that "look pretty" in the address bar or bookmarks, without
-  // affecting functionality in any way. That being said, be careful to not
-  // unescape characters that are used as delimiters or serve a special
-  // purpose, such as the "#?&=+" (octothorpe, question mark, ampersand,
-  // equals, plus) characters.
-  //
-  // Usage:
-  //
-  // > jQuery.param.fragment.noEscape( [ chars ] );
-  //
-  // Arguments:
-  //
-  //  chars - (String) The characters to not escape in the fragment. If
-  //    unspecified, defaults to empty string (escape all characters).
-  //
-  // Returns:
-  //
-  //  Nothing.
-
-  jq_param_fragment.noEscape = function( chars ) {
-    chars = chars || '';
-    var arr = $.map( chars.split(''), encodeURIComponent );
-    re_no_escape = new RegExp( arr.join('|'), 'g' );
-  };
-
-  // A sensible default. These are the characters people seem to complain about
-  // "uglifying up the URL" the most.
-  jq_param_fragment.noEscape( ',/' );
-
-  // Method: jQuery.param.fragment.ajaxCrawlable
-  //
-  // TODO: DESCRIBE
-  //
-  // Usage:
-  //
-  // > jQuery.param.fragment.ajaxCrawlable( [ state ] );
-  //
-  // Arguments:
-  //
-  //  state - (Boolean) TODO: DESCRIBE
-  //
-  // Returns:
-  //
-  //  (Boolean) The current ajaxCrawlable state.
-
-  jq_param_fragment.ajaxCrawlable = function( state ) {
-    if ( state !== undefined ) {
-      if ( state ) {
-        re_params_fragment = /^.*(?:#!|#)/;
-        re_fragment = /^([^#]*)(?:#!|#)?(.*)$/;
-        fragment_prefix = '#!';
-      } else {
-        re_params_fragment = /^.*#/;
-        re_fragment = /^([^#]*)#?(.*)$/;
-        fragment_prefix = '#';
-      }
-      ajax_crawlable = !!state;
-    }
-
-    return ajax_crawlable;
-  };
-
-  jq_param_fragment.ajaxCrawlable( 0 );
-
-  // Section: Deparam (from string)
-  //
-  // Method: jQuery.deparam
-  //
-  // Deserialize a params string into an object, optionally coercing numbers,
-  // booleans, null and undefined values; this method is the counterpart to the
-  // internal jQuery.param method.
-  //
-  // Usage:
-  //
-  // > jQuery.deparam( params [, coerce ] );
-  //
-  // Arguments:
-  //
-  //  params - (String) A params string to be parsed.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false if omitted.
-  //
-  // Returns:
-  //
-  //  (Object) An object representing the deserialized params string.
-
-  $.deparam = jq_deparam = function( params, coerce ) {
-    var obj = {},
-      coerce_types = { 'true': !0, 'false': !1, 'null': null };
-
-    // Iterate over all name=value pairs.
-    $.each( params.replace( /\+/g, ' ' ).split( '&' ), function(j,v){
-      var param = v.split( '=' ),
-        key = decode( param[0] ),
-        val,
-        cur = obj,
-        i = 0,
-
-        // If key is more complex than 'foo', like 'a[]' or 'a[b][c]', split it
-        // into its component parts.
-        keys = key.split( '][' ),
-        keys_last = keys.length - 1;
-
-      // If the first keys part contains [ and the last ends with ], then []
-      // are correctly balanced.
-      if ( /\[/.test( keys[0] ) && /\]$/.test( keys[ keys_last ] ) ) {
-        // Remove the trailing ] from the last keys part.
-        keys[ keys_last ] = keys[ keys_last ].replace( /\]$/, '' );
-
-        // Split first keys part into two parts on the [ and add them back onto
-        // the beginning of the keys array.
-        keys = keys.shift().split('[').concat( keys );
-
-        keys_last = keys.length - 1;
-      } else {
-        // Basic 'foo' style key.
-        keys_last = 0;
-      }
-
-      // Are we dealing with a name=value pair, or just a name?
-      if ( param.length === 2 ) {
-        val = decode( param[1] );
-
-        // Coerce values.
-        if ( coerce ) {
-          val = val && !isNaN(val)            ? +val              // number
-            : val === 'undefined'             ? undefined         // undefined
-            : coerce_types[val] !== undefined ? coerce_types[val] // true, false, null
-            : val;                                                // string
-        }
-
-        if ( keys_last ) {
-          // Complex key, build deep object structure based on a few rules:
-          // * The 'cur' pointer starts at the object top-level.
-          // * [] = array push (n is set to array length), [n] = array if n is
-          //   numeric, otherwise object.
-          // * If at the last keys part, set the value.
-          // * For each keys part, if the current level is undefined create an
-          //   object or array based on the type of the next keys part.
-          // * Move the 'cur' pointer to the next level.
-          // * Rinse & repeat.
-          for ( ; i <= keys_last; i++ ) {
-            key = keys[i] === '' ? cur.length : keys[i];
-            cur = cur[key] = i < keys_last
-              ? cur[key] || ( keys[i+1] && isNaN( keys[i+1] ) ? {} : [] )
-              : val;
-          }
-
-        } else {
-          // Simple key, even simpler rules, since only scalars and shallow
-          // arrays are allowed.
-
-          if ( $.isArray( obj[key] ) ) {
-            // val is already an array, so push on the next value.
-            obj[key].push( val );
-
-          } else if ( obj[key] !== undefined ) {
-            // val isn't an array, but since a second value has been specified,
-            // convert val into an array.
-            obj[key] = [ obj[key], val ];
-
-          } else {
-            // val is a scalar.
-            obj[key] = val;
-          }
-        }
-
-      } else if ( key ) {
-        // No value was defined, so set something meaningful.
-        obj[key] = coerce
-          ? undefined
-          : '';
-      }
-    });
-
-    return obj;
-  };
-
-  // Method: jQuery.deparam.querystring
-  //
-  // Parse the query string from a URL or the current window.location.href,
-  // deserializing it into an object, optionally coercing numbers, booleans,
-  // null and undefined values.
-  //
-  // Usage:
-  //
-  // > jQuery.deparam.querystring( [ url ] [, coerce ] );
-  //
-  // Arguments:
-  //
-  //  url - (String) An optional params string or URL containing query string
-  //    params to be parsed. If url is omitted, the current
-  //    window.location.href is used.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false if omitted.
-  //
-  // Returns:
-  //
-  //  (Object) An object representing the deserialized params string.
-
-  // Method: jQuery.deparam.fragment
-  //
-  // Parse the fragment (hash) from a URL or the current window.location.href,
-  // deserializing it into an object, optionally coercing numbers, booleans,
-  // null and undefined values.
-  //
-  // Usage:
-  //
-  // > jQuery.deparam.fragment( [ url ] [, coerce ] );
-  //
-  // Arguments:
-  //
-  //  url - (String) An optional params string or URL containing fragment (hash)
-  //    params to be parsed. If url is omitted, the current window.location.href
-  //    is used.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false if omitted.
-  //
-  // Returns:
-  //
-  //  (Object) An object representing the deserialized params string.
-
-  function jq_deparam_sub( is_fragment, url_or_params, coerce ) {
-    if ( url_or_params === undefined || typeof url_or_params === 'boolean' ) {
-      // url_or_params not specified.
-      coerce = url_or_params;
-      url_or_params = jq_param[ is_fragment ? str_fragment : str_querystring ]();
-    } else {
-      url_or_params = is_string( url_or_params )
-        ? url_or_params.replace( is_fragment ? re_params_fragment : re_params_querystring, '' )
-        : url_or_params;
-    }
-
-    return jq_deparam( url_or_params, coerce );
-  };
-
-  jq_deparam[ str_querystring ]                    = curry( jq_deparam_sub, 0 );
-  jq_deparam[ str_fragment ] = jq_deparam_fragment = curry( jq_deparam_sub, 1 );
-
-  // Section: Element manipulation
-  //
-  // Method: jQuery.elemUrlAttr
-  //
-  // Get the internal "Default URL attribute per tag" list, or augment the list
-  // with additional tag-attribute pairs, in case the defaults are insufficient.
-  //
-  // In the <jQuery.fn.querystring> and <jQuery.fn.fragment> methods, this list
-  // is used to determine which attribute contains the URL to be modified, if
-  // an "attr" param is not specified.
-  //
-  // Default Tag-Attribute List:
-  //
-  //  a      - href
-  //  base   - href
-  //  iframe - src
-  //  img    - src
-  //  input  - src
-  //  form   - action
-  //  link   - href
-  //  script - src
-  //
-  // Usage:
-  //
-  // > jQuery.elemUrlAttr( [ tag_attr ] );
-  //
-  // Arguments:
-  //
-  //  tag_attr - (Object) An object containing a list of tag names and their
-  //    associated default attribute names in the format { tag: 'attr', ... } to
-  //    be merged into the internal tag-attribute list.
-  //
-  // Returns:
-  //
-  //  (Object) An object containing all stored tag-attribute values.
-
-  // Only define function and set defaults if function doesn't already exist, as
-  // the urlInternal plugin will provide this method as well.
-  $[ str_elemUrlAttr ] || ($[ str_elemUrlAttr ] = function( obj ) {
-    return $.extend( elemUrlAttr_cache, obj );
-  })({
-    a: str_href,
-    base: str_href,
-    iframe: str_src,
-    img: str_src,
-    input: str_src,
-    form: 'action',
-    link: str_href,
-    script: str_src
-  });
-
-  jq_elemUrlAttr = $[ str_elemUrlAttr ];
-
-  // Method: jQuery.fn.querystring
-  //
-  // Update URL attribute in one or more elements, merging the current URL (with
-  // or without pre-existing query string params) plus any params object or
-  // string into a new URL, which is then set into that attribute. Like
-  // <jQuery.param.querystring (build url)>, but for all elements in a jQuery
-  // collection.
-  //
-  // Usage:
-  //
-  // > jQuery('selector').querystring( [ attr, ] params [, merge_mode ] );
-  //
-  // Arguments:
-  //
-  //  attr - (String) Optional name of an attribute that will contain a URL to
-  //    merge params or url into. See <jQuery.elemUrlAttr> for a list of default
-  //    attributes.
-  //  params - (Object) A params object to be merged into the URL attribute.
-  //  params - (String) A URL containing query string params, or params string
-  //    to be merged into the URL attribute.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  //
-  //    * 0: params in the params argument will override any params in attr URL.
-  //    * 1: any params in attr URL will override params in the params argument.
-  //    * 2: params argument will completely replace any query string in attr
-  //         URL.
-  //
-  // Returns:
-  //
-  //  (jQuery) The initial jQuery collection of elements, but with modified URL
-  //  attribute values.
-
-  // Method: jQuery.fn.fragment
-  //
-  // Update URL attribute in one or more elements, merging the current URL (with
-  // or without pre-existing fragment/hash params) plus any params object or
-  // string into a new URL, which is then set into that attribute. Like
-  // <jQuery.param.fragment (build url)>, but for all elements in a jQuery
-  // collection.
-  //
-  // Usage:
-  //
-  // > jQuery('selector').fragment( [ attr, ] params [, merge_mode ] );
-  //
-  // Arguments:
-  //
-  //  attr - (String) Optional name of an attribute that will contain a URL to
-  //    merge params into. See <jQuery.elemUrlAttr> for a list of default
-  //    attributes.
-  //  params - (Object) A params object to be merged into the URL attribute.
-  //  params - (String) A URL containing fragment (hash) params, or params
-  //    string to be merged into the URL attribute.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified, and is as-follows:
-  //
-  //    * 0: params in the params argument will override any params in attr URL.
-  //    * 1: any params in attr URL will override params in the params argument.
-  //    * 2: params argument will completely replace any fragment (hash) in attr
-  //         URL.
-  //
-  // Returns:
-  //
-  //  (jQuery) The initial jQuery collection of elements, but with modified URL
-  //  attribute values.
-
-  function jq_fn_sub( mode, force_attr, params, merge_mode ) {
-    if ( !is_string( params ) && typeof params !== 'object' ) {
-      // force_attr not specified.
-      merge_mode = params;
-      params = force_attr;
-      force_attr = undefined;
-    }
-
-    return this.each(function(){
-      var that = $(this),
-
-        // Get attribute specified, or default specified via $.elemUrlAttr.
-        attr = force_attr || jq_elemUrlAttr()[ ( this.nodeName || '' ).toLowerCase() ] || '',
-
-        // Get URL value.
-        url = attr && that.attr( attr ) || '';
-
-      // Update attribute with new URL.
-      that.attr( attr, jq_param[ mode ]( url, params, merge_mode ) );
-    });
-
-  };
-
-  $.fn[ str_querystring ] = curry( jq_fn_sub, str_querystring );
-  $.fn[ str_fragment ]    = curry( jq_fn_sub, str_fragment );
-
-  // Section: History, hashchange event
-  //
-  // Method: jQuery.bbq.pushState
-  //
-  // Adds a 'state' into the browser history at the current position, setting
-  // location.hash and triggering any bound <hashchange event> callbacks
-  // (provided the new state is different than the previous state).
-  //
-  // If no arguments are passed, an empty state is created, which is just a
-  // shortcut for jQuery.bbq.pushState( {}, 2 ).
-  //
-  // Usage:
-  //
-  // > jQuery.bbq.pushState( [ params [, merge_mode ] ] );
-  //
-  // Arguments:
-  //
-  //  params - (String) A serialized params string or a hash string beginning
-  //    with # to merge into location.hash.
-  //  params - (Object) A params object to merge into location.hash.
-  //  merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
-  //    specified (unless a hash string beginning with # is specified, in which
-  //    case merge behavior defaults to 2), and is as-follows:
-  //
-  //    * 0: params in the params argument will override any params in the
-  //         current state.
-  //    * 1: any params in the current state will override params in the params
-  //         argument.
-  //    * 2: params argument will completely replace current state.
-  //
-  // Returns:
-  //
-  //  Nothing.
-  //
-  // Additional Notes:
-  //
-  //  * Setting an empty state may cause the browser to scroll.
-  //  * Unlike the fragment and querystring methods, if a hash string beginning
-  //    with # is specified as the params agrument, merge_mode defaults to 2.
-
-  jq_bbq.pushState = jq_bbq_pushState = function( params, merge_mode ) {
-    if ( is_string( params ) && /^#/.test( params ) && merge_mode === undefined ) {
-      // Params string begins with # and merge_mode not specified, so completely
-      // overwrite window.location.hash.
-      merge_mode = 2;
-    }
-
-    var has_args = params !== undefined,
-      // Merge params into window.location using $.param.fragment.
-      url = jq_param_fragment( location.href,
-        has_args ? params : {}, has_args ? merge_mode : 2 );
-
-    // Set new window.location.href. Note that Safari 3 & Chrome barf on
-    // location.hash = '#' so the entire URL is set.
-    location.href = url;
-  };
-
-  // Method: jQuery.bbq.getState
-  //
-  // Retrieves the current 'state' from the browser history, parsing
-  // location.hash for a specific key or returning an object containing the
-  // entire state, optionally coercing numbers, booleans, null and undefined
-  // values.
-  //
-  // Usage:
-  //
-  // > jQuery.bbq.getState( [ key ] [, coerce ] );
-  //
-  // Arguments:
-  //
-  //  key - (String) An optional state key for which to return a value.
-  //  coerce - (Boolean) If true, coerces any numbers or true, false, null, and
-  //    undefined to their actual value. Defaults to false.
-  //
-  // Returns:
-  //
-  //  (Anything) If key is passed, returns the value corresponding with that key
-  //    in the location.hash 'state', or undefined. If not, an object
-  //    representing the entire 'state' is returned.
-
-  jq_bbq.getState = jq_bbq_getState = function( key, coerce ) {
-    return key === undefined || typeof key === 'boolean'
-      ? jq_deparam_fragment( key ) // 'key' really means 'coerce' here
-      : jq_deparam_fragment( coerce )[ key ];
-  };
-
-  // Method: jQuery.bbq.removeState
-  //
-  // Remove one or more keys from the current browser history 'state', creating
-  // a new state, setting location.hash and triggering any bound
-  // <hashchange event> callbacks (provided the new state is different than
-  // the previous state).
-  //
-  // If no arguments are passed, an empty state is created, which is just a
-  // shortcut for jQuery.bbq.pushState( {}, 2 ).
-  //
-  // Usage:
-  //
-  // > jQuery.bbq.removeState( [ key [, key ... ] ] );
-  //
-  // Arguments:
-  //
-  //  key - (String) One or more key values to remove from the current state,
-  //    passed as individual arguments.
-  //  key - (Array) A single array argument that contains a list of key values
-  //    to remove from the current state.
-  //
-  // Returns:
-  //
-  //  Nothing.
-  //
-  // Additional Notes:
-  //
-  //  * Setting an empty state may cause the browser to scroll.
-
-  jq_bbq.removeState = function( arr ) {
-    var state = {};
-
-    // If one or more arguments is passed..
-    if ( arr !== undefined ) {
-
-      // Get the current state.
-      state = jq_bbq_getState();
-
-      // For each passed key, delete the corresponding property from the current
-      // state.
-      $.each( $.isArray( arr ) ? arr : arguments, function(i,v){
-        delete state[ v ];
-      });
-    }
-
-    // Set the state, completely overriding any existing state.
-    jq_bbq_pushState( state, 2 );
-  };
-
-  // Event: hashchange event (BBQ)
-  //
-  // Usage in jQuery 1.4 and newer:
-  //
-  // In jQuery 1.4 and newer, the event object passed into any hashchange event
-  // callback is augmented with a copy of the location.hash fragment at the time
-  // the event was triggered as its event.fragment property. In addition, the
-  // event.getState method operates on this property (instead of location.hash)
-  // which allows this fragment-as-a-state to be referenced later, even after
-  // window.location may have changed.
-  //
-  // Note that event.fragment and event.getState are not defined according to
-  // W3C (or any other) specification, but will still be available whether or
-  // not the hashchange event exists natively in the browser, because of the
-  // utility they provide.
-  //
-  // The event.fragment property contains the output of <jQuery.param.fragment>
-  // and the event.getState method is equivalent to the <jQuery.bbq.getState>
-  // method.
-  //
-  // > $(window).bind( 'hashchange', function( event ) {
-  // >   var hash_str = event.fragment,
-  // >     param_obj = event.getState(),
-  // >     param_val = event.getState( 'param_name' ),
-  // >     param_val_coerced = event.getState( 'param_name', true );
-  // >   ...
-  // > });
-  //
-  // Usage in jQuery 1.3.2:
-  //
-  // In jQuery 1.3.2, the event object cannot to be augmented as in jQuery 1.4+,
-  // so the fragment state isn't bound to the event object and must instead be
-  // parsed using the <jQuery.param.fragment> and <jQuery.bbq.getState> methods.
-  //
-  // > $(window).bind( 'hashchange', function( event ) {
-  // >   var hash_str = $.param.fragment(),
-  // >     param_obj = $.bbq.getState(),
-  // >     param_val = $.bbq.getState( 'param_name' ),
-  // >     param_val_coerced = $.bbq.getState( 'param_name', true );
-  // >   ...
-  // > });
-  //
-  // Additional Notes:
-  //
-  // * Due to changes in the special events API, jQuery BBQ v1.2 or newer is
-  //   required to enable the augmented event object in jQuery 1.4.2 and newer.
-  // * See <jQuery hashchange event> for more detailed information.
-
-  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
-
-    // Augmenting the event object with the .fragment property and .getState
-    // method requires jQuery 1.4 or newer. Note: with 1.3.2, everything will
-    // work, but the event won't be augmented)
-    add: function( handleObj ) {
-      var old_handler;
-
-      function new_handler(e) {
-        // e.fragment is set to the value of location.hash (with any leading #
-        // removed) at the time the event is triggered.
-        var hash = e[ str_fragment ] = jq_param_fragment();
-
-        // e.getState() works just like $.bbq.getState(), but uses the
-        // e.fragment property stored on the event object.
-        e.getState = function( key, coerce ) {
-          return key === undefined || typeof key === 'boolean'
-            ? jq_deparam( hash, key ) // 'key' really means 'coerce' here
-            : jq_deparam( hash, coerce )[ key ];
-        };
-
-        old_handler.apply( this, arguments );
-      };
-
-      // This may seem a little complicated, but it normalizes the special event
-      // .add method between jQuery 1.4/1.4.1 and 1.4.2+
-      if ( $.isFunction( handleObj ) ) {
-        // 1.4, 1.4.1
-        old_handler = handleObj;
-        return new_handler;
-      } else {
-        // 1.4.2+
-        old_handler = handleObj.handler;
-        handleObj.handler = new_handler;
-      }
-    }
-
-  });
-
-})(jQuery,this);
-
-/*!
- * jQuery hashchange event - v1.3 - 7/21/2010
- * http://benalman.com/projects/jquery-hashchange-plugin/
- *
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-
-// Script: jQuery hashchange event
-//
-// *Version: 1.3, Last updated: 7/21/2010*
-//
-// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
-// GitHub       - http://github.com/cowboy/jquery-hashchange/
-// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
-// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
-//
-// About: License
-//
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-//
-// About: Examples
-//
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-//
-// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
-// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
-//
-// About: Support and Testing
-//
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-//
-// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
-//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
-// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
-//
-// About: Known issues
-//
-// While this jQuery hashchange event implementation is quite stable and
-// robust, there are a few unfortunate browser bugs surrounding expected
-// hashchange event-based behaviors, independent of any JavaScript
-// window.onhashchange abstraction. See the following examples for more
-// information:
-//
-// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
-// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
-// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
-// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
-//
-// Also note that should a browser natively support the window.onhashchange
-// event, but not report that it does, the fallback polling loop will be used.
-//
-// About: Release History
-//
-// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
-//         "removable" for mobile-only development. Added IE6/7 document.title
-//         support. Attempted to make Iframe as hidden as possible by using
-//         techniques from http://www.paciellogroup.com/blog/?p=604. Added
-//         support for the "shortcut" format $(window).hashchange( fn ) and
-//         $(window).hashchange() like jQuery provides for built-in events.
-//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
-//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
-//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
-//         file to address access denied issues when setting document.domain in
-//         IE6/7.
-// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
-//         from a page on another domain would cause an error in Safari 4. Also,
-//         IE6/7 Iframe is now inserted after the body (this actually works),
-//         which prevents the page from scrolling when the event is first bound.
-//         Event can also now be bound before DOM ready, but it won't be usable
-//         before then in IE6/7.
-// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
-//         where browser version is incorrectly reported as 8.0, despite
-//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
-// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
-//         window.onhashchange functionality into a separate plugin for users
-//         who want just the basic event & back button support, without all the
-//         extra awesomeness that BBQ provides. This plugin will be included as
-//         part of jQuery BBQ, but also be available separately.
-
-(function($,window,undefined){
-  '$:nomunge'; // Used by YUI compressor.
-
-  // Reused string.
-  var str_hashchange = 'hashchange',
-
-    // Method / object references.
-    doc = document,
-    fake_onhashchange,
-    special = $.event.special,
-
-    // Does the browser support window.onhashchange? Note that IE8 running in
-    // IE7 compatibility mode reports true for 'onhashchange' in window, even
-    // though the event isn't supported, so also test document.documentMode.
-    doc_mode = doc.documentMode,
-    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
-
-  // Get location.hash (or what you'd expect location.hash to be) sans any
-  // leading #. Thanks for making this necessary, Firefox!
-  function get_fragment( url ) {
-    url = url || location.href;
-    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
-  };
-
-  // Method: jQuery.fn.hashchange
-  //
-  // Bind a handler to the window.onhashchange event or trigger all bound
-  // window.onhashchange event handlers. This behavior is consistent with
-  // jQuery's built-in event handlers.
-  //
-  // Usage:
-  //
-  // > jQuery(window).hashchange( [ handler ] );
-  //
-  // Arguments:
-  //
-  //  handler - (Function) Optional handler to be bound to the hashchange
-  //    event. This is a "shortcut" for the more verbose form:
-  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
-  //    all bound window.onhashchange event handlers will be triggered. This
-  //    is a shortcut for the more verbose
-  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
-  //    the <hashchange event> section.
-  //
-  // Returns:
-  //
-  //  (jQuery) The initial jQuery collection of elements.
-
-  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
-  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
-  $.fn[ str_hashchange ] = function( fn ) {
-    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
-  };
-
-  // Property: jQuery.fn.hashchange.delay
-  //
-  // The numeric interval (in milliseconds) at which the <hashchange event>
-  // polling loop executes. Defaults to 50.
-
-  // Property: jQuery.fn.hashchange.domain
-  //
-  // If you're setting document.domain in your JavaScript, and you want hash
-  // history to work in IE6/7, not only must this property be set, but you must
-  // also set document.domain BEFORE jQuery is loaded into the page. This
-  // property is only applicable if you are supporting IE6/7 (or IE8 operating
-  // in "IE7 compatibility" mode).
-  //
-  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
-  // path of the included "document-domain.html" file, which can be renamed or
-  // modified if necessary (note that the document.domain specified must be the
-  // same in both your main JavaScript as well as in this file).
-  //
-  // Usage:
-  //
-  // jQuery.fn.hashchange.domain = document.domain;
-
-  // Property: jQuery.fn.hashchange.src
-  //
-  // If, for some reason, you need to specify an Iframe src file (for example,
-  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
-  // do so using this property. Note that when using this property, history
-  // won't be recorded in IE6/7 until the Iframe src file loads. This property
-  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
-  // compatibility" mode).
-  //
-  // Usage:
-  //
-  // jQuery.fn.hashchange.src = 'path/to/file.html';
-
-  $.fn[ str_hashchange ].delay = 50;
-  /*
-  $.fn[ str_hashchange ].domain = null;
-  $.fn[ str_hashchange ].src = null;
-  */
-
-  // Event: hashchange event
-  //
-  // Fired when location.hash changes. In browsers that support it, the native
-  // HTML5 window.onhashchange event is used, otherwise a polling loop is
-  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
-  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
-  // compatibility" mode), a hidden Iframe is created to allow the back button
-  // and hash-based history to work.
-  //
-  // Usage as described in <jQuery.fn.hashchange>:
-  //
-  // > // Bind an event handler.
-  // > jQuery(window).hashchange( function(e) {
-  // >   var hash = location.hash;
-  // >   ...
-  // > });
-  // >
-  // > // Manually trigger the event handler.
-  // > jQuery(window).hashchange();
-  //
-  // A more verbose usage that allows for event namespacing:
-  //
-  // > // Bind an event handler.
-  // > jQuery(window).bind( 'hashchange', function(e) {
-  // >   var hash = location.hash;
-  // >   ...
-  // > });
-  // >
-  // > // Manually trigger the event handler.
-  // > jQuery(window).trigger( 'hashchange' );
-  //
-  // Additional Notes:
-  //
-  // * The polling loop and Iframe are not created until at least one handler
-  //   is actually bound to the 'hashchange' event.
-  // * If you need the bound handler(s) to execute immediately, in cases where
-  //   a location.hash exists on page load, via bookmark or page refresh for
-  //   example, use jQuery(window).hashchange() or the more verbose
-  //   jQuery(window).trigger( 'hashchange' ).
-  // * The event can be bound before DOM ready, but since it won't be usable
-  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
-  //   to bind it inside a DOM ready handler.
-
-  // Override existing $.event.special.hashchange methods (allowing this plugin
-  // to be defined after jQuery BBQ in BBQ's source code).
-  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
-
-    // Called only when the first 'hashchange' event is bound to window.
-    setup: function() {
-      // If window.onhashchange is supported natively, there's nothing to do..
-      if ( supports_onhashchange ) { return false; }
-
-      // Otherwise, we need to create our own. And we don't want to call this
-      // until the user binds to the event, just in case they never do, since it
-      // will create a polling loop and possibly even a hidden Iframe.
-      $( fake_onhashchange.start );
-    },
-
-    // Called only when the last 'hashchange' event is unbound from window.
-    teardown: function() {
-      // If window.onhashchange is supported natively, there's nothing to do..
-      if ( supports_onhashchange ) { return false; }
-
-      // Otherwise, we need to stop ours (if possible).
-      $( fake_onhashchange.stop );
-    }
-
-  });
-
-  // fake_onhashchange does all the work of triggering the window.onhashchange
-  // event for browsers that don't natively support it, including creating a
-  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
-  // Iframe to enable back and forward.
-  fake_onhashchange = (function(){
-    var self = {},
-      timeout_id,
-
-      // Remember the initial hash so it doesn't get triggered immediately.
-      last_hash = get_fragment(),
-
-      fn_retval = function(val){ return val; },
-      history_set = fn_retval,
-      history_get = fn_retval;
-
-    // Start the polling loop.
-    self.start = function() {
-      timeout_id || poll();
-    };
-
-    // Stop the polling loop.
-    self.stop = function() {
-      timeout_id && clearTimeout( timeout_id );
-      timeout_id = undefined;
-    };
-
-    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
-    // if location.hash has changed, and triggers the 'hashchange' event on
-    // window when necessary.
-    function poll() {
-      var hash = get_fragment(),
-        history_hash = history_get( last_hash );
-
-      if ( hash !== last_hash ) {
-        history_set( last_hash = hash, history_hash );
-
-        $(window).trigger( str_hashchange );
-
-      } else if ( history_hash !== last_hash ) {
-        location.href = location.href.replace( /#.*/, '' ) + history_hash;
-      }
-
-      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
-    };
-
-    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
-    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
-    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
-    // FIX: jQuery 1.9 dropped $.browser, this detects IE 6/7/8 with fallback
-    ( $.browser ? $.browser.msie : ( $.support ? $.support.leadingWhitespace == false : null ) )
-    //$.browser.msie
-    && !supports_onhashchange && (function(){
-      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
-      // when running in "IE7 compatibility" mode.
-
-      var iframe,
-        iframe_src;
-
-      // When the event is bound and polling starts in IE 6/7, create a hidden
-      // Iframe for history handling.
-      self.start = function(){
-        if ( !iframe ) {
-          iframe_src = $.fn[ str_hashchange ].src;
-          iframe_src = iframe_src && iframe_src + get_fragment();
-
-          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
-          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
-          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
-
-            // When Iframe has completely loaded, initialize the history and
-            // start polling.
-            .one( 'load', function(){
-              iframe_src || history_set( get_fragment() );
-              poll();
-            })
-
-            // Load Iframe src if specified, otherwise nothing.
-            .attr( 'src', iframe_src || 'javascript:0' )
-
-            // Append Iframe after the end of the body to prevent unnecessary
-            // initial page scrolling (yes, this works).
-            .insertAfter( 'body' )[0].contentWindow;
-
-          // Whenever `document.title` changes, update the Iframe's title to
-          // prettify the back/next history menu entries. Since IE sometimes
-          // errors with "Unspecified error" the very first time this is set
-          // (yes, very useful) wrap this with a try/catch block.
-          doc.onpropertychange = function(){
-            try {
-              if ( event.propertyName === 'title' ) {
-                iframe.document.title = doc.title;
-              }
-            } catch(e) {}
-          };
-
-        }
-      };
-
-      // Override the "stop" method since an IE6/7 Iframe was created. Even
-      // if there are no longer any bound event handlers, the polling loop
-      // is still necessary for back/next to work at all!
-      self.stop = fn_retval;
-
-      // Get history by looking at the hidden Iframe's location.hash.
-      history_get = function() {
-        return get_fragment( iframe.location.href );
-      };
-
-      // Set a new history item by opening and then closing the Iframe
-      // document, *then* setting its location.hash. If document.domain has
-      // been set, update that as well.
-      history_set = function( hash, history_hash ) {
-        var iframe_doc = iframe.document,
-          domain = $.fn[ str_hashchange ].domain;
-
-        if ( hash !== history_hash ) {
-          // Update Iframe with any initial `document.title` that might be set.
-          iframe_doc.title = doc.title;
-
-          // Opening the Iframe's document after it has been closed is what
-          // actually adds a history entry.
-          iframe_doc.open();
-
-          // Set document.domain for the Iframe document as well, if necessary.
-          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
-
-          iframe_doc.close();
-
-          // Update the Iframe's hash, for great justice.
-          iframe.location.hash = hash;
-        }
-      };
-
-    })();
-    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
-    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-    return self;
-  })();
-
-})(jQuery,this);
diff --git a/core/misc/dialog.position.js b/core/misc/dialog.position.js
index ec4fb3104aa62e18b90a7899ec06c5aeeed59574..7b12055c76d6634000ba3c13518f41b71d85d495 100644
--- a/core/misc/dialog.position.js
+++ b/core/misc/dialog.position.js
@@ -77,5 +77,4 @@
     }
   });
 
-// @todo remove window.parent once overlay is removed from core.
-})(jQuery, Drupal, drupalSettings, Drupal.debounce,  window.parent.Drupal.displace);
+})(jQuery, Drupal, drupalSettings, Drupal.debounce, Drupal.displace);
diff --git a/core/misc/displace.js b/core/misc/displace.js
index 32e4db3ce0dad128f0eef0a03b2b311ebbfba6c6..0b6186a28a4058ae5c6f80650c4b97f94cfda653 100644
--- a/core/misc/displace.js
+++ b/core/misc/displace.js
@@ -17,10 +17,6 @@
    */
   Drupal.behaviors.drupalDisplace = {
     attach: function () {
-      // Do not process the window of the overlay.
-      if (parent.Drupal.overlay && parent.Drupal.overlay.iframeWindow === window) {
-        return;
-      }
       // Mark this behavior as processed on the first pass.
       if (this.displaceProcessed) {
         return;
diff --git a/core/misc/tabbingmanager.js b/core/misc/tabbingmanager.js
index f212a1da5202f2b59c610a77a8c4106ca431e23f..9914233219eb2b9023783690a6a8f680ed8828fa 100644
--- a/core/misc/tabbingmanager.js
+++ b/core/misc/tabbingmanager.js
@@ -7,12 +7,6 @@
 
 "use strict";
 
-// Do not process the window of the overlay.
-if (parent.Drupal.overlay && parent.Drupal.overlay.iframeWindow === window) {
-  return;
-}
-
-
 /**
  * Provides an API for managing page tabbing order modifications.
  */
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index e1bc631887adf88467a80faadf7d3d9d4d0b5031..331e985961a5846e680adc886e5c9836d4e6c579 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -189,9 +189,7 @@ function block_page_build(&$page) {
       '#type' => 'link',
       '#title' => t('Exit block region demonstration'),
       '#href' => 'admin/structure/block' . (\Drupal::config('system.theme')->get('default') == $theme ? '' : '/list/' . $theme),
-      // Add the "overlay-restore" class to indicate this link should restore
-      // the context in which the region demonstration page was opened.
-      '#options' => array('attributes' => array('class' => array('block-demo-backlink', 'overlay-restore'))),
+      '#options' => array('attributes' => array('class' => array('block-demo-backlink'))),
       '#weight' => -10,
     );
   }
@@ -566,7 +564,7 @@ function block_menu_delete($menu) {
  */
 function block_admin_paths() {
   $paths = array(
-    // Exclude the block demonstration page from admin (overlay) treatment.
+    // Exclude the block demonstration page from admin treatment.
     // This allows us to present this page in its true form, full page.
     'admin/structure/block/demo/*' => FALSE,
   );
diff --git a/core/modules/contextual/contextual.module b/core/modules/contextual/contextual.module
index 130ba4c71a1bf4259067d1ccebefe6c67df49268..d9d20b58fe44153ce8798edd1b81e6ae7782a537 100644
--- a/core/modules/contextual/contextual.module
+++ b/core/modules/contextual/contextual.module
@@ -136,9 +136,7 @@ function contextual_library_info() {
     'title' => 'Contextual Links Toolbar Tab',
     'version' => \Drupal::VERSION,
     'js' => array(
-      // Add the JavaScript, with a group and weight such that it will run
-      // before modules/overlay/overlay-parent.js.
-      $path . '/js/contextual.toolbar.js' => array('group' => JS_LIBRARY, 'weight' => -1),
+      $path . '/js/contextual.toolbar.js' => array('group' => JS_LIBRARY),
     ),
     'css' => array(
       $path . '/css/contextual.toolbar.css' => array(),
diff --git a/core/modules/contextual/js/contextual.toolbar.js b/core/modules/contextual/js/contextual.toolbar.js
index 53557e6076af4a12fe62d080bf1084b54c22a2f8..e1a01dd0a8dc7c7e8f29adb8910570bbfc398039 100644
--- a/core/modules/contextual/js/contextual.toolbar.js
+++ b/core/modules/contextual/js/contextual.toolbar.js
@@ -31,16 +31,6 @@ function initContextualToolbar (context) {
   new contextualToolbar.VisualView(viewOptions);
   new contextualToolbar.AuralView(viewOptions);
 
-  // Update the model based on overlay events.
-  $(document).on({
-    'drupalOverlayOpen.contextualToolbar': function () {
-      model.set('overlayIsOpen', true);
-    },
-    'drupalOverlayClose.contextualToolbar': function () {
-      model.set('overlayIsOpen', false);
-    }
-  });
-
   // Show the edit tab while there's >=1 contextual link.
   if (Drupal.contextual && Drupal.contextual.collection) {
     var contextualCollection = Drupal.contextual.collection;
@@ -98,10 +88,8 @@ Drupal.contextualToolbar = {
       // Indicates whether the toggle is currently in "view" or "edit" mode.
       isViewing: true,
       // Indicates whether the toggle should be visible or hidden. Automatically
-      // calculated, depends on overlayIsOpen and contextualCount.
+      // calculated, depends on contextualCount.
       isVisible: false,
-      // Indicates whether the overlay is open or not.
-      overlayIsOpen: false,
       // Tracks how many contextual links exist on the page.
       contextualCount: 0,
       // A TabbingContext object as returned by Drupal.TabbingManager: the set
@@ -109,8 +97,8 @@ Drupal.contextualToolbar = {
       tabbingContext: null
     },
     initialize: function () {
-      this.on('change:overlayIsOpen change:contextualCount', function (model) {
-        model.set('isVisible', !model.get('overlayIsOpen') && model.get('contextualCount') > 0);
+      this.on('change:contextualCount', function (model) {
+        model.set('isVisible', model.get('contextualCount') > 0);
       });
     }
   }),
diff --git a/core/modules/overlay/css/overlay-child.css b/core/modules/overlay/css/overlay-child.css
deleted file mode 100644
index 6efd7be13402dfde696fa09b2dc00d2e82e45944..0000000000000000000000000000000000000000
--- a/core/modules/overlay/css/overlay-child.css
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * @file
- * Basic styling for the Overlay child pages.
- */
-
-html[dir="rtl"] {
-  direction: rtl;
-}
-
-.js {
-  background: transparent !important;
-  overflow-y: scroll;
-}
-.js body {
-  background: transparent !important;
-  margin-left: 0;
-  margin-right: 0;
-  padding: 20px 0;
-}
-
-#overlay {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  display: block;
-  margin: 0 auto;
-  max-width: 80em;
-  max-width: 80rem;
-  min-height: 100px;
-  position: relative;
-  padding: 2em 40px;
-  width: 100%;
-}
-#overlay-titlebar {
-  padding: 0 20px;
-  position: relative;
-  white-space: nowrap;
-  z-index: 100;
-}
-#overlay-content {
-  background: #fff;
-  clear: both;
-  color: #000;
-  padding: .5em 1em;
-  position: relative;
-}
-
-#overlay-title-wrapper {
-  overflow: hidden;
-}
-#overlay-title {
-  color: #fff;
-  float: left; /* LTR */
-  font-size: 20px;
-  margin: 0;
-  padding: 0.3em 0;
-}
-[dir="rtl"] #overlay-title {
-  float: right;
-  left: auto;
-}
-#overlay-title:active,
-#overlay-title:focus {
-  outline: 0;
-}
-.overlay .skip-link {
-  color: #fff; /* This is white to contrast with the dark background behind it. */
-}
-
-#overlay-close-wrapper {
-  position: absolute;
-  right: 0; /* LTR */
-}
-[dir="rtl"] #overlay-close-wrapper {
-  left: 0;
-  right: auto;
-}
-#overlay-close,
-#overlay-close:hover {
-  background: #ffffff url(../images/close.png) no-repeat;
-  border: 0;
-  border-radius: 0 12px 12px 0; /* LTR */
-  display: block;
-  height: 26px;
-  margin: 0;
-  padding: 0;
-  /* Replace with position:fixed to get a scrolling close button. */
-  position: absolute;
-  width: 26px;
-}
-[dir="rtl"] #overlay-close,
-[dir="rtl"] #overlay-close:hover {
-  border-radius: 12px 0 0 12px;
-}
-#overlay-close:focus, #overlay-close:active{
-  outline: 1px dotted;
-}
-
-/**
- * Tabs on the overlay.
- */
-#overlay-tabs {
-  line-height: 26px;
-  margin: -28px 0 0 0;
-  position: absolute;
-  right: 20px; /* LTR */
-  text-transform: uppercase;
-}
-[dir="rtl"] #overlay-tabs {
-  left: 20px;
-  right: auto;
-}
-#overlay-tabs li {
-  display: inline-block;
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-#overlay-tabs li a,
-#overlay-tabs li a:active,
-#overlay-tabs li a:visited,
-#overlay-tabs li a:hover {
-  background-color: #a6a7a2;
-  border-radius: 8px 8px 0 0;
-  color: #000;
-  display: inline-block;
-  font-size: 11px;
-  font-weight: bold;
-  margin: 0 1px;
-  outline: 0;
-  padding: 0 14px;
-  text-decoration: none;
-}
-#overlay-tabs li.active a,
-#overlay-tabs li.active a.active,
-#overlay-tabs li.active a:active,
-#overlay-tabs li.active a:visited {
-  background-color: #fff;
-  margin-bottom: 0;
-  padding-bottom: 2px;
-}
-#overlay-tabs li a:focus,
-#overlay-tabs li a:hover {
-  color: #fff;
-}
-#overlay-tabs li.active a:focus,
-#overlay-tabs li.active a:hover {
-  color: #000;
-}
-
-/**
- * Add to shortcuts link
- */
-#overlay-titlebar .add-or-remove-shortcuts {
-  padding-top: 0.6em;
-}
-#overlay-titlebar .add-or-remove-shortcuts .icon {
-  margin-top: 4px;
-}
-#overlay-titlebar .add-or-remove-shortcuts .text {
-  padding-top: 0;
-}
-/**
- * Disable message.
- */
-#overlay-disable-message {
-  background-color: #fff;
-  margin: 0 auto 20px;
-  width: 80%;
-  border-radius: 0 0 8px 8px;
-}
-.overlay-disable-message-focused {
-  padding: 0.5em;
-}
-.overlay-disable-message-focused a {
-  display: block;
-  float: left;
-}
-.overlay-disable-message-focused #overlay-dismiss-message {
-  float: right;
-}
diff --git a/core/modules/overlay/css/overlay-parent.css b/core/modules/overlay/css/overlay-parent.css
deleted file mode 100644
index c036aa9ea05d77b201612aa04c2e02d7d304a987..0000000000000000000000000000000000000000
--- a/core/modules/overlay/css/overlay-parent.css
+++ /dev/null
@@ -1,55 +0,0 @@
-
-/**
- * @file
- * Basic styling for the Overlay module.
- */
-
-html.overlay-open,
-html.overlay-open body {
-  height: 100%;
-  overflow: hidden;
-}
-
-#overlay-container,
-.overlay-modal-background,
-.overlay-element {
-  height: 100%;
-  left: 0;
-  position: absolute;
-  top: 0;
-  width: 100%;
-  z-index: 500;
-}
-
-.overlay-modal-background {
-  /* Using a transparent png renders faster than using opacity */
-  background: transparent url(../images/background.png) repeat;
-}
-
-.overlay-element {
-  background: transparent;
-  left: -200%;
-  z-index: 501;
-}
-.overlay-element.overlay-active {
-  left: 0;
-}
-
-html.overlay-open .displace-top,
-html.overlay-open .displace-bottom {
-  z-index: 600;
-}
-
-/**
- * Within the overlay parent, the message about disabling the overlay is for
- * screen-reader users only. It is always kept invisible with the
- * visually-hidden class, and removed from the tab order. Overlay-child.css
- * contains styling for the same message appearing within the overlay, and
- * intended for sighted users.
- */
-#overlay-disable-message {
-  display: none;
-}
-html.overlay-open #overlay-disable-message {
-  display: block;
-}
diff --git a/core/modules/overlay/images/background.png b/core/modules/overlay/images/background.png
deleted file mode 100644
index 9be21936e15f1d7016e24e78fc2ab7af3e5d0d7d..0000000000000000000000000000000000000000
--- a/core/modules/overlay/images/background.png
+++ /dev/null
@@ -1,5 +0,0 @@
-‰PNG
-
-���
IHDR���
-���
-���2Ͻ���IDAT•c```ØO$UHO…�TJ~½\¨����IEND®B`‚
\ No newline at end of file
diff --git a/core/modules/overlay/images/close.png b/core/modules/overlay/images/close.png
deleted file mode 100644
index 44d2b6b007d508b220cb06a1ee9d1e5183e6d6c2..0000000000000000000000000000000000000000
--- a/core/modules/overlay/images/close.png
+++ /dev/null
@@ -1,14 +0,0 @@
-‰PNG
-
-���
IHDR���������©JLÎ���	pHYs�����šœ��
-OiCCPPhotoshop ICC profile��xڝSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*!	Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ,Š
-Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ–H3Q5€©BàƒÇÄÆáä.@
-$p�³d!sý#�ø~<<+"À¾�xÓ�ÀM›À0‡ÿêB™\€„Àt‘8K€�@zŽB¦�@F€˜&S� �`Ëcbã�P-�`'æÓ�€ø™{�[”! ‘� eˆD�h;�¬ÏVŠE�X0�fKÄ9�Ø-�0IWfH�°·�Àβ��0Qˆ…)�{�`È##x�„™�FòW<ñ+®ç*��x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ�� ‘àƒóýxήÎÎ6Ž¶_-ê¿ÿ"bbãþåÏ«p@��át~Ñþ,/³€;€mþ¢%îh^ u÷‹f²@µ� éÚWópø~<<E¡¹ÙÙåääØJÄB[aÊW}þgÂ_ÀWýlù~<ü÷õà¾â$2]GøàÂÌôL¥Ï’	„bÜæGü·ÿüÓ"ÄIb¹X*ãQqŽDšŒó2¥"‰B’)Å%Òÿdâß,û>ß5�°j>{‘-¨]cöK'XtÀâ÷��ò»oÁÔ(€hƒáÏwÿï?ýG %�€fI’q��^D$.Tʳ?Ç��D *°AôÁ,ÀÁÜÁü`6„B$ÄÂBB
-d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼	AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È�2‚ü†¼G1”²Q=ÔµC¹¨7„F¢Ðdt1š ›Ðr´=Œ6¡çЫhڏ>CÇ0Àè3Äl0.ÆÃB±8,	“c˱"¬«Æ°V¬»‰õcϱwEÀ	6wB aAHXLXNØH¨ $4Ú	7	„QÂ'"“¨K´&ºùÄb21‡XH,#֏/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[
-b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw
†ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê
-•J•&•*/T©ª¦ªÞªUóUËT©^S}®FU3Sã©	Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k
«†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN	ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ
-§M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õGX³$ÛÎ<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yn…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý=
‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ?Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿÑ�§€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~'…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž
-yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L
LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y-
-¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳Êې7œïŸÿíÂá’¶¥†KW-X潬j9²<qyÛ
-ã+†V¬<¸Š¶*mÕO«íW—®~½&zMk^ÁÊ‚ÁµkëU
-å…}ëÜ×í]OX/Yßµaú†>‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n
ÙÚ´
ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw-
6
UœÆâ#pDyäé÷	ß÷
:ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ4<YyJóTÉiÚé‚Ó“gòÏŒ•}~.ùÜ`Û¢¶{çcÎßjoïºtáÒEÿ‹ç;¼;Î\ò¸tò²ÛåW¸Wš¯:_mêtê<þ“ÓOÇ»œ»š®¹\k¹îz½µ{f÷éž7ÎÝô½yñÿÖÕž9=ݽózo÷Å÷õßÝ~r'ýÎË»Ùw'î­¼O¼_ô@íAÙC݇Õ?[þÜØïÜjÀw óÑÜG÷…ƒÏþ‘õC™Ë†
†ëž8>99â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û��� cHRM��z%��€ƒ��ùÿ��€é��u0��ê`��:˜��o’_ÅF���ÆIDATxÚì•Ñ	Ã0D5’FòÒN;Hƒ8\¿bb¥IZL(ù806èq:Û"�4Bô€þäî03ˆDf†ˆÀÝñˆ,Å3‰¾­|3ãHU—"Ó4¥€õ™ªâÈÝ›BµV˜Ùbf¨µ6°,³.¨”²) õöˆ¥”ã ^6f†yžafÍúhVý~&y¼]ôœ¬u?аÖ
»qùzGî÷`‡~A=g™öœœUÝŒ	UM3y&ìJõ�hÛ»¶¹g����IEND®B`‚
\ No newline at end of file
diff --git a/core/modules/overlay/lib/Drupal/overlay/Access/DismissMessageAccessCheck.php b/core/modules/overlay/lib/Drupal/overlay/Access/DismissMessageAccessCheck.php
deleted file mode 100644
index 087d40f51d9294f45771206b7be8c68d9d130be9..0000000000000000000000000000000000000000
--- a/core/modules/overlay/lib/Drupal/overlay/Access/DismissMessageAccessCheck.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\Access\DismissMessageAccessCheck
- */
-
-namespace Drupal\overlay\Access;
-
-use Drupal\Core\Access\AccessCheckInterface;
-use Drupal\Core\Session\AccountInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Provides an access check for overlay user dismiss message routes.
- */
-class DismissMessageAccessCheck implements AccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_access_overlay_dismiss_message', $route->getRequirements());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function access(Route $route, Request $request, AccountInterface $account) {
-    if (!$account->hasPermission('access overlay')) {
-      return static::DENY;
-    }
-    // It's unlikely, but possible that "access overlay" permission is granted
-    // to the anonymous role. In this case, we do not display the message to
-    // disable the overlay, so there is nothing to dismiss.
-    if (!$account->id()) {
-      return static::DENY;
-    }
-    return static::ALLOW;
-  }
-
-}
diff --git a/core/modules/overlay/lib/Drupal/overlay/Controller/OverlayController.php b/core/modules/overlay/lib/Drupal/overlay/Controller/OverlayController.php
deleted file mode 100644
index eb072b332528efa07384a4d0139b9a524ec0ae09..0000000000000000000000000000000000000000
--- a/core/modules/overlay/lib/Drupal/overlay/Controller/OverlayController.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\Controller\OverlayController.
- */
-
-namespace Drupal\overlay\Controller;
-
-use Drupal\Core\Access\CsrfTokenGenerator;
-use Drupal\Core\Controller\ControllerBase;
-use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Session\AccountInterface;
-use Drupal\user\UserDataInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
-
-/**
- * Controller routines for overlay routes.
- *
- * @todo keeping the controllerInterface since we should be injecting
- * something to take care of the overlay_render_region() call.
- */
-class OverlayController extends ControllerBase implements ContainerInjectionInterface {
-
-  /**
-   * The userdata service.
-   *
-   * @var \Drupal\user\UserDataInterface
-   */
-  protected $userData;
-
-  /**
-   * The CSRF token generator.
-   *
-   * @var \Drupal\Core\Access\CsrfTokenGenerator
-   */
-  protected $csrfGenerator;
-
-  /**
-   * The current user.
-   *
-   * @var \Drupal\Core\Session\AccountInterface
-   */
-  protected $account;
-
-  /**
-   * Constructs a OverlayController instance.
-   *
-   * @param \Drupal\user\UserDataInterface $user_data
-   *   The userdata service.
-   * @param \Drupal\Core\Access\CsrfTokenGenerator $csrf_generator
-   *   The CSRF token generator.
-   * @param \Drupal\Core\Session\AccountInterface $account
-   *   The current user.
-   */
-  public function __construct(UserDataInterface $user_data, CsrfTokenGenerator $csrf_generator, AccountInterface $account) {
-    $this->userData = $user_data;
-    $this->csrfGenerator = $csrf_generator;
-    $this->account = $account;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('user.data'),
-      $container->get('csrf_token'),
-      $container->get('current_user')
-    );
-  }
-
-  /**
-   * Prints the markup obtained by rendering a single region of the page.
-   *
-   * @todo add a DI for managing the overlay_render_region() call.
-   *
-   * @param string
-   *   The name of the page region to render.
-   *
-   * @return \Symfony\Component\HttpFoundation\Response
-   *
-   * @see Drupal.overlay.refreshRegions()
-   */
-  public function regionRender($region) {
-    return new Response(overlay_render_region($region));
-  }
-
-  /**
-   * Dismisses the overlay accessibility message for this user.
-   *
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object.
-   *
-   * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
-   *   Thrown when a non valid token was specified.
-   *
-   * @return \Drupal\Core\Controller\ControllerBase
-   *   Redirects to the user's edit page.
-   */
-  public function overlayMessage(Request $request) {
-    // @todo Integrate CSRF link token directly into routing system:
-    //   http://drupal.org/node/1798296.
-    $token = $request->attributes->get('token');
-    if (!isset($token) || !$this->csrfGenerator->validate($token, 'overlay')) {
-      throw new AccessDeniedHttpException();
-    }
-    $this->userData->set('overlay', $this->account->id(), 'message_dismissed', 1);
-    drupal_set_message($this->t('The message has been dismissed. You can change your overlay settings at any time by visiting your profile page.'));
-    // Destination is normally given. Go to the user profile as a fallback.
-    return $this->redirect('user_edit', array('user' => $this->account->id()));
-  }
-
-}
diff --git a/core/modules/overlay/lib/Drupal/overlay/EventSubscriber/OverlaySubscriber.php b/core/modules/overlay/lib/Drupal/overlay/EventSubscriber/OverlaySubscriber.php
deleted file mode 100644
index 59e67f07af9a6a6779488c9d8477fb822da4dbb2..0000000000000000000000000000000000000000
--- a/core/modules/overlay/lib/Drupal/overlay/EventSubscriber/OverlaySubscriber.php
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\EventSubscriber\OverlaySubscriber.
- */
-
-namespace Drupal\overlay\EventSubscriber;
-
-use Drupal\Core\ContentNegotiation;
-use Drupal\Core\Routing\UrlGeneratorInterface;
-use Drupal\Component\Utility\Url;
-use Drupal\user\UserData;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-use Symfony\Component\HttpFoundation\RedirectResponse;
-use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
-use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
-
-/**
- * Overlay subscriber for controller requests.
- */
-class OverlaySubscriber implements EventSubscriberInterface {
-
-  /**
-   * The content negotiation service.
-   *
-   * @var \Drupal\Core\ContentNegotiation
-   */
-  protected $negotiation;
-
-  /**
-   * The user.data service.
-   *
-   * @var \Drupal\user\UserData
-   */
-  protected $userData;
-
-  /**
-   * The url generator service.
-   *
-   * @var \Drupal\Core\Routing\UrlGeneratorInterface
-   */
-  protected $urlGenerator;
-
-  /**
-   * Constructs an OverlaySubscriber object.
-   *
-   * @param \Drupal\Core\ContentNegotiation $negotiation
-   *   The content negotiation service.
-   * @param \Drupal\user\UserData $user_data
-   *   The user.data service.
-   * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
-   *   The url generator service.
-   */
-  public function __construct(ContentNegotiation $negotiation, UserData $user_data, UrlGeneratorInterface $url_generator) {
-    $this->negotiation = $negotiation;
-    $this->userData = $user_data;
-    $this->urlGenerator = $url_generator;
-  }
-
-  /**
-   * Performs check on the beginning of a request.
-   *
-   * Determine whether the current page request is destined to appear in the
-   * parent window or in the overlay window, and format the page accordingly.
-   *
-   * @see overlay_set_mode()
-   */
-  public function onRequest(GetResponseEvent $event) {
-    $request = $event->getRequest();
-    if ($this->negotiation->getContentType($request) != 'html') {
-      // Only act on html pages.
-      return;
-    }
-    $user = \Drupal::currentUser();
-
-    $mode = overlay_get_mode();
-
-    // Only act if the user has access to the overlay and a mode was not already
-    // set. Other modules can also enable the overlay directly for other uses.
-    $user_data = $this->userData->get('overlay', $user->id(), 'enabled');
-    $use_overlay = !isset($user_data) || $user_data;
-    if (empty($mode) && $user->hasPermission('access overlay') && $use_overlay) {
-      $current_path = $request->attributes->get('_system_path');
-      // After overlay is enabled on the modules page, redirect to
-      // <front>#overlay=admin/modules to actually enable the overlay.
-      if (isset($_SESSION['overlay_enable_redirect']) && $_SESSION['overlay_enable_redirect']) {
-        unset($_SESSION['overlay_enable_redirect']);
-        $url = $this->urlGenerator
-          ->generateFromPath('<front>', array(
-            'fragment' => 'overlay=' . $current_path,
-            'absolute' => TRUE,
-          ));
-        $response = new RedirectResponse($url);
-        $event->setResponse($response);
-      }
-
-      if ($request->query->get('render') == 'overlay') {
-        // If a previous page requested that we close the overlay, close it and
-        // redirect to the final destination.
-        if (isset($_SESSION['overlay_close_dialog'])) {
-          $response = call_user_func_array('overlay_close_dialog', $_SESSION['overlay_close_dialog']);
-          unset($_SESSION['overlay_close_dialog']);
-          $event->setResponse($response);
-        }
-        // If this page shouldn't be rendered inside the overlay, redirect to
-        // the parent.
-        elseif (!path_is_admin($current_path)) {
-          // Prevent open redirects by ensuring the current path is not an absolute URL.
-          if (Url::isExternal($current_path)) {
-            $current_path = '<front>';
-          }
-          $response = overlay_close_dialog($current_path, array('query' => drupal_get_query_parameters(NULL, array('render'))));
-          $event->setResponse($response);
-        }
-
-        // Indicate that we are viewing an overlay child page.
-        overlay_set_mode('child');
-
-        // Unset the render parameter to avoid it being included in URLs on the
-        // page.
-        $request->query->remove('render');
-      }
-      // Do not enable the overlay if we already are on an admin page.
-      elseif (!path_is_admin($current_path)) {
-        // Otherwise add overlay parent code and our behavior.
-        overlay_set_mode('parent');
-      }
-    }
-  }
-
-  /**
-   * Performs end of request tasks.
-   *
-   * When viewing an overlay child page, check if we need to trigger a refresh of
-   * the supplemental regions of the overlay on the next page request.
-   */
-  public function onResponse(FilterResponseEvent $event) {
-    // Check that we are in an overlay child page.
-    if (overlay_get_mode() == 'child') {
-      // Load any markup that was stored earlier in the page request, via calls
-      // to overlay_store_rendered_content(). If none was stored, this is not a
-      // page request where we expect any changes to the overlay supplemental
-      // regions to have occurred, so we do not need to proceed any further.
-      $original_markup = overlay_get_rendered_content();
-      if (!empty($original_markup)) {
-        // Compare the original markup to the current markup that we get from
-        // rendering each overlay supplemental region now. If they don't match,
-        // something must have changed, so we request a refresh of that region
-        // within the parent window on the next page request.
-        foreach (overlay_supplemental_regions() as $region) {
-          if (!isset($original_markup[$region]) || $original_markup[$region] != overlay_render_region($region)) {
-            overlay_request_refresh($region);
-          }
-        }
-      }
-      $response = $event->getResponse();
-      if ($response instanceOf RedirectResponse) {
-        $path = $response->getTargetUrl();
-        // The authorize.php script bootstraps Drupal to a very low level, where
-        // the PHP code that is necessary to close the overlay properly will not
-        // be loaded. Therefore, if we are redirecting to authorize.php inside
-        // the overlay, instead redirect back to the current page with
-        // instructions to close the overlay there before redirecting to the
-        // final destination.
-        $options = array('absolute' => TRUE);
-        if ($path == system_authorized_get_url($options) || $path == system_authorized_batch_processing_url($options)) {
-          $_SESSION['overlay_close_dialog'] = array($path, $options);
-          $path = current_path();
-          $options = drupal_get_query_parameters();
-        }
-
-        // If the current page request is inside the overlay, add ?render=overlay
-        // to the new path, so that it appears correctly inside the overlay.
-        if (isset($options['query'])) {
-          $options['query'] += array('render' => 'overlay');
-        }
-        else {
-          $options['query'] = array('render' => 'overlay');
-        }
-        $response->setTargetUrl($this->urlGenerator->generateFromPath($path, $options));
-      }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onRequest');
-    $events[KernelEvents::RESPONSE][] = array('onResponse');
-
-    return $events;
-  }
-}
diff --git a/core/modules/overlay/lib/Drupal/overlay/Tests/OverlayCloseTest.php b/core/modules/overlay/lib/Drupal/overlay/Tests/OverlayCloseTest.php
deleted file mode 100644
index 406755cc4cbafc36e1f6c58bca7adf511a7a0f76..0000000000000000000000000000000000000000
--- a/core/modules/overlay/lib/Drupal/overlay/Tests/OverlayCloseTest.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\Tests\OverlayCloseTest.
- */
-
-namespace Drupal\overlay\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests that the overlay can be properly closed.
- */
-class OverlayCloseTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('node', 'overlay');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Overlay closing functionality',
-      'description' => 'Test that the overlay can be correctly closed.',
-      'group' => 'Overlay',
-    );
-  }
-
-  /**
-   * Tests that the overlay is correctly closed after creating a node.
-   */
-  function testNodeCreation() {
-    // Make sure the node creation page is considered an administrative path
-    // (which will appear in the overlay).
-    $this->container->get('config.factory')->get('node.settings')->set('use_admin_theme', '1')->save();
-
-    // Create a content type and a user who has permission to create it inside
-    // the overlay.
-    $this->drupalCreateContentType(array('type' => 'test', 'name' => 'Test content type'));
-    $admin_user = $this->drupalCreateUser(array('access content', 'access overlay', 'create test content'));
-    $this->drupalLogin($admin_user);
-
-    // Create a new node, with ?render=overlay in the query parameter to
-    // simulate creating it inside the overlay.
-    $this->drupalPostForm('node/add/test', array('title' => 'Test node title'), t('Save'), array('query' => array('render' => 'overlay')));
-
-    // Make sure a bare minimum HTML page is displayed that contains the
-    // JavaScript necessary to close the overlay.
-    $this->assertRaw('<body class="overlay"></body>', 'An empty body tag is present on the page request after a node is created inside the overlay.');
-    $this->assertRaw('"closeOverlay":true', 'The JavaScript setting for closing the overlay is present on the page request after a node is created inside the overlay.');
-
-    // Visit another page and make sure that we now see the message saying the
-    // node was created (i.e., that it does not appear inside the overlay where
-    // no one would have time to read it before the overlay closes).
-    $this->drupalGet('');
-    $this->assertRaw(t('!post %title has been created.', array('!post' => 'Test content type', '%title' => 'Test node title')), 'Message about the node being created is displayed on the next page request after the overlay is closed.');
-  }
-}
diff --git a/core/modules/overlay/lib/Drupal/overlay/Tests/OverlayRenderTest.php b/core/modules/overlay/lib/Drupal/overlay/Tests/OverlayRenderTest.php
deleted file mode 100644
index b32c4d6c41c9db093763772f22ae53db2c5b98d1..0000000000000000000000000000000000000000
--- a/core/modules/overlay/lib/Drupal/overlay/Tests/OverlayRenderTest.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\Tests\OverlayRenderTest.
- */
-
-namespace Drupal\overlay\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests the rendering of a page in an overlay.
- */
-class OverlayRenderTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('test_page_test', 'overlay');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Overlay child page rendering',
-      'description' => 'Tests the rendering of a page in an overlay.',
-      'group' => 'Overlay',
-    );
-  }
-
-  /**
-   * Tests the title of a page in an overlay.
-   */
-  public function testOverlayTitle() {
-    $account = $this->drupalCreateUser(array('access overlay'));
-    $this->drupalLogin($account);
-
-    $this->drupalGet('admin/test-render-title', array('query' => array('render' => 'overlay')));
-    $result = $this->xpath('//h1[@id = "overlay-title"]');
-    $this->assertEqual((string) $result[0], 'Foo');
-  }
-
-}
diff --git a/core/modules/overlay/lib/Drupal/overlay/Tests/OverlaySettingTest.php b/core/modules/overlay/lib/Drupal/overlay/Tests/OverlaySettingTest.php
deleted file mode 100644
index 7ae4b1fdbaa201cf5210422879f7ef809da65e87..0000000000000000000000000000000000000000
--- a/core/modules/overlay/lib/Drupal/overlay/Tests/OverlaySettingTest.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\Tests\OverlaySettingTest.
- */
-
-namespace Drupal\overlay\Tests;
-
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests the overlay settings.
- */
-class OverlaySettingTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('overlay');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Overlay settings',
-      'description' => 'Test that users can configure the overlay',
-      'group' => 'Overlay',
-    );
-  }
-
-  /**
-   * Test that users can configure the overlay.
-   */
-  function testNodeCreation() {
-    $user = $this->drupalCreateUser(array('access overlay'));
-    $this->drupalLogin($user);
-
-    $this->drupalGet('user/' . $user->id() . '/edit');
-    $this->assertFieldChecked('edit-overlay');
-    $this->drupalPostForm(NULL, array('overlay' => FALSE), t('Save'));
-    $this->assertNoFieldChecked('edit-overlay');
-    $this->assertFalse(\Drupal::service('user.data')->get('overlay', $user->id(), 'enabled'), 'Overlay disabled');
-
-  }
-}
diff --git a/core/modules/overlay/overlay-child.js b/core/modules/overlay/overlay-child.js
deleted file mode 100644
index cd7cdee2a1471e03742dd199e04775e06b9aca9e..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay-child.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * @file
- * Attaches the behaviors for the Overlay child pages.
- */
-
-(function ($) {
-
-"use strict";
-
-/**
- * Attach the child dialog behavior to new content.
- */
-Drupal.behaviors.overlayChild = {
-  attach: function (context, settings) {
-    // Make sure this behavior is not processed more than once.
-    if (this.processed) {
-      return;
-    }
-    this.processed = true;
-
-    // If we cannot reach the parent window, break out of the overlay.
-    if (!parent.Drupal || !parent.Drupal.overlay) {
-      window.location = window.location.href.replace(/([?&]?)render=overlay&?/g, '$1').replace(/\?$/, '');
-    }
-
-    settings = settings.overlayChild || {};
-
-    // If the entire parent window should be refreshed when the overlay is
-    // closed, pass that information to the parent window.
-    if (settings.refreshPage) {
-      parent.Drupal.overlay.refreshPage = true;
-    }
-
-    // If a form has been submitted successfully, then the server side script
-    // may have decided to tell the parent window to close the popup dialog.
-    if (settings.closeOverlay) {
-      parent.Drupal.overlay.bindChild(window, true);
-      // Use setTimeout to close the child window from a separate thread,
-      // because the current one is busy processing Drupal behaviors.
-      setTimeout(function () {
-        if (typeof settings.redirect === 'string') {
-          parent.Drupal.overlay.redirect(settings.redirect);
-        }
-        else {
-          parent.Drupal.overlay.close();
-        }
-      }, 1);
-      return;
-    }
-
-    // If one of the regions displaying outside the overlay needs to be
-    // reloaded immediately, let the parent window know.
-    if (settings.refreshRegions) {
-      parent.Drupal.overlay.refreshRegions(settings.refreshRegions);
-    }
-
-    // Ok, now we can tell the parent window we're ready.
-    parent.Drupal.overlay.bindChild(window);
-
-    // IE8 crashes on certain pages if this isn't called; reason unknown.
-    window.scrollTo(window.scrollX, window.scrollY);
-
-    // Attach child related behaviors to the iframe document.
-    Drupal.overlayChild.attachBehaviors(context, settings);
-
-    // There are two links within the message that informs people about the
-    // overlay and how to disable it. Make sure both links are visible when
-    // either one has focus and add a class to the wrapper for styling purposes.
-    $(context).find('#overlay-disable-message')
-      .focusin(function () {
-        $(this).addClass('overlay-disable-message-focused')
-          .find('a.focusable').removeClass('visually-hidden');
-      })
-      .focusout(function () {
-        $(this).removeClass('overlay-disable-message-focused')
-          .find('a.focusable').addClass('visually-hidden');
-      });
-  }
-};
-
-/**
- * Overlay object for child windows.
- */
-Drupal.overlayChild = Drupal.overlayChild || {
-  behaviors: {}
-};
-
-Drupal.overlayChild.prototype = {};
-
-/**
- * Attach child related behaviors to the iframe document.
- */
-Drupal.overlayChild.attachBehaviors = function (context, settings) {
-  var behavior, behaviors = this.behaviors;
-  for (behavior in behaviors) {
-    if (behaviors.hasOwnProperty(behavior)) {
-      behaviors[behavior](context, settings);
-    }
-  }
-};
-
-/**
- * Capture and handle clicks.
- *
- * Instead of binding a click event handler to every link we bind one to the
- * document and handle events that bubble up. This also allows other scripts
- * to bind their own handlers to links and also to prevent overlay's handling.
- */
-Drupal.overlayChild.behaviors.addClickHandler = function (context, settings) {
-  $(document).bind('click.drupal-overlay mouseup.drupal-overlay', $.proxy(parent.Drupal.overlay, 'eventhandlerOverrideLink'));
-};
-
-/**
- * Modify forms depending on their relation to the overlay.
- *
- * By default, forms are assumed to keep the flow in the overlay. Thus their
- * action attribute get a ?render=overlay suffix.
- */
-Drupal.overlayChild.behaviors.parseForms = function (context, settings) {
-  $(context).find('form').once('overlay', function () {
-    // Obtain the action attribute of the form.
-    var action = $(this).attr('action');
-    // Keep internal forms in the overlay.
-    if (typeof action === 'undefined' || (action.indexOf('http') !== 0 && action.indexOf('https') !== 0)) {
-      action += (action.indexOf('?') > -1 ? '&' : '?') + 'render=overlay';
-      $(this).attr('action', action);
-    }
-    // Submit external forms into a new window.
-    else {
-      $(this).attr('target', '_new');
-    }
-  });
-};
-
-/**
- * Replace the overlay title with a message while loading another page.
- */
-Drupal.overlayChild.behaviors.loading = function (context, settings) {
-  var $title;
-  var text = Drupal.t('Loading');
-  var dots = '';
-
-  $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () {
-    $title = $('#overlay-title').text(text);
-    setInterval(function () {
-      dots = (dots.length > 10) ? '' : dots + '.';
-      $title.text(text + dots);
-    }, 500);
-  });
-};
-
-/**
- * Switch active tab immediately.
- */
-Drupal.overlayChild.behaviors.tabs = function (context, settings) {
-  var $tabsLinks = $('#overlay-tabs > li > a');
-
-  $('#overlay-tabs > li > a').bind('click.drupal-overlay', function () {
-    var active_tab = Drupal.t('(active tab)');
-    $tabsLinks.parent().siblings().removeClass('active').find('visually-hidden:contains(' + active_tab + ')').appendTo(this);
-    $(this).parent().addClass('active');
-  });
-};
-
-/**
- * If the shortcut add/delete button exists, move it to the overlay titlebar.
- */
-Drupal.overlayChild.behaviors.shortcutAddLink = function (context, settings) {
-  // Remove any existing shortcut button markup from the titlebar.
-  $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove();
-  // If the shortcut add/delete button exists, move it to the titlebar.
-  var $addToShortcuts = $('.add-or-remove-shortcuts');
-  if ($addToShortcuts.length) {
-    $addToShortcuts.insertAfter('#overlay-title');
-  }
-
-  $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () {
-    $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove();
-  });
-};
-
-Drupal.overlayChild.behaviors.bindDrupalViewportOffsetChangeEvent = function (context, settings) {
-  // Workaround because of the way jQuery events works.
-  // jQuery from the parent frame needs to be used to catch this event.
-  parent.jQuery(parent.document).on('drupalViewportOffsetChange', function (event, offsets) {
-    // Fires an event that the child iframe can listen to.
-    $(document).trigger('drupalViewportOffsetChange', offsets);
-  });
-};
-
-})(jQuery);
diff --git a/core/modules/overlay/overlay-parent.js b/core/modules/overlay/overlay-parent.js
deleted file mode 100644
index 0e5fcf06404e7aa9e55b7beac0d0cfaa0c0189ec..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay-parent.js
+++ /dev/null
@@ -1,878 +0,0 @@
-/**
- * @file
- * Attaches the behaviors for the Overlay parent pages.
- */
-
-(function ($, Drupal, displace, drupalSettings) {
-
-"use strict";
-
-/**
- * Open the overlay, or load content into it, when an admin link is clicked.
- */
-Drupal.behaviors.overlayParent = {
-  attach: function (context, settings) {
-    if (this.processed) {
-      return;
-    }
-    this.processed = true;
-
-    $(window)
-      // When the hash (URL fragment) changes, open the overlay if needed.
-      .bind('hashchange.drupal-overlay', $.proxy(Drupal.overlay, 'eventhandlerOperateByURLFragment'))
-      // Trigger the hashchange handler once, after the page is loaded, so that
-      // permalinks open the overlay.
-      .triggerHandler('hashchange.drupal-overlay');
-
-    // Do not use the overlay on devices with low screen width.
-    // @todo Replace with conditional loading.
-    if(!Drupal.checkWidthBreakpoint()) {
-      return;
-    }
-
-    $(document)
-      // Instead of binding a click event handler to every link we bind one to
-      // the document and only handle events that bubble up. This allows other
-      // scripts to bind their own handlers to links and also to prevent
-      // overlay's handling.
-      .bind('click.drupal-overlay mouseup.drupal-overlay', $.proxy(Drupal.overlay, 'eventhandlerOverrideLink'));
-  }
-};
-
-/**
- * Overlay object for parent windows.
- *
- * Events
- * Overlay triggers a number of events that can be used by other scripts.
- * - drupalOverlayOpen: This event is triggered when the overlay is opened.
- * - drupalOverlayBeforeClose: This event is triggered when the overlay attempts
- *   to close. If an event handler returns false, the close will be prevented.
- * - drupalOverlayClose: This event is triggered when the overlay is closed.
- * - drupalOverlayBeforeLoad: This event is triggered right before a new URL
- *   is loaded into the overlay.
- * - drupalOverlayReady: This event is triggered when the DOM of the overlay
- *   child document is fully loaded.
- * - drupalOverlayLoad: This event is triggered when the overlay is finished
- *   loading.
- * - drupalOverlayResize: This event is triggered when the overlay is being
- *   resized to match the parent window.
- */
-Drupal.overlay = Drupal.overlay || {
-  isOpen: false,
-  isOpening: false,
-  isClosing: false,
-  isLoading: false
-};
-
-Drupal.overlay.prototype = {};
-
-/**
- * Open the overlay.
- *
- * @param url
- *   The URL of the page to open in the overlay.
- *
- * @return
- *   TRUE if the overlay was opened, FALSE otherwise.
- */
-Drupal.overlay.open = function (url) {
-  // Just one overlay is allowed.
-  if (this.isOpen || this.isOpening) {
-    return this.load(url);
-  }
-  this.isOpening = true;
-  // Store the original document title.
-  this.originalTitle = document.title;
-
-  // Create the dialog and related DOM elements.
-  this.create();
-
-  this.isOpening = false;
-  this.isOpen = true;
-  $(document.documentElement).addClass('overlay-open');
-
-  // Allow other scripts to respond to this event.
-  $(document).trigger('drupalOverlayOpen');
-
-  return this.load(url);
-};
-
-/**
- * Create the underlying markup and behaviors for the overlay.
- */
-Drupal.overlay.create = function () {
-  // Update offsets values on the page.
-  displace(false);
-
-  // Build the overlay container.
-  this.$container = $(Drupal.theme('overlayContainer'))
-    .appendTo(document.body);
-
-  // Overlay uses transparent iframes that cover the full parent window.
-  // When the overlay is open the scrollbar of the parent window is hidden.
-  // Because some browsers show a white iframe background for a short moment
-  // while loading a page into an iframe, overlay uses two iframes. By loading
-  // the page in a hidden (inactive) iframe the user doesn't see the white
-  // background. When the page is loaded the active and inactive iframes
-  // are switched.
-  this.activeFrame = this.$iframeA = $(Drupal.theme('overlayElement'))
-    .appendTo(this.$container);
-
-  this.inactiveFrame = this.$iframeB = $(Drupal.theme('overlayElement'))
-    .appendTo(this.$container);
-
-  this.$iframeA.bind('load.drupal-overlay', { self: this.$iframeA[0], sibling: this.$iframeB }, $.proxy(this, 'loadChild'));
-  this.$iframeB.bind('load.drupal-overlay', { self: this.$iframeB[0], sibling: this.$iframeA }, $.proxy(this, 'loadChild'));
-
-  // Add a second class "drupal-overlay-open" to indicate these event handlers
-  // should only be bound when the overlay is open.
-  var eventClass = '.drupal-overlay.drupal-overlay-open';
-  $(window)
-    .bind('resize' + eventClass, $.proxy(this, 'eventhandlerOuterResize'));
-  $(document)
-    .bind('drupalViewportOffsetChange' + eventClass, $.proxy(this, 'eventhandlerViewportOffsetChange'))
-    .bind('drupalOverlayLoad' + eventClass, $.proxy(this, 'eventhandlerOuterResize'))
-    .bind('drupalOverlayReady' + eventClass +
-          ' drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerSyncURLFragment'))
-    .bind('drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerRefreshPage'))
-    .bind('drupalOverlayBeforeClose' + eventClass +
-          ' drupalOverlayBeforeLoad' + eventClass +
-          ' drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerDispatchEvent'));
-
-  $(document)
-    .bind('drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerAlterDisplacedElements'))
-    .bind('drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerRestoreDisplacedElements'));
-};
-
-/**
- * Load the given URL into the overlay iframe.
- *
- * Use this method to change the URL being loaded in the overlay if it is
- * already open.
- *
- * @return
- *   TRUE if URL is loaded into the overlay, FALSE otherwise.
- */
-Drupal.overlay.load = function (url) {
-  if (!this.isOpen) {
-    return false;
-  }
-
-  // Allow other scripts to respond to this event.
-  $(document).trigger('drupalOverlayBeforeLoad');
-
-  $(document.documentElement).addClass('overlay-loading');
-
-  // The contentDocument property is not supported in IE until IE8.
-  var iframeDocument = this.inactiveFrame[0].contentDocument || this.inactiveFrame[0].contentWindow.document;
-
-  // location.replace doesn't create a history entry. location.href does.
-  // In this case, we want location.replace, as we're creating the history
-  // entry using URL fragments.
-  iframeDocument.location.replace(url);
-
-  return true;
-};
-
-/**
- * Close the overlay and remove markup related to it from the document.
- *
- * @return
- *   TRUE if the overlay was closed, FALSE otherwise.
- */
-Drupal.overlay.close = function () {
-  // Prevent double execution when close is requested more than once.
-  if (!this.isOpen || this.isClosing) {
-    return false;
-  }
-
-  // Allow other scripts to respond to this event.
-  var event = $.Event('drupalOverlayBeforeClose');
-  $(document).trigger(event);
-  // If a handler returned false, the close will be prevented.
-  if (event.isDefaultPrevented()) {
-    return false;
-  }
-
-  this.isClosing = true;
-  this.isOpen = false;
-  $(document.documentElement).removeClass('overlay-open');
-  // Restore the original document title.
-  document.title = this.originalTitle;
-
-  // Allow other scripts to respond to this event.
-  $(document).trigger('drupalOverlayClose');
-
-  Drupal.announce(Drupal.t('Tabbing is no longer constrained by the Overlay module.'));
-
-  // When the iframe is still loading don't destroy it immediately but after
-  // the content is loaded (see Drupal.overlay.loadChild).
-  if (!this.isLoading) {
-    this.destroy();
-    this.isClosing = false;
-  }
-  return true;
-};
-
-/**
- * Destroy the overlay.
- */
-Drupal.overlay.destroy = function () {
-  $([document, window]).unbind('.drupal-overlay-open');
-  this.$container.remove();
-
-  this.$container = null;
-  this.$iframeA = null;
-  this.$iframeB = null;
-
-  this.iframeWindow = null;
-};
-
-/**
- * Redirect the overlay parent window to the given URL.
- *
- * @param url
- *   Can be an absolute URL or a relative link to the domain root.
- */
-Drupal.overlay.redirect = function (url) {
-  // Create a native Link object, so we can use its object methods.
-  var link = $(url.link(url)).get(0);
-
-  // If the link is already open, force the hashchange event to simulate reload.
-  if (window.location.href === link.href) {
-    $(window).triggerHandler('hashchange.drupal-overlay');
-  }
-
-  window.location.href = link.href;
-  return true;
-};
-
-/**
- * Bind the child window.
- *
- * Note that this function is fired earlier than Drupal.overlay.loadChild.
- */
-Drupal.overlay.bindChild = function (iframeWindow, isClosing) {
-  this.iframeWindow = iframeWindow;
-
-  // We are done if the child window is closing.
-  if (isClosing || this.isClosing || !this.isOpen) {
-    return;
-  }
-
-  // Allow other scripts to respond to this event.
-  $(document).trigger('drupalOverlayReady');
-};
-
-/**
- * Event handler: load event handler for the overlay iframe.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: load
- *   - event.currentTarget: iframe
- */
-Drupal.overlay.loadChild = function (event) {
-  var iframe = event.data.self;
-  var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
-  var iframeWindow = iframeDocument.defaultView || iframeDocument.parentWindow;
-  if (iframeWindow.location.href === 'about:blank') {
-    return;
-  }
-
-  this.isLoading = false;
-  $(document.documentElement).removeClass('overlay-loading');
-  event.data.sibling.removeClass('overlay-active').prop({ 'tabindex': -1 });
-
-  // Only continue when overlay is still open and not closing.
-  if (this.isOpen && !this.isClosing) {
-    // And child document is an actual overlayChild.
-    if (iframeWindow.Drupal && iframeWindow.Drupal.overlayChild) {
-      // Replace the document title with title of iframe.
-      document.title = iframeWindow.document.title;
-
-      this.activeFrame = $(iframe)
-        .addClass('overlay-active')
-        // Add a title attribute to the iframe for accessibility.
-        .attr('title', Drupal.t('@title dialog', { '@title': iframeWindow.jQuery('#overlay-title').text() })).prop('tabindex', false);
-      this.inactiveFrame = event.data.sibling;
-
-      Drupal.announce(Drupal.t('The overlay has been opened to @title', {'@title': iframeWindow.jQuery('#overlay-title').text()}));
-
-      // Load an empty document into the inactive iframe.
-      (this.inactiveFrame[0].contentDocument || this.inactiveFrame[0].contentWindow.document).location.replace('about:blank');
-
-      // Create a fake link before the skip link in order to give it focus.
-      var skipLink = iframeWindow.jQuery('[href="#main-content"]');
-      Drupal.overlay.setFocusBefore(skipLink, iframeWindow.document);
-
-      // Report these tabbables to the TabbingManger in the parent window.
-      Drupal.overlay.releaseTabbing();
-      Drupal.overlay.constrainTabbing($(iframeWindow.document).add('#toolbar-administration'));
-
-      Drupal.announce(Drupal.t('Tabbing is constrained to items in the administrative toolbar and the overlay.'));
-
-      // Allow other scripts to respond to this event.
-      $(document).trigger('drupalOverlayLoad');
-    }
-    else {
-      window.location = iframeWindow.location.href.replace(/([?&]?)render=overlay&?/g, '$1').replace(/\?$/, '');
-    }
-  }
-  else {
-    this.destroy();
-  }
-};
-
-/**
- * Creates a placeholder element to receive document focus.
- *
- * Setting the document focus to a link will make it visible, even if it's a
- * "skip to main content" link that should normally be visible only when the
- * user tabs to it. This function can be used to set the document focus to
- * just before such an invisible link.
- *
- * @param $element
- *   The jQuery element that should receive focus on the next tab press.
- * @param document
- *   The iframe window element to which the placeholder should be added. The
- *   placeholder element has to be created inside the same iframe as the element
- *   it precedes, to keep IE happy. (http://bugs.jquery.com/ticket/4059)
- */
-Drupal.overlay.setFocusBefore = function ($element, document) {
-  // Create an anchor inside the placeholder document.
-  var placeholder = document.createElement('a');
-  var $placeholder = $(placeholder).addClass('visually-hidden').attr('href', '#');
-  // Put the placeholder where it belongs, and set the document focus to it.
-  $placeholder.insertBefore($element);
-  $placeholder.attr('autofocus', true);
-  // Make the placeholder disappear as soon as it loses focus, so that it
-  // doesn't appear in the tab order again.
-  $placeholder.one('blur', function () {
-    $(this).remove();
-  });
-};
-
-/**
- * Check if the given link is in the administrative section of the site.
- *
- * @param url
- *   The URL to be tested.
- *
- * @return boolean
- *   TRUE if the URL represents an administrative link, FALSE otherwise.
- */
-Drupal.overlay.isAdminLink = function (url) {
-  if (Drupal.overlay.isExternalLink(url)) {
-    return false;
-  }
-
-  var path = this.getPath(url);
-
-  // Turn the list of administrative paths into a regular expression.
-  if (!this.adminPathRegExp) {
-    var prefix = '';
-    if (drupalSettings.overlay.pathPrefixes.length) {
-      // Allow path prefixes used for language negatiation followed by slash,
-      // and the empty string.
-      prefix = '(' + drupalSettings.overlay.pathPrefixes.join('/|') + '/|)';
-    }
-    var adminPaths = '^' + prefix + '(' + drupalSettings.overlay.paths.admin.replace(/\s+/g, '|') + ')$';
-    var nonAdminPaths = '^' + prefix + '(' + drupalSettings.overlay.paths.non_admin.replace(/\s+/g, '|') + ')$';
-    adminPaths = adminPaths.replace(/\*/g, '.*');
-    nonAdminPaths = nonAdminPaths.replace(/\*/g, '.*');
-    this.adminPathRegExp = new RegExp(adminPaths);
-    this.nonAdminPathRegExp = new RegExp(nonAdminPaths);
-  }
-
-  return this.adminPathRegExp.exec(path) && !this.nonAdminPathRegExp.exec(path);
-};
-
-/**
- * Determine whether a link is external to the site.
- *
- * @param url
- *   The URL to be tested.
- *
- * @return boolean
- *   TRUE if the URL is external to the site, FALSE otherwise.
- */
-Drupal.overlay.isExternalLink = function (url) {
-  var re = new RegExp('^((f|ht)tps?:)?//(?!' + window.location.host + ')');
-  return re.test(url);
-};
-
-/**
- * Responds to the drupalViewportOffsetChange event.
- *
- * @param object event
- *   A jQuery event object.
- *
- * @param object offsets
- *   An object whose keys are the for sides an element -- top, right, bottom
- *   and left. The value of each key is the viewport displacement distance for
- *   that edge.
- */
-Drupal.overlay.eventhandlerViewportOffsetChange = function (event, offsets) {
-  // Allow other scripts to respond to this event.
-  $(document).trigger('drupalOverlayResize');
-};
-
-/**
- * Event handler: resizes overlay according to the size of the parent window.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: any
- *   - event.currentTarget: any
- */
-Drupal.overlay.eventhandlerOuterResize = function (event) {
-  // Proceed only if the overlay still exists.
-  if (!(this.isOpen || this.isOpening) || this.isClosing || !this.iframeWindow) {
-    return;
-  }
-
-  // IE6 uses position:absolute instead of position:fixed.
-  if (typeof document.body.style.maxHeight !== 'string') {
-    this.activeFrame.height($(window).height());
-  }
-
-  // Allow other scripts to respond to this event.
-  $(document).trigger('drupalOverlayResize');
-};
-
-/**
- * Event handler: resizes displaced elements so they won't overlap the scrollbar
- * of overlay's iframe.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: any
- *   - event.currentTarget: any
- */
-Drupal.overlay.eventhandlerAlterDisplacedElements = function (event) {
-  // Proceed only if the overlay still exists.
-  if (!(this.isOpen || this.isOpening) || this.isClosing || !this.iframeWindow) {
-    return;
-  }
-
-  var offsets = displace.offsets;
-
-  // Move the body of the iframe contentDocument inward a sufficient distance
-  // to prevent it from appearing underneath displacing elements like the
-  // toolbar.
-  var iframeBody = this.iframeWindow.document.body;
-  $(iframeBody).css({
-    'padding-top': offsets.top,
-    'padding-right': offsets.right,
-    'padding-bottom': offsets.bottom,
-    'padding-left': offsets.left
-  });
-  // Trigger a repaint.
-  iframeBody.style.display = 'none';
-  iframeBody.style.display = 'block';
-
-  // Constrain the width of offsetting top and bottom elements, such as the
-  // toolbar, so that a scroll in the overlay iframe won't be occluded.
-  var iframeBodyWidth = iframeBody.clientWidth;
-  if (iframeBodyWidth > 0 && iframeBodyWidth < document.documentElement.clientWidth) {
-    $('[data-offset-top], [data-offset-bottom]').css('max-width', iframeBodyWidth);
-  }
-};
-
-/**
- * Event handler: restores size of displaced elements as they were before
- * overlay was opened.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: any
- *   - event.currentTarget: any
- */
-Drupal.overlay.eventhandlerRestoreDisplacedElements = function (event) {
-  $('[data-offset-top], [data-offset-bottom]').css('max-width', 'none');
-};
-
-/**
- * Event handler: overrides href of administrative links to be opened in
- * the overlay.
- *
- * This click event handler should be bound to any document (for example the
- * overlay iframe) of which you want links to open in the overlay.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: click, mouseup
- *   - event.currentTarget: document
- *
- * @see Drupal.overlayChild.behaviors.addClickHandler
- */
-Drupal.overlay.eventhandlerOverrideLink = function (event) {
-  // In some browsers the click event isn't fired for right-clicks. Use the
-  // mouseup event for right-clicks and the click event for everything else.
-  if ((event.type === 'click' && event.button === 2) || (event.type === 'mouseup' && event.button !== 2)) {
-    return;
-  }
-
-  var $target = $(event.target);
-
-  // Close the overlay when the button contains the overlay-close class.
-  if ($target.is('button') && $target.hasClass('overlay-close')) {
-    // Clearing the overlay URL fragment will close the overlay.
-    $.bbq.removeState('overlay');
-    return;
-  }
-
-  // Only continue if clicked target (or one of its parents) is a link.
-  if (!$target.is('a')) {
-    $target = $target.closest('a');
-    if (!$target.length) {
-      return;
-    }
-  }
-
-  // Never open links in the overlay that contain the overlay-exclude class.
-  if ($target.hasClass('overlay-exclude')) {
-    return;
-  }
-
-  var target = $target[0];
-  var href = target.href;
-  // Only handle links that have an href attribute and use the HTTP(S) protocol.
-  if (typeof href !== 'undefined' && href !== '' && (/^https?\:/).test(target.protocol)) {
-    var anchor = href.replace(target.ownerDocument.location.href, '');
-    // Skip anchor links.
-    if (anchor.length === 0 || anchor.charAt(0) === '#') {
-      return;
-    }
-    // Open admin links in the overlay.
-    else if (this.isAdminLink(href)) {
-      // If the link contains the overlay-restore class and the overlay-context
-      // state is set, also update the parent window's location.
-      var parentLocation = ($target.hasClass('overlay-restore') && typeof $.bbq.getState('overlay-context') === 'string') ? Drupal.url($.bbq.getState('overlay-context')) : null;
-      href = this.fragmentizeLink($target.get(0), parentLocation);
-      // Only override default behavior when left-clicking and user is not
-      // pressing the ALT, CTRL, META (Command key on the Macintosh keyboard)
-      // or SHIFT key.
-      if (event.button === 0 && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
-        // Redirect to a fragmentized href. This will trigger a hashchange event.
-        this.redirect(href);
-        // Prevent default action and further propagation of the event.
-        return false;
-      }
-      // Otherwise alter clicked link's href. This is being picked up by
-      // the default action handler.
-      else {
-        $target
-          // Restore link's href attribute on blur or next click.
-          .one('blur mousedown', { target: target, href: target.href }, function (event) { $(event.data.target).attr('href', event.data.href); })
-          .attr('href', href);
-      }
-    }
-    // Non-admin links should close the overlay and open in the main window,
-    // which is the default action for a link. We only need to handle them
-    // if the overlay is open and the clicked link is inside the overlay iframe.
-    else if (this.isOpen && target.ownerDocument === this.iframeWindow.document) {
-      // Open external links in the immediate parent of the frame, unless the
-      // link already has a different target.
-      if (target.hostname !== window.location.hostname) {
-        if (!$target.attr('target')) {
-          $target.attr('target', '_parent');
-        }
-      }
-      else {
-        // Add the overlay-context state to the link, so "overlay-restore" links
-        // can restore the context.
-        // Leave links with an existing fragment alone. Adding an extra
-        // parameter to a link like "node/1#section-1" breaks the link.
-        if (!$target[0].hash) {
-          // For links with no existing fragment, add the overlay context.
-          $target.attr('href', $.param.fragment(href, { 'overlay-context': this.getPath(window.location) + window.location.search }));
-        }
-
-        // When the link has a destination query parameter and that destination
-        // is an admin link we need to fragmentize it. This will make it reopen
-        // in the overlay.
-        var params = $.deparam.querystring(href);
-        if (params.destination && this.isAdminLink(params.destination)) {
-          var fragmentizedDestination = $.param.fragment(this.getPath(window.location), { overlay: params.destination });
-          $target.attr('href', $.param.querystring(href, { destination: fragmentizedDestination }));
-        }
-
-        // Make the link open in the immediate parent of the frame, unless the
-        // link already has a different target.
-        if (!$target.attr('target')) {
-          $target.attr('target', '_parent');
-        }
-      }
-    }
-  }
-};
-
-/**
- * Event handler: opens or closes the overlay based on the current URL fragment.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: hashchange
- *   - event.currentTarget: document
- */
-Drupal.overlay.eventhandlerOperateByURLFragment = function (event) {
-  // If we changed the hash to reflect an internal redirect in the overlay,
-  // its location has already been changed, so don't do anything.
-  if ($.data(window.location, window.location.href) === 'redirect') {
-    $.data(window.location, window.location.href, null);
-    return;
-  }
-
-  // Get the overlay URL from the current URL fragment.
-  var state = $.bbq.getState('overlay');
-  if (state) {
-    // Append render variable, so the server side can choose the right
-    // rendering and add child frame code to the page if needed.
-    var url = $.param.querystring(Drupal.url(state), { render: 'overlay' });
-
-    this.open(url);
-    this.resetActiveClass(this.getPath(url));
-  }
-  // If there is no overlay URL in the fragment and the overlay is (still)
-  // open, close the overlay.
-  else if (this.isOpen && !this.isClosing) {
-    this.close();
-    this.resetActiveClass(this.getPath(window.location));
-  }
-};
-
-/**
- * Event handler: makes sure the internal overlay URL is reflected in the parent
- * URL fragment.
- *
- * Normally the parent URL fragment determines the overlay location. However, if
- * the overlay redirects internally, the parent doesn't get informed, and the
- * parent URL fragment will be out of date. This is a sanity check to make
- * sure we're in the right place.
- *
- * The parent URL fragment is also not updated automatically when overlay's
- * open, close or load functions are used directly (instead of through
- * eventhandlerOperateByURLFragment).
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: drupalOverlayReady, drupalOverlayClose
- *   - event.currentTarget: document
- */
-Drupal.overlay.eventhandlerSyncURLFragment = function (event) {
-  if (this.isOpen) {
-    var expected = $.bbq.getState('overlay');
-    // This is just a sanity check, so we're comparing paths, not query strings.
-    if (this.getPath(Drupal.url(expected)) !== this.getPath(this.iframeWindow.document.location)) {
-      // There may have been a redirect inside the child overlay window that the
-      // parent wasn't aware of. Update the parent URL fragment appropriately.
-      var newLocation = Drupal.overlay.fragmentizeLink(this.iframeWindow.document.location);
-      // Set a 'redirect' flag on the new location so the hashchange event handler
-      // knows not to change the overlay's content.
-      $.data(window.location, newLocation, 'redirect');
-      // Use location.replace() so we don't create an extra history entry.
-      window.location.replace(newLocation);
-    }
-  }
-  else {
-    $.bbq.removeState('overlay');
-  }
-};
-
-/**
- * Event handler: if the child window suggested that the parent refresh on
- * close, force a page refresh.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: drupalOverlayClose
- *   - event.currentTarget: document
- */
-Drupal.overlay.eventhandlerRefreshPage = function (event) {
-  if (Drupal.overlay.refreshPage) {
-    window.location.reload(true);
-  }
-};
-
-/**
- * Event handler: dispatches events to the overlay document.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: any
- *   - event.currentTarget: any
- */
-Drupal.overlay.eventhandlerDispatchEvent = function (event) {
-  if (this.iframeWindow && this.iframeWindow.document) {
-    this.iframeWindow.jQuery(this.iframeWindow.document).trigger(event);
-  }
-};
-
-/**
- * Make a regular admin link into a URL that will trigger the overlay to open.
- *
- * @param link
- *   A JavaScript Link object (i.e. an <a> element).
- * @param parentLocation
- *   (optional) URL to override the parent window's location with.
- *
- * @return
- *   A URL that will trigger the overlay (in the form
- *   /node/1#overlay=admin/config).
- */
-Drupal.overlay.fragmentizeLink = function (link, parentLocation) {
-  // Don't operate on links that are already overlay-ready.
-  var params = $.deparam.fragment(link.href);
-  if (params.overlay) {
-    return link.href;
-  }
-
-  // Determine the link's original destination.
-  var path = this.getPath(link);
-  // Preserve existing query and fragment parameters in the URL, except for
-  // "render=overlay" which is re-added in Drupal.overlay.eventhandlerOperateByURLFragment.
-  var destination = path + link.search.replace(/&?render=overlay/, '').replace(/\?$/, '') + link.hash;
-
-  // Assemble and return the overlay-ready link.
-  return $.param.fragment(parentLocation || window.location.href, { overlay: destination });
-};
-
-/**
- * Refresh a specific region.
- *
- * @param regionName
- *   Name of the region.
- * @param regionSelector
- *   CSS selector for the region.
- */
-function refreshRegion(regionName, regionSelector) {
-  var $region = $(regionSelector);
-  Drupal.detachBehaviors($region);
-  $.get(Drupal.url(drupalSettings.overlay.ajaxCallback + '/' + regionName), function (newElement) {
-    $region.replaceWith($(newElement));
-    Drupal.attachBehaviors($region, drupalSettings);
-  });
-}
-
-/**
- * Refresh any regions of the page that are displayed outside the overlay.
- *
- * @param data
- *   An array of objects with information on the page regions to be refreshed.
- *   For each object, the key is a CSS class identifying the region to be
- *   refreshed, and the value represents the section of the Drupal $page array
- *   corresponding to this region.
- */
-Drupal.overlay.refreshRegions = function (data) {
-  var region, region_info, regionClass;
-  for (region in data) {
-    if (data.hasOwnProperty(region)) {
-      region_info = data[region];
-      for (regionClass in region_info) {
-        if (region_info.hasOwnProperty(regionClass)) {
-          refreshRegion(region_info[regionClass], '.' + regionClass);
-        }
-      }
-    }
-  }
-};
-
-/**
- * Reset the active class on links in displaced elements according to
- * given path.
- *
- * @param activePath
- *   Path to match links against.
- */
-Drupal.overlay.resetActiveClass = function(activePath) {
-  var self = this;
-  var windowDomain = window.location.protocol + window.location.hostname;
-
-  $('#toolbar-administration')
-  .find('a[href]')
-  // Remove active class from all links in displaced elements.
-  .removeClass('active')
-  // Add active class to links that match activePath.
-  .each(function () {
-    var linkDomain = this.protocol + this.hostname;
-    var linkPath = self.getPath(this);
-
-    // A link matches if it is part of the active trail of activePath, except
-    // for frontpage links.
-    if (linkDomain === windowDomain && (activePath + '/').indexOf(linkPath + '/') === 0 && (linkPath !== '' || activePath === '')) {
-      $(this).addClass('active');
-    }
-  });
-};
-
-/**
- * Helper function to get the (corrected) Drupal path of a link.
- *
- * @param link
- *   Link object or string to get the Drupal path from.
- *
- * @return
- *   The Drupal path.
- */
-Drupal.overlay.getPath = function (link) {
-  if (typeof link === 'string') {
-    // Create a native Link object, so we can use its object methods.
-    link = $(link.link(link)).get(0);
-  }
-
-  var path = link.pathname;
-  // Ensure a leading slash on the path, omitted in some browsers.
-  if (path.charAt(0) !== '/') {
-    path = '/' + path;
-  }
-  path = path.replace(new RegExp(drupalSettings.basePath + drupalSettings.scriptPath), '');
-
-  return path;
-};
-
-/**
- * Makes elements outside the overlay unreachable via the tab key.
- */
-Drupal.overlay.constrainTabbing = function ($tabbables) {
-  // If a tabset is already active, return without creating a new one.
-  if (this.tabset && !this.tabset.released) {
-    return;
-  }
-  // Leave links inside the overlay and toolbars alone.
-  this.tabset = Drupal.tabbingManager.constrain($tabbables);
-  var self = this;
-  $(document).on('drupalOverlayClose.tabbing', function () {
-    self.tabset.release();
-    $(document).off('drupalOverlayClose.tabbing');
-  });
-};
-
-/**
- *
- */
-Drupal.overlay.releaseTabbing = function () {
-  if (this.tabset) {
-    this.tabset.release();
-    delete this.tabset;
-  }
-};
-
-$.extend(Drupal.theme, {
-  /**
-   * Theme function to create the overlay iframe element.
-   */
-  overlayContainer: function () {
-    return '<div id="overlay-container"><div class="overlay-modal-background"></div></div>';
-  },
-
-  /**
-   * Theme function to create an overlay iframe element.
-   */
-  overlayElement: function (url) {
-    return '<iframe class="overlay-element" frameborder="0" scrolling="auto" allowtransparency="true"></iframe>';
-  }
-});
-
-})(jQuery, Drupal, Drupal.displace, drupalSettings);
diff --git a/core/modules/overlay/overlay.api.php b/core/modules/overlay/overlay.api.php
deleted file mode 100644
index bc23546df7ed8c629ff68dc9126abdc1056a83c1..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay.api.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @file
- * Hooks provided by Overlay module.
- */
-
-/**
- * @addtogroup hooks
- * @{
- */
-
-/**
- * Allow modules to act when an overlay parent window is initialized.
- *
- * The parent window is initialized when a page is displayed in which the
- * overlay might be required to be displayed, so modules can act here if they
- * need to take action to accommodate the possibility of the overlay appearing
- * within a Drupal page.
- */
-function hook_overlay_parent_initialize() {
-  // Add our custom JavaScript.
-  drupal_add_js(drupal_get_path('module', 'hook') . '/hook-overlay.js');
-}
-
-/**
- * Allow modules to act when an overlay child window is initialized.
- *
- * The child window is initialized when a page is displayed from within the
- * overlay, so modules can act here if they need to take action to work from
- * within the confines of the overlay.
- */
-function hook_overlay_child_initialize() {
-  // Add our custom JavaScript.
-  drupal_add_js(drupal_get_path('module', 'hook') . '/hook-overlay-child.js');
-}
-
-/**
- * @} End of "addtogroup hooks".
- */
diff --git a/core/modules/overlay/overlay.info.yml b/core/modules/overlay/overlay.info.yml
deleted file mode 100644
index 07b634d1d9bf7e1ecffeab58ac422bff153dacec..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay.info.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-name: Overlay
-type: module
-description: 'Displays the Drupal administration interface in an overlay.'
-package: Core
-version: VERSION
-core: 8.x
diff --git a/core/modules/overlay/overlay.install b/core/modules/overlay/overlay.install
deleted file mode 100644
index f3b78f30cffb1534a9b5996dedce8898085291db..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay.install
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/**
- * @file
- * Install, update, and uninstall functions for the Overlay module.
- */
-
-/**
- * Implements hook_install().
- *
- * If the module is being enabled through the admin UI, and not from an
- * installation profile, reopen the modules page in an overlay.
- */
-function overlay_install() {
-  if (strpos(current_path(), 'admin/modules') === 0) {
-    // Flag for a redirect to <front>#overlay=admin/modules on hook_init().
-    $_SESSION['overlay_enable_redirect'] = 1;
-  }
-}
-
-/**
- * Implements hook_update_dependencies().
- */
-function overlay_update_dependencies() {
-  // Migrate users.data after User module prepared the tables.
-  $dependencies['overlay'][8000] = array(
-    'user' => 8016,
-  );
-  return $dependencies;
-}
-
-/**
- * Migrate {users}.data into {users_data}.
- */
-function overlay_update_8000() {
-  $query = db_select('_d7_users_data', 'ud');
-  $query->condition('name', 'overlay');
-  $query->addField('ud', 'uid');
-  $query->addExpression("'overlay'", 'module');
-  $query->addExpression("'enabled'", 'name');
-  $query->addField('ud', 'value', 'value');
-  $query->addExpression(1, 'serialized');
-
-  db_insert('users_data')
-    ->from($query)
-    ->execute();
-
-  // Migrate 'overlay_message_dismissed'.
-  $query = db_select('_d7_users_data', 'ud');
-  $query->condition('name', 'overlay_message_dismissed');
-  $query->addField('ud', 'uid');
-  $query->addExpression("'overlay'", 'module');
-  $query->addExpression("'message_dismissed'", 'name');
-  $query->addField('ud', 'value', 'value');
-  $query->addExpression(1, 'serialized');
-
-  db_insert('users_data')
-    ->from($query)
-    ->execute();
-
-  db_delete('_d7_users_data')
-    ->condition('name', array('overlay', 'overlay_message_dismissed'))
-    ->execute();
-}
diff --git a/core/modules/overlay/overlay.module b/core/modules/overlay/overlay.module
deleted file mode 100644
index 81279c18dd914c2129f33535bd88799357507d8b..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay.module
+++ /dev/null
@@ -1,845 +0,0 @@
-<?php
-
-/**
- * @file
- * Displays the Drupal administration interface in an overlay.
- */
-
-use Drupal\Core\Template\RenderWrapper;
-use Symfony\Component\HttpFoundation\RedirectResponse;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
-use Drupal\block\Entity\Block;
-use Drupal\Core\Session\AccountInterface;
-
-/**
- * Implements hook_help().
- */
-function overlay_help($path, $arg) {
-  switch ($path) {
-    case 'admin/help#overlay':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Overlay module uses JavaScript to open administration pages in an overlay of the page you were viewing when you clicked the administrative link, instead of replacing the page in your browser window. This ensures that you return to the page you were viewing once you close the overlay, even if you have visited several administration pages. For more information, see the <a href="!overlay">online documentation for the Overlay module</a>.', array('!overlay' => 'https://drupal.org/documentation/modules/overlay')) . '</p>';
-      $output .= '<dl>';
-      $output .= '<dt>' . t('Disabling the overlay for individual users') . '</dt>';
-      $output .= '<dd>' . t('Users can individually disable the overlay functionality on their <em>Profile page</em>.') . '</dd>';
-      $output .= '</dl>';
-      return $output;
-  }
-}
-
-/**
- * Implements hook_admin_paths().
- */
-function overlay_admin_paths() {
-  $paths = array(
-    // This is marked as an administrative path so that if it is visited from
-    // within the overlay, the user will stay within the overlay while the
-    // callback is being processed.
-    'overlay/dismiss-message' => TRUE,
-  );
-  return $paths;
-}
-
-/**
- * Implements hook_permission().
- */
-function overlay_permission() {
-  return array(
-    'access overlay' => array(
-      'title' => t('Access the administrative overlay'),
-      'description' => t('View administrative pages in the overlay.'),
-    ),
-  );
-}
-
-/**
- * Implements hook_theme().
- */
-function overlay_theme() {
-  return array(
-    'overlay' => array(
-      'render element' => 'page',
-      'template' => 'overlay',
-    ),
-    'overlay_disable_message' => array(
-      'render element' => 'element',
-      'template' => 'overlay-disable-message',
-    ),
-  );
-}
-
-/**
- * Implements hook_field_extra_fields().
- */
-function overlay_field_extra_fields() {
-  $fields['user']['user']['form']['overlay_control'] = array(
-    'label' => t('Administrative overlay'),
-    'description' => t('Overlay module form element.'),
-    'weight' => 4,
-  );
-  return $fields;
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- */
-function overlay_form_user_form_alter(&$form, &$form_state) {
-  $account = $form_state['controller']->getEntity();
-  if ($account->hasPermission('access overlay')) {
-    $account_data = \Drupal::service('user.data')->get('overlay', $account->id(), 'enabled');
-    $form['overlay_control'] = array(
-      '#type' => 'details',
-      '#title' => t('Administrative overlay'),
-      '#weight' => 4,
-    );
-    $form['overlay_control']['overlay'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Use the overlay for administrative pages.'),
-      '#description' => t('Show administrative pages on top of the page you started from.'),
-      '#default_value' => isset($account_data) ? $account_data : 1,
-    );
-    $form['actions']['submit']['#submit'][] = 'overlay_user_profile_form_submit';
-  }
-}
-
-/**
- * Submit callback for the user profile form to save the overlay page setting.
- */
-function overlay_user_profile_form_submit($form, &$form_state) {
-  $account = $form_state['controller']->getEntity();
-  if ($account->id() && isset($form_state['values']['overlay'])) {
-    \Drupal::service('user.data')->set('overlay', $account->id(), 'enabled', (int) $form_state['values']['overlay']);
-  }
-}
-
-/**
- * Implements hook_library_info().
- */
-function overlay_library_info() {
-  $module_path = drupal_get_path('module', 'overlay');
-
-  // Overlay parent.
-  $libraries['drupal.overlay.parent'] = array(
-    'title' => 'Overlay: Parent',
-    'website' => 'http://drupal.org/documentation/modules/overlay',
-    'version' => '1.0',
-    'js' => array(
-      $module_path . '/overlay-parent.js' => array(),
-    ),
-    'css' => array(
-      $module_path . '/css/overlay-parent.css' => array(),
-    ),
-    'dependencies' => array(
-      array('system', 'jquery'),
-      array('system', 'drupal'),
-      array('system', 'drupalSettings'),
-      array('system', 'drupal.displace'),
-      array('system', 'drupal.tabbingmanager'),
-      array('system', 'drupal.announce'),
-      array('system', 'jquery.ui.core'),
-      array('system', 'jquery.bbq'),
-    ),
-  );
-  // Overlay child.
-  $libraries['drupal.overlay.child'] = array(
-    'title' => 'Overlay: Child',
-    'website' => 'http://drupal.org/documentation/modules/overlay',
-    'version' => '1.0',
-    'js' => array(
-      $module_path . '/overlay-child.js' => array(),
-    ),
-    'css' => array(
-      $module_path . '/css/overlay-child.css' => array(),
-    ),
-    'dependencies' => array(
-      array('system', 'jquery'),
-      array('system', 'drupal'),
-      array('system', 'drupalSettings'),
-      array('system', 'jquery.once'),
-    ),
-  );
-
-  return $libraries;
-}
-
-/**
- * Implements hook_batch_alter().
- *
- * If the current page request is inside the overlay, add ?render=overlay to
- * the success callback URL, so that it appears correctly within the overlay.
- *
- * @see overlay_get_mode()
- */
-function overlay_batch_alter(&$batch) {
-  if (overlay_get_mode() == 'child') {
-    if (isset($batch['url_options']['query'])) {
-      $batch['url_options']['query']['render'] = 'overlay';
-    }
-    else {
-      $batch['url_options']['query'] = array('render' => 'overlay');
-    }
-  }
-}
-
-/**
- * Implements hook_page_alter().
- */
-function overlay_page_alter(&$page) {
-  // If we are limiting rendering to a subset of page regions, deny access to
-  // all other regions so that they will not be processed.
-  if ($regions_to_render = overlay_get_regions_to_render()) {
-    $skipped_regions = array_diff(element_children($page), $regions_to_render);
-    foreach ($skipped_regions as $skipped_region) {
-      $page[$skipped_region]['#access'] = FALSE;
-    }
-  }
-
-  $mode = overlay_get_mode();
-  if ($mode == 'child') {
-    // Add the overlay wrapper before the html wrapper.
-    array_unshift($page['#theme_wrappers'], 'overlay');
-  }
-  elseif ($mode == 'parent' && ($message = overlay_disable_message())) {
-    $page['page_top']['disable_overlay'] = $message;
-  }
-}
-
-/**
- * Returns a renderable array representing a message for disabling the overlay.
- *
- * If the current user can access the overlay and has not previously indicated
- * that this message should be dismissed, this function returns a message
- * containing a link to disable the overlay. Nothing is returned for anonymous
- * users, because the links control per-user settings. Because some screen
- * readers are unable to properly read overlay contents, site builders are
- * discouraged from granting the "access overlay" permission to the anonymous
- * role.
- *
- * @see http://drupal.org/node/890284
- */
-function overlay_disable_message() {
-  $user = \Drupal::currentUser();
-
-  $build = array();
-  if ($user->isAnonymous() || !$user->hasPermission('access overlay')) {
-    return $build;
-  }
-
-  $user_data = \Drupal::service('user.data')->get('overlay', $user->id());
-  if (empty($user_data['message_dismissed']) && (!isset($user_data['enabled']) || $user_data['enabled'])) {
-    $build = array(
-      '#theme' => 'overlay_disable_message',
-      '#weight' => -99,
-      // Link to the user's profile page, where the overlay can be disabled.
-      'profile_link' => array(
-        '#type' => 'link',
-        '#title' => t('If you have problems accessing administrative pages on this site, disable the overlay on your profile page.'),
-        '#href' => 'user/' . $user->id() . '/edit',
-        '#options' => array(
-          'query' => drupal_get_destination(),
-          'fragment' => 'edit-overlay-control',
-          'attributes' => array(
-            'id' => 'overlay-profile-link',
-            // Prevent the target page from being opened in the overlay.
-            'class' => array('overlay-exclude'),
-          ),
-        ),
-      ),
-      // Link to a menu callback that allows this message to be permanently
-      // dismissed for the current user.
-      'dismiss_message_link' => array(
-        '#type' => 'link',
-        '#title' => t('Dismiss this message.'),
-        '#href' => 'overlay/dismiss-message',
-        '#options' => array(
-          'query' => drupal_get_destination() + array(
-            // Add a token to protect against cross-site request forgeries.
-            'token' => drupal_get_token('overlay'),
-          ),
-          'attributes' => array(
-            'id' => 'overlay-dismiss-message',
-            // If this message is being displayed outside the overlay, prevent
-            // this link from opening the overlay.
-            'class' => (overlay_get_mode() == 'parent') ? array('overlay-exclude') : array(),
-          ),
-        ),
-      )
-    );
-  }
-
-  return $build;
-}
-
-/**
- * Prepares variables for overlay disable message templates.
- *
- * Default template: overlay-disable-message.html.twig.
- *
- * @param array $variables
- *   An associative array with an 'element' element, which itself is an
- *   associative array containing:
- *   - profile_link: The link to this user's account.
- *   - dismiss_message_link: The link to dismiss the overlay.
- */
-function template_preprocess_overlay_disable_message(&$variables) {
-  $element = $variables['element'];
-
-  // Add CSS classes to hide the links from most sighted users, while keeping
-  // them accessible to screen-reader users and keyboard-only users. To assist
-  // screen-reader users, this message appears in both the parent and child
-  // documents, but only the one in the child document is part of the tab order.
-  foreach (array('profile_link', 'dismiss_message_link') as $key) {
-    $element[$key]['#options']['attributes']['class'][] = 'visually-hidden';
-    if (overlay_get_mode() == 'child') {
-      $element[$key]['#options']['attributes']['class'][] = 'focusable';
-    }
-  }
-
-  $variables['profile_link'] = $element['profile_link'];
-  $variables['dismiss_link'] = $element['dismiss_message_link'];
-}
-
-/**
- * Implements hook_block_access().
- */
-function overlay_block_access(Block $block, $operation, AccountInterface $account, $langcode) {
-  // If we are limiting rendering to a subset of page regions, hide all blocks
-  // which appear in regions not on that list. Note that overlay_page_alter()
-  // does a more comprehensive job of preventing unwanted regions from being
-  // displayed (regardless of whether they contain blocks or not), but the
-  // reason for duplicating effort here is performance; we do not even want
-  // these blocks to be built if they are not going to be displayed.
-  if ($regions_to_render = overlay_get_regions_to_render()) {
-    if (!in_array($block->get('region'), $regions_to_render)) {
-      return FALSE;
-    }
-  }
-}
-
-/**
- * Implements hook_system_info_alter().
- *
- * Add default regions for the overlay.
- */
-function overlay_system_info_alter(&$info, $file, $type) {
-  if ($type == 'theme') {
-    $info['overlay_regions'][] = 'content';
-    $info['overlay_regions'][] = 'help';
-  }
-}
-
-/**
- * Implements hook_preprocess_HOOK() for HTML document templates.
- *
- * If the current page request is inside the overlay, add appropriate classes
- * to the <body> element, and simplify the page title.
- *
- * @see overlay_get_mode()
- */
-function overlay_preprocess_html(&$variables) {
-  if (overlay_get_mode() == 'child') {
-    // Add overlay class, so themes can react to being displayed in the overlay.
-    $variables['attributes']['class'][] = 'overlay';
-  }
-}
-
-/**
- * Implements hook_preprocess_HOOK() for maintenance page templates.
- *
- * If the current page request is inside the overlay, add appropriate classes
- * to the <body> element, and simplify the page title.
- */
-function overlay_preprocess_maintenance_page(&$variables) {
-  overlay_preprocess_html($variables);
-}
-
-/**
- * Prepares variables for overlay templates.
- *
- * Default template: overlay.html.twig.
- *
- * If the current page request is inside the overlay, add appropriate classes
- * to the <body> element, and simplify the page title.
- *
- * @param array $variables
- *   An associative array containing:
- *   - page: A render element representing the page.
- */
-function template_preprocess_overlay(&$variables) {
-  $variables['tabs'] = menu_primary_local_tasks();
-
-  if (isset($variables['page']['#title'])) {
-    $variables['title'] = $variables['page']['#title'];
-  }
-  else {
-    $variables['title'] = new RenderWrapper('drupal_get_title');
-  }
-  $variables['disable_overlay'] = overlay_disable_message();
-
-  // Add attributes for the overlay container.
-  $variables['attributes']['id'] = 'overlay';
-  $variables['attributes']['class'][] = 'overlay';
-  // Add attributes for the overlay title.
-  $variables['title_attributes']['id'] = 'overlay-title';
-  // Add attributes for the overlay content.
-  $variables['content_attributes']['id'] = 'overlay-content';
-  $variables['content_attributes']['class'][] = 'clearfix';
-}
-
-/**
- * Implements hook_preprocess_HOOK() for page templates.
- *
- * If the current page request is inside the overlay, hide the tabs.
- *
- * @see overlay_get_mode()
- */
-function overlay_preprocess_page(&$variables) {
-  if (overlay_get_mode() == 'child') {
-    unset($variables['tabs']['#primary']);
-  }
-}
-
-/**
- * Prints an empty page.
- *
- * This function is used to print out a bare minimum empty page which still has
- * the scripts and styles necessary in order to trigger the overlay to close.
- *
- * It can be used to prevent a page request which closes the overlay (for
- * example, a form submission) from being fully re-rendered before the overlay
- * is closed, thereby allowing the dialog to be closed faster and with less
- * interruption, and also allowing the display of messages to be deferred to
- * the parent window (rather than displaying them in the child window, which
- * will close before the user has had a chance to read them).
- *
- * @return \Symfony\Component\HttpFoundation\Response
- *   A Response object.
- */
-function overlay_deliver_empty_page() {
-  $empty_page = '<html><head><title></title>' . drupal_get_css() . drupal_get_js() . '</head><body class="overlay"></body></html>';
-  return new Response($empty_page);
-}
-
-/**
- * Gets the current overlay mode.
- *
- * @see overlay_set_mode()
- */
-function overlay_get_mode() {
-  return overlay_set_mode(NULL);
-}
-
-/**
- * Sets the overlay mode and adds proper JavaScript and styles to the page.
- *
- * Note that since setting the overlay mode triggers a variety of behaviors
- * (including hooks being invoked), it can only be done once per page request.
- * Therefore, the first call to this function which passes along a value of the
- * $mode parameter controls the overlay mode that will be used.
- *
- * @param $mode
- *   To set the mode, pass in one of the following values:
- *   - 'parent': This is used in the context of a parent window (a regular
- *     browser window). If set, JavaScript is added so that administrative
- *     links in the parent window will open in an overlay.
- *   - 'child': This is used in the context of the child overlay window (the
- *     page actually appearing within the overlay iframe). If set, JavaScript
- *     and CSS are added so that Drupal behaves nicely from within the overlay.
- *   - 'none': This is used to avoid adding any overlay-related code to the
- *     page at all. Modules can set this to explicitly prevent the overlay from
- *     being used. For example, since the overlay module itself sets the mode
- *     to 'parent' or 'child' in the overlay event subscriber when certain
- *     conditions are met, other modules which want to override that behavior
- *     can do so by setting the mode to 'none' earlier in the page request -
- *     e.g., in their own event subscribers, if they have a higher priority.
- *   This parameter is optional, and if omitted, the current mode will be
- *   returned with no action taken.
- *
- * @return
- *   The current mode, if any has been set, or NULL if no mode has been set.
- *
- * @ingroup overlay_api
- * @see \Drupal\overlay\EventSubscriber\OverlaySubscriber::onRequest()
- */
-function overlay_set_mode($mode = NULL) {
-  // We're not using drupal_static() here since the static cache is reset in
-  // drupal_flush_all_caches(); this could lead to the loss of the overlay when
-  // submitting the admin/modules form, for instance.
-  static $overlay_mode;
-
-  // Make sure external resources are not included more than once. Also return
-  // the current mode, if no mode was specified.
-  if (isset($overlay_mode) || !isset($mode)) {
-    return $overlay_mode;
-  }
-  $overlay_mode = $mode;
-
-  switch ($overlay_mode) {
-    case 'parent':
-      drupal_add_library('overlay', 'drupal.overlay.parent');
-
-      // Allow modules to act upon overlay events.
-      \Drupal::moduleHandler()->invokeAll('overlay_parent_initialize');
-      break;
-
-    case 'child':
-      drupal_add_library('overlay', 'drupal.overlay.child');
-
-      // Allow modules to act upon overlay events.
-      \Drupal::moduleHandler()->invokeAll('overlay_child_initialize');
-      break;
-  }
-  return $overlay_mode;
-}
-
-/**
- * Implements hook_overlay_parent_initialize().
- */
-function overlay_overlay_parent_initialize() {
-  // Let the client side know which paths are administrative.
-  $paths = path_get_admin_paths();
-  foreach ($paths as &$type) {
-    $type = str_replace('<front>', \Drupal::config('system.site')->get('page.front'), $type);
-  }
-  drupal_add_js(array('overlay' => array('paths' => $paths)), 'setting');
-  $path_prefixes = array();
-  if (\Drupal::moduleHandler()->moduleExists('language')) {
-    language_negotiation_include();
-    if (\Drupal::config('language.negotiation')->get('url.source') == LANGUAGE_NEGOTIATION_URL_PREFIX) {
-      // Skip the empty string indicating the default language. We always accept
-      // paths without a prefix.
-      $path_prefixes = language_negotiation_url_prefixes();
-      $path_prefixes = array_values(array_filter($path_prefixes));
-    }
-  }
-  drupal_add_js(array('overlay' => array('pathPrefixes' => $path_prefixes)), 'setting');
-  // Pass along the Ajax callback for rerendering sections of the parent window.
-  drupal_add_js(array('overlay' => array('ajaxCallback' => 'overlay-ajax')), 'setting');
-}
-
-/**
- * Implements hook_overlay_child_initialize().
- */
-function overlay_overlay_child_initialize() {
-  // Check if the parent window needs to refresh any page regions on this page
-  // request.
-  overlay_trigger_refresh();
-  // If this is a POST request, or a GET request with a token parameter, we
-  // have an indication that something in the supplemental regions of the
-  // overlay might change during the current page request. We therefore store
-  // the initial rendered content of those regions here, so that we can compare
-  // it to the same content rendered in OverlaySubscriber::onResponse(),
-  // at the end of the page request. This allows us to check if anything
-  // actually did change, and, if so, trigger an immediate Ajax refresh
-  // of the parent window.
-  $token = \Drupal::request()->query->get('token');
-  $post = \Drupal::request()->request->count();
-  if (!empty($post) || isset($token)) {
-    foreach (overlay_supplemental_regions() as $region) {
-      overlay_store_rendered_content($region, overlay_render_region($region));
-    }
-    // In addition, notify the parent window that when the overlay closes,
-    // the entire parent window should be refreshed.
-    overlay_request_page_refresh();
-  }
-  // Indicate that when the main page rendering occurs later in the page
-  // request, only the regions that appear within the overlay should be
-  // rendered.
-  overlay_set_regions_to_render(overlay_regions());
-}
-
-/**
- * Immediately returns HTML to to the browser and closes the overlay.
- *
- * @param $redirect
- *   (optional) The path that should open in the parent window after the
- *   overlay closes. If not set, no redirect will be performed on the parent
- *   window.
- *
- * @param $redirect_options
- *   (optional) An associative array of options to use when generating the
- *   redirect URL.
- *
- * @return \Symfony\Component\HttpFoundation\Response
- *   A Response object.
- *
- * @todo This function should only request that the overlay close when the page
- *   is displayed (as it did in Drupal 7), not immediately end the request.
- */
-function overlay_close_dialog($redirect = NULL, $redirect_options = array()) {
-  $settings = array(
-    'overlayChild' => array(
-      'closeOverlay' => TRUE,
-    ),
-  );
-
-  // Tell the child window to perform the redirection when requested to.
-  if (isset($redirect)) {
-    $settings['overlayChild']['redirect'] = url($redirect, $redirect_options);
-  }
-
-  drupal_add_js($settings, array('type' => 'setting'));
-
-  // Since we are closing the overlay as soon as the page is displayed, we do
-  // not want to show any of the page's actual content.
-  return overlay_deliver_empty_page();
-}
-
-/**
- * Returns a list of page regions that appear in the overlay.
- *
- * Overlay regions correspond to the entire contents of the overlay child
- * window and are refreshed each time a new page request is made within the
- * overlay.
- *
- * @return
- *   An array of region names that correspond to those which appear in the
- *   overlay, within the theme that is being used to display the current page.
- *
- * @see overlay_supplemental_regions()
- */
-function overlay_regions() {
-  return _overlay_region_list('overlay_regions');
-}
-
-/**
- * Returns a list of supplemental page regions for the overlay.
- *
- * Supplemental overlay regions are those which are technically part of the
- * parent window, but appear to the user as being related to the overlay
- * (usually because they are displayed next to, rather than underneath, the
- * main overlay regions) and therefore need to be dynamically refreshed if any
- * administrative actions taken within the overlay change their contents.
- *
- * An example of a typical overlay supplemental region would be the 'page_top'
- * region, in the case where a toolbar is being displayed there.
- *
- * @return
- *   An array of region names that correspond to supplemental overlay regions,
- *   within the theme that is being used to display the current page.
- *
- * @see overlay_regions()
- */
-function overlay_supplemental_regions() {
-  return _overlay_region_list('overlay_supplemental_regions');
-}
-
-/**
- * Returns a list of page regions related to the overlay.
- *
- * @param $type
- *   The type of regions to return. This can either be 'overlay_regions' or
- *   'overlay_supplemental_regions'.
- *
- * @return
- *   An array of region names of the given type, within the theme that is being
- *   used to display the current page.
- *
- * @see overlay_regions()
- * @see overlay_supplemental_regions()
- */
-function _overlay_region_list($type) {
-  // Obtain the current theme. We need to first make sure the theme system is
-  // initialized, since this function can be called early in the page request.
-  drupal_theme_initialize();
-  $themes = list_themes();
-  $theme = $themes[$GLOBALS['theme']];
-  // Return the list of regions stored within the theme's info array, or an
-  // empty array if no regions of the appropriate type are defined.
-  return !empty($theme->info[$type]) ? $theme->info[$type] : array();
-}
-
-/**
- * Returns a list of page regions that rendering should be limited to.
- *
- * @return
- *   An array containing the names of the regions that will be rendered when
- *   drupal_render_page() is called. If empty, then no limits will be imposed,
- *   and all regions of the page will be rendered.
- *
- * @see overlay_page_alter()
- * @see overlay_block_access()
- * @see overlay_set_regions_to_render()
- */
-function overlay_get_regions_to_render() {
-  return overlay_set_regions_to_render();
-}
-
-/**
- * Sets the regions of the page that rendering will be limited to.
- *
- * @param $regions
- *   (Optional) An array containing the names of the regions that should be
- *   rendered when drupal_render_page() is called. Pass in an empty array to
- *   remove all limits and cause drupal_render_page() to render all page
- *   regions (the default behavior). If this parameter is omitted, no change
- *   will be made to the current list of regions to render.
- *
- * @return
- *   The current list of regions to render, or an empty array if the regions
- *   are not being limited.
- *
- * @see overlay_page_alter()
- * @see overlay_block_access()
- * @see overlay_get_regions_to_render()
- */
-function overlay_set_regions_to_render($regions = NULL) {
-  $regions_to_render = &drupal_static(__FUNCTION__, array());
-  if (isset($regions)) {
-    $regions_to_render = $regions;
-  }
-  return $regions_to_render;
-}
-
-/**
- * Renders an individual page region.
- *
- * This function is primarily intended to be used for checking the content of
- * supplemental overlay regions (e.g., a region containing a toolbar). Passing
- * in a region that is intended to display the main page content is not
- * supported; the region will be rendered by this function, but the main page
- * content will not appear in it. In addition, although this function returns
- * the rendered HTML for the provided region, it does not place it on the final
- * page, nor add any of its associated JavaScript or CSS to the page.
- *
- * @param $region
- *   The name of the page region that should be rendered.
- *
- * @return
- *   The rendered HTML of the provided region.
- */
-function overlay_render_region($region) {
-  // Indicate the region that we will be rendering, so that other regions will
-  // be hidden by overlay_page_alter() and overlay_block_access().
-  overlay_set_regions_to_render(array($region));
-  // Do what is necessary to force drupal_render_page() to only display HTML
-  // from the requested region. Specifically, declare that the main page
-  // content does not need to automatically be added to the page, and pass in
-  // a page array that has all theme functions removed (so that overall HTML
-  // for the page will not be added either).
-  $system_main_content_added = &drupal_static('system_main_content_added');
-  $system_main_content_added = TRUE;
-  $page = array(
-    '#type' => 'page',
-    '#theme' => NULL,
-    '#theme_wrappers' => array(),
-  );
-  // Render the region, but do not cache any JavaScript or CSS associated with
-  // it. This region might not be included the next time drupal_render_page()
-  // is called, and we do not want its JavaScript or CSS to erroneously appear
-  // on the final rendered page.
-  $original_js = drupal_add_js();
-  $original_css = drupal_add_css();
-  $original_libraries = drupal_static('drupal_add_library');
-  $js = &drupal_static('drupal_add_js');
-  $css = &drupal_static('drupal_add_css');
-  $libraries = &drupal_static('drupal_add_library');
-  $markup = drupal_render_page($page);
-  $js = $original_js;
-  $css = $original_css;
-  $libraries = $original_libraries;
-  // Indicate that the main page content has not, in fact, been displayed, so
-  // that future calls to drupal_render_page() will be able to render it
-  // correctly.
-  $system_main_content_added = FALSE;
-  // Restore the original behavior of rendering all regions for the next time
-  // drupal_render_page() is called.
-  overlay_set_regions_to_render(array());
-  return $markup;
-}
-
-/**
- * Returns any rendered content that was stored earlier in the page request.
- *
- * @return
- *   An array of all rendered HTML that was stored earlier in the page request,
- *   keyed by the identifier with which it was stored. If no content was
- *   stored, an empty array is returned.
- *
- * @see overlay_store_rendered_content()
- */
-function overlay_get_rendered_content() {
-  return overlay_store_rendered_content();
-}
-
-/**
- * Stores strings representing rendered HTML content.
- *
- * This function is used to keep a static cache of rendered content that can be
- * referred to later in the page request.
- *
- * @param $id
- *   (Optional) An identifier for the content which is being stored, which will
- *   be used as an array key in the returned array. If omitted, no change will
- *   be made to the current stored data.
- * @param $content
- *   (Optional) A string representing the rendered data to store. This only has
- *   an effect if $id is also provided.
- *
- * @return
- *   An array representing all data that is currently being stored, or an empty
- *   array if there is none.
- *
- * @see overlay_get_rendered_content()
- */
-function overlay_store_rendered_content($id = NULL, $content = NULL) {
-  $rendered_content = &drupal_static(__FUNCTION__, array());
-  if (isset($id)) {
-    $rendered_content[$id] = $content;
-  }
-  return $rendered_content;
-}
-
-/**
- * Requests that the parent window refreshes a particular page region.
- *
- * @param $region
- *   The name of the page region to refresh. The parent window will trigger a
- *   refresh of this region on the next page load.
- *
- * @see overlay_trigger_refresh()
- * @see Drupal.overlay.refreshRegions()
- */
-function overlay_request_refresh($region) {
-  $class = drupal_html_class("region-$region");
-  $_SESSION['overlay_regions_to_refresh'][] = array($class => $region);
-}
-
-/**
- * Requests that the entire parent window is reloaded when the overlay closes.
- *
- * @see overlay_trigger_refresh()
- */
-function overlay_request_page_refresh() {
-  $_SESSION['overlay_refresh_parent'] = TRUE;
-}
-
-/**
- * Checks if the parent window needs to be refreshed on this page load.
- *
- * If the previous page load requested that any page regions be refreshed, or
- * if it requested that the entire page be refreshed when the overlay closes,
- * pass that request via JavaScript to the child window, so it can in turn pass
- * the request to the parent window.
- *
- * @see overlay_request_refresh()
- * @see overlay_request_page_refresh()
- * @see Drupal.overlay.refreshRegions()
- */
-function overlay_trigger_refresh() {
-  if (!empty($_SESSION['overlay_regions_to_refresh'])) {
-    $settings = array(
-      'overlayChild' => array(
-        'refreshRegions' => $_SESSION['overlay_regions_to_refresh'],
-      ),
-    );
-    drupal_add_js($settings, array('type' => 'setting'));
-    unset($_SESSION['overlay_regions_to_refresh']);
-  }
-  if (!empty($_SESSION['overlay_refresh_parent'])) {
-    drupal_add_js(array('overlayChild' => array('refreshPage' => TRUE)), array('type' => 'setting'));
-    unset($_SESSION['overlay_refresh_parent']);
-  }
-}
diff --git a/core/modules/overlay/overlay.routing.yml b/core/modules/overlay/overlay.routing.yml
deleted file mode 100644
index cc6ba04f1f59396734b8d3488aafa4c4c5b0c170..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay.routing.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-overlay.message:
-  path: '/overlay/dismiss-message'
-  defaults:
-    _controller: '\Drupal\overlay\Controller\OverlayController::overlayMessage'
-  requirements:
-    _access_overlay_dismiss_message: 'TRUE'
-
-overlay.ajax:
-  path: '/overlay-ajax/{region}'
-  defaults:
-    _controller: '\Drupal\overlay\Controller\OverlayController::regionRender'
-  requirements:
-    _permission: 'access overlay'
diff --git a/core/modules/overlay/overlay.services.yml b/core/modules/overlay/overlay.services.yml
deleted file mode 100644
index aed4378f0d7ef66102d552318d0bfc64866b3806..0000000000000000000000000000000000000000
--- a/core/modules/overlay/overlay.services.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-services:
-  overlay.subscriber:
-    class: Drupal\overlay\EventSubscriber\OverlaySubscriber
-    tags:
-      - { name: event_subscriber }
-    arguments: ['@content_negotiation', '@user.data', '@url_generator']
-
-  access_check.overlay.dismiss_message:
-    class: Drupal\overlay\Access\DismissMessageAccessCheck
-    tags:
-      - { name: access_check }
diff --git a/core/modules/overlay/templates/overlay-disable-message.html.twig b/core/modules/overlay/templates/overlay-disable-message.html.twig
deleted file mode 100644
index d5891a387b6352a4b5571f02a43b450f796ee507..0000000000000000000000000000000000000000
--- a/core/modules/overlay/templates/overlay-disable-message.html.twig
+++ /dev/null
@@ -1,18 +0,0 @@
-{#
-/**
- * @file
- * Default theme implementation for the message about disabling the overlay.
- *
- * Available variables:
- * - profile_link: The link to this user's account.
- * - dismiss_link: The link to dismiss the overlay.
- *
- * @see template_preprocess_overlay_disable_message()
- *
- * @ingroup themeable
- */
-#}
-<div id="overlay-disable-message" class="clearfix">
-  <h3 class="visually-hidden">{{ 'Options for the administrative overlay'|t }}</h3>
-  {{ profile_link }} {{ dismiss_link }}
-</div>
diff --git a/core/modules/overlay/templates/overlay.html.twig b/core/modules/overlay/templates/overlay.html.twig
deleted file mode 100644
index 57605cd55675f25cb47da0d4d84f097e1d7bec55..0000000000000000000000000000000000000000
--- a/core/modules/overlay/templates/overlay.html.twig
+++ /dev/null
@@ -1,37 +0,0 @@
-{#
-/**
- * @file
- * Default theme implementation to display a page in the overlay.
- *
- * Available variables:
- * - attributes: HTML attributes for the containing element.
- * - content_attributes: HTML attributes for the content.
- * - title_attributes: HTML attributes for the title.
- * - title: The (sanitized) title of the page.
- * - page: The rendered page content.
- * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
- *   view and edit tabs when displaying a node).
- * - disable_overlay: The message about how to disable the overlay.
- *
- * @see template_preprocess_overlay()
- *
- * @ingroup themeable
- */
-#}
-{{ disable_overlay }}
-<div{{ attributes }}>
-  <div id="overlay-titlebar" class="clearfix">
-    <div id="overlay-title-wrapper" class="clearfix">
-      <h1{{ title_attributes }}>{{ title }}</h1>
-    </div>
-    <div id="overlay-close-wrapper">
-      <button id="overlay-close" class="overlay-close" type="button" aria-controls="overlay-content"><span class="visually-hidden">{{ 'Close overlay'|t }}</span></button>
-    </div>
-    {% if tabs %}
-      <h2 class="visually-hidden">{{ 'Primary tabs'|t }}</h2><ul id="overlay-tabs">{{ tabs }}</ul>
-    {% endif %}
-  </div>
-  <div{{ content_attributes }}>
-    {{ page }}
-  </div>
-</div>
diff --git a/core/modules/overlay/tests/Drupal/overlay/Tests/Controller/OverlayControllerTest.php b/core/modules/overlay/tests/Drupal/overlay/Tests/Controller/OverlayControllerTest.php
deleted file mode 100644
index 03e01a738806a1188527b795658e218303b56308..0000000000000000000000000000000000000000
--- a/core/modules/overlay/tests/Drupal/overlay/Tests/Controller/OverlayControllerTest.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\overlay\Tests\Controller\OverlayControllerTest.
- */
-
-namespace Drupal\overlay\Tests\Controller {
-
-use Drupal\overlay\Controller\OverlayController;
-use Drupal\Tests\UnitTestCase;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\HttpFoundation\RedirectResponse;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Tests the overlay controller.
- *
- * @see \Drupal\overlay\Controller\OverlayController
- */
-class OverlayControllerTest extends UnitTestCase {
-
-  /**
-   * The mocked user data.
-   *
-   * @var \Drupal\user\UserDataInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $userData;
-
-  /**
-   * The mocked csrf token generator.
-   *
-   * @var \Drupal\Core\Access\CsrfTokenGenerator|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $csrfGenerator;
-
-  /**
-   * The mocked current user.
-   *
-   * @var \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $account;
-
-  /**
-   * The mocked URL generator.
-   *
-   * @var \Drupal\Core\Routing\UrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $urlGenerator;
-
-  /**
-   * The tested overlay controller.
-   *
-   * @var \Drupal\overlay\Controller\OverlayController
-   */
-  protected $overlayController;
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Overlay controller tests',
-      'description' => 'Tests the overlay controller.',
-      'group' => 'Overlay',
-    );
-  }
-
-  protected function setUp() {
-    $this->userData = $this->getMock('Drupal\user\UserDataInterface');
-    $this->csrfGenerator = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator')
-      ->disableOriginalConstructor()
-      ->getMock();
-    $this->account = $this->getMock('Drupal\Core\Session\AccountInterface');
-    $this->urlGenerator = $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface');
-
-    $this->overlayController = new OverlayController($this->userData, $this->csrfGenerator, $this->account);
-
-    $translation = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface');
-    $container = new ContainerBuilder();
-    $container->set('url_generator', $this->urlGenerator);
-    $container->set('string_translation', $translation);
-    \Drupal::setContainer($container);
-  }
-
-  /**
-   * Tests the overlayMessage method.
-   *
-   * @see \Drupal\overlay\Controller\OverlayController::overlayMessage()
-   */
-  public function testOverlayMessage() {
-    $this->account->expects($this->any())
-      ->method('id')
-      ->will($this->returnValue(31));
-    $this->userData->expects($this->once())
-      ->method('set')
-      ->with('overlay', 31, 'message_dismissed', 1);
-    $this->urlGenerator->expects($this->once())
-      ->method('generate')
-      ->with('user_edit', array('user' => 31))
-      ->will($this->returnValue('http://drupal/user/31/edit'));
-
-    $token = $this->randomName();
-    $this->csrfGenerator->expects($this->once())
-      ->method('validate')
-      ->with($token, 'overlay')
-      ->will($this->returnValue(TRUE));
-
-    $request = new Request();
-    $request->attributes->set('token', $token);
-    $result = $this->overlayController->overlayMessage($request);
-
-    $this->assertTrue($result instanceof RedirectResponse);
-    $this->assertEquals('http://drupal/user/31/edit', $result->getTargetUrl());
-  }
-
-  /**
-   * Tests the overlayMessage method with non existing token.
-   *
-   * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
-   */
-  public function testOverlayMessageWithoutToken() {
-    $request = new Request();
-    $this->overlayController->overlayMessage($request);
-  }
-
-  /**
-   * Tests the overlayMessage method with invalid token.
-   *
-   * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
-   */
-  public function testOverlayMessageWithInvalidToken() {
-    $this->csrfGenerator->expects($this->once())
-      ->method('validate')
-      ->with('invalid_token', 'overlay')
-      ->will($this->returnValue(FALSE));
-    $request = new Request();
-    $request->attributes->set('token', 'invalid_token');
-    $this->overlayController->overlayMessage($request);
-  }
-
-}
-
-}
-
-namespace {
-  // @todo Convert once drupal_set_message is an object
-  if (!function_exists('drupal_set_message')) {
-    function drupal_set_message($message) {
-    }
-  }
-}
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 2bff21fd560443e862d2df476dfc97e14dfd86ea..ef90ed22eb602e73d1a083151db44ed7b6ea4eb4 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -51,8 +51,7 @@ function hook_hook_info() {
  *
  * Modules may specify whether or not the routing paths they define are
  * to be considered administrative. Other modules may use this information to
- * display those pages differently (e.g. in a modal overlay, or in a different
- * theme).
+ * display those pages differently.
  *
  * To change the administrative status of menu items defined in another module's
  * routing paths, modules should implement hook_admin_paths_alter().
@@ -2986,16 +2985,6 @@ function hook_token_info_alter(&$data) {
  * @ingroup batch
  */
 function hook_batch_alter(&$batch) {
-  // If the current page request is inside the overlay, add ?render=overlay to
-  // the success callback URL, so that it appears correctly within the overlay.
-  if (overlay_get_mode() == 'child') {
-    if (isset($batch['url_options']['query'])) {
-      $batch['url_options']['query']['render'] = 'overlay';
-    }
-    else {
-      $batch['url_options']['query'] = array('render' => 'overlay');
-    }
-  }
 }
 
 /**
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 78905dab0d020ebed4635707a2c3e6368478b31a..8ca02734e6688805f31ecb16ec915d6f33d8082b 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -1104,7 +1104,7 @@ function system_library_info() {
 
   // A utility that measures and reports viewport offset dimensions from
   // elements like the toolbar that can potentially displace the positioning of
-  // elements like the overlay.
+  // elements.
   $libraries['drupal.displace'] = array(
     'title' => 'Drupal displace',
     'version' => \Drupal::VERSION,
diff --git a/core/modules/system/tests/upgrade/drupal-7.user_data.database.php b/core/modules/system/tests/upgrade/drupal-7.user_data.database.php
index d55f4bf1b34789e142c3e9549a60687faf5cfc66..a2f7d46cdab58c61522dfb2d2546b3328158f5e3 100644
--- a/core/modules/system/tests/upgrade/drupal-7.user_data.database.php
+++ b/core/modules/system/tests/upgrade/drupal-7.user_data.database.php
@@ -16,8 +16,6 @@
   ->fields(array(
     'data' => serialize(array(
       'contact' => 1,
-      'overlay_message_dismissed' => '1',
-      'overlay' => '1',
       'garbage' => 'data',
     )),
   ))
@@ -28,7 +26,6 @@
   ->fields(array(
     'data' => serialize(array(
       'contact' => '0',
-      'overlay' => 1,
       'more' => array('garbage', 'data'),
     )),
   ))
diff --git a/core/modules/toolbar/js/toolbar.js b/core/modules/toolbar/js/toolbar.js
index d94fde6cc92a01e1a3c7b30d7a9f187e7984bb0c..aba0e2d6c2d33b56132ef97e250e571f407543b2 100644
--- a/core/modules/toolbar/js/toolbar.js
+++ b/core/modules/toolbar/js/toolbar.js
@@ -110,15 +110,6 @@ Drupal.behaviors.toolbar = {
         // Update the model when the viewport offset changes.
         .on('drupalViewportOffsetChange.toolbar', function (event, offsets) {
           model.set('offsets', offsets);
-        })
-        // The overlay will hide viewport overflow, potentially stranding tray
-        // items that are offscreen. The toolbar will adjust tray presentation
-        // to prevent this when viewport overflow is hidden.
-        .on('drupalOverlayOpen.toolbar', function () {
-          model.set('isViewportOverflowConstrained', true);
-        })
-        .on('drupalOverlayClose.toolbar', function () {
-          model.set('isViewportOverflowConstrained', false);
         });
 
       // Broadcast model changes to other modules.
@@ -217,9 +208,9 @@ Drupal.toolbar = {
       // Menu subtrees are loaded through an AJAX request only when the Toolbar
       // is set to a vertical orientation.
       areSubtreesLoaded: false,
-      // If the viewport overflow becomes constrained, such as when the overlay
-      // is open, isFixed must be true so that elements in the trays aren't
-      // lost offscreen and impossible to get to.
+      // If the viewport overflow becomes constrained, isFixed must be true so
+      // that elements in the trays aren't lost off-screen and impossible to
+      // get to.
       isViewportOverflowConstrained: false,
       // The orientation of the active tray.
       orientation: 'vertical',
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index 32027858a033e0d5ad2e33c359040b32bc2844f3..b8b0dcb70ee402139e23b4258ca34d9770f9760b 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -383,22 +383,6 @@ function theme_toolbar_tray_heading_wrapper(&$variables) {
   }
 }
 
-/**
- * Implements hook_system_info_alter().
- *
- * Indicate that the 'page_top' region (in which the toolbar will be displayed)
- * is an overlay supplemental region that should be refreshed whenever its
- * content is updated.
- *
- * This information is provided for any module that might need to use it, not
- * just the core Overlay module.
- */
-function toolbar_system_info_alter(&$info, $file, $type) {
-  if ($type == 'theme') {
-    $info['overlay_supplemental_regions'][] = 'page_top';
-  }
-}
-
 /**
  * Implements hook_toolbar().
  */
diff --git a/core/modules/tour/js/tour.js b/core/modules/tour/js/tour.js
index 86357e7083701690d5966b01a9ea42565e73e330..9a8b64842cd99421d55efdff9578d5d2947d5f65 100644
--- a/core/modules/tour/js/tour.js
+++ b/core/modules/tour/js/tour.js
@@ -7,6 +7,8 @@
 
 "use strict";
 
+var queryString = decodeURI(window.location.search);
+
 /**
  * Attaches the tour's toolbar tab behavior.
  *
@@ -28,33 +30,6 @@ Drupal.behaviors.tour = {
         model: model
       });
 
-      // Update the model based on Overlay events.
-      $(document)
-        // Overlay is opening: cancel tour if active and mark overlay as open.
-        .on('drupalOverlayOpen.tour', function () {
-          model.set({ isActive: false, overlayIsOpen: true });
-        })
-        // Overlay is loading a new URL: clear tour & cancel if active.
-        .on('drupalOverlayBeforeLoad.tour', function () {
-          model.set({ isActive: false, overlayTour: [] });
-        })
-        // Overlay is closing: clear tour & cancel if active, mark overlay closed.
-        .on('drupalOverlayClose.tour', function () {
-          model.set({ isActive: false, overlayIsOpen: false, overlayTour: [] });
-        })
-        // Overlay has loaded DOM: check whether a tour is available.
-        .on('drupalOverlayReady.tour', function () {
-          // We must select the tour in the Overlay's window using the Overlay's
-          // jQuery, because the joyride plugin only works for the window in which
-          // it was loaded.
-          // @todo Make upstream contribution so this can be simplified, which
-          // should also allow us to *not* load jquery.joyride.js in the Overlay,
-          // resulting in better front-end performance.
-          var overlay = Drupal.overlay.iframeWindow;
-          var $overlayContext = overlay.jQuery(overlay.document);
-          model.set('overlayTour', $overlayContext.find('ol#tour'));
-        });
-
       model
         // Allow other scripts to respond to tour events.
         .on('change:isActive', function (model, isActive) {
@@ -64,8 +39,7 @@ Drupal.behaviors.tour = {
         .set('tour', $(context).find('ol#tour'));
 
       // Start the tour imediately if toggled via query string.
-      var query = $.deparam.querystring();
-      if (query.tour) {
+      if (/tour=?/i.test(queryString)) {
         model.set('isActive', true);
       }
 
@@ -82,10 +56,6 @@ Drupal.tour.models.StateModel = Backbone.Model.extend({
   defaults: {
     // Indicates whether the Drupal root window has a tour.
     tour: [],
-    // Indicates whether the Overlay is open.
-    overlayIsOpen: false,
-    // Indicates whether the Overlay window has a tour.
-    overlayTour: [],
     // Indicates whether the tour is currently running.
     isActive: false,
     // Indicates which tour is the active one (necessary to cleanly stop).
@@ -104,7 +74,7 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
    * Implements Backbone Views' initialize().
    */
   initialize: function () {
-    this.model.on('change:tour change:overlayTour change:overlayIsOpen change:isActive', this.render, this);
+    this.model.on('change:tour change:isActive', this.render, this);
     this.model.on('change:isActive', this.toggleTour, this);
   },
 
@@ -159,8 +129,7 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
    *   A jQuery element pointing to a <ol> containing tour items.
    */
   _getTour: function () {
-    var whichTour = (this.model.get('overlayIsOpen')) ? 'overlayTour' : 'tour';
-    return this.model.get(whichTour);
+    return this.model.get('tour');
   },
 
   /**
@@ -168,12 +137,10 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
    *
    * @return jQuery
    *   A jQuery element pointing to the document within which a tour would be
-   *   started given the current state. I.e. when the Overlay is open, this will
-   *   point to the HTML document inside the Overlay's iframe, otherwise it will
-   *   point to the Drupal root window.
+   *   started given the current state.
    */
   _getDocument: function () {
-    return (this.model.get('overlayIsOpen')) ? $(Drupal.overlay.iframeWindow.document) : $(document);
+    return $(document);
   },
 
   /**
@@ -196,7 +163,7 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
    */
   _removeIrrelevantTourItems: function ($tour, $document) {
     var removals = false;
-    var query = $.deparam.querystring();
+    var tips = /tips=([^&]+)/.exec(queryString);
     $tour
       .find('li')
       .each(function () {
@@ -205,7 +172,7 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
         var itemClass = $this.attr('data-class');
         // If the query parameter 'tips' is set, remove all tips that don't
         // have the matching class.
-        if (query.tips && !$(this).hasClass(query.tips)) {
+        if (tips && !$(this).hasClass(tips[1])) {
           removals = true;
           $this.remove();
           return;
diff --git a/core/modules/tour/tour.module b/core/modules/tour/tour.module
index df7eaa9023f6fb904bfe99cd512fbd086ad4eb3c..7aafeb3ed3e6766ed5d5d7cee28b7312c8b0a021 100644
--- a/core/modules/tour/tour.module
+++ b/core/modules/tour/tour.module
@@ -28,15 +28,12 @@ function tour_library_info() {
     'title' => 'Tour',
     'version' => \Drupal::VERSION,
     'js' => array(
-      // Add the JavaScript, with a group and weight such that it will run
-      // before modules/overlay/overlay-parent.js.
-      $path . '/js/tour.js' => array('group' => JS_LIBRARY, 'weight' => -1),
+      $path . '/js/tour.js' => array('group' => JS_LIBRARY),
     ),
     'dependencies' => array(
       array('system', 'jquery'),
       array('system', 'drupal'),
       array('system', 'backbone'),
-      array('system', 'jquery.bbq'),
       array('tour', 'jquery.joyride'),
       array('tour', 'tour-styling'),
     ),
@@ -47,7 +44,7 @@ function tour_library_info() {
     'version' => \Drupal::VERSION,
     'css' => array(
       $path . '/css/tour.module.css' => array('media' => 'screen'),
-    )
+    ),
   );
 
   $libraries['jquery.joyride'] = array(
diff --git a/core/modules/views_ui/js/ajax.js b/core/modules/views_ui/js/ajax.js
index 0b416c95d7ada6627a26aa5f4a13ddba115804c8..84d65c8d5ce266a71a22dafe475dde5eefee9d1e 100644
--- a/core/modules/views_ui/js/ajax.js
+++ b/core/modules/views_ui/js/ajax.js
@@ -23,8 +23,7 @@
   };
 
   Drupal.AjaxCommands.prototype.viewsReplaceTitle = function (ajax, response, status) {
-    // In case we're in the overlay, get a reference to the underlying window.
-    var doc = parent.document;
+    var doc = document;
     // For the <title> element, make a best-effort attempt to replace the page
     // title and leave the site name alone. If the theme doesn't use the site
     // name in the <title> element, this will fail.
@@ -36,7 +35,6 @@
     doc.title = oldTitle.replace(re, response.title + ' $1 ' + response.siteName);
 
     $('h1.page-title').text(response.title);
-    $('h1#overlay-title').text(response.title);
   };
 
   /**
diff --git a/core/profiles/standard/standard.info.yml b/core/profiles/standard/standard.info.yml
index 4502ecd8713ea808578a1ca2ffe4e027694ae77a..ba41dd54aca223b9de4fc02edf39ae8b0328dce5 100644
--- a/core/profiles/standard/standard.info.yml
+++ b/core/profiles/standard/standard.info.yml
@@ -30,7 +30,6 @@ dependencies:
   - search
   - shortcut
   - toolbar
-  - overlay
   - field_ui
   - file
   - rdf
diff --git a/core/themes/bartik/css/colors.css b/core/themes/bartik/css/colors.css
index 96f38778c60300e6e1b033d1792462a089c0c205..1ad555a1c1815f43fdff95f81ea84c8f0a8f9045 100644
--- a/core/themes/bartik/css/colors.css
+++ b/core/themes/bartik/css/colors.css
@@ -1,7 +1,6 @@
 /* ---------- Color Module Styles ----------- */
 
-body,
-body.overlay {
+body {
   color: #3b3b3b;
 }
 .comment .comment-arrow {
diff --git a/core/themes/bartik/css/style.css b/core/themes/bartik/css/style.css
index 0768ddffd94a729d60c8e9f4b387804a4a0112a2..2b426ab955e3e5d0f627dc03f232953364b5ed0b 100644
--- a/core/themes/bartik/css/style.css
+++ b/core/themes/bartik/css/style.css
@@ -1535,10 +1535,6 @@ input.form-submit:focus {
 div.password-suggestions {
   border: 0;
 }
-.ui-widget-overlay {
-  background: #222222;
-  opacity: 0.7;
-}
 #forum .name {
   font-size: 1.083em;
 }
@@ -1679,9 +1675,6 @@ ol.search-results {
 div.add-or-remove-shortcuts {
   padding-top: 0.9em;
 }
-.overlay div.add-or-remove-shortcuts {
-  padding-top: 0.8em;
-}
 
 /* ---------- Admin-specific Theming ---------- */
 
@@ -1710,13 +1703,7 @@ div.add-or-remove-shortcuts {
 .page-admin #admin-dblog img {
   margin: 0 5px;
 }
-/* Fix spacing when Seven is used in the overlay. */
-#system-theme-settings details {
-  padding: 0;
-}
-#system-theme-settings details summary {
-  margin-top: 0;
-}
+
 /* Configuration. */
 div.admin .right,
 div.admin .left {
@@ -1743,33 +1730,6 @@ div.admin-panel .description {
   margin: 0 0 14px 7px;
 }
 
-/* ---------- Overlay layout styles ----------- */
-
-.overlay #main,
-.overlay #content {
-  width: auto;
-  float: none;
-}
-.overlay #page {
-  padding: 0 2em;
-}
-.overlay .region-page-top,
-.overlay #header,
-.overlay #page-title,
-.overlay #featured,
-.overlay #sidebar-first,
-.overlay #triptych-wrapper,
-.overlay #footer-wrapper {
-  display: none;
-}
-.overlay-processed .field-type-image {
-  display: block;
-  float: none;
-}
-.overlay #messages {
-  width: auto;
-}
-
 /* ---------- book ----------- */
 .book-navigation .menu {
   border-top: 1px solid #d6d6d6;
diff --git a/core/themes/seven/jquery.ui.theme.css b/core/themes/seven/jquery.ui.theme.css
index 5099b9a98b69a348a8cde6abcd4281305b7847e3..89aa38bcffb5aef6cff88be243a2013a7069fcb9 100644
--- a/core/themes/seven/jquery.ui.theme.css
+++ b/core/themes/seven/jquery.ui.theme.css
@@ -322,21 +322,6 @@
   font-weight: normal;
 }
 
-/**
- * Overlays
- */
-.ui-widget-overlay {
-  background: #000;
-  opacity: .70;
-  filter: Alpha(Opacity=70);
-}
-.overlay {
-  padding-right: 26px;
-}
-.overlay .ui-dialog-titlebar {
-  background: transparent;
-}
-
 /**
  * Slider
  */
diff --git a/core/themes/seven/style.css b/core/themes/seven/style.css
index 5700ea01ebd62939518b585b6b0d7ddd4bdaa32e..11f98460d3dd14adb56c18dd142b6a07f0dfe9d0 100644
--- a/core/themes/seven/style.css
+++ b/core/themes/seven/style.css
@@ -1066,50 +1066,6 @@ body.in-maintenance #logo {
   color: green;
 }
 
-/* Overlay theming */
-.overlay #branding {
-  background-color: #fff;
-  padding-top: 15px;
-  padding-bottom: 15px;
-}
-.overlay #branding h1.page-title,
-.overlay #left,
-.overlay #footer {
-  display: none;
-}
-.overlay #page {
-  margin: 0;
-  padding: 0 20px;
-}
-.overlay #branding .breadcrumb {
-  float: left; /* LTR */
-  position: relative;
-  z-index: 10;
-}
-[dir="rtl"] .overlay #branding .breadcrumb {
-  float: right;
-}
-#overlay-tabs {
-  bottom: -1px;
-  font-size: 1.54em;
-  line-height: 1.54em;
-  margin: 0;
-}
-.overlay ul.secondary {
-  background: transparent none;
-  margin: -1.4em 0 0.3em 0; /* LTR */
-  overflow: visible;
-}
-[dir="rtl"] .overlay ul.secondary {
-  margin: -1.4em 0 0.3em 0;
-}
-.overlay #content {
-  padding: 0;
-}
-h1#overlay-title {
-  font-weight: normal;
-}
-
 /* Shortcut theming */
 .add-or-remove-shortcuts a:focus span.text,
 .add-or-remove-shortcuts a:hover span.text {
@@ -1227,28 +1183,6 @@ h1#overlay-title {
   background-color: #73b3dd;
 }
 
-/* Disable overlay message */
-#overlay-disable-message {
-  background-color: #addafc;
-}
-#overlay-disable-message a,
-#overlay-disable-message a:visited {
-  color: #000;
-}
-#overlay-disable-message a:focus,
-#overlay-disable-message a:active {
-  outline: none;
-  text-decoration: underline;
-}
-.overlay-disable-message-focused a {
-  padding: 0.4em 0.6em;
-}
-.overlay-disable-message-focused #overlay-dismiss-message {
-  background-color: #59a0d8;
-  color: #fff;
-  border-radius: 8px;
-}
-
 /**
  * Views styling
  */
@@ -1615,9 +1549,6 @@ details.fieldset-no-legend {
 .entity-meta details .summary {
  display: none; /* Hide JS summaries. @todo Rethink summaries. */
 }
-.overlay .layout-region-node-footer {
-  padding-bottom: .5em;
-}
 
 /**
  * Widescreen
@@ -1690,47 +1621,6 @@ details.fieldset-no-legend {
   .entity-meta-header {
     border-top: 0;
   }
-
-  /* Additional overlay theming */
-
-  /**
-   * These are terrible selectors.
-   * @todo Add a proper class to the overlay for this page.
-   */
-  .overlay[class*="page-node-add-"] #overlay-content,
-  .overlay.page-node-edit #overlay-content {
-    padding: 0;
-  }
-  .overlay[class*="page-node-add-"] #page,
-  .overlay.page-node-edit #page {
-    padding: 0;
-  }
-  .overlay[class*="page-node-add-"] #branding,
-  .overlay.page-node-edit #branding {
-    padding-left: 2em;
-    padding-right: 2em;
-  }
-  .overlay[class*="page-node-add-"] #console,
-  .overlay.page-node-edit #console {
-    margin: 0 2em;
-  }
-  .overlay[class*="page-node-add-"] .messages,
-  .overlay.page-node-edit .messages {
-    margin-bottom: 1em;
-  }
-  .overlay .layout-node-form {
-    border-top: 1px solid #bfbfbf;
-  }
-  .overlay .layout-node-form:before {
-    display: none;
-  }
-  .overlay .layout-region-node-main,
-  .overlay .layout-region-node-footer {
-    padding-left: 2em;
-  }
-  .overlay .layout-region-node-footer {
-    padding-bottom: 1.5em;
-  }
 }
 @media
   screen and (max-width: 1020px),