Index: src/wp-includes/class-wp-editor.php
===================================================================
--- src/wp-includes/class-wp-editor.php	(revision 26931)
+++ src/wp-includes/class-wp-editor.php	(working copy)
@@ -222,6 +222,7 @@
 					 * the TinyMCE instance.
 					 */
 					$plugins = array_unique( apply_filters( 'tiny_mce_plugins', array(
+						'audiovideo',
 						'charmap',
 						'link',
 						'media',
@@ -332,8 +333,11 @@
 					self::$first_init['spellchecker_language'] = self::$mce_locale;
 				}
 
+				$suffix = SCRIPT_DEBUG ? '' : '.min';
+				$dashicons = "/wp-includes/css/dashicons$suffix.css";
+
 				// 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/formatting.php
===================================================================
--- src/wp-includes/formatting.php	(revision 26931)
+++ src/wp-includes/formatting.php	(working copy)
@@ -242,6 +242,9 @@
 		$pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee inside object/embed
 		$pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
 	}
+	if ( preg_match( '|[\[<]video|', $pee ) ) {
+		$pee = preg_replace( '#\s*<(track|source)([^>]*)>\s*#', '<$1$2>', $pee ); // no pee inside video tag/shortcode
+	}
 	$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
 	// make paragraphs, including one at the end
 	$pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY);
@@ -258,6 +261,7 @@
 	$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee);
 	if ( $br ) {
 		$pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee);
+		$pee = preg_replace_callback('/[\[<]video.*?[\[<]\/video[\]>]/s', '_autop_newline_preservation_helper', $pee);
 		$pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
 		$pee = str_replace('<WPPreserveNewline />', "\n", $pee);
 	}
Index: src/wp-includes/js/media-editor.js
===================================================================
--- src/wp-includes/js/media-editor.js	(revision 26931)
+++ src/wp-includes/js/media-editor.js	(working copy)
@@ -480,6 +480,9 @@
 				} else if ( h.indexOf('[gallery') !== -1 ) {
 					if ( ed.plugins.wpgallery )
 						h = ed.plugins.wpgallery._do_gallery(h);
+				} else if ( h.indexOf('[video') !== -1 || h.indexOf('[audio') !== -1 ) {
+					if ( ed.plugins.audiovideo )
+						h = ed.plugins.audiovideo._do_media(h);
 				} else if ( h.indexOf('[embed') === 0 ) {
 					if ( ed.plugins.wordpress )
 						h = ed.plugins.wordpress._setEmbed(h);
Index: src/wp-includes/js/tinymce/plugins/audiovideo/plugin.js
===================================================================
--- src/wp-includes/js/tinymce/plugins/audiovideo/plugin.js	(revision 0)
+++ src/wp-includes/js/tinymce/plugins/audiovideo/plugin.js	(working copy)
@@ -0,0 +1,68 @@
+/* global tinymce */
+tinymce.PluginManager.add('audiovideo', function( editor ) {
+
+	function parseMedia( content ) {
+		return content
+			.replace( /(\[audio[^\]]*\][\s\S]*?\[\/audio\])/g, function( match, attr ) {
+				var data = tinymce.DOM.encode( attr );
+				return '<div class="mceTemp media-shortcode-wrapper" draggable="true"><div class="dashicons dashicons-format-audio"></div><img src="' + tinymce.Env.transparentSrc + '" class="wp-media-shortcode wp-audio-shortcode mceItem" ' +
+					'title="' + data + '" data-mce-resize="false" data-mce-placeholder="1" /></div>';
+			})
+			.replace( /(\[video[^\]]*\][\s\S]*?\[\/video\])/g, function( match, attr ) {
+				var data = tinymce.DOM.encode( attr );
+				console.log( data );
+				return '<div class="mceTemp media-shortcode-wrapper" draggable="true"><div class="dashicons dashicons-format-video"></div><img src="' + tinymce.Env.transparentSrc + '" class="wp-media-shortcode wp-video-shortcode mceItem" ' +
+					'title="' + data + '" data-mce-resize="false" data-mce-placeholder="1" /></div>';
+			});
+	}
+
+	function getMedia( content ) {
+		function getAttr( str, name ) {
+			name = new RegExp( name + '=\"([^\"]+)\"', 'g' ).exec( str );
+			return name ? tinymce.DOM.decode( name[1] ) : '';
+		}
+
+		return content.replace( /(<img[^>]+>)<\/div>/g, function( match, image ) {
+			var cls = getAttr( image, 'class' );
+
+			if ( cls.indexOf('wp-audio-shortcode') !== -1 ) {
+				return tinymce.trim( getAttr( image, 'title' ) );
+			}
+
+			if ( cls.indexOf('wp-video-shortcode') !== -1 ) {
+				return tinymce.trim( getAttr( image, 'title' ) );
+			}
+
+			return match;
+		});
+	}
+
+	// Display 'media' instead of img in element path
+	editor.on( 'ResolveName', function( e ) {
+		var dom = editor.dom,
+			target = e.target;
+
+		if ( target.nodeName === 'IMG' && dom.hasClass( target, 'wp-audio-shortcode' ) ) {
+			e.name = 'audio';
+		}
+
+		if ( target.nodeName === 'IMG' && dom.hasClass( target, 'wp-video-shortcode' ) ) {
+			e.name = 'video';
+		}
+	});
+
+	editor.on( 'BeforeSetContent', function( e ) {
+		e.content = parseMedia( e.content );
+	});
+
+	editor.on( 'PostProcess', function( e ) {
+		if ( e.get ) {
+			e.content = getMedia( e.content );
+		}
+	});
+
+	return {
+		_do_media: parseMedia,
+		_get_media: getMedia
+	};
+});
Index: src/wp-includes/js/tinymce/skins/wordpress/wp-content.css
===================================================================
--- src/wp-includes/js/tinymce/skins/wordpress/wp-content.css	(revision 26931)
+++ src/wp-includes/js/tinymce/skins/wordpress/wp-content.css	(working copy)
@@ -122,6 +122,40 @@
 	border-style: solid;
 }
 
