Index: src/wp-includes/class.wp-scripts.php
===================================================================
--- src/wp-includes/class.wp-scripts.php	(revision 37169)
+++ src/wp-includes/class.wp-scripts.php	(working copy)
@@ -93,15 +93,6 @@
 	public $print_html = '';
 
 	/**
-	 * HTML to print before the script handle.
-	 *
-	 * @since 4.5.0
-	 * @access public
-	 * @var string
-	 */
-	public $print_html_before = '';
-
-	/**
 	 * Holds inline code if concatenation is enabled.
 	 *
 	 * @since 2.8.0
@@ -144,6 +135,12 @@
 	public $default_dirs;
 
 	/**
+	 * @since 4.5.0
+	 * @ignore
+	 */
+	private $disable_concat = false;
+
+	/**
 	 * Constructor.
 	 *
 	 * @since 2.6.0
@@ -293,7 +290,7 @@
 			$after_handle = sprintf( "<script type='text/javascript'>\n%s\n</script>\n", $after_handle );
 		}
 
-		if ( $this->do_concat ) {
+		if ( $this->do_concat && ! $this->disable_concat ) {
 			/**
 			 * Filter the script loader source.
 			 *
@@ -304,11 +301,13 @@
 			 */
 			$srce = apply_filters( 'script_loader_src', $src, $handle );
 
-			if ( $before_handle && ! $conditional ) {
-				$this->print_html_before .= $before_handle;
-			}
+			if ( $this->in_default_dir( $srce ) && ( $before_handle || $after_handle ) ) {
+				$this->disable_concat = true;
 
-			if ( $this->in_default_dir( $srce ) && ! $conditional && ! $after_handle ) {
+				// Have to print the so-far concatenated scripts right away to maintain the right order.
+				_print_scripts();
+				$this->reset();
+			} elseif ( $this->in_default_dir( $srce ) && ! $conditional ) {
 				$this->print_code .= $this->print_extra_script( $handle, false );
 				$this->concat .= "$handle,";
 				$this->concat_version .= "$handle$ver";
@@ -362,12 +361,8 @@
 		 */
 		$tag = apply_filters( 'script_loader_tag', $tag, $handle, $src );
 
-		if ( $this->do_concat ) {
-			if ( $after_handle ) {
-				$this->print_html_before .= $tag;
-			} else {
-				$this->print_html .= $tag;
-			}
+		if ( $this->do_concat && ! $this->disable_concat ) {
+			$this->print_html .= $tag;
 		} else {
 			echo $tag;
 		}
@@ -592,7 +587,6 @@
 		$this->concat = '';
 		$this->concat_version = '';
 		$this->print_html = '';
-		$this->print_html_before = '';
 		$this->ext_version = '';
 		$this->ext_handles = '';
 	}
Index: src/wp-includes/script-loader.php
===================================================================
--- src/wp-includes/script-loader.php	(revision 37169)
+++ src/wp-includes/script-loader.php	(working copy)
@@ -998,10 +998,6 @@
 			echo "</script>\n";
 		}
 
-		if ( ! empty( $wp_scripts->print_html_before ) ) {
-			echo $wp_scripts->print_html_before;
-		}
-
 		$concat = str_split( $concat, 128 );
 		$concat = 'load%5B%5D=' . implode( '&load%5B%5D=', $concat );
 
Index: tests/phpunit/tests/dependencies/scripts.php
===================================================================
--- tests/phpunit/tests/dependencies/scripts.php	(revision 37169)
+++ tests/phpunit/tests/dependencies/scripts.php	(working copy)
@@ -453,9 +453,11 @@
 		$print_scripts = get_echo( '_print_scripts' );
 
 		$ver = get_bloginfo( 'version' );
-		$expected  = "<script type='text/javascript'>\nconsole.log(\"before one\");\n</script>\n";
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=three&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"before one\");\n</script>\n";
+		$expected .= "<script type='text/javascript' src='/directory/one.js?ver={$ver}'></script>\n";
 		$expected .= "<script type='text/javascript'>\nconsole.log(\"before two\");\n</script>\n";
-		$expected .= "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=one,two,three&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript' src='/directory/two.js?ver={$ver}'></script>\n";
 
 		$this->assertEquals( $expected, $print_scripts );
 	}
