Index: src/wp-includes/js/mce-view.js
===================================================================
--- src/wp-includes/js/mce-view.js	(revision 32517)
+++ src/wp-includes/js/mce-view.js	(working copy)
@@ -93,8 +93,7 @@
 		setMarkers: function( content ) {
 			var pieces = [ { content: content } ],
 				self = this,
-				instance,
-				current;
+				instance, current;
 
 			_.each( views, function( view, type ) {
 				current = pieces.slice();
@@ -102,7 +101,7 @@
 
 				_.each( current, function( piece ) {
 					var remaining = piece.content,
-						result;
+						result, text;
 
 					// Ignore processed pieces, but retain their location.
 					if ( piece.processed ) {
@@ -119,10 +118,11 @@
 						}
 
 						instance = self.createInstance( type, result.content, result.options );
+						text = instance.loader ? '.' : instance.text;
 
 						// Add the processed piece for the match.
 						pieces.push( {
-							content: '<p data-wpview-marker="' + instance.encodedText + '">' + instance.text + '</p>',
+							content: '<p data-wpview-marker="' + instance.encodedText + '">' + text + '</p>',
 							processed: true
 						} );
 
@@ -138,7 +138,8 @@
 				} );
 			} );
 
-			return _.pluck( pieces, 'content' ).join( '' );
+			content = _.pluck( pieces, 'content' ).join( '' );
+			return content.replace( /<p>\s*<p data-wpview-marker=/g, '<p data-wpview-marker=' ).replace( /<\/p>\s*<\/p>/g, '</p>' );
 		},
 
 		/**
@@ -416,7 +417,7 @@
 		 */
 		replaceMarkers: function() {
 			this.getMarkers( function( editor, node ) {
-				if ( $( node ).text() !== this.text ) {
+				if ( ! this.loader && $( node ).text() !== this.text ) {
 					editor.dom.setAttrib( node, 'data-wpview-marker', null );
 					return;
 				}
Index: src/wp-includes/js/media-audiovideo.js
===================================================================
--- src/wp-includes/js/media-audiovideo.js	(revision 32517)
+++ src/wp-includes/js/media-audiovideo.js	(working copy)
@@ -704,7 +704,7 @@
 
 			if ( -1 === content.indexOf( attachment.get( 'url' ) ) ) {
 				content += [
-					'<track srclang="en" label="English"kind="subtitles" src="',
+					'<track srclang="en" label="English" kind="subtitles" src="',
 					attachment.get( 'url' ),
 					'" />'
 				].join('');
Index: src/wp-includes/js/media/views/frame/video-details.js
===================================================================
--- src/wp-includes/js/media/views/frame/video-details.js	(revision 32517)
+++ src/wp-includes/js/media/views/frame/video-details.js	(working copy)
@@ -120,7 +120,7 @@
 
 			if ( -1 === content.indexOf( attachment.get( 'url' ) ) ) {
 				content += [
-					'<track srclang="en" label="English"kind="subtitles" src="',
+					'<track srclang="en" label="English" kind="subtitles" src="',
 					attachment.get( 'url' ),
 					'" />'
 				].join('');
Index: src/wp-includes/js/tinymce/plugins/wpview/plugin.js
===================================================================
--- src/wp-includes/js/tinymce/plugins/wpview/plugin.js	(revision 32517)
+++ src/wp-includes/js/tinymce/plugins/wpview/plugin.js	(working copy)
@@ -152,19 +152,20 @@
 		};
 	}
 
-	// Remove the content of view wrappers from HTML string
-	function emptyViews( content ) {
-		content = content.replace( /<div[^>]+data-wpview-text="([^"]+)"[^>]*>[\s\S]+?wpview-selection-after[^>]+>[^<>]*<\/p>\s*<\/div>/g, function( all, match ) {
-			return '<p>' + window.decodeURIComponent( match ) + '</p>';
-		});
+	function resetViewsCallback( match, viewText ) {
+		return '<p>' + window.decodeURIComponent( viewText ) + '</p>';
+	}
 
-		return content.replace( / data-wpview-marker="[^"]+"/g, '' );
+	// Replace the view tags with the view string
+	function resetViews( content ) {
+		return content.replace( /<div[^>]+data-wpview-text="([^"]+)"[^>]*>(?:[\s\S]+?wpview-selection-after[^>]+>[^<>]*<\/p>\s*|\.)<\/div>/g, resetViewsCallback )
+			.replace( /<p [^>]*?data-wpview-marker="([^"]+)"[^>]*>[\s\S]*?<\/p>/g, resetViewsCallback );
 	}
 
 	// Prevent adding undo levels on changes inside a view wrapper
 	editor.on( 'BeforeAddUndo', function( event ) {
 		if ( event.level.content ) {
-			event.level.content = emptyViews( event.level.content );
+			event.level.content = resetViews( event.level.content );
 		}
 	});
 
@@ -348,33 +349,31 @@
 		}
 	});
 
-	function resetViews( rootNode ) {
-		// Replace view nodes
-		$( 'div[data-wpview-text]', rootNode ).each( function( i, node ) {
-			var $node = $( node ),
-				text = window.decodeURIComponent( $node.attr( 'data-wpview-text' ) || '' );
-
-			if ( text && node.parentNode ) {
-				$node.replaceWith( $( editor.dom.create('p') ).text( text ) );
-			}
+	// Empty the wpview wrap and marker nodes
+	function emptyViewNodes( rootNode ) {
+		$( 'div[data-wpview-text], p[data-wpview-marker]', rootNode ).each( function( i, node ) {
+			node.innerHTML = '.';
 		});
-
-		// Remove marker attributes
-		$( 'p[data-wpview-marker]', rootNode ).attr( 'data-wpview-marker', null );
 	}
 
+	// Run that before the DOM cleanup
 	editor.on( 'PreProcess', function( event ) {
-		// Replace the view nodes with their text in the DOM clone.
-		resetViews( event.node );
+		emptyViewNodes( event.node );
 	}, true );
 
 	editor.on( 'hide', function() {
-		// Replace the view nodes with their text directly in the editor body.
 		wp.mce.views.unbind();
 		deselect();
-		resetViews( editor.getBody() );
+		emptyViewNodes();
 	});
 
+	editor.on( 'PostProcess', function( event ) {
+		if ( event.content ) {
+			event.content = event.content.replace( /<div [^>]*?data-wpview-text="([^"]+)"[^>]*>[\s\S]*?<\/div>/g, resetViewsCallback )
+				.replace( /<p [^>]*?data-wpview-marker="([^"]+)"[^>]*>[\s\S]*?<\/p>/g, resetViewsCallback );
+		}
+	});
+
 	// Excludes arrow keys, delete, backspace, enter, space bar.
 	// Ref: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode
 	function isSpecialKey( key ) {
