Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 21259)
+++ wp-admin/includes/post.php	(working copy)
@@ -1342,3 +1342,37 @@
 
 	return $url;
 }
+
+/**
+ * Creates a new page to be set as a front page or a posts page in Reading Settings.
+ *
+ * @since 3.5.0
+ * @access private
+ */
+function _create_new_page() {
+	if ( ! isset( $_POST[ 'page_on_front' ] ) && ! isset( $_POST[ 'page_for_posts' ] ) )
+		return;
+
+	if ( 'new' != $_POST[ 'page_on_front' ] && 'new' != $_POST[ 'page_for_posts' ] )
+		return;
+
+	$post_type = get_post_type_object( 'page' );
+	if ( ! current_user_can( $post_type->cap->edit_posts ) )
+		wp_die( __( 'You are not allowed to create pages on this site.' ) );
+
+	foreach ( array( 'page_on_front', 'page_for_posts' ) as $option ) {
+		if ( ! isset( $_POST[ $option . '_name' ] ) || 'new' != $_POST[ $option ] )
+			continue;
+
+		$page_title = esc_html( stripslashes( $_POST[ $option . '_name' ] ) );
+		$page = get_page_by_title( $page_title );
+
+		if ( $page && 'publish' == $page->post_status )
+			$page_id = $page->ID;
+		else
+			$page_id = wp_insert_post( array( 'post_title' => $page_title, 'post_type' => 'page', 'post_status' => 'publish' ) );
+
+		$_POST[ $option ] = $page_id;
+	}
+}
+add_action( 'admin_init', '_create_new_page' );
Index: wp-admin/options-reading.php
===================================================================
--- wp-admin/options-reading.php	(revision 21259)
+++ wp-admin/options-reading.php	(working copy)
@@ -25,22 +25,53 @@
 ?>
 <script type="text/javascript">
 //<![CDATA[
-	jQuery(document).ready(function($){
+	jQuery(document).ready( function($) {
 		var section = $('#front-static-pages'),
 			staticPage = section.find('input:radio[value="page"]'),
 			selects = section.find('select'),
-			check_disabled = function(){
-				selects.prop( 'disabled', ! staticPage.prop('checked') );
+			toggle_selects = function() {
+				selects.closest('ul').toggle( staticPage.prop('checked') );
 			};
-		check_disabled();
- 		section.find('input:radio').change(check_disabled);
+			toggle_new_page_input = function() {
+				$(this).closest('li').find('label[for$="name"], .description').toggle( 'new' == $(this).val() );
+			};
+			
+		toggle_selects();
+ 		section.find('input:radio').change( toggle_selects );
+
+		selects.each( toggle_new_page_input );
+		selects.change( toggle_new_page_input );
 	});
 //]]>
 </script>
 <?php
 }
-add_action('admin_head', 'add_js');
+add_action( 'admin_head', 'add_js' );
 
+/**
+ * Retrieve or display list of pages as a dropdown (select list).
+ *
+ * @since 3.5.0
+ * @access private
+ *
+ * @param array|string $args List attributes.
+ * @return string HTML content
+ */
+function _dropdown_pages( $args ) {
+	$r = wp_parse_args( $args );
+	extract( $r, EXTR_SKIP );
+
+	$output = "<select name='" . esc_attr( $name ) . "' id='" . esc_attr( $name ) . "'>\n";
+	$output .= "\t<option value=\"0\">" . __( '&mdash; Select &mdash;' ) . "</option>\n";
+	$pages = get_pages( $r );
+	if ( ! empty( $pages ) )
+		$output .= walk_page_dropdown_tree( $pages, 0, $r );
+	$output .= "\t<option value=\"new\">" . __( 'Create New Page' ) . "</option>\n";
+	$output .= "</select>\n";
+
+	return apply_filters( 'wp_dropdown_pages', $output );
+}
+
 get_current_screen()->add_help_tab( array(
 	'id'      => 'overview',
 	'title'   => __('Overview'),
@@ -66,17 +97,9 @@
 <form name="form1" method="post" action="options.php">
 <?php settings_fields( 'reading' ); ?>
 
-<?php if ( ! get_pages() ) : ?>
-<input name="show_on_front" type="hidden" value="posts" />
-<table class="form-table">
 <?php
-	if ( 'posts' != get_option( 'show_on_front' ) ) :
+	if ( 'page' == get_option( 'show_on_front' ) && ( ! get_pages() || ! get_option( 'page_on_front' ) && ! get_option( 'page_for_posts' ) ) )
 		update_option( 'show_on_front', 'posts' );
-	endif;
-
-else :
-	if ( 'page' == get_option( 'show_on_front' ) && ! get_option( 'page_on_front' ) && ! get_option( 'page_for_posts' ) )
-		update_option( 'show_on_front', 'posts' );
 ?>
 <table class="form-table">
 <tr valign="top">
@@ -93,15 +116,22 @@
 	</label>
 	</p>
 <ul>
-	<li><label for="page_on_front"><?php printf( __( 'Front page: %s' ), wp_dropdown_pages( array( 'name' => 'page_on_front', 'echo' => 0, 'show_option_none' => __( '&mdash; Select &mdash;' ), 'option_none_value' => '0', 'selected' => get_option( 'page_on_front' ) ) ) ); ?></label></li>
-	<li><label for="page_for_posts"><?php printf( __( 'Posts page: %s' ), wp_dropdown_pages( array( 'name' => 'page_for_posts', 'echo' => 0, 'show_option_none' => __( '&mdash; Select &mdash;' ), 'option_none_value' => '0', 'selected' => get_option( 'page_for_posts' ) ) ) ); ?></label></li>
+	<li>
+		<label for="page_on_front"><?php printf( __( 'Front page: %s' ), _dropdown_pages( array( 'name' => 'page_on_front', 'selected' => get_option( 'page_on_front' ) ) ) ); ?></label>
+		<label for="page_on_front_name"><?php printf( __( 'New page name: %s' ), '<input type="text" id="page_on_front_name" value="' . _x( 'Home', 'page on front' ) . '" name="page_on_front_name">' ); ?></label>
+		<p class="description"><?php _e( 'A new page named "Home" will be added and saved as the home page.' ); ?></p>
+	</li>
+	<li>
+		<label for="page_for_posts"><?php printf( __( 'Posts page: %s' ), _dropdown_pages( array( 'name' => 'page_for_posts', 'selected' => get_option( 'page_for_posts' ) ) ) ); ?></label>
+		<label for="page_for_posts_name"><?php printf( __( 'New page name: %s' ), '<input type="text" id="page_for_posts_name" value="' . _x( 'Blog', 'page for posts' ) . '" name="page_for_posts_name">' ); ?></label>
+		<p class="description"><?php _e( 'A new page named "Blog" will be added and saved as the posts page.' ); ?></p>
+	</li>
 </ul>
 <?php if ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) == get_option( 'page_on_front' ) ) : ?>
 <div id="front-page-warning" class="error inline"><p><?php _e( '<strong>Warning:</strong> these pages should not be the same!' ); ?></p></div>
 <?php endif; ?>
 </fieldset></td>
 </tr>
-<?php endif; ?>
 <tr valign="top">
 <th scope="row"><label for="posts_per_page"><?php _e( 'Blog pages show at most' ); ?></label></th>
 <td>
