Index: wp-includes/js/mce-view.js
===================================================================
--- wp-includes/js/mce-view.js	(revision 28745)
+++ wp-includes/js/mce-view.js	(working copy)
@@ -687,7 +687,33 @@
 				return this.template({ content: this.parsed });
 			}
 		} ),
-		edit: function() {}
+
+		edit: function( node ) {
+			var embed = media.embed,
+				self = this,
+				frame, data;
+
+			$( document ).trigger( 'media:edit' );
+
+			data = window.decodeURIComponent( $( node ).attr('data-wpview-text') );
+			frame = embed.edit( data );
+			frame.on( 'close', function() {
+				frame.detach();
+			} );
+			frame.state( 'embed' ).props.on( 'change:url', function (model, url) {
+				if ( ! url ) {
+					return;
+				}
+				frame.state( 'embed' ).metadata = model.toJSON();
+			} );
+			frame.state( 'embed' ).on( 'select', function() {
+				var shortcode = embed.shortcode( frame.state( 'embed' ).metadata ).string();
+				$( node ).attr( 'data-wpview-text', window.encodeURIComponent( shortcode ) );
+				wp.mce.views.refreshView( self, shortcode );
+				frame.detach();
+			} );
+			frame.open();
+		}
 	} );
 
 }(jQuery));
Index: wp-includes/js/media-editor.js
===================================================================
--- wp-includes/js/media-editor.js	(revision 28745)
+++ wp-includes/js/media-editor.js	(working copy)
@@ -298,6 +298,55 @@
 		}
 	};
 
+	wp.media.embed = {
+		coerce : wp.media.coerce,
+
+		defaults : {
+			url : '',
+			width: '',
+			height: ''
+		},
+
+		edit : function( data ) {
+			var frame, props = {},
+				shortcode = wp.shortcode.next( 'embed', data ).shortcode;
+
+			props = _.defaults( shortcode.attrs.named, this.defaults );
+			if ( shortcode.content ) {
+				props.url = shortcode.content;
+			}
+
+			frame = wp.media({
+				frame: 'post',
+				state: 'embed',
+				metadata: props
+			});
+
+			return frame;
+		},
+
+		shortcode : function( model ) {
+			var self = this, content;
+
+			_.each( this.defaults, function( value, key ) {
+				model[ key ] = self.coerce( model, key );
+
+				if ( value === model[ key ] ) {
+					delete model[ key ];
+				}
+			});
+
+			content = model.url;
+			delete model.url;
+
+			return new wp.shortcode({
+				tag: 'embed',
+				attrs: model,
+				content: content
+			});
+		}
+	};
+
 	wp.media.collection = function(attributes) {
 		var collections = {};
 
Index: wp-includes/js/media-views.js
===================================================================
--- wp-includes/js/media-views.js	(revision 28745)
+++ wp-includes/js/media-views.js	(working copy)
@@ -1402,15 +1402,17 @@
 
 			priority: 120,
 			type:     'link',
-			url:      ''
+			url:      '',
+			metadata: {}
 		},
 
 		// The amount of time used when debouncing the scan.
 		sensitivity: 200,
 
-		initialize: function() {
+		initialize: function(options) {
+			this.metadata = options.metadata;
 			this.debouncedScan = _.debounce( _.bind( this.scan, this ), this.sensitivity );
-			this.props = new Backbone.Model({ url: '' });
+			this.props = new Backbone.Model( this.metadata || { url: '' });
 			this.props.on( 'change:url', this.debouncedScan, this );
 			this.props.on( 'change:url', this.refresh, this );
 			this.on( 'scan', this.scanImage, this );
@@ -2278,7 +2280,8 @@
 			_.defaults( this.options, {
 				multiple:  true,
 				editing:   false,
-				state:    'insert'
+				state:    'insert',
+				metadata:  {}
 			});
 			/**
 			 * call 'initialize' directly on the parent class
@@ -2330,7 +2333,7 @@
 				}),
 
 				// Embed states.
-				new media.controller.Embed(),
+				new media.controller.Embed( { metadata: options.metadata } ),
 
 				new media.controller.EditImage( { model: options.editImage } ),
 
@@ -6440,7 +6443,9 @@
 		},
 
 		initialize: function() {
-			this.$input = $('<input id="embed-url-field" />').attr( 'type', 'text' ).val( this.model.get('url') );
+			var self = this;
+
+			this.$input = $('<input id="embed-url-field" type="text" />').val( this.model.get('url') );
 			this.input = this.$input[0];
 
 			this.spinner = $('<span class="spinner" />')[0];
@@ -6447,6 +6452,12 @@
 			this.$el.append([ this.input, this.spinner ]);
 
 			this.model.on( 'change:url', this.render, this );
+
+			if ( this.model.get( 'url' ) ) {
+				_.delay( function () {
+					self.model.trigger( 'change:url' );
+				}, 500 );
+			}
 		},
 		/**
 		 * @returns {wp.media.view.EmbedUrl} Returns itself to allow chaining
Index: wp-includes/media-template.php
===================================================================
--- wp-includes/media-template.php	(revision 28745)
+++ wp-includes/media-template.php	(working copy)
@@ -1077,6 +1077,7 @@
 
 	<script type="text/html" id="tmpl-editor-embed">
 		<div class="toolbar">
+			<div class="dashicons dashicons-edit edit"></div>
 			<div class="dashicons dashicons-no-alt remove"></div>
 		</div>
 		{{{ data.content }}}
