Index: src/wp-admin/js/editor-expand.js
===================================================================
--- src/wp-admin/js/editor-expand.js	(revision 37596)
+++ src/wp-admin/js/editor-expand.js	(working copy)
@@ -16,7 +16,6 @@
 			$textTop = $( '#ed_toolbar' ),
 			$textEditor = $( '#content' ),
 			textEditor = $textEditor[0],
-			textEditorLength = 0,
 			$bottom = $( '#post-status-info' ),
 			$menuBar = $(),
 			$statusBar = $(),
@@ -76,7 +75,9 @@
 		}
 
 		function textEditorResize() {
-			var reduce, scrollHeight;
+			var height;
+			var length;
+			var scrollHeight;
 
 			if ( mceEditor && ! mceEditor.isHidden() ) {
 				return;
@@ -86,17 +87,35 @@
 				return;
 			}
 
-			reduce = textEditorLength > ( textEditorLength = textEditor.value.length );
-			scrollHeight = textEditor.scrollHeight;
+			height = parseInt( textEditor.style.height, 10 );
+			length = textEditor.value.length;
 
-			if ( reduce ) {
+			if ( length < textEditorResize.oldLength ) {
 				textEditor.style.height = 'auto';
-				textEditor.style.height = scrollHeight + 'px';
-				adjust();
-			} else if ( parseInt( textEditor.style.height, 10 ) < scrollHeight ) {
-				textEditor.style.height = scrollHeight + 'px';
+				scrollHeight = textEditor.scrollHeight;
+
+				if ( scrollHeight < autoresizeMinHeight ) {
+					textEditor.style.height = autoresizeMinHeight + 'px';
+				} else {
+					textEditor.style.height = scrollHeight + 'px';
+				}
+
+				// When reducing the height, scroll up the difference.
+				if ( scrollHeight - height < 0 ) {
+					window.scrollBy( 0, scrollHeight - height );
+				}
+
 				adjust();
+			} else {
+				scrollHeight = textEditor.scrollHeight;
+
+				if ( height < scrollHeight ) {
+					textEditor.style.height = scrollHeight + 'px';
+					adjust();
+				}
 			}
+
+			textEditorResize.oldLength = length;
 		}
 
 		// We need to wait for TinyMCE to initialize.
