Index: src/wp-includes/class.wp-dependencies.php
===================================================================
--- src/wp-includes/class.wp-dependencies.php	(revision 37403)
+++ src/wp-includes/class.wp-dependencies.php	(working copy)
@@ -35,6 +35,14 @@
 	public $queue = array();
 
 	/**
+	 * An array of reserved offsets.
+	 *
+	 * @access public
+	 * @var array
+	 */
+	public $offsets = array();
+
+	/**
 	 * An array of _WP_Dependency handle objects to queue.
 	 *
 	 * @access public
@@ -291,12 +299,36 @@
 	 * @since 2.6.0 Moved from `WP_Scripts`.
 	 *
 	 * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings).
+	 * @param integer $offset offset within queue (increments to next available offset if already reserved).
 	 */
-	public function enqueue( $handles ) {
+	public function enqueue( $handles, $offset = null ) {
 		foreach ( (array) $handles as $handle ) {
 			$handle = explode('?', $handle);
 			if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) {
-				$this->queue[] = $handle[0];
+				if ( $offset !== null ) {
+					while ( array_key_exists($offset, $this->offsets) ) {
+						$offset++;
+					}
+					$this->offsets[$offset] = $handle[0];
+					ksort($this->offsets);
+					if ( array_key_exists($offset, $this->queue) ) {
+						array_splice($this->queue, $offset, 0, $handle[0]);
+						// Make sure all reserved offsets positions remain the same even after a splice
+						foreach ( $this->offsets as $queuedOffset => $queuedHandle ) {
+							if ( $this->queue[$queuedOffset] != $queuedHandle ) {
+								$queuedKey = array_search($queuedHandle, $this->queue);
+								unset($this->queue[$queuedKey]);
+								ksort($this->queue);
+								array_splice($this->queue, $queuedOffset, 0, $queuedHandle);
+							}
+						}
+					} else {
+						$this->queue[$offset] = $handle[0];
+						ksort($this->queue);
+					}
+				} else {
+					$this->queue[] = $handle[0];
+				}
 				if ( isset($handle[1]) )
 					$this->args[$handle[0]] = $handle[1];
 			}
@@ -320,6 +352,9 @@
 			$handle = explode('?', $handle);
 			$key = array_search($handle[0], $this->queue);
 			if ( false !== $key ) {
+				if ( in_array($key, $this->offsets) ) {
+					unset($this->offsets[$key]);
+				}
 				unset($this->queue[$key]);
 				unset($this->args[$handle[0]]);
 			}
Index: src/wp-includes/functions.wp-scripts.php
===================================================================
--- src/wp-includes/functions.wp-scripts.php	(revision 37403)
+++ src/wp-includes/functions.wp-scripts.php	(working copy)
@@ -254,8 +254,9 @@
  *                                    If set to null, no version is added.
  * @param bool             $in_footer Optional. Whether to enqueue the script before </body> instead of in the <head>.
  *                                    Default 'false'.
+ * @param integer          $offset    Optional. Offset within queue (increments to next available offset if already reserved).
  */
-function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) {
+function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false, $offset = null ) {
 	$wp_scripts = wp_scripts();
 
 	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );
@@ -273,7 +274,7 @@
 		}
 	}
 
-	$wp_scripts->enqueue( $handle );
+	$wp_scripts->enqueue( $handle, $offset );
 }
 
 /**
Index: src/wp-includes/functions.wp-styles.php
===================================================================
--- src/wp-includes/functions.wp-styles.php	(revision 37403)
+++ src/wp-includes/functions.wp-styles.php	(working copy)
@@ -159,8 +159,9 @@
  * @param string           $media  Optional. The media for which this stylesheet has been defined.
  *                                 Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like
  *                                 '(orientation: portrait)' and '(max-width: 640px)'.
+ * @param integer          $offset Offset within queue (increments to next available offset if already reserved).
  */
-function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all' ) {
+function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all', $offset = null ) {
 	_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );
 
 	$wp_styles = wp_styles();
@@ -169,7 +170,7 @@
 		$_handle = explode('?', $handle);
 		$wp_styles->add( $_handle[0], $src, $deps, $ver, $media );
 	}