@@ -463,6 +465,32 @@
 	/**
 	 * @ticket 14853
 	 */
+	public function test_wp_add_inline_script_before_with_concat2() {
+		global $wp_scripts;
+
+		$wp_scripts->do_concat = true;
+		$wp_scripts->default_dirs = array( '/directory/' );
+
+		wp_enqueue_script( 'one', '/directory/one.js' );
+		wp_enqueue_script( 'two', '/directory/two.js' );
+		wp_enqueue_script( 'three', '/directory/three.js' );
+
+		wp_add_inline_script( 'one', 'console.log("before one");', 'before' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$ver = get_bloginfo( 'version' );
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=two,three&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"before one\");\n</script>\n";
+		$expected .= "<script type='text/javascript' src='/directory/one.js?ver={$ver}'></script>\n";
+
+		$this->assertEquals( $expected, $print_scripts );
+	}
+
+	/**
+	 * @ticket 14853
+	 */
 	public function test_wp_add_inline_script_after_with_concat() {
 		global $wp_scripts;
 
@@ -481,11 +509,11 @@
 		$print_scripts = get_echo( '_print_scripts' );
 
 		$ver = get_bloginfo( 'version' );
-		$expected  = "<script type='text/javascript' src='/directory/two.js?ver={$ver}'></script>\n";
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=one,four&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript' src='/directory/two.js?ver={$ver}'></script>\n";
 		$expected .= "<script type='text/javascript'>\nconsole.log(\"after two\");\n</script>\n";
 		$expected .= "<script type='text/javascript' src='/directory/three.js?ver={$ver}'></script>\n";
 		$expected .= "<script type='text/javascript'>\nconsole.log(\"after three\");\n</script>\n";
-		$expected .= "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=one,four&amp;ver={$ver}'></script>\n";
 
 		$this->assertEquals( $expected, $print_scripts );
 	}
@@ -516,8 +544,178 @@
 		wp_script_add_data( 'test-example', 'conditional', 'gte IE 9' );
 
 		$this->assertEquals( $expected_localized, get_echo( 'wp_print_scripts' ) );
-		$this->assertEquals( $expected, $wp_scripts->print_html_before );
-		$this->assertEquals( '', $wp_scripts->print_html );
+		$this->assertEquals( $expected, $wp_scripts->print_html );
 	}
 
