Index: wp-includes/theme.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wp-includes/theme.php	(revision 771cfe22baad409e71932570f7f47342174fa6e2)
+++ wp-includes/theme.php	(revision )
@@ -1380,10 +1380,15 @@
 			$repeat = 'repeat';
 		$repeat = " background-repeat: $repeat;";
 
-		$position = get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
-		if ( ! in_array( $position, array( 'center', 'right', 'left' ) ) )
-			$position = 'left';
-		$position = " background-position: top $position;";
+		$position_x = get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
+		if ( ! in_array( $position_x, array( 'center', 'right', 'left' ) ) )
+			$position_x = 'left';
+
+		$position_y = get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) );
+		if ( ! in_array( $position_y, array( 'center', 'top', 'bottom' ) ) )
+			$position_y = 'top';
+
+		$position = " background-position: $position_y $position_x;";
 
 		$attachment = get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) );
 		if ( ! in_array( $attachment, array( 'fixed', 'scroll' ) ) )
Index: wp-admin/custom-background.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wp-admin/custom-background.php	(revision 771cfe22baad409e71932570f7f47342174fa6e2)
+++ wp-admin/custom-background.php	(revision )
@@ -151,6 +151,15 @@
 			set_theme_mod('background_position_x', $position);
 		}
 
+		if ( isset($_POST['background-position-y']) ) {
+			check_admin_referer('custom-background');
+			if ( in_array($_POST['background-position-y'], array('center', 'top', 'bottom')) )
+				$position = $_POST['background-position-y'];
+			else
+				$position = 'top';
+			set_theme_mod('background_position_y', $position);
+		}
+
 		if ( isset($_POST['background-attachment']) ) {
 			check_admin_referer('custom-background');
 			if ( in_array($_POST['background-attachment'], array('fixed', 'scroll')) )
@@ -223,7 +232,7 @@
 			// Background-image URL must be single quote, see below.
 			$background_styles .= ' background-image: url(\'' . $background_image_thumb . '\');'
 				. ' background-repeat: ' . get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) . ';'
-				. ' background-position: top ' . get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
+				. ' background-position: '. get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) .' ' . get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );
 		}
 	?>
 	<div id="custom-background-image" style="<?php echo $background_styles; ?>"><?php // must be double quote, see above ?>
@@ -293,7 +302,7 @@
 <tbody>
 <?php if ( get_background_image() ) : ?>
 <tr>
-<th scope="row"><?php _e( 'Position' ); ?></th>
+<th scope="row"><?php _e( 'Position X' ); ?></th>
 <td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Position' ); ?></span></legend>
 <label>
 <input name="background-position-x" type="radio" value="left"<?php checked( 'left', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />
@@ -306,9 +315,27 @@
 <label>
 <input name="background-position-x" type="radio" value="right"<?php checked( 'right', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />
 <?php _e('Right') ?>
+</label>
+</fieldset></td>
+</tr>
+
+	<tr>
+		<th scope="row"><?php _e( 'Position Y' ); ?></th>
+		<td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Position' ); ?></span></legend>
+				<label>
+					<input name="background-position-y" type="radio" value="left"<?php checked( 'top', get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) ) ); ?> />
+					<?php _e('Top') ?>
+				</label>
+				<label>
+					<input name="background-position-y" type="radio" value="center"<?php checked( 'center', get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) ) ); ?> />
+					<?php _e('Center') ?>
+				</label>
+				<label>
+					<input name="background-position-y" type="radio" value="right"<?php checked( 'bottom', get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) ) ); ?> />
+					<?php _e('Bottom') ?>
-</label>
-</fieldset></td>
-</tr>
+				</label>
+			</fieldset></td>
+	</tr>
 
 <tr>
 <th scope="row"><?php _e( 'Repeat' ); ?></th>
Index: wp-includes/class-wp-customize-manager.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wp-includes/class-wp-customize-manager.php	(revision 771cfe22baad409e71932570f7f47342174fa6e2)
+++ wp-includes/class-wp-customize-manager.php	(revision )
@@ -2059,7 +2059,7 @@
 		) );
 
 		$this->add_control( 'background_position_x', array(
-			'label'      => __( 'Background Position' ),
+			'label'      => __( 'Background Position X' ),
 			'section'    => 'background_image',
 			'type'       => 'radio',
 			'choices'    => array(
@@ -2069,6 +2069,22 @@
 			),
 		) );
 
+		$this->add_setting( 'background_position_y', array(
+				'default'        => get_theme_support( 'custom-background', 'default-position-y' ),
+				'theme_supports' => 'custom-background',
+		) );
+
+		$this->add_control( 'background_position_y', array(
+				'label'   => __( 'Background Position Y' ),
+				'section' => 'background_image',
+				'type'    => 'radio',
+				'choices' => array(
+						'top'    => __( 'Top' ),
+						'center' => __( 'Center' ),
+						'bottom' => __( 'Bottom' ),
+				),
+		) );
+
 		$this->add_setting( 'background_attachment', array(
 			'default'        => get_theme_support( 'custom-background', 'default-attachment' ),
 			'theme_supports' => 'custom-background',
@@ -2087,7 +2103,7 @@
 		// If the theme is using the default background callback, we can update
 		// the background CSS using postMessage.
 		if ( get_theme_support( 'custom-background', 'wp-head-callback' ) === '_custom_background_cb' ) {
-			foreach ( array( 'color', 'image', 'position_x', 'repeat', 'attachment' ) as $prop ) {
+			foreach ( array( 'color', 'image', 'position_x', 'position_y', 'repeat', 'attachment' ) as $prop ) {
 				$this->get_setting( 'background_' . $prop )->transport = 'postMessage';
 			}
 		}
