Index: wp-includes/js/media-editor.js
===================================================================
--- wp-includes/js/media-editor.js	(revision 23065)
+++ wp-includes/js/media-editor.js	(working copy)
@@ -320,6 +320,74 @@
 		};
 	}());
 
+	wp.media.featuredImage = {
+		get: function() {
+			return wp.media.view.settings.post.featuredImageId;
+		},
+
+		set: function( id ) {
+			var settings = wp.media.view.settings;
+
+			settings.post.featuredImageId = id;
+
+			wp.media.post( 'set-post-thumbnail', {
+				json:         true,
+				post_id:      settings.post.id,
+				thumbnail_id: settings.post.featuredImageId,
+				_wpnonce:     settings.post.nonce
+			}).done( function( html ) {
+				$( '.inside', '#postimagediv' ).html( html );
+			});
+		},
+
+		frame: function() {
+			if ( this._frame )
+				return this._frame;
+
+			this._frame = wp.media({
+				state: 'featured-image',
+				states: [ new wp.media.controller.FeaturedImage() ]
+			});
+
+			this._frame.on( 'toolbar:create:featured-image', function( toolbar ) {
+				this.createSelectToolbar( toolbar, {
+					text: wp.media.view.l10n.setFeaturedImage
+				});
+			}, this._frame );
+
+			this._frame.state('featured-image').on( 'select', this.select );
+			return this._frame;
+		},
+
+		select: function() {
+			var settings = wp.media.view.settings,
+				selection = this.get('selection').single();
+
+			if ( ! settings.post.featuredImageId )
+				return;
+
+			wp.media.featuredImage.set( selection ? selection.id : -1 );
+		},
+
+		init: function() {
+			// Open the content media manager to the 'featured image' tab when
+			// the post thumbnail is clicked.
+			$('#postimagediv').on( 'click', '#set-post-thumbnail', function( event ) {
+				event.preventDefault();
+				// Stop propagation to prevent thickbox from activating.
+				event.stopPropagation();
+
+				wp.media.featuredImage.frame().open();
+
+			// Update the featured image id when the 'remove' link is clicked.
+			}).on( 'click', '#remove-post-thumbnail', function() {
+				wp.media.view.settings.post.featuredImageId = -1;
+			});
+		}
+	};
+
+	$( wp.media.featuredImage.init );
+
 	wp.media.editor = {
 		insert: function( h ) {
 			var mce = typeof(tinymce) != 'undefined',
@@ -443,24 +511,7 @@
 				}
 			}, this );
 
-			workflow.state('featured-image').on( 'select', function() {
-				var settings = wp.media.view.settings,
-					selection = this.get('selection').single();
-
-				if ( ! settings.post.featuredImageId )
-					return;
-
-				settings.post.featuredImageId = selection ? selection.id : -1;
-				wp.media.post( 'set-post-thumbnail', {
-					json:         true,
-					post_id:      settings.post.id,
-					thumbnail_id: settings.post.featuredImageId,
-					_wpnonce:     settings.post.nonce
-				}).done( function( html ) {
-					$( '.inside', '#postimagediv' ).html( html );
-				});
-			});
-
+			workflow.state('featured-image').on( 'select', wp.media.featuredImage.select );
 			workflow.setState( workflow.options.state );
 			return workflow;
 		},
@@ -586,37 +637,6 @@
 
 				wp.media.editor.open( editor );
 			});
-
-			// Open the content media manager to the 'featured image' tab when
-			// the post thumbnail is clicked.
-			$('#postimagediv').on( 'click', '#set-post-thumbnail', function( event ) {
-				event.preventDefault();
-				// Stop propagation to prevent thickbox from activating.
-				event.stopPropagation();
-
-				// Always get the 'content' frame, since this is tailored to post.php.
-				var frame = wp.media.editor.add('content'),
-					initialState = frame.state().id,
-					escape;
-
-				escape = function() {
-					// Only run this event once.
-					this.off( 'escape', escape );
-
-					// If we're still on the 'featured-image' state, restore
-					// the initial state.
-					if ( 'featured-image' === this.state().id )
-						this.setState( initialState );
-				};
-
-				frame.on( 'escape', escape, frame );
-
-				frame.setState('featured-image').open();
-
-			// Update the featured image id when the 'remove' link is clicked.
-			}).on( 'click', '#remove-post-thumbnail', function() {
-				wp.media.view.settings.post.featuredImageId = -1;
-			});
 		}
 	};
 
Index: wp-includes/js/media-views.js
===================================================================
--- wp-includes/js/media-views.js	(revision 23065)
+++ wp-includes/js/media-views.js	(working copy)
@@ -289,7 +289,7 @@
 			this.frame.router.render( mode );
 
 			view = router.get();
