Index: wp-admin/css/wp-admin.css
===================================================================
--- wp-admin/css/wp-admin.css	(revision 21872)
+++ wp-admin/css/wp-admin.css	(working copy)
@@ -2870,6 +2870,10 @@
 	font-size: 11px;
 }
 
+#front-static-pages #edit-slug-box {
+	padding: 0;
+}
+
 #editable-post-name-full {
 	display: none;
 }
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 21872)
+++ wp-admin/includes/post.php	(working copy)
@@ -1055,9 +1055,15 @@
  * @return string intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor.
  */
 function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
-	global $wpdb;
+	global $wpdb, $current_screen;
+
 	$post = get_post($id);
 
+	if ( isset( $current_screen ) )
+		$context = $current_screen->id;
+	else
+		$context = isset( $_POST['context'] ) ? $_POST['context'] : '';
+
 	list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);
 
 	if ( 'publish' == $post->post_status ) {
@@ -1068,11 +1074,12 @@
 		$title = __('Temporary permalink. Click to edit this part.');
 	}
 
-	if ( false === strpos($permalink, '%postname%') && false === strpos($permalink, '%pagename%') ) {
-		$return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink" tabindex="-1">' . $permalink . "</span>\n";
+	if ( false === strpos( $permalink, '%postname%' ) && false === strpos( $permalink, '%pagename%' ) ) {
+		$return  = ( 'options-reading' == $context ) ? __( 'Located at' ) . "\n" : '<strong>' . __( 'Permalink:' ) . "</strong>\n";
+		$return .= '<span id="sample-permalink" tabindex="-1">' . $permalink . "</span>\n";
 		if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) )
 			$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-tiny" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
-		if ( isset($view_post) )
+		if ( isset( $view_post ) && 'options-reading' == $context )
 			$return .= "<span id='view-post-btn'><a href='$permalink' class='button button-tiny'>$view_post</a></span>\n";
 
 		$return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug);
@@ -1095,14 +1102,14 @@
 	}
 
 	$post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
-	$display_link = str_replace(array('%pagename%','%postname%'), $post_name_html, $permalink);
-	$view_link = str_replace(array('%pagename%','%postname%'), $post_name, $permalink);
-	$return =  '<strong>' . __('Permalink:') . "</strong>\n";
+	$display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, $permalink );
+	$view_link = str_replace( array( '%pagename%', '%postname%' ), $post_name, $permalink );
+	$return  = ( 'options-reading' == $context ) ? __( 'Located at' ) . "\n" : '<strong>' . __( 'Permalink:' ) . "</strong>\n";
 	$return .= '<span id="sample-permalink" tabindex="-1">' . $display_link . "</span>\n";
 	$return .= '&lrm;'; // Fix bi-directional text display defect in RTL languages.
 	$return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug button button-tiny hide-if-no-js" onclick="editPermalink(' . $id . '); return false;">' . __('Edit') . "</a></span>\n";
 	$return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
-	if ( isset($view_post) )
+	if ( isset( $view_post ) && 'options-reading' != $context )
 		$return .= "<span id='view-post-btn'><a href='$view_link' class='button button-tiny'>$view_post</a></span>\n";
 
 	$return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug);
@@ -1318,3 +1325,41 @@
 
 	return $url;
 }
+
+/**
+ * Creates new pages to be set as a front page or a page for posts in Reading Settings.
+ *
+ * @since 3.5.0
+ * @access private
+ */
+function _create_pages_for_reading_settings() {
+	if ( ! isset( $_POST['show_on_front'] ) )
+		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.' ) );
+
+	if ( isset( $_POST['page_on_front'] ) && 'new' == $_POST['page_on_front'] ) {
+		$page_id = wp_insert_post( array(
+			'post_title' => esc_html( stripslashes( $_POST['page_on_front_title'] ) ),
+			'post_type' => 'page',
+			'post_status' => 'publish'
+		) );
+
+		if ( $page_id && ! is_wp_error( $page_id ) )
+			$_POST['page_on_front'] = $page_id;
+	}
+
+	if ( isset( $_POST['page_for_posts'] ) ) {
+		if ( ! $page = get_post( (int) $_POST['page_for_posts'] ) )
+			return;
+
+		$page->post_title = esc_html( stripslashes( $_POST['page_for_posts_title'] ) );
+		$page->post_name = esc_html( stripslashes( $_POST['post_name'] ) );
+		$page->post_status = 'publish';
+
+		wp_update_post( $page );
+	}
+}
+add_action( 'admin_init', '_create_pages_for_reading_settings' );
Index: wp-admin/js/post.js
===================================================================
--- wp-admin/js/post.js	(revision 21872)
+++ wp-admin/js/post.js	(working copy)
@@ -569,6 +569,7 @@
 					post_id: post_id,
 					new_slug: new_slug,
 					new_title: $('#title').val(),
