Index: wp-includes/class-wp-customize-manager.php
===================================================================
--- wp-includes/class-wp-customize-manager.php	(revision 24017)
+++ wp-includes/class-wp-customize-manager.php	(working copy)
@@ -847,16 +847,32 @@
 		) );
 
 		$this->add_control( 'background_position_x', array(
-			'label'      => __( 'Background Position' ),
-			'section'    => 'background_image',
-			'type'       => 'radio',
-			'choices'    => array(
-				'left'       => __('Left'),
-				'center'     => __('Center'),
-				'right'      => __('Right'),
+			'label'   => __( 'Horizontal Background Position' ),
+			'section' => 'background_image',
+			'type'    => 'radio',
+			'choices' => array(
+				'left'   => __( 'Left' ),
+				'center' => __( 'Center' ),
+				'right'  => __( 'Right' ),
 			),
 		) );
 
+		$this->add_setting( 'background_position_y', array(
+			'default'        => 'top',
+			'theme_supports' => 'custom-background',
+		) );
+
+		$this->add_control( 'background_position_y', array(
+			'label'   => __( 'Vertical Background Position' ),
+			'section' => 'background_image',
+			'type'    => 'radio',
+			'choices' => array(
+				'top'    => __( 'Top' ),
+				'center' => __( 'Center' ),
+				'bottom' => __( 'Bottom' )
+			),
+		) );
+
 		$this->add_setting( 'background_attachment', array(
 			'default'        => 'fixed',
 			'theme_supports' => 'custom-background',
@@ -875,7 +891,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( 'attachment', 'color', 'image', 'position_x', 'position_y', 'repeat' ) as $prop ) {
 				$this->get_setting( 'background_' . $prop )->transport = 'postMessage';
 			}
 		}
Index: wp-includes/js/customize-preview.js
===================================================================
--- wp-includes/js/customize-preview.js	(revision 24017)
+++ wp-includes/js/customize-preview.js	(working copy)
@@ -98,11 +98,11 @@
 		preview.send( 'ready' );
 
 		/* Custom Backgrounds */
-		bg = $.map(['color', 'image', 'position_x', 'repeat', 'attachment'], function( prop ) {
+		bg = $.map( [ 'attachment', 'color', 'image', 'position_x', 'position_y', 'repeat' ], function( prop ) {
 			return 'background_' + prop;
 		});
 
-		api.when.apply( api, bg ).done( function( color, image, position_x, repeat, attachment ) {
+		api.when.apply( api, bg ).done( function( attachment, color, image, position_x, position_y, repeat ) {
 			var body = $(document.body),
 				head = $('head'),
 				style = $('#custom-background-css'),
@@ -126,10 +126,10 @@
 					css += 'background-color: ' + color() + ';';
 
 				if ( image() ) {
+					css += 'background-attachment: ' + attachment() + ';';
 					css += 'background-image: url("' + image() + '");';
-					css += 'background-position: top ' + position_x() + ';';
+					css += 'background-position: ' + position_x() + ' ' + position_y() + ';';
 					css += 'background-repeat: ' + repeat() + ';';
-					css += 'background-attachment: ' + attachment() + ';';
 				}
 
 				// Refresh the stylesheet by removing and recreating it.
Index: wp-includes/theme.php
===================================================================
--- wp-includes/theme.php	(revision 24017)
+++ wp-includes/theme.php	(working copy)
@@ -1167,11 +1167,18 @@
 			$repeat = 'repeat';
 		$repeat = " background-repeat: $repeat;";
 
-		$position = get_theme_mod( 'background_position_x', 'left' );
-		if ( ! in_array( $position, array( 'center', 'right', 'left' ) ) )
-			$position = 'left';
-		$position = " background-position: top $position;";
+		$position_x = get_theme_mod( 'background_position_x', 'left' );
 
+		if ( ! in_array( $position_x, array( 'center', 'left', 'right' ) ) )
+			$position_x = 'left';
+
+		$position_y = get_theme_mod( 'background_position_y', 'top' );
+
+		if ( ! in_array( $position_y, array( 'bottom', 'center', 'top' ) ) )
+			$position_y = 'top';
+
+		$position = ' background-position: ' . $position_x . ' ' . $position_y . ';';
+
 		$attachment = get_theme_mod( 'background_attachment', 'scroll' );
 		if ( ! in_array( $attachment, array( 'fixed', 'scroll' ) ) )
 			$attachment = 'scroll';
@@ -1732,4 +1739,4 @@
 		}());
 	</script>
 	<?php
-}
\ No newline at end of file
+}
Index: wp-admin/js/custom-background.js
===================================================================
--- wp-admin/js/custom-background.js	(revision 24017)
+++ wp-admin/js/custom-background.js	(working copy)
@@ -12,10 +12,18 @@
 			}
 		});
 
-		$('input[name="background-position-x"]').change(function() {
-			bgImage.css('background-position', $(this).val() + ' top');
-		});
+		$( 'input[name="background-position-x"]' ).change( function() {
+			bgPosition = bgImage.css( 'background-position' ).split( ' ' );
 
+			bgImage.css( 'background-position', $( this ).val() + ' ' + bgPosition[1] );
+		} );
+
+		$( 'input[name="background-position-y"]' ).change( function() {
+			bgPosition = bgImage.css( 'background-position' ).split( ' ' );
+
+			bgImage.css( 'background-position', bgPosition[0] + ' ' + $( this ).val() );
+		} );
+
 		$('input[name="background-repeat"]').change(function() {
 			bgImage.css('background-repeat', $(this).val());
 		});
@@ -71,4 +79,4 @@
 			frame.open();
 		});
 	});
