Index: src/wp-includes/class-wp-editor.php
===================================================================
--- src/wp-includes/class-wp-editor.php	(revision 27095)
+++ src/wp-includes/class-wp-editor.php	(working copy)
@@ -234,6 +234,7 @@
 						'textcolor',
 						'fullscreen',
 						'wordpress',
+						'wpaudiovideo',
 						'wpeditimage',
 						'wpgallery',
 						'wplink',
@@ -335,8 +336,12 @@
 					self::$first_init['external_plugins'] = json_encode( $mce_external_plugins );
 				}
 
+				$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+				$version = 'ver=' . $GLOBALS['wp_version'];
+				$dashicons = includes_url( "css/dashicons$suffix.css?$version" );
+
 				// WordPress default stylesheet
-				$mce_css = array( self::$baseurl . '/skins/wordpress/wp-content.css' );
+				$mce_css = array( $dashicons, self::$baseurl . '/skins/wordpress/wp-content.css' );
 
 				// load editor_style.css if the current theme supports it
 				if ( ! empty( $GLOBALS['editor_styles'] ) && is_array( $GLOBALS['editor_styles'] ) ) {
Index: src/wp-includes/js/tinymce/plugins/wpaudiovideo/plugin.js
===================================================================
--- src/wp-includes/js/tinymce/plugins/wpaudiovideo/plugin.js	(revision 0)
+++ src/wp-includes/js/tinymce/plugins/wpaudiovideo/plugin.js	(working copy)
@@ -0,0 +1,159 @@
+/* global tinymce */
+tinymce.PluginManager.add( 'wpaudiovideo', function( editor ) {
+
+	function parseMediaShortcode( content ) {
+		return content.replace( /\[(audio|video)[^\]]*\][\s\S]*?\[\/\1\]/g, function( match, type ) {
+			var data = window.encodeURIComponent( match ),
+				cls = 'dashicons-format-' + type;
+
+			return '<div class="wp-control" data-wp-control="' + data + '" contenteditable="false" tabindex="0"><p class="' + cls + '"><br></p></div>';
+		});
+	}
+
+	function getMediaShortcode( content ) {
+		function getAttr( str, name ) {
+			name = new RegExp( name + '=\"([^\"]+)\"', 'g' ).exec( str );
+			return name ? window.decodeURIComponent( name[1] ) : '';
+		}
+
+		return content.replace( /<div ([^>]+)>(?:\u00a0|&nbsp;| )*<\/div>/g, function( match, attr ) {
+			var data = getAttr( attr, 'data-wp-control' );
+
+			if ( data ) {
+				return data;
+			}
+
+			return match;
+		});
+	}
+
+	editor.on( 'BeforeSetContent', function( e ) {
+		e.content = parseMediaShortcode( e.content );
+	});
+
+	editor.on( 'PostProcess', function( e ) {
+		if ( e.get ) {
+			e.content = getMediaShortcode( e.content );
+		}
+	});
+
+	// Add padding <p> if the noneditable node is last
+	editor.on( 'SetContent', function( event ) {
+        var node, body, p,
+			dom = editor.dom;
+
+		if ( event.load || ! event.set ) {
+			body = editor.getBody();
+
+			if ( dom.hasClass( body.lastChild, 'wp-control' ) ) {
+				p = dom.create( 'p', { 'data-wp-control-after': '1' }, tinymce.Env.ie && tinymce.Env.ie < 11 ? '' : '<br data-mce-bogus="1" />' );
+				dom.insertAfter( p, body.lastChild );
+				
+				if ( ! event.set ) {
+					editor.nodeChanged();
+					editor.selection.select( p );
+					editor.selection.collapse( true );
+				}
+			}
+		}
+    });
+
+	editor.on( 'PreProcess', function( event ) {
+		var dom = editor.dom;
+
+		// Remove empty padding nodes
+		tinymce.each( dom.select( '[data-wp-control-after]', event.node ), function( node ) {
+			if ( dom.isEmpty( node ) ) {
+				dom.remove( node );
+			} else {
+				dom.setAttrib( node, 'data-wp-control-after', null );
+			}
+		});
+
+		// Empty the control nodes
+		tinymce.each( dom.select( '.wp-control', event.node ), function( node ) {
+			tinymce.each( node.childNodes, function( child ) {
+				dom.remove( child );
+			});
+		});
+    });
+    
+	editor.on( 'init', function() {
+		var dom = editor.dom,
+			selection = editor.selection;
+
+	    function moveCaret( node ) {
+			selection.select(  node.nextSibling || node.previousSibling || node.parentNode );
+			selection.collapse( true );
+			editor.nodeChanged();
+		}
+
+		function getWrapper( event ) {
+			if ( dom.hasClass( event.target, 'wp-control' ) ) {
+				return event.target;
+			} else {
+				return dom.getParent( event.target, 'div.wp-control' ) || dom.getParent( selection.getNode(), 'div.wp-control' );
+			}
+		}
+
+		editor.on( 'click contextmenu', function( event ) {
+			var wrapper = getWrapper( event );
+
+			if ( wrapper ) {
+				// Don't follow links in the non-editable wrapper
+				if ( dom.is( event.target, 'a' ) || dom.getParent( event.target, 'a' ) ) {
+					event.preventDefault();
+				}
+
+				if ( tinymce.Env.ie ) {
+					// Move the caret out of the wrapper
+					moveCaret( wrapper );
+				}
+			}
+		});
+
+		editor.on( 'mousedown', function( event ) {
+			var wrapper = getWrapper( event );
+
+			if ( wrapper ) {
+				dom.addClass( wrapper, 'wp-selected' )
+				event.preventDefault();
+
+				if ( tinymce.Env.ie && tinymce.Env.ie < 9 ) {		
+					// Move the caret out of the wrapper
+					setTimeout( function() {
+						moveCaret( wrapper );
+					}, 0 );
+					
+					
+					// Prevent IE < 9 from making the div resizable.
+					// Without this the tick border and resize handles show for a moment.
+					// oncontrolselect and unselectable="on" don't seem to work here :(
+		//			throw new Error('(ignore me)');
+				}
+			} else {
+				dom.removeClass( dom.select( 'div.wp-selected' ), 'wp-selected' );
+			}
+		});
+
+		editor.on( 'keydown', function( event ) {
+			var element, p,
+				key = event.keyCode;
+
+			if ( key === tinymce.util.VK.DELETE || key === tinymce.util.VK.BACKSPACE ) {
+				element = dom.select( 'div.wp-selected' );
+
+				if ( element.length ) {
+					dom.events.cancel( event );
+					dom.remove( element[0] );
+					editor.nodeChanged();
+				}
+			}
+		});
+	});
+
+	return {
+		parseMediaShortcode: parseMediaShortcode,
+		getMediaShortcode: getMediaShortcode
+	};
+});
Index: src/wp-includes/js/tinymce/skins/wordpress/wp-content.css
===================================================================
--- src/wp-includes/js/tinymce/skins/wordpress/wp-content.css	(revision 27095)
+++ src/wp-includes/js/tinymce/skins/wordpress/wp-content.css	(working copy)
@@ -127,6 +127,38 @@
 	border-style: solid;
 }
 
+/* Audio/video shortcodes */
+.mce-content-body .wp-media-shortcode {
+	margin-bottom: 20px;
+	border: 1px dashed #888;
+	background: #f2f2f2;
+	width: 99%;
+	height: 250px;
+	line-height: 250px;
+	outline: 0;
+	cursor: default;
+	color: transparent;
+	font-size: 48px;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	user-select: none;
+}
+
+.mce-content-body .wp-media-shortcode:before {
+	color: #444;
+}
+
+.mce-content-body .wp-media-shortcode.dashicons-format-audio {
+	height: 40px;
+	line-height: 40px;
+	font-size: 20px;
+}
+
+.mce-content-body .wp-media-shortcode-selected {
+	background-color: #ededed;
+	border-style: solid;
+}
+
 img.wp-oembed {
 	border: 1px dashed #888;
 	background: #f7f5f2 url("images/embedded.png") no-repeat scroll center center;
