Index: wp-admin/async-upload.php
===================================================================
--- wp-admin/async-upload.php	(revision 21466)
+++ wp-admin/async-upload.php	(working copy)
@@ -38,10 +38,13 @@
 		wp_die( __( 'You are not allowed to edit this item.' ) );
 
 	if ( 2 == $_REQUEST['fetch'] ) {
-		add_filter('attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2);
-		echo get_media_item($id, array( 'send' => false, 'delete' => true ));
+		add_filter( 'attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2 );
+		echo get_media_item( $id, array( 'send' => false, 'delete' => true ) );
 	} else {
-		add_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2);
+		if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+			add_filter( 'attachment_fields_to_edit', '__return_empty_array' );
+		else
+			add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 );
 		echo get_media_item($id);
 	}
 	exit;
Index: wp-admin/css/media.dev.css
===================================================================
--- wp-admin/css/media.dev.css	(revision 21466)
+++ wp-admin/css/media.dev.css	(working copy)
@@ -193,10 +193,6 @@
 	text-align: center;
 }
 
-#media-upload a.wp-post-thumbnail {
-	margin: 0 20px;
-}
-
 #media-items a.delete {
 	display: block;
 	float: right;
Index: wp-admin/includes/media.php
===================================================================
--- wp-admin/includes/media.php	(revision 21466)
+++ wp-admin/includes/media.php	(working copy)
@@ -7,11 +7,11 @@
  */
 
 /**
- * {@internal Missing Short Description}}
+ * Sets up the default media upload tabs.
  *
  * @since 2.5.0
  *
- * @return unknown
+ * @return array
  */
 function media_upload_tabs() {
 	$_default_tabs = array(
@@ -25,38 +25,54 @@
 }
 
 /**
- * {@internal Missing Short Description}}
+ * Adds the number of attachments to the "Gallery" tab header.
  *
  * @since 2.5.0
  *
- * @param unknown_type $tabs
- * @return unknown
+ * @param array $tabs
+ * @return array
  */
-function update_gallery_tab($tabs) {
+function update_gallery_tab( $tabs ) {
 	global $wpdb;
 
-	if ( !isset($_REQUEST['post_id']) ) {
-		unset($tabs['gallery']);
+	if ( ! isset( $_REQUEST['post_id'] ) ) {
+		unset( $tabs['gallery'] );
 		return $tabs;
 	}
 
-	$post_id = intval($_REQUEST['post_id']);
+	$post_id = intval( $_REQUEST['post_id'] );
 
 	if ( $post_id )
 		$attachments = intval( $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent = %d", $post_id ) ) );
 
-	if ( empty($attachments) ) {
-		unset($tabs['gallery']);
+	if ( empty( $attachments ) ) {
+		unset( $tabs['gallery'] );
 		return $tabs;
 	}
 
-	$tabs['gallery'] = sprintf(__('Gallery (%s)'), "<span id='attachments-count'>$attachments</span>");
+	$tabs['gallery'] = sprintf( __( 'Gallery (%s)' ), "<span id='attachments-count'>$attachments</span>" );
 
 	return $tabs;
 }
-add_filter('media_upload_tabs', 'update_gallery_tab');
+add_filter( 'media_upload_tabs', 'update_gallery_tab' );
 
 /**
+ * Hides "From URL" tab when setting a featured image.
+ *
+ * @since 3.5.0
+ *
+ * @param array $tabs
+ * @return array
+ */
+function hide_from_url_tab( $tabs ) {
+	if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+		unset( $tabs['type_url'] );
+
+	return $tabs;
+}
+add_filter( 'media_upload_tabs', 'hide_from_url_tab' );
+
+/**
  * {@internal Missing Short Description}}
  *
  * @since 2.5.0
@@ -665,6 +681,9 @@
 			$errors = $return;
 	}
 
+	if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+		add_filter( 'media_upload_mime_type_links', '__return_empty_array' );
+
 	return wp_iframe( 'media_upload_library_form', $errors );
 }
 
@@ -1152,7 +1171,9 @@
 		'extra_rows' => array(),
 	);
 
-	if ( $send )
+	if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+		$send = '';
+	elseif ( $send )
 		$send = get_submit_button( __( 'Insert into Post' ), 'button', "send[$attachment_id]", false );
 	if ( $delete && current_user_can( 'delete_post', $attachment_id ) ) {
 		if ( !EMPTY_TRASH_DAYS ) {
@@ -1180,7 +1201,8 @@
 	if ( 'image' == $type && $calling_post_id && current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) )
 		&& post_type_supports( get_post_type( $calling_post_id ), 'thumbnail' ) && get_post_thumbnail_id( $calling_post_id ) != $attachment_id ) {
 		$ajax_nonce = wp_create_nonce( "set_post_thumbnail-$calling_post_id" );
-		$thumbnail = "<a class='wp-post-thumbnail' id='wp-post-thumbnail-" . $attachment_id . "' href='#' onclick='WPSetAsThumbnail(\"$attachment_id\", \"$ajax_nonce\");return false;'>" . esc_html__( "Use as featured image" ) . "</a>";
+		$class = ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] ) ? "class='button-primary'" : '';
+		$thumbnail = "<input $class id='wp-post-thumbnail-$attachment_id' type='submit' onclick='WPSetAsThumbnail(\"$attachment_id\", \"$ajax_nonce\");return false;' value='" . esc_attr__( "Use as featured image" ) . "' name='wp-post-thumbnail-$attachment_id' />";
 	}
 
 	if ( ( $send || $thumbnail || $delete ) && !isset( $form_fields['buttons'] ) )
@@ -1420,9 +1442,10 @@
 
 	media_upload_header();
 
-	$post_id = isset( $_REQUEST['post_id'] )? intval( $_REQUEST['post_id'] ) : 0;
+	$post_id = ( isset( $_REQUEST['post_id'] ) ) ? intval( $_REQUEST['post_id'] ) : 0;
+	$context = ( isset( $_REQUEST['context'] ) ) ? $_REQUEST['context'] : '';
 
-	$form_action_url = admin_url("media-upload.php?type=$type&tab=type&post_id=$post_id");
+	$form_action_url = admin_url("media-upload.php?type=$type&tab=type&post_id=$post_id&context=$context");
 	$form_action_url = apply_filters('media_upload_form_url', $form_action_url, $type);
 	$form_class = 'media-upload-form type-form validate';
 
@@ -1433,6 +1456,7 @@
 <form enctype="multipart/form-data" method="post" action="<?php echo esc_attr($form_action_url); ?>" class="<?php echo $form_class; ?>" id="<?php echo $type; ?>-form">
 <?php submit_button( '', 'hidden', 'save', false ); ?>
 <input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
+<input type="hidden" name="context" id="context" value="<?php echo isset( $_REQUEST['context'] ) ? esc_attr( $_REQUEST['context'] ) : ''; ?>" />
 <?php wp_nonce_field('media-form'); ?>
 
 <h3 class="media-title"><?php _e('Add media files from your computer'); ?></h3>
@@ -1485,9 +1509,10 @@
 
 	media_upload_header();
 
-	$post_id = intval($_REQUEST['post_id']);
+	$post_id = intval( $_REQUEST['post_id'] );
+	$context = ( isset( $_REQUEST['context'] ) ) ? $_REQUEST['context'] : '';
 
-	$form_action_url = admin_url("media-upload.php?type=$type&tab=type&post_id=$post_id");
+	$form_action_url = admin_url("media-upload.php?type=$type&tab=type&post_id=$post_id&context=$context");
 	$form_action_url = apply_filters('media_upload_form_url', $form_action_url, $type);
 	$form_class = 'media-upload-form type-form validate';
 
@@ -1497,6 +1522,7 @@
 
 <form enctype="multipart/form-data" method="post" action="<?php echo esc_attr($form_action_url); ?>" class="<?php echo $form_class; ?>" id="<?php echo $type; ?>-form">
 <input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
+<input type="hidden" name="context" id="context" value="<?php echo isset( $_REQUEST['context'] ) ? esc_attr( $_REQUEST['context'] ) : ''; ?>" />
 <?php wp_nonce_field('media-form'); ?>
 
 <h3 class="media-title"><?php _e('Insert media from another website'); ?></h3>
@@ -1620,8 +1646,10 @@
 	$redir_tab = 'gallery';
 	media_upload_header();
 
-	$post_id = intval($_REQUEST['post_id']);
-	$form_action_url = admin_url("media-upload.php?type=$type&tab=gallery&post_id=$post_id");
+	$post_id = intval( $_REQUEST['post_id'] );
+	$context = ( isset( $_REQUEST['context'] ) ) ? $_REQUEST['context'] : '';
+
+	$form_action_url = admin_url("media-upload.php?type=$type&tab=gallery&post_id=$post_id&context=$context");
 	$form_action_url = apply_filters('media_upload_form_url', $form_action_url, $type);
 	$form_class = 'media-upload-form validate';
 
@@ -1646,10 +1674,12 @@
 <a href="#" id="showall"><?php _e('Show'); ?></a>
 <a href="#" id="hideall" style="display:none;"><?php _e('Hide'); ?></a>
 </span>
+<?php if ( ! isset( $_REQUEST['context'] ) || 'featured' != $_REQUEST['context'] ) : ?>
 <?php _e('Sort Order:'); ?>
 <a href="#" id="asc"><?php _e('Ascending'); ?></a> |
 <a href="#" id="desc"><?php _e('Descending'); ?></a> |
 <a href="#" id="clear"><?php _ex('Clear', 'verb'); ?></a>
+<?php endif; ?>
 </div>
 <form enctype="multipart/form-data" method="post" action="<?php echo esc_attr($form_action_url); ?>" class="<?php echo $form_class; ?>" id="gallery-form">
 <?php wp_nonce_field('media-form'); ?>
@@ -1657,22 +1687,32 @@
 <table class="widefat" cellspacing="0">
 <thead><tr>
 <th><?php _e('Media'); ?></th>
+<?php if ( ! isset( $_REQUEST['context'] ) || 'featured' != $_REQUEST['context'] ) : ?>
 <th class="order-head"><?php _e('Order'); ?></th>
+<?php endif; ?>
 <th class="actions-head"><?php _e('Actions'); ?></th>
 </tr></thead>
 </table>
 <div id="media-items">
-<?php add_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2); ?>
-<?php echo get_media_items($post_id, $errors); ?>
+<?php
+if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+	add_filter( 'attachment_fields_to_edit', '__return_empty_array' );
+else
+	add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 );
+
+echo get_media_items( $post_id, $errors );
+?>
 </div>
 
 <p class="ml-submit">
 <?php submit_button( __( 'Save all changes' ), 'button savebutton', 'save', false, array( 'id' => 'save-all', 'style' => 'display: none;' ) ); ?>
 <input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
+<input type="hidden" name="context" id="context" value="<?php echo isset( $_REQUEST['context'] ) ? esc_attr( $_REQUEST['context'] ) : ''; ?>" />
 <input type="hidden" name="type" value="<?php echo esc_attr( $GLOBALS['type'] ); ?>" />
 <input type="hidden" name="tab" value="<?php echo esc_attr( $GLOBALS['tab'] ); ?>" />
 </p>
 
+<?php if ( ! isset( $_REQUEST['context'] ) || 'featured' != $_REQUEST['context'] ) : ?>
 <div id="gallery-settings" style="display:none;">
 <div class="title"><?php _e('Gallery Settings'); ?></div>
 <table id="basic" class="describe"><tbody>
@@ -1749,6 +1789,7 @@
 <input type="button" class="button" style="display:none;" onMouseDown="wpgallery.update();" name="update-gallery" id="update-gallery" value="<?php esc_attr_e( 'Update gallery settings' ); ?>" />
 </p>
 </div>
+<?php endif; ?>
 </form>
 <?php
 }
@@ -1765,7 +1806,8 @@
 
 	media_upload_header();
 
-	$post_id = intval($_REQUEST['post_id']);
+	$post_id = intval( $_REQUEST['post_id'] );
+	$context = ( isset( $_REQUEST['context'] ) ) ? $_REQUEST['context'] : '';
 
 	$form_action_url = admin_url("media-upload.php?type=$type&tab=library&post_id=$post_id");
 	$form_action_url = apply_filters('media_upload_form_url', $form_action_url, $type);
@@ -1909,12 +1951,18 @@
 </script>
 
 <div id="media-items">
-<?php add_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2); ?>
-<?php echo get_media_items(null, $errors); ?>
+<?php
+if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+	add_filter( 'attachment_fields_to_edit', '__return_empty_array' );
+else
+	add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 );
+
+echo get_media_items( null, $errors ); ?>
 </div>
 <p class="ml-submit">
 <?php submit_button( __( 'Save all changes' ), 'button savebutton', 'save', false ); ?>
 <input type="hidden" name="post_id" id="post_id" value="<?php echo (int) $post_id; ?>" />
+<input type="hidden" name="context" id="context" value="<?php echo isset( $_REQUEST['context'] ) ? esc_attr( $_REQUEST['context'] ) : ''; ?>" />
 </p>
 </form>
 <?php
@@ -2056,6 +2104,8 @@
  * @since 3.3.0
  */
 function media_upload_text_after() {
+	if ( isset( $_REQUEST['context'] ) && 'featured' == $_REQUEST['context'] )
+		return;
 	?>
 	<span class="after-file-upload"><?php _e('After a file has been uploaded, you can add titles and descriptions.'); ?></span>
 	<?php
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 21466)
+++ wp-admin/includes/post.php	(working copy)
@@ -1147,7 +1147,9 @@
 	if ( empty( $post_id ) )
 		$post_id = $post_ID;
 
-	$upload_iframe_src = esc_url( get_upload_iframe_src('image', $post_id) );
+	$upload_iframe_src = get_upload_iframe_src( 'image', $post_id );
+	$upload_iframe_src = remove_query_arg( 'TB_iframe', $upload_iframe_src );
+	$upload_iframe_src = esc_url( add_query_arg( array( 'context' => 'featured', 'TB_iframe' => 1 ), $upload_iframe_src ) );
 	$set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set featured image' ) . '" href="%s" id="set-post-thumbnail" class="thickbox">%s</a></p>';
 	$content = sprintf( $set_thumbnail_link, $upload_iframe_src, esc_html__( 'Set featured image' ) );
 
Index: wp-admin/js/set-post-thumbnail.dev.js
===================================================================
--- wp-admin/js/set-post-thumbnail.dev.js	(revision 21466)
+++ wp-admin/js/set-post-thumbnail.dev.js	(working copy)
@@ -1,20 +1,22 @@
 function WPSetAsThumbnail(id, nonce){
-	var $link = jQuery('a#wp-post-thumbnail-' + id);
+	var $button = jQuery('input#wp-post-thumbnail-' + id);
 
-	$link.text( setPostThumbnailL10n.saving );
+	$button.val( setPostThumbnailL10n.saving );
 	jQuery.post(ajaxurl, {
 		action:"set-post-thumbnail", post_id: post_id, thumbnail_id: id, _ajax_nonce: nonce, cookie: encodeURIComponent(document.cookie)
 	}, function(str){
 		var win = window.dialogArguments || opener || parent || top;
-		$link.text( setPostThumbnailL10n.setThumbnail );
+		$button.val( setPostThumbnailL10n.setThumbnail );
 		if ( str == '0' ) {
 			alert( setPostThumbnailL10n.error );
 		} else {
-			jQuery('a.wp-post-thumbnail').show();
-			$link.text( setPostThumbnailL10n.done );
-			$link.fadeOut( 2000 );
+			jQuery('input.wp-post-thumbnail').show();
+			$button.val( setPostThumbnailL10n.done );
+			$button.fadeOut( 2000 );
 			win.WPSetThumbnailID(id);
 			win.WPSetThumbnailHTML(str);
+			if ( -1 != window.location.href.indexOf('featured') )
+				win.tb_remove();
 		}
 	}
 	);
Index: wp-includes/js/plupload/handlers.dev.js
===================================================================
--- wp-includes/js/plupload/handlers.dev.js	(revision 21466)
+++ wp-includes/js/plupload/handlers.dev.js	(working copy)
@@ -111,18 +111,22 @@
 }
 
 function prepareMediaItem(fileObj, serverData) {
-	var f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id);
+	var f = ( typeof shortform == 'undefined' ) ? 1 : 2,
+		c = jQuery('#context'),
+		item = jQuery('#media-item-' + fileObj.id);
 
 	try {
 		if ( typeof topWin.tb_remove != 'undefined' )
 			topWin.jQuery('#TB_overlay').click(topWin.tb_remove);
 	} catch(e){}
 
+	c = ( typeof c.val() != 'undefined' ) ? c.val() : '';
+
 	if ( isNaN(serverData) || !serverData ) { // Old style: Append the HTML returned by the server -- thumbnail and form inputs
 		item.append(serverData);
 		prepareMediaItemInit(fileObj);
 	} else { // New style: server data is just the attachment ID, fetch the thumbnail and form html from the server
-		item.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm()});
+		item.load('async-upload.php', {attachment_id:serverData, fetch:f, context:c}, function(){prepareMediaItemInit(fileObj);updateMediaForm()});
 	}
 }
 
