Index: src/wp-includes/js/mce-view.js
===================================================================
--- src/wp-includes/js/mce-view.js	(revision 28062)
+++ src/wp-includes/js/mce-view.js	(working copy)
@@ -41,7 +41,7 @@
 					doc = editor.getDoc();
 					$( doc ).find( '[data-wpview-text="' + this.encodedText + '"]' ).each(function (i, elem) {
 						var node = $( elem );
-						node.html( html );
+						node.html( html ).append( '<span data-wp-view-end class="wp-view-end"></span>' );
 						$( self ).trigger( 'ready', elem );
 					});
 				}
@@ -339,6 +339,7 @@
 	 * @mixin
 	 */
 	wp.mce.media = {
+		loaded: false,
 		/**
 		 * @global wp.shortcode
 		 *
@@ -410,11 +411,26 @@
 	 */
 	wp.mce.media.View = wp.mce.View.extend({
 		initialize: function( options ) {
+			this.players = {};
 			this.shortcode = options.shortcode;
+			this.parsing = 0;
 			_.bindAll( this, 'setPlayer' );
 			$(this).on( 'ready', this.setPlayer );
 		},
 
+		countShortcodes: function () {
+			var size = 0, self = this;
+			_.each( tinymce.editors, function( editor ) {
+				var doc;
+				if ( editor.plugins.wpview ) {
+					doc = editor.getDoc();
+					size += $( doc ).find( '[data-wpview-text="' + self.encodedText + '"]' ).length;
+				}
+			} );
+
+			return size;
+		},
+
 		/**
 		 * Creates the player instance for the current node
 		 *
@@ -435,9 +451,8 @@
 				firefox = this.ua.is( 'ff' ),
 				className = '.wp-' +  this.shortcode.tag + '-shortcode';
 
-			if ( this.player ) {
-				this.unsetPlayer();
-			}
+			this.size = this.countShortcodes();
+			this.pauseAllPlayers();
 
 			media = $( node ).find( className );
 
@@ -459,9 +474,19 @@
 
 			media = wp.media.view.MediaDetails.prepareSrc( media.get(0) );
 
-			setTimeout( function() {
-				self.player = new MediaElementPlayer( media, this.mejsSettings );
-			}, 75 );
+			setTimeout( function () {
+				var player = new MediaElementPlayer( media, this.mejsSettings );
+				
+				wp.mce.media.loaded = true;
+				if ( self.players[ self.parsing ] ) {
+					self.removePlayer( self.players[ self.parsing ] );
+				}
+				self.players[ self.parsing ] = player;
+				self.parsing += 1;
+				if ( self.parsing === self.size ) {
+					self.parsing = 0;
+				}
+			}, wp.mce.media.loaded ? 10 : 500 );
 		},
 
 		/**
Index: src/wp-includes/js/media-audiovideo.js
===================================================================
--- src/wp-includes/js/media-audiovideo.js	(revision 28062)
+++ src/wp-includes/js/media-audiovideo.js	(working copy)
@@ -128,8 +128,8 @@
 		 *	MediaElement tries to pull the audio/video tag out of
 		 *	its container and re-add it to the DOM.
 		 */
-		removePlayer: function() {
-			var t = this.player, featureIndex, feature;
+		removePlayer: function(t) {
+			var featureIndex, feature;
 
 			// invoke features cleanup
 			for ( featureIndex in t.options.features ) {
@@ -145,13 +145,13 @@
 				t.$node.remove();
 			}
 
-			if ( 'native' !== t.media.pluginType ) {
-				t.media.remove();
-			}
+			t.media.remove();
 
 			delete window.mejs.players[t.id];
 
-			t.container.remove();
+			if (typeof t.container == 'object') {
+				t.container.remove();
+			}
 			t.globalUnbind();
 			delete t.node.player;
 		},
@@ -165,7 +165,7 @@
 		unsetPlayer : function() {
 			if ( this.player ) {
 				wp.media.mixin.pauseAllPlayers();
-				wp.media.mixin.removePlayer.apply( this );
+				wp.media.mixin.removePlayer( this.player );
 				this.player = false;
 			}
 		}
Index: src/wp-includes/js/mediaelement/wp-mediaelement.css
===================================================================
--- src/wp-includes/js/mediaelement/wp-mediaelement.css	(revision 28062)
+++ src/wp-includes/js/mediaelement/wp-mediaelement.css	(working copy)
@@ -72,7 +72,7 @@
 	max-width: 100%;
 }
 
-.wp-playlist audio {
+.wp-playlist audio, audio.wp-audio-shortcode {
 	display: none;
 	max-width: 100%;
 	width: 400px;
Index: src/wp-includes/js/tinymce/plugins/wpview/plugin.js
===================================================================
--- src/wp-includes/js/tinymce/plugins/wpview/plugin.js	(revision 28062)
+++ src/wp-includes/js/tinymce/plugins/wpview/plugin.js	(working copy)
@@ -141,8 +141,21 @@
 	}
 
 	editor.on( 'BeforeAddUndo', function( event ) {
-		if ( selected && ! toRemove ) {
-			event.preventDefault();
+		var replace,
+			previousContent,
+			content;
+
+		replace = function( content ) {
+			return content.replace(/(<div[^>]+wpview-wrap[^>]+>)([\s\S]+)(<span[^>]+data-wp-view-end[^>]+><\/span><\/div>)/mg, '$`$1$3$\'' );
+		};
+
+		if ( event.lastLevel ) {
+			previousContent = replace( event.lastLevel.content );
+			content = replace( event.level.content );
+
+			if ( content === previousContent ) {
+				event.preventDefault();
+			}
 		}
 	});
 
@@ -162,11 +175,7 @@
 	editor.on( 'SetContent', function( event ) {
 		var body, padNode;
 
-		// don't (re-)render views if the format of the content is raw
-		// to avoid adding additional undo levels on undo/redo
-		if ( event.format !== 'raw' ) {
-			wp.mce.views.render();
-		}
+		wp.mce.views.render();
 
 		// Add padding <p> if the noneditable node is last
 		if ( event.load || ! event.set ) {
Index: src/wp-includes/js/tinymce/tinymce.js
===================================================================
--- src/wp-includes/js/tinymce/tinymce.js	(revision 28062)
+++ src/wp-includes/js/tinymce/tinymce.js	(working copy)
@@ -17165,12 +17165,12 @@
 					return null;
 				}
 
-				if (editor.fire('BeforeAddUndo', {level: level, originalEvent: event}).isDefaultPrevented()) {
+				lastLevel = data[index];
+				if (editor.fire('BeforeAddUndo', {level: level, lastLevel: lastLevel, originalEvent: event}).isDefaultPrevented()) {
 					return null;
 				}
 
 				// Add undo level if needed
-				lastLevel = data[index];
 				if (lastLevel && lastLevel.content == level.content) {
 					return null;
 				}
@@ -34977,4 +34977,4 @@
 });
 
 expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/dom/DomQuery","tinymce/html/Styles","tinymce/dom/TreeWalker","tinymce/util/Tools","tinymce/dom/Range","tinymce/html/Entities","tinymce/Env","tinymce/dom/StyleSheetLoader","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/RangeUtils","tinymce/dom/Selection","tinymce/fmt/Preview","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/util/Observable","tinymce/Shortcuts","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/ui/ComboBox","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/ListBox","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
-})(this);
\ No newline at end of file
+})(this);
