Index: wp-admin/js/editor.js
===================================================================
--- wp-admin/js/editor.js	(revision 31803)
+++ wp-admin/js/editor.js	(working copy)
@@ -142,6 +142,10 @@
 			});
 		}
 
+        	//Blocks for which to retain the p tag
+        	skipBlocklist = 'ul|ol|li|table|thead|tbody|tfoot|tr|th|td';
+        	preserve_p = new RegExp( '\\s*</(' + skipBlocklist + ')>\\s*', 'g' ).test(content);
+
 		// Pretty it up for the source editor
 		blocklist1 = 'blockquote|ul|ol|li|table|thead|tbody|tfoot|tr|th|td|div|h[1-6]|p|fieldset';
 		content = content.replace( new RegExp( '\\s*</(' + blocklist1 + ')>\\s*', 'g' ), '</$1>\n' );
@@ -153,11 +157,13 @@
 		// Separate <div> containing <p>
 		content = content.replace( /<div( [^>]*)?>\s*<p>/gi, '<div$1>\n\n' );
 
-		// Remove <p> and <br />
-		content = content.replace( /\s*<p>/gi, '' );
-		content = content.replace( /\s*<\/p>\s*/gi, '\n\n' );
-		content = content.replace( /\n[\s\u00a0]+\n/g, '\n\n' );
-		content = content.replace( /\s*<br ?\/?>\s*/gi, '\n' );
+		// Remove <p> and <br />. Also check the block list to be skipped.
+        	if ( false === preserve_p ) {
+            		content = content.replace( /\s*<p>/gi, '' );
+	            	content = content.replace( /\s*<\/p>\s*/gi, '\n\n' );
+		        content = content.replace( /\n[\s\u00a0]+\n/g, '\n\n' );
+            		content = content.replace( /\s*<br ?\/?>\s*/gi, '\n' );
+        	}
 
 		// Fix some block element newline issues
 		content = content.replace( /\s*<div/g, '\n<div' );
Index: wp-includes/js/tinymce/plugins/wordpress/plugin.js
===================================================================
--- wp-includes/js/tinymce/plugins/wordpress/plugin.js	(revision 31803)
+++ wp-includes/js/tinymce/plugins/wordpress/plugin.js	(working copy)
@@ -379,7 +379,7 @@
 
 	editor.on( 'SaveContent', function( e ) {
 		// If editor is hidden, we just want the textarea's value to be saved
-		if ( ! editor.inline && editor.isHidden() ) {
+		if ( ( ! editor.inline && editor.isHidden() ) || editor.isNotDirty ) {
 			e.content = e.element.value;
 			return;
 		}