+					context: pagenow,
 					samplepermalinknonce: $('#samplepermalinknonce').val()
 				}, function(data) {
 					$('#edit-slug-box').html(data);
Index: wp-admin/options-reading.php
===================================================================
--- wp-admin/options-reading.php	(revision 21872)
+++ wp-admin/options-reading.php	(working copy)
@@ -15,6 +15,8 @@
 $title = __( 'Reading Settings' );
 $parent_file = 'options-general.php';
 
+wp_enqueue_script( 'post' );
+
 /**
  * Display JavaScript on the page.
  *
@@ -24,21 +26,32 @@
 ?>
 <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') );
+			frontPage = section.find('input:checkbox[name="show_on_front"]'),
+			postsPage = section.find('input:checkbox[name="page_for_posts"]'),
+			frontPageSelect = section.find('select'),
+			toggleInputs = function() {
+				frontPage.closest('p').next().toggle( frontPage.prop('checked') );
+				frontPage.closest('p').next().find('label[for$="title"]').toggle( 'new' == frontPageSelect.find(':selected').val() );
+
+				postsPage.closest('p').toggle( frontPage.prop('checked') );
+				postsPage.closest('p').next().toggle( postsPage.is(':visible') && postsPage.prop('checked') );
+
+				if ( ! postsPage.is(':visible') )
+					postsPage.prop('checked', true);
 			};
-		check_disabled();
- 		section.find('input:radio').change(check_disabled);
+
+		toggleInputs();	
+		$.each( [ frontPage, postsPage, frontPageSelect ], function() {
+			$(this).change( toggleInputs );
+		});
 	});
 //]]>
 </script>
 <?php
 }
-add_action('admin_head', 'options_reading_add_js');
+add_action( 'admin_head', 'options_reading_add_js' );
 
 /**
  * Render the blog charset setting.
@@ -50,6 +63,29 @@
 	echo '<p class="description">' . __( 'The <a href="http://codex.wordpress.org/Glossary#Character_set">character encoding</a> of your site (UTF-8 is recommended)' ) . '</p>';
 }
 
+/**
+ * Retrieve or display list of pages as a dropdown (select list).
+ *
+ * @since 3.5.0
+ *
+ * @param array|string $args List attributes.
+ * @return string HTML content.
+ */
+function options_reading_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";
+	$output .= "\t<option value=\"new\" id=\"new-page\">" . __( 'Add New Page' ) . "</option>\n";
+	$pages = get_pages( $r );
+	if ( ! empty( $pages ) )
+		$output .= walk_page_dropdown_tree( $pages, 0, $r );
+	$output .= "</select>\n";
+
+	return apply_filters( 'wp_dropdown_pages', $output );
+}
+
 get_current_screen()->add_help_tab( array(
 	'id'      => 'overview',
 	'title'   => __('Overview'),
@@ -82,47 +118,61 @@
 <form method="post" action="options.php">
 <?php
 settings_fields( 'reading' );
+wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false );
 
 if ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) )
 	add_settings_field( 'blog_charset', __( 'Encoding for pages and feeds' ), 'options_reading_blog_charset', 'reading', 'default', array( 'label_for' => 'blog_charset' ) );
-?>
 
-<?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' ) ) {
+	if ( ! 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' );
+if ( ! $page_for_posts = get_post( get_option( 'page_for_posts' ) ) ) {
+	$title = _x( 'Blog', 'default page for posts title' );
+	if ( ! $page_for_posts = get_page_by_path( sanitize_title( $title ) ) ) {
+		$page_for_posts = get_default_post_to_edit( 'page', true );
+		$page_for_posts->post_title = $title;
+		$page_for_posts->post_name = sanitize_title( $title );
+	}
+}
 ?>
 <table class="form-table">
 <tr valign="top">
-<th scope="row"><?php _e( 'Front page displays' ); ?></th>
-<td id="front-static-pages"><fieldset><legend class="screen-reader-text"><span><?php _e( 'Front page displays' ); ?></span></legend>
-	<p><label>
-		<input name="show_on_front" type="radio" value="posts" class="tog" <?php checked( 'posts', get_option( 'show_on_front' ) ); ?> />
-		<?php _e( 'Your latest posts' ); ?>
-	</label>
-	</p>
-	<p><label>
-		<input name="show_on_front" type="radio" value="page" class="tog" <?php checked( 'page', get_option( 'show_on_front' ) ); ?> />
-		<?php printf( __( 'A <a href="%s">static page</a> (select below)' ), 'edit.php?post_type=page' ); ?>
-	</label>
-	</p>
+<th scope="row"><?php _e( 'Enable a static front page' ); ?></th>
+<td id="front-static-pages"><fieldset><legend class="screen-reader-text"><span><?php _e( 'Enable a static front page' ); ?></span></legend>
+<p><label>
+	<input name="show_on_front" type="checkbox" value="page" class="tog" <?php checked( 'page', get_option( 'show_on_front' ) ); ?> />
+	<?php printf( __( 'Show a <a href="%s">page</a> instead of your latest posts' ), 'edit.php?post_type=page' ); ?>
+</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 echo options_reading_dropdown_pages( array( 'name' => 'page_on_front', 'selected' => get_option( 'page_on_front' ) ) ); ?></label>
+		<label for="page_on_front_title"><?php _e( 'New page title:' ); ?>
+			<input name="page_on_front_title" type="text" id="page_on_front_title" value="<?php echo esc_attr_x( 'Home', 'default page on front title' ); ?>" />
+		</label>
+	</li>
 </ul>
+<p><label>
+	<input name="page_for_posts" type="checkbox" value="<?php echo $page_for_posts->ID; ?>" class="tog" <?php checked( (bool) get_option( 'page_for_posts' ) ); ?> />
+	<?php _e( 'Show latest posts on a separate page' ); ?>
+</label>
+</p>
+<ul>
+	<li>
+		<label for="page_for_posts_title"><?php _e( 'Posts page title:' ); ?>
+			<input name="page_for_posts_title" type="text" id="page_for_posts_title" value="<?php echo esc_attr( htmlspecialchars( $page_for_posts->post_title ) ); ?>" />
+		</label>
+		<p id="edit-slug-box"><?php echo get_sample_permalink_html( $page_for_posts->ID, $page_for_posts->post_title, $page_for_posts->post_name ); ?></p>
+		<input name="post_name" type="hidden" id="post_name" value="<?php echo esc_attr( apply_filters( 'editable_slug', $page_for_posts->post_name ) ); ?>" />
+	</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>
