Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 17776)
+++ wp-includes/script-loader.php	(working copy)
@@ -306,7 +306,7 @@
 			'noPerm' => __('You do not have permission to do that.'),
 			'broken' => __('An unidentified error has occurred.'),
 			'l10n_print_after' => 'try{convertEntities(tagsl10n);}catch(e){};'
-		));
+		) );
 
 		$scripts->add( 'admin-custom-fields', "/wp-admin/js/custom-fields$suffix.js", array('wp-lists'), '20090106' );
 		$scripts->add_data( 'admin-custom-fields', 'group', 1 );
@@ -315,7 +315,9 @@
 		$scripts->add_data( 'admin-comments', 'group', 1 );
 		$scripts->localize( 'admin-comments', 'adminCommentsL10n', array(
 			'hotkeys_highlight_first' => isset($_GET['hotkeys_highlight_first']),
-			'hotkeys_highlight_last' => isset($_GET['hotkeys_highlight_last'])
+			'hotkeys_highlight_last' => isset($_GET['hotkeys_highlight_last']),
+			'replyApprove' => __( 'Approve and Reply' ),
+			'reply' => __( 'Reply' )
 		) );
 
 		$scripts->add( 'xfn', "/wp-admin/js/xfn$suffix.js", array('jquery'), '20100403' );
Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 17776)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -666,6 +666,8 @@
 	$comment = get_comment($comment_id);
 	if ( ! $comment ) die('1');
 
+	$parent = get_comment( $comment_parent );
+
 	$position = ( isset($_POST['position']) && (int) $_POST['position']) ? (int) $_POST['position'] : '-1';
 
 	$x = new WP_Ajax_Response();
@@ -685,13 +687,22 @@
 		$comment_list_item = ob_get_contents();
 	ob_end_clean();
 
-	$x->add( array(
+	$response =  array(
 		'what' => 'comment',
 		'id' => $comment->comment_ID,
 		'data' => $comment_list_item,
 		'position' => $position
-	));
+	);
 
+	// automatically approve parent comment if user has privileges
+	if ( !( $parent->comment_approved ) && current_user_can( 'moderate_comments' ) ) {
+		if ( wp_update_comment( array( 'comment_ID' => $comment_parent, 'comment_approved' => 'approve' ) ) ) 
+			$response['supplemental'] = array( 'parent_approved' => $parent->comment_ID );
+		else
+			die( '1' );
+	}
+
+	$x->add( $response );
 	$x->send();
 	break;
 case 'edit-comment' :