-	$wp_styles->enqueue( $handle );
+	$wp_styles->enqueue( $handle, $offset );
 }
 
 /**
Index: tests/phpunit/tests/dependencies/scripts.php
===================================================================
--- tests/phpunit/tests/dependencies/scripts.php	(revision 37403)
+++ tests/phpunit/tests/dependencies/scripts.php	(working copy)
@@ -29,12 +29,15 @@
 		wp_enqueue_script('empty-deps-no-version', 'example.com' );
 		wp_enqueue_script('empty-deps-version', 'example.com', array(), 1.2);
 		wp_enqueue_script('empty-deps-null-version', 'example.com', array(), null);
+		wp_enqueue_script('empty-deps-null-version-with-offset', 'example2.com', array(), null, false, 1);
+		wp_enqueue_script('empty-deps-null-version-with-offset-and-new-key', 'example3.com', array(), null, false, 5);
 		$ver = get_bloginfo( 'version' );
 		$expected  = "<script type='text/javascript' src='http://example.com?ver=$ver'></script>\n";
+		$expected .= "<script type='text/javascript' src='http://example2.com'></script>\n";
 		$expected .= "<script type='text/javascript' src='http://example.com?ver=$ver'></script>\n";
 		$expected .= "<script type='text/javascript' src='http://example.com?ver=1.2'></script>\n";
 		$expected .= "<script type='text/javascript' src='http://example.com'></script>\n";
-
+		$expected .= "<script type='text/javascript' src='http://example3.com'></script>\n";
 		$this->assertEquals($expected, get_echo('wp_print_scripts'));
 
 		// No scripts left to print
@@ -724,4 +727,35 @@
 
 		$this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
 	}
+	
+	/**
+	 * Test enqueue offsets
+	 * @ticket 36791
+	 */
+	function test_wp_enqueue_script_with_offset_and_dependencies_in_head_and_footer() {
+		wp_enqueue_script( 'child-head', '/child-head.js', array(), null, false ); // in head
+		wp_enqueue_script( 'child-footer', '/child-footer.js', array(), null, true ); // in footer
+		wp_enqueue_script( 'child-head2', '/child-head2.js', array(), null, false, 1); // second in head
+		wp_enqueue_script( 'child-head1', '/child-head1.js', array(), null, false, 0); // first in head
+		wp_enqueue_script( 'parent', '/parent.js', array( 'child-head', 'child-footer' ), null, true); // in footer
+		wp_enqueue_script( 'parent1', '/parent1.js', array(), null, true, 1 ); // first in footer
+		wp_enqueue_script( 'parent2', '/parent2.js', array(), null, true); // in footer
+		wp_enqueue_script( 'parent3', '/parent3.js', array(), null, true, 0); // second in footer
+
+		$header = get_echo( 'wp_print_head_scripts' );
+		$footer = get_echo( 'wp_print_footer_scripts' );
+
+		$expected_header  = "<script type='text/javascript' src='/child-head1.js'></script>\n";
+		$expected_header .= "<script type='text/javascript' src='/child-head2.js'></script>\n";
+		$expected_header .= "<script type='text/javascript' src='/child-head.js'></script>\n";
+		$expected_footer  = "<script type='text/javascript' src='/parent1.js'></script>\n";
+		$expected_footer .= "<script type='text/javascript' src='/parent3.js'></script>\n";
+		$expected_footer .= "<script type='text/javascript' src='/child-footer.js'></script>\n";
+		$expected_footer .= "<script type='text/javascript' src='/parent.js'></script>\n";
+		$expected_footer .= "<script type='text/javascript' src='/parent2.js'></script>\n";
+
+		$this->assertEquals( $expected_header, $header );
+		$this->assertEquals( $expected_footer, $footer );
+	}
+	
 }
Index: tests/phpunit/tests/dependencies/styles.php
===================================================================
--- tests/phpunit/tests/dependencies/styles.php	(revision 37403)
+++ tests/phpunit/tests/dependencies/styles.php	(working copy)
@@ -33,8 +33,11 @@
 		wp_enqueue_style('no-deps-version', 'example.com', array(), 1.2);
 		wp_enqueue_style('no-deps-null-version', 'example.com', array(), null);
 		wp_enqueue_style('no-deps-null-version-print-media', 'example.com', array(), null, 'print');
+		wp_enqueue_style('no-deps-null-version-print-media-with-offset', 'example2.com', array(), null, 'print', 1);
+		
 		$ver = get_bloginfo( 'version' );
 		$expected  = "<link rel='stylesheet' id='no-deps-no-version-css'  href='http://example.com?ver=$ver' type='text/css' media='all' />\n";
+		$expected .= "<link rel='stylesheet' id='no-deps-null-version-print-media-with-offset-css'  href='http://example2.com' type='text/css' media='print' />\n";
 		$expected .= "<link rel='stylesheet' id='no-deps-version-css'  href='http://example.com?ver=1.2' type='text/css' media='all' />\n";
 		$expected .= "<link rel='stylesheet' id='no-deps-null-version-css'  href='http://example.com' type='text/css' media='all' />\n";
 		$expected .= "<link rel='stylesheet' id='no-deps-null-version-print-media-css'  href='http://example.com' type='text/css' media='print' />\n";