+.mce-content-body .media-shortcode-wrapper {
+	position: relative;
+	margin-bottom: 20px;
+}
+
+.mce-content-body .media-shortcode-wrapper .dashicons {
+	position: absolute;
+	z-index: 2;
+	left: 50%;
+	top: 50%;
+	font-size: 48px;
+	width: 48px;
+	height: 48px;
+	margin: -24px 0 0 -24px;
+}
+
+.mce-content-body img.wp-media-shortcode {
+	border: 1px dashed #888;
+	background: #f2f2f2;
+	width: 99%;
+	height: 250px;
+	outline: 0;
+	cursor: pointer;
+}
+
+.mce-content-body img.wp-audio-shortcode {
+	height: 100px;
+}
+
+.mce-content-body img.wp-media-shortcode:hover {
+	background-color: #ededed;
+	border-style: solid;
+}
+
 .mce-content-body img.wp-gallery.wp-gallery-selected {
 	background-color: #d8d8d8;
 	border-style: solid;
Index: src/wp-includes/media.php
===================================================================
--- src/wp-includes/media.php	(revision 26931)
+++ src/wp-includes/media.php	(working copy)
@@ -1223,6 +1223,14 @@
 			$html .= sprintf( $source, $type['type'], esc_url( $$fallback ) );
 		}
 	}
+
+	if ( ! empty( $content ) ) {
+		if ( false !== strpos( $content, "\n" ) )
+			$content = str_replace( array( "\r\n", "\n", "\t" ), '', $content );
+
+		$html .= trim( $content );
+	}
+
 	if ( 'mediaelement' === $library )
 		$html .= wp_mediaelement_fallback( $fileurl );
 	$html .= '</video>';
Index: tests/phpunit/tests/media.php
===================================================================
--- tests/phpunit/tests/media.php	(revision 26931)
+++ tests/phpunit/tests/media.php	(working copy)
@@ -346,4 +346,41 @@
 		$matches = get_media_embedded_in_content( $content, $types );
 		$this->assertEquals( $contents, $matches );
 	}
+
+	function test_video_shortcode_body() {
+		$width = 640;
+		$height = 360;
+
+		$video =<<<VIDEO
+[video width="640" height="360" mp4="http://wordpress-core-develop/wp-content/uploads/2013/12/XVMwB.mp4"]
+<!-- WebM/VP8 for Firefox4, Opera, and Chrome -->
+<source type="video/webm" src="myvideo.webm" />
+<!-- Ogg/Vorbis for older Firefox and Opera versions -->
+<source type="video/ogg" src="myvideo.ogv" />
+<!-- Optional: Add subtitles for each language -->
+<track kind="subtitles" src="subtitles.srt" srclang="en" />
+<!-- Optional: Add chapters -->
+<track kind="chapters" src="chapters.srt" srclang="en" />
+[/video]
+VIDEO;
+
+		$w = $GLOBALS['content_width'];
+		$h = ceil( ( $height * $w ) / $width );
+
+		$content = apply_filters( 'the_content', $video );
+
+		$expected = '<div style="width: ' . $w . 'px; max-width: 100%;" class="wp-video">' .
+				'<!--[if lt IE 9]><script>document.createElement(\'video\');</script><![endif]-->
+<video class="wp-video-shortcode" id="video-0-1" width="' . $w . '" height="' . $h . '" preload="metadata" controls="controls">' .
+'<source type="video/mp4" src="http://wordpress-core-develop/wp-content/uploads/2013/12/XVMwB.mp4" />' .
+'<!-- WebM/VP8 for Firefox4, Opera, and Chrome --><source type="video/webm" src="myvideo.webm" />' .
+'<!-- Ogg/Vorbis for older Firefox and Opera versions --><source type="video/ogg" src="myvideo.ogv" />' .
+'<!-- Optional: Add subtitles for each language --><track kind="subtitles" src="subtitles.srt" srclang="en" />' .
+'<!-- Optional: Add chapters --><track kind="chapters" src="chapters.srt" srclang="en" />' .
+'<a href="http://wordpress-core-develop/wp-content/uploads/2013/12/XVMwB.mp4">' .
+'http://wordpress-core-develop/wp-content/uploads/2013/12/XVMwB.mp4</a></video></div>
+';
+
+		$this->assertEquals( $expected, $content );
+	}
 }