-			if ( view.select )
+			if ( view && view.select )
 				view.select( this.frame.content.mode() );
 		},
 
@@ -304,7 +304,7 @@
 			menu.mode( mode );
 
 			view = menu.get();
-			if ( view.select )
+			if ( view && view.select )
 				view.select( this.id );
 		},
 
@@ -357,6 +357,7 @@
 			sidebar:    'settings',
 			content:    'upload',
 			router:     'browse',
+			menu:       'default',
 			searchable: true,
 			filterable: false,
 			sortable:   true,
@@ -669,7 +670,6 @@
 			id:         'featured-image',
 			filterable: 'uploaded',
 			multiple:   false,
-			menu:       'main',
 			toolbar:    'featured-image',
 			title:      l10n.featuredImageTitle,
 			priority:   60
@@ -707,6 +707,17 @@
 		},
 
 		activate: function() {
+			this.updateSelection();
+			this.frame.on( 'open', this.updateSelection, this );
+			media.controller.Library.prototype.activate.apply( this, arguments );
+		},
+
+		deactivate: function() {
+			this.frame.off( 'open', this.updateSelection, this );
+			media.controller.Library.prototype.deactivate.apply( this, arguments );
+		},
+
+		updateSelection: function() {
 			var selection = this.get('selection'),
 				id = media.view.settings.post.featuredImageId,
 				attachment;
@@ -717,7 +728,6 @@
 			}
 
 			selection.reset( attachment ? [ attachment ] : [] );
-			media.controller.Library.prototype.activate.apply( this, arguments );
 		}
 	});
 
@@ -728,7 +738,7 @@
 		defaults: {
 			id:      'embed',
 			url:     '',
-			menu:    'main',
+			menu:    'default',
 			content: 'embed',
 			toolbar: 'main-embed',
 			type:    'link',
@@ -1231,6 +1241,9 @@
 				model.frame = this;
 				model.trigger('ready');
 			}, this );
+
+			if ( this.options.states )
+				this.states.add( this.options.states );
 		},
 
 		reset: function() {
@@ -1294,6 +1307,9 @@
 			// Bind default title creation.
 			this.on( 'title:create:default', this.createTitle, this );
 			this.title.mode('default');
+
+			// Bind default menu.
+			this.on( 'menu:create:default', this.createMenu, this );
 		},
 
 		render: function() {
@@ -1350,12 +1366,12 @@
 					src:     tabUrl + '&tab=' + id,
 					title:   title,
 					content: 'iframe',
-					menu:    'main'
+					menu:    'default'
 				}, options ) );
 			}, this );
 
 			this.on( 'content:create:iframe', this.iframeContent, this );
-			this.on( 'menu:render:main', this.iframeMenu, this );
+			this.on( 'menu:render:default', this.iframeMenu, this );
 			this.on( 'open', this.hijackThickbox, this );
 			this.on( 'close', this.restoreThickbox, this );
 		},
@@ -1449,6 +1465,9 @@
 		createStates: function() {
 			var options = this.options;
 
+			if ( this.options.states )
+				return;
+
 			// Add the default states.
 			this.states.add([
 				// Main states.
@@ -1456,7 +1475,6 @@
 					selection: options.selection,
 					library:   media.query( options.library ),
 					multiple:  options.multiple,
-					menu:      'main',
 					title:     options.title,
 					priority:  20
 				})
@@ -1464,7 +1482,6 @@
 		},
 
 		bindHandlers: function() {
-			this.on( 'menu:create:main', this.createMenu, this );
 			this.on( 'router:create:browse', this.createRouter, this );
 			this.on( 'router:render:browse', this.browseRouter, this );
 			this.on( 'content:create:browse', this.browseContent, this );
@@ -1550,7 +1567,6 @@
 					id:         'insert',
 					title:      l10n.insertMediaTitle,
 					priority:   20,
-					menu:       'main',
 					toolbar:    'main-insert',
 					filterable: 'all',
 					library:    media.query( options.library ),
@@ -1569,7 +1585,6 @@
 					id:         'gallery',
 					title:      l10n.createGalleryTitle,
 					priority:   40,
-					menu:       'main',
 					toolbar:    'main-gallery',
 					filterable: 'uploaded',
 					multiple:   'add',
@@ -1609,10 +1624,7 @@
 
 
 			if ( media.view.settings.post.featuredImageId ) {
-				this.states.add( new media.controller.FeaturedImage({
-					controller: this,
-					menu:       'main'
-				}) );
+				this.states.add( new media.controller.FeaturedImage() );
 			}
 		},
 
@@ -1626,7 +1638,7 @@
 
 			var handlers = {
 					menu: {
-						'main':    'mainMenu',
+						'default': 'mainMenu',
 						'gallery': 'galleryMenu'
 					},
 
