Index: wp-admin/js/editor.js
===================================================================
--- wp-admin/js/editor.js	(revision 8259)
+++ wp-admin/js/editor.js	(working copy)
@@ -53,6 +53,7 @@
         content = content.replace(new RegExp('\\s*<div', 'mg'), '\n<div');
         content = content.replace(new RegExp('</div>\\s*', 'mg'), '</div>\n');
 		content = content.replace(new RegExp('\\s*\\[wp_caption([^\\[]+)\\[/wp_caption\\]\\s*', 'gi'), '\n\n[wp_caption$1[/wp_caption]\n\n');
+		content = content.replace(new RegExp('wp_caption\\]\\n\\n+\\[wp_caption', 'g'), 'wp_caption]\n\n[wp_caption');
 
         var blocklist2 = 'blockquote|ul|ol|li|table|thead|tr|th|td|h[1-6]|pre';
         content = content.replace(new RegExp('\\s*<(('+blocklist2+') ?[^>]*)\\s*>', 'mg'), '\n<$1>');
Index: wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js
===================================================================
--- wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	(revision 8259)
+++ wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	(working copy)
@@ -127,68 +127,48 @@
 			});
 
 			// Add Media buttons to fullscreen
-            ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) {
-          		if ( 'mceFullScreen' != cmd ) return;
+			ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) {
+				if ( 'mceFullScreen' != cmd ) return;
 				if ( 'mce_fullscreen' != ed.id )
 					ed.settings.theme_advanced_buttons1 += ',|,add_image,add_video,add_audio,add_media';
-      		});
+			});
 
 			// Add class "alignleft", "alignright" and "aligncenter" when selecting align for images.