+	/**
+	 * @ticket 36392
+	 */
+	public function test_wp_add_inline_script_concat_with_core_dependency() {
+		global $wp_scripts;
+
+		wp_default_scripts( $wp_scripts );
+
+		$wp_scripts->base_url = '';
+		$wp_scripts->do_concat = true;
+
+		$ver = get_bloginfo( 'version' );
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=jquery-core,jquery-migrate&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
+
+		wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null );
+		wp_add_inline_script( 'test-example', 'console.log("after");' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$this->assertEquals( $expected, $print_scripts );
+	}
+
+	/**
+	 * @ticket 36392
+	 */
+	public function test_wp_add_inline_script_concat_with_conditional_and_core_dependency() {
+		global $wp_scripts;
+
+		wp_default_scripts( $wp_scripts );
+
+		$wp_scripts->base_url = '';
+		$wp_scripts->do_concat = true;
+
+		$ver = get_bloginfo( 'version' );
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=jquery-core,jquery-migrate&amp;ver={$ver}'></script>\n";
+		$expected .= "<!--[if gte IE 9]>\n";
+		$expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
+		$expected .= "<![endif]-->\n";
+
+		wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null );
+		wp_add_inline_script( 'test-example', 'console.log("after");' );
+		wp_script_add_data( 'test-example', 'conditional', 'gte IE 9' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$this->assertEquals( $expected, $print_scripts );
+	}
+
+	/**
+	 * @ticket 36392
+	 */
+	public function test_wp_add_inline_script_before_concat_with_core_dependency() {
+		global $wp_scripts;
+
+		wp_default_scripts( $wp_scripts );
+
+		$wp_scripts->base_url = '';
+		$wp_scripts->do_concat = true;
+
+		$ver = get_bloginfo( 'version' );
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=jquery-core,jquery-migrate&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
+		$expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
+
+		wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null );
+		wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$this->assertEquals( $expected, $print_scripts );
+	}
+
+	/**
+	 * @ticket 36392
+	 */
+	public function test_wp_add_inline_script_before_after_concat_with_core_dependency() {
+		global $wp_scripts;
+
+		wp_default_scripts( $wp_scripts );
+
+		$wp_scripts->base_url = '';
+		$wp_scripts->do_concat = true;
+
+		$ver = get_bloginfo( 'version' );
+		$expected  = "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=jquery-core,jquery-migrate,wp-a11y&amp;ver={$ver}'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"before\");\n</script>\n";
+		$expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
+		$expected .= "<script type='text/javascript' src='http://example2.com'></script>\n";
+		$expected .= "<script type='text/javascript'>\nconsole.log(\"after\");\n</script>\n";
+
+		wp_enqueue_script( 'test-example', 'http://example.com', array( 'jquery' ), null );
+		wp_add_inline_script( 'test-example', 'console.log("before");', 'before' );
+		wp_enqueue_script( 'test-example2', 'http://example2.com', array( 'wp-a11y' ), null );
+		wp_add_inline_script( 'test-example2', 'console.log("after");', 'after' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$this->assertEquals( $expected, $print_scripts );
+	}
+
+	/**
+	 * @ticket 36392
+	 */
+	public function test_wp_add_inline_script_customize_dependency() {
+		global $wp_scripts;
+
+		wp_default_scripts( $wp_scripts );
+
+		$wp_scripts->base_url = '';
+		$wp_scripts->do_concat = true;
+
+		$expected_tail  = "<![endif]-->\n";
+		$expected_tail .= "<script type='text/javascript' src='/customize-dependency.js'></script>\n";
+		$expected_tail .= "<script type='text/javascript'>\n";
+		$expected_tail .= "tryCustomizeDependency()\n";
+		$expected_tail .= "</script>\n";
+
+		$handle = 'customize-dependency';
+		wp_enqueue_script( $handle, '/customize-dependency.js', array( 'customize-controls' ), null );
+		wp_add_inline_script( $handle, 'tryCustomizeDependency()' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$tail = substr( $print_scripts, strrpos( $print_scripts, "<![endif]-->" ) );
+		$this->assertEquals( $expected_tail, $tail );
+	}
+
+	/**
+	 * Limitation: One can't add inline script to scripts in the $default_dirs (which in standard use are '/wp-admin/js/' and '/wp-includes/js/') if those scripts have dependencies on each other.
+	 *
+	 * @ticket 36392
+	 */
+	public function test_wp_add_inline_script_limitation() {
+		global $wp_scripts;
+
+		$wp_scripts->do_concat = true;
+		$wp_scripts->default_dirs = array('/wp-admin/js/', '/wp-includes/js/'); // Default dirs as in wp-includes/script-loader.php
+
+		wp_enqueue_script( 'one', '/wp-includes/js/script.js' );
+		wp_enqueue_script( 'two', '/wp-includes/js/script2.js', array( 'one' ) );
+		wp_add_inline_script( 'one', 'console.log("after one");', 'after' );
+
+		wp_print_scripts();
+		$print_scripts = get_echo( '_print_scripts' );
+
+		$ver = get_bloginfo( 'version' );
+
+		$expected = '';
+
+		if ( false ) {
+			/* Should be */
+			$expected .= "<script type='text/javascript' src='/wp-includes/js/script.js?ver={$ver}'></script>\n";
+			$expected .= "<script type='text/javascript'>\nconsole.log(\"after one\");\n</script>\n";
+			$expected .= "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=two&amp;ver={$ver}'></script>\n";
+		} else {
+			/* Actual */
+			$expected .= "<script type='text/javascript' src='/wp-admin/load-scripts.php?c=0&amp;load%5B%5D=two&amp;ver={$ver}'></script>\n"; // Wrong.
+			$expected .= "<script type='text/javascript' src='/wp-includes/js/script.js?ver={$ver}'></script>\n";
+			$expected .= "<script type='text/javascript'>\nconsole.log(\"after one\");\n</script>\n";
+		}
+
+		$this->assertEquals( $expected, $print_scripts );
+	}
 }