Index: wp-admin/js/edit-comments.dev.js
===================================================================
--- wp-admin/js/edit-comments.dev.js	(revision 17776)
+++ wp-admin/js/edit-comments.dev.js	(working copy)
@@ -1,4 +1,4 @@
-var theList, theExtraList, toggleWithKeyboard = false;
+var theList, theExtraList, toggleWithKeyboard = false, getCount, updateCount, dashboardTotals;
 (function($) {
 
 setCommentsList = function() {
@@ -9,13 +9,25 @@
 	pageInput = $('input[name="_page"]', '#comments-form');
 
 	dimAfter = function( r, settings ) {
-		var c = $('#' + settings.element);
+		var c = $('#' + settings.element), editRow, replyID, replyButton;
 
-		if ( c.is('.unapproved') )
-			c.find('div.comment_status').html('0')
-		else
-			c.find('div.comment_status').html('1')
+		editRow = $('#replyrow');
+		replyID = $('#comment_ID', editRow).val();
+		replyButton = $('#replybtn', editRow);
 
+		if ( c.is('.unapproved') ) {
+			if (settings.data.id == replyID)
+				replyButton.text(adminCommentsL10n.replyApprove);
+
+			c.find('div.comment_status').html('0');
+		} else {
+			if (settings.data.id == replyID)
+				replyButton.text(adminCommentsL10n.reply);
+
+			c.find('div.comment_status').html('1');
+		}
+		
+
 		$('span.pending-count').each( function() {
 			var a = $(this), n, dif;
 			n = a.html().replace(/[^0-9]+/g, '');
@@ -99,7 +111,7 @@
 		});
 	};
 
-	function dashboardTotals(n) {
+	dashboardTotals = function dashboardTotals(n) {
 		var dash = $('#dashboard_right_now'), total, appr, totalN, apprN;
 
 		n = n || 0;
@@ -115,16 +127,16 @@
 		updateCount(total, totalN);
 		updateCount(appr, apprN);
 
-	}
+	};
 
-	function getCount(el) {
+	getCount = function getCount(el) {
 		var n = parseInt( el.html().replace(/[^0-9]+/g, ''), 10 );
 		if ( isNaN(n) )
 			return 0;
 		return n;
-	}
+	};
 
-	function updateCount(el, n) {
+	updateCount = function updateCount(el, n) {
 		var n1 = '';
 		if ( isNaN(n) )
 			return;
@@ -137,7 +149,7 @@
 			n = n + n1;
 		}
 		el.html(n);
-	}
+	};
 
 	// In admin-ajax.php, we send back the unix time stamp instead of 1 on success
 	delAfter = function( r, settings ) {
@@ -355,7 +367,8 @@
 	},
 
 	open : function(id, p, a) {
-		var t = this, editRow, rowData, act, h, c = $('#comment-' + id);
+		var t = this, editRow, rowData, act, h, c = $('#comment-' + id), replyButton;
+
 		t.close();
 		t.cid = id;
 
@@ -387,9 +400,17 @@
 				$('#replyrow').fadeIn(300, function(){ $(this).show() });
 			});
 		} else {
+			replyButton = $('#replybtn', editRow);
 			$('#edithead, #savebtn', editRow).hide();
 			$('#replyhead, #replybtn', editRow).show();
 			c.after(editRow);
+
+			if (c.hasClass('unapproved')) {
+				replyButton.text(adminCommentsL10n.replyApprove);
+			} else {
+				replyButton.text(adminCommentsL10n.reply);
+			}
+			
 			$('#replyrow').fadeIn(300, function(){ $(this).show() });
 		}
 
@@ -453,37 +474,60 @@
 	},
 
 	show : function(xml) {
-		var r, c, id, bg;
+		var t = this, r, c, id, bg, pid;
 
 		if ( typeof(xml) == 'string' ) {
-			this.error({'responseText': xml});
+			t.error({'responseText': xml});
 			return false;
 		}
 
 		r = wpAjax.parseAjaxResponse(xml);
 		if ( r.errors ) {
-			this.error({'responseText': wpAjax.broken});
+			t.error({'responseText': wpAjax.broken});
 			return false;
 		}
 
 		r = r.responses[0];
 		c = r.data;
 		id = '#comment-' + r.id;
-		if ( 'edit-comment' == this.act )
+		if ( 'edit-comment' == t.act )
 			$(id).remove();
 
 		$(c).hide()
 		$('#replyrow').after(c);
 
-		this.revert();
-		this.addEvents($(id));
+		if ( r.supplemental.parent_approved ) {
+			pid = '#comment-' + r.supplemental.parent_approved;
+
+			$('span.pending-count').each( function() {
+				var a = $(this), n = getCount(a);
+				if (! isNaN(n)) {
+					n = n - 1;
+					if ( n < 0 ) { n = 0; }
+					a.closest('#awaiting-mod')[ 0 == n ? 'addClass' : 'removeClass' ]('count-0');
+					updateCount(a, n);
+					dashboardTotals();
+				}
+			});
+		}
+
+		t.revert();
+		t.addEvents($(id));
 		bg = $(id).hasClass('unapproved') ? '#ffffe0' : '#fff';
 
 		$(id)
 			.animate( { 'backgroundColor':'#CCEEBB' }, 600 )
-			.animate( { 'backgroundColor': bg }, 600 );
+			.animate( { 'backgroundColor': bg }, 600, function() {
+				if ( pid ) {
+					pid  = $(pid)
+						.animate( { 'backgroundColor':'#CCEEBB' }, 600 )
+						.animate( { 'backgroundColor': '#FFFFFF' }, 600 );
 
-		// $.fn.wpList.process($(id));
+					pid.find('.row-actions .approve').hide();
+					pid.find('.row-actions .unapprove').show();
+				}
+			});
+
 	},
 
 	error : function(r) {