-			ed.onExecCommand.add(function( ed, cmd ) {
-				var n, bl, dom = ed.dom;
+			ed.addCommand('JustifyLeft', function() {
+				var n = ed.selection.getNode();
 
-				if ( 'JustifyCenter' == cmd ) {
-					tinymce.each(dom.select('img'), function(n) {
-						var v = n.className;
+				if ( n.nodeName != 'IMG' )
+					ed.editorCommands.mceJustify('JustifyLeft', 'left');
+				else ed.plugins.wordpress.do_align(n, 'alignleft');
+			});
 
-						if (v.indexOf('aligncenter') == -1) {
-							dom.getParent(n, function(P) {
-								if (P && P.style && P.style.textAlign == 'center')
-									dom.setStyle(P, 'textAlign', '');
-							});
-						}
-					});
+			ed.addCommand('JustifyRight', function() {
+				var n = ed.selection.getNode();
 
-					ed.execCommand('mceRepaint');
-				}
+				if ( n.nodeName != 'IMG' )
+					ed.editorCommands.mceJustify('JustifyRight', 'right');
+				else ed.plugins.wordpress.do_align(n, 'alignright');
 			});
 
-			ed.onBeforeExecCommand.add(function( ed, cmd ) {
-				var n, dir, xdir, bl, dom = ed.dom;
+			ed.addCommand('JustifyCenter', function() {
+				var n = ed.selection.getNode(), P = ed.dom.getParent(n, 'p'), DL = ed.dom.getParent(n, 'dl');
 
-				if ( ( cmd.indexOf('Justify') != -1 ) && ( n = ed.selection.getNode() ) ) {
-					if ( 'JustifyFull' == cmd || n.nodeName !== 'IMG' ) return;
-					dir = cmd.substring(7).toLowerCase();
-
-					if (  ed.queryCommandState( cmd ) ) {
-						n.className = n.className.replace(/align[^ '"]+\s?/g, '');
-						dom.addClass( n, "alignnone" );
-					} else if ( 'JustifyCenter' == cmd ) {
-						n.className = n.className.replace(/alignleft\s?|alignright\s?|alignnone\s?/g, '');
-						if ( dom.hasClass( n, "aligncenter" ) ) {
-							dom.removeClass( n, "aligncenter" );
-							dom.addClass( n, "alignnone" );
-						} else
-							dom.addClass( n, "aligncenter" );
-
-					} else {
-						n.className = n.className.replace(/align[^ '"]+\s?/g, '');
-						dom.addClass( n, "align"+dir );
-					}
-				}
+				if ( n.nodeName == 'IMG' && ( P || DL ) )
+					ed.plugins.wordpress.do_align(n, 'aligncenter');
+				else ed.editorCommands.mceJustify('JustifyCenter', 'center');
 			});
 
-            // Word count if script is loaded
-            if ( 'undefined' != typeof wpWordCount ) {
-                var last = 0;
-                ed.onKeyUp.add(function(ed, e) {
-                    if ( e.keyCode == last ) return;
-                    if ( 13 == e.keyCode || 8 == last || 46 == last ) wpWordCount.wc( ed.getContent({format : 'raw'}) );
-                    last = e.keyCode;
-                });
-            };
+			// Word count if script is loaded
+			if ( 'undefined' != typeof wpWordCount ) {
+				var last = 0;
+				ed.onKeyUp.add(function(ed, e) {
+					if ( e.keyCode == last ) return;
+					if ( 13 == e.keyCode || 8 == last || 46 == last ) wpWordCount.wc( ed.getContent({format : 'raw'}) );
+					last = e.keyCode;
+				});
+			};
 
-            // Add listeners to handle more break
+			// Add listeners to handle more break
 			t._handleMoreBreak(ed, url);
 
 			// Add custom shortcuts
@@ -227,7 +207,31 @@
 		},
 
 		// Internal functions
+		do_align : function(n, a) {
+			var P, DL, DIV, cls, c, ed = tinyMCE.activeEditor;
 
+			P = ed.dom.getParent(n, 'p');
+			DL = ed.dom.getParent(n, 'dl');
+			DIV = ed.dom.getParent(n, 'div');
+
+			if ( DL && DIV ) {
+				cls = ed.dom.hasClass(DL, a) ? 'alignnone' : a;
+				DL.className = DL.className.replace(/align[^ '"]+\s?/g, '');
+				ed.dom.addClass(DL, cls);
+				c = (cls == 'aligncenter') ? ed.dom.addClass(DIV, 'mceIEcenter') : ed.dom.removeClass(DIV, 'mceIEcenter');
+			} else if ( P ) {
+				cls = ed.dom.hasClass(n, a) ? 'alignnone' : a;
+				n.className = n.className.replace(/align[^ '"]+\s?/g, '');
+				ed.dom.addClass(n, cls);
+				if ( cls == 'aligncenter' )
+					ed.dom.setStyle(P, 'textAlign', 'center');
+				else if (P.style && P.style.textAlign == 'center')
+					ed.dom.setStyle(P, 'textAlign', '');
+			}
+
+			ed.execCommand('mceRepaint');
+		},
+
 		// Resizes the iframe by a relative height value
 		_resizeIframe : function(ed, tb_id, dy) {
 			var ifr = ed.getContentAreaContainer().firstChild;
Index: wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js
===================================================================
--- wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js	(revision 8259)
+++ wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js	(working copy)
@@ -21,16 +21,16 @@
 
 			ed.onInit.add(function(ed) {
 				tinymce.dom.Event.add(ed.getWin(), 'scroll', function(e) {
-	  				ed.plugins.wpeditimage.hideButtons();
+					ed.plugins.wpeditimage.hideButtons();
 				});
 			});
 
 			ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) {
 				ed.plugins.wpeditimage.hideButtons();
-      		});
+			});
 
 			ed.onSaveContent.add(function(ed, o) {
-   				ed.plugins.wpeditimage.hideButtons();
+				ed.plugins.wpeditimage.hideButtons();
 			});
 
 			ed.onMouseUp.add(function(ed, e) {
@@ -63,8 +63,8 @@
 			});
 
 			ed.onBeforeSetContent.add(function(ed, o) {
-           		o.content = t._do_shcode(o.content);
-      		});
+				o.content = t._do_shcode(o.content);
+			});
 
 			ed.onPostProcess.add(function(ed, o) {
 				if (o.get)
@@ -74,8 +74,8 @@
 
 		_do_shcode : function(co) {
 			return co.replace(/\[wp_caption([^\]]+)\]([\s\S]+?)\[\/wp_caption\][\s\u00a0]*/g, function(a,b,c){
-				var id = b.match(/id=['"]([^'"]+)/), cls = b.match(/align=['"]([^'"]+)/);
-				var w = b.match(/width=['"]([0-9]+)/), cap = b.match(/caption=['"]([^'"]+)/);
+				var id = b.match(/id=['"]([^'"]+)/i), cls = b.match(/align=['"]([^'"]+)/i);
+				var w = b.match(/width=['"]([0-9]+)/), cap = b.match(/caption=['"]([^'"]+)/i);
 
 				id = ( id && id[1] ) ? id[1] : '';
 				cls = ( cls && cls[1] ) ? cls[1] : 'alignnone';
@@ -91,8 +91,8 @@
 		},
 
 		_get_shcode : function(co) {
-			return co.replace(/<div class="mceTemp[^"]*">\s*<dl([^>]+)>\s*<dt[^>]+>([\s\S]+?)<\/dt>\s*<dd[^>]+>([^<]+)<\/dd>\s*<\/dl>\s*<\/div>\s*/g, function(a,b,c,cap){
-				var id = b.match(/id=['"]([^'"]+)/), cls = b.match(/class=['"]([^'"]+)/);
+			return co.replace(/<div class="mceTemp[^"]*">\s*<dl([^>]+)>\s*<dt[^>]+>([\s\S]+?)<\/dt>\s*<dd[^>]+>([^<]+)<\/dd>\s*<\/dl>\s*<\/div>\s*/gi, function(a,b,c,cap){
+				var id = b.match(/id=['"]([^'"]+)/i), cls = b.match(/class=['"]([^'"]+)/i);
 				var w = c.match(/width=['"]([0-9]+)/);
 
 				id = ( id && id[1] ) ? id[1] : '';
@@ -100,26 +100,12 @@
 				w = ( w && w[1] ) ? w[1] : '';
 
 				if ( ! w || ! cap ) return c;
-				cls = cls ? cls.match(/align[^ '"]+/) : '';
+				cls = cls.match(/align[^ '"]+/) || 'alignnone';
 
 				return '[wp_caption id="'+id+'" align="'+cls+'" width="'+w+'" caption="'+cap+'"]'+c+'[/wp_caption]';
 			});
 		},
 
-		_fixCenter : function(c) {
-			var ed = tinyMCE.activeEditor;
-
-			tinymce.each(ed.dom.select('img', c), function(n) {
-				if ( ed.dom.hasClass(n, 'aligncenter') ) {
-					var P = ed.dom.getParent(n, 'p');
-					if ( tinymce.isIE )
-						ed.dom.addClass(P, 'mce_iecenter');
-					if ( P.style && P.style.textAlign == 'center' )
-						ed.dom.setStyle(P, 'textAlign', '');
-				}
-			});
-		},
-
 		showButtons : function(n) {
 			var t = this, ed = tinyMCE.activeEditor, p1, p2, vp, DOM = tinymce.DOM, X, Y;
 
@@ -172,7 +158,7 @@
 				ed.windowManager.bookmark = ed.selection.getBookmark('simple');
 				ed.execCommand("WP_EditImage");
 				this.parentNode.style.display = 'none';
-			}
+			};
 
 			var wp_delimgbtn = DOM.add('wp_editbtns', 'img', {
 				src : t.url+'/img/delete.png',
@@ -196,7 +182,7 @@
 					ed.execCommand('mceRepaint');
 					return false;
 				}
-			}
+			};
 		},
 
 		getInfo : function() {
Index: wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js
===================================================================
--- wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js	(revision 8259)
+++ wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js	(working copy)
@@ -260,11 +260,11 @@
 		if ( DL = dom.getParent(el, 'dl') ) {
 			var dlc = ed.dom.getAttrib(DL, 'class');
 			dlc = dlc.match(/align[^ "']+/i);
-			if ( ! dom.hasClass(el, dlc) )
+			if ( dlc && ! dom.hasClass(el, dlc) )
 				c += ' '+dlc;
-				
+
 			tinymce.each(DL.childNodes, function(e) {
-				if ( e.nodeName == 'DD' ) {
+				if ( e.nodeName == 'DD' && dom.hasClass(e, 'wp_caption_dd') ) {
 					caption = e.innerHTML;
 					return;
 				}
@@ -377,16 +377,10 @@
 			'class' : img_class
 		});
 
-		if ( ! f.link_href.value ) {
-			if ( A ) {
-				b = ed.selection.getBookmark();
-				ed.dom.remove(A, 1);
-				ed.selection.moveToBookmark(b);
-			}
-		} else {
+		if ( f.link_href.value ) {
 			// Create new anchor elements
 			if ( A == null ) {
-				if ( ! f.link_href.value.match(/https?:\/\//) )
+				if ( ! f.link_href.value.match(/https?:\/\//i) )
 					f.link_href.value = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.link_href.value);
 
 				if ( tinymce.isWebKit && ed.dom.hasClass(el, 'aligncenter') ) {
@@ -431,18 +425,26 @@
 					style : 'width: '+cap_width+'px;'
 				});
 
-				if ( DIV ) 
+				if ( DIV )
 					ed.dom.setAttrib(DIV, 'class', div_cls);
 
 				if ( (DT = ed.dom.getParent(el, 'dt')) && (DD = DT.nextSibling) && ed.dom.hasClass(DD, 'wp_caption_dd') )
 					ed.dom.setHTML(DD, f.img_alt.value);
 
 			} else {
+				var lnk = '', pa;
 				if ( (id = f.img_classes.value.match( /wp-image-([0-9]{1,6})/ )) && id[1] )
 					cap_id = 'attachment_'+id[1];
 
-				if ( f.link_href.value ) html = ed.dom.getOuterHTML(ed.dom.getParent(el, 'a'));
-				else html = ed.dom.getOuterHTML(el);
+				if ( f.link_href.value && (lnk = ed.dom.getParent(el, 'a')) ) {
+					if ( lnk.childNodes.length == 1 )
+						html = ed.dom.getOuterHTML(lnk);
+					else {
+						html = ed.dom.getOuterHTML(lnk);
+						html = html.match(/<a[^>]+>/i);
+						html = html+ed.dom.getOuterHTML(el)+'</a>';
+					}
+				} else html = ed.dom.getOuterHTML(el);
 
 				html = '<dl id="'+cap_id+'" class="wp_caption '+t.align+'" style="width: '+cap_width+
 				'px"><dt class="wp_caption_dt">'+html+'</dt><dd class="wp_caption_dd">'+f.img_alt.value+'</dd></dl>';
@@ -451,19 +453,25 @@
 
 				if ( P ) {
 					P.parentNode.insertBefore(cap, P);
-					ed.dom.remove(P);
+					if ( P.childNodes.length == 1 )
+						ed.dom.remove(P);
+					else if ( lnk && lnk.childNodes.length == 1 )
+						ed.dom.remove(lnk);
+					else ed.dom.remove(el);
+				} else if ( pa = ed.dom.getParent(el, 'TD,TH,LI') ) {
+					pa.appendChild(cap);
+					if ( lnk && lnk.childNodes.length == 1 )
+						ed.dom.remove(lnk);
+					else ed.dom.remove(el);
 				}
 			}
 
-			tinyMCEPopup.execCommand("mceEndUndoLevel");
-			ed.execCommand('mceRepaint');
-			tinyMCEPopup.close();
-			return;
 		} else {
 			if ( DL && DIV ) {
-				if ( f.link_href.value ) html = ed.dom.getOuterHTML(ed.dom.getParent(el, 'a'));
+				var aa;
+				if ( f.link_href.value && (aa = ed.dom.getParent(el, 'a')) ) html = ed.dom.getOuterHTML(aa);
 				else html = ed.dom.getOuterHTML(el);
-				
+
 				P = ed.dom.create('p', {}, html);
 				DIV.parentNode.insertBefore(P, DIV);
 				ed.dom.remove(DIV);
@@ -478,6 +486,12 @@
 				ed.dom.setStyle(P, 'textAlign', '');
 		}
 
+		if ( ! f.link_href.value && A ) {
+			b = ed.selection.getBookmark();
+			ed.dom.remove(A, 1);
+			ed.selection.moveToBookmark(b);
+		}
+
 		tinyMCEPopup.execCommand("mceEndUndoLevel");
 		ed.execCommand('mceRepaint');
 		tinyMCEPopup.close();
Index: wp-includes/js/tinymce/tiny_mce_config.php
===================================================================
--- wp-includes/js/tinymce/tiny_mce_config.php	(revision 8259)
+++ wp-includes/js/tinymce/tiny_mce_config.php	(working copy)
@@ -222,7 +222,7 @@
 // Setup cache info
 if ( $disk_cache ) {
 
-	$cacheKey = apply_filters('tiny_mce_version', '20080703');
+	$cacheKey = apply_filters('tiny_mce_version', '20080706');
 
 	foreach ( $initArray as $v )
 		$cacheKey .= $v;
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 8259)
+++ wp-includes/script-loader.php	(working copy)
@@ -34,10 +34,10 @@
 	$visual_editor = apply_filters('visual_editor', array('tiny_mce'));
 	$scripts->add( 'editor', false, $visual_editor, '20080321' );
 
-	$scripts->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080702' );
+	$scripts->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080706' );
 
 	// Modify this version when tinyMCE plugins are changed.
-	$mce_version = apply_filters('tiny_mce_version', '20080703');
+	$mce_version = apply_filters('tiny_mce_version', '20080706');
 	$scripts->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_config.php', array('editor_functions'), $mce_version );
 
 	$scripts->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');