-})(jQuery);
\ No newline at end of file
+})(jQuery);
Index: wp-admin/js/customize-controls.js
===================================================================
--- wp-admin/js/customize-controls.js	(revision 24017)
+++ wp-admin/js/customize-controls.js	(working copy)
@@ -914,7 +914,7 @@
 		// Control visibility for default controls
 		$.each({
 			'background_image': {
-				controls: [ 'background_repeat', 'background_position_x', 'background_attachment' ],
+				controls: [ 'background_repeat', 'background_position_x', 'background_position_y', 'background_attachment' ],
 				callback: function( to ) { return !! to }
 			},
 			'show_on_front': {
Index: wp-admin/custom-background.php
===================================================================
--- wp-admin/custom-background.php	(revision 24017)
+++ wp-admin/custom-background.php	(working copy)
@@ -141,15 +141,28 @@
 			set_theme_mod('background_repeat', $repeat);
 		}
 
-		if ( isset($_POST['background-position-x']) ) {
-			check_admin_referer('custom-background');
-			if ( in_array($_POST['background-position-x'], array('center', 'right', 'left')) )
-				$position = $_POST['background-position-x'];
+		if ( isset( $_POST[ 'background-position-x' ] ) ) {
+			check_admin_referer( 'custom-background' );
+
+			if ( in_array( $_POST[ 'background-position-x' ], array( 'center', 'left', 'right') ) )
+				$position_x = $_POST[ 'background-position-x' ];
 			else
-				$position = 'left';
-			set_theme_mod('background_position_x', $position);
+				$position_x = 'left';
+
+			set_theme_mod( 'background_position_x', $position_x );
 		}
 
+		if ( isset( $_POST[ 'background-position-y' ] ) ) {
+			check_admin_referer( 'custom-background' );
+
+			if ( in_array( $_POST[ 'background-position-y' ], array( 'bottom', 'center', 'top' ) ) )
+				$position_y = $_POST[ 'background-position-y' ];
+			else
+				$position_y = 'top';
+
+			set_theme_mod( 'background_position_y', $position_y );
+		}
+
 		if ( isset($_POST['background-attachment']) ) {
 			check_admin_referer('custom-background');
 			if ( in_array($_POST['background-attachment'], array('fixed', 'scroll')) )
@@ -206,7 +219,7 @@
 	// background-image URL must be single quote, see below
 	$background_styles .= ' background-image: url(\'' . set_url_scheme( get_theme_mod( 'background_image_thumb', get_background_image() ) ) . '\');'
 		. ' background-repeat: ' . get_theme_mod('background_repeat', 'repeat') . ';'
-		. ' background-position: top ' . get_theme_mod('background_position_x', 'left');
+		. ' background-position: ' . get_theme_mod( 'background_position_x', 'left' ) . ' ' . get_theme_mod( 'background_position_y', 'top' );
 }
 ?>
 <div id="custom-background-image" style="<?php echo $background_styles; ?>"><?php // must be double quote, see above ?>
@@ -273,24 +286,42 @@
 <tbody>
 <?php if ( get_background_image() ) : ?>
 <tr valign="top">
-<th scope="row"><?php _e( 'Position' ); ?></th>
+<th scope="row"><?php _e( 'Horizontal Position' ); ?></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', 'left')); ?> />
-<?php _e('Left') ?>
+<input name="background-position-x" type="radio" value="left"<?php checked( 'left', get_theme_mod( 'background_position_x', 'left' ) ); ?> />
+<?php _e( 'Left' ); ?>
 </label>
 <label>
-<input name="background-position-x" type="radio" value="center"<?php checked('center', get_theme_mod('background_position_x', 'left')); ?> />
-<?php _e('Center') ?>
+<input name="background-position-x" type="radio" value="center"<?php checked( 'center', get_theme_mod( 'background_position_x', 'left' ) ); ?> />
+<?php _e( 'Center' ); ?>
 </label>
 <label>
-<input name="background-position-x" type="radio" value="right"<?php checked('right', get_theme_mod('background_position_x', 'left')); ?> />
-<?php _e('Right') ?>
+<input name="background-position-x" type="radio" value="right"<?php checked( 'right', get_theme_mod( 'background_position_x', 'left' ) ); ?> />
+<?php _e( 'Right' ); ?>
 </label>
 </fieldset></td>
 </tr>
 
 <tr valign="top">
+<th scope="row"><?php _e( 'Vertical Position' ); ?></th>
+<td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Position' ); ?></span></legend>
+<label>
+<input name="background-position-y" type="radio" value="top"<?php checked( 'top', get_theme_mod( 'background_position_y', 'top' ) ); ?> />
+<?php _e( 'Top' ); ?>
+</label>
+<label>
+<input name="background-position-y" type="radio" value="center"<?php checked( 'center', get_theme_mod( 'background_position_y', 'top' ) ); ?> />
+<?php _e( 'Center' ); ?>
+</label>
+<label>
+<input name="background-position-y" type="radio" value="bottom"<?php checked( 'bottom', get_theme_mod( 'background_position_y', 'top' ) ); ?> />
+<?php _e( 'Bottom' ); ?>
+</label>
+</fieldset></td>
+</tr>
+
+<tr valign="top">
 <th scope="row"><?php _e( 'Repeat' ); ?></th>
 <td><fieldset><legend class="screen-reader-text"><span><?php _e( 'Background Repeat' ); ?></span></legend>
 <label><input type="radio" name="background-repeat" value="no-repeat"<?php checked('no-repeat', get_theme_mod('background_repeat', 'repeat')); ?> /> <?php _e('No Repeat'); ?></label>
