Index: wp-admin/js/editor.dev.js
===================================================================
--- wp-admin/js/editor.dev.js	(revision 21206)
+++ wp-admin/js/editor.dev.js	(working copy)
@@ -209,6 +209,9 @@
 		if ( preserve_br )
 			pee = pee.replace(/<wp-temp-br([^>]*)>/g, '<br$1>');
 
+		if ( typeof(tinymce) != 'undefined' && tinymce.isIE )
+			pee = pee.replace(/<p>&nbsp;<\/p>/gi, '<p></p>');
+
 		return pee;
 	},
 
Index: wp-admin/js/media-upload.dev.js
===================================================================
--- wp-admin/js/media-upload.dev.js	(revision 21206)
+++ wp-admin/js/media-upload.dev.js	(working copy)
@@ -26,7 +26,7 @@
 
 		if ( h.indexOf('[caption') === 0 ) {
 			if ( ed.wpSetImgCaption )
-				h = ed.wpSetImgCaption(h);
+				h = ed.wpSetImgCaption(h, true);
 		} else if ( h.indexOf('[gallery') === 0 ) {
 			if ( ed.plugins.wpgallery )
 				h = ed.plugins.wpgallery._do_gallery(h);
@@ -79,8 +79,7 @@
 			var ed;
 
 			if ( typeof(tinymce) != 'undefined' && tinymce.isIE && ( ed = tinymce.get(wpActiveEditor) ) && !ed.isHidden() ) {
-				ed.focus();
-				ed.windowManager.insertimagebookmark = ed.selection.getBookmark();
+				ed.windowManager.insertimagebookmark = ed.selection.getBookmark(2);
 			}
 		});
 	});
Index: wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js
===================================================================
--- wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js	(revision 21206)
+++ wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js	(working copy)
@@ -124,21 +124,37 @@
 			});
 
 			ed.onPostProcess.add(function(ed, o) {
-				if (o.get)
+				if ( o.get )
 					o.content = ed.wpGetImgCaption(o.content);
 			});
 
-			ed.wpSetImgCaption = function(content) {
-				return t._do_shcode(content);
+			ed.wpSetImgCaption = function(str, insert) {
+				return t._do_shcode(str, insert);
 			};
 
-			ed.wpGetImgCaption = function(content) {
-				return t._get_shcode(content);
+			ed.wpGetImgCaption = function(str) {
+				return t._get_shcode(str);
 			};
 		},
 
-		_do_shcode : function(content) {
-			return content.replace(/(?:<p>)?\[(?:wp_)?caption([^\]]+)\]([\s\S]+?)\[\/(?:wp_)?caption\](?:<\/p>)?/g, function(a,b,c){
+		_do_shcode : function(str, insert) {
+			var ed = this.editor, n;
+
+			if ( insert ) { // new image with caption inserted
+				n = ed.selection.getNode();
+
+				if ( n && n.nodeName === 'P' && /^(?:&nbsp;|<br[^>]*>|\s|\uFEFF|\u200B)*$/.test(n.innerHTML) ) {
+					// add a paragraph after the caption, the caret would go there
+					if ( tinymce.isIE ) {
+						str += '<p>'
+					} else {
+						ed.selection.select(n);
+						str += '<p></p>'
+					}
+				}
+			}
+
+			return str.replace(/(?:<p>)?\[(?:wp_)?caption([^\]]+)\]([\s\S]+?)\[\/(?:wp_)?caption\](?:<\/p>)?/g, function(a,b,c){
 				var id, cls, w, cap, div_cls, img, trim = tinymce.trim;
 
 				id = b.match(/id=['"]([^'"]*)['"] ?/);
