diff --git a/ChangeLog b/ChangeLog
index aff1fcb28f845f4792acf91a25ab7af84a0a526f..65b354f0c466011ab094663ee56f76fe00c786dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -88,9 +88,11 @@ CVS code -
 	  do_research(), do_replace_loop(), do_find_bracket(), and
 	  edit_refresh().  New functions do_left_void(),
 	  do_right_void(), need_horizontal_update(),
-	  need_vertical_update(), edit_scroll(), and edit_redraw().
-	  Also rename the int refresh in do_delete() and do_backspace()
-	  to do_refresh so as not to conflict with refresh(). (DLR)
+	  need_vertical_update(), edit_scroll(), and edit_redraw().  All
+	  of these functions but the first two require the previous
+	  versions of current and/or placewewant as parameters.  Also
+	  rename the int refresh in do_delete() and do_backspace() to
+	  do_refresh so as not to conflict with refresh(). (DLR)
 	- Add some comments better explaining what is disabled in
 	  restricted mode and why. (DLR)
 	- Since KEEP_CUTBUFFER is only used in cut.c, make it a static
diff --git a/src/move.c b/src/move.c
index 77365b1896c43dee8a7aeb8bba789fae366af9ed..1c8fbb054672765ab52e7a5ca94158d3146ff52b 100644
--- a/src/move.c
+++ b/src/move.c
@@ -92,7 +92,7 @@ int do_end(void)
 
 int do_page_up(void)
 {
-    int new_pww = placewewant;
+    int old_pww = placewewant;
     const filestruct *old_current = current;
 #ifndef DISABLE_WRAPPING
     wrap_reset();
@@ -102,7 +102,7 @@ int do_page_up(void)
      * and put the cursor at the beginning of the line. */
     if (edittop == fileage) {
 	current = fileage;
-	new_pww = 0;
+	placewewant = 0;
     } else {
 	edit_scroll(UP, editwinrows - 2);
 
@@ -121,19 +121,17 @@ int do_page_up(void)
 	else {
 #endif
 	    current = edittop;
-	    new_pww = 0;
+	    placewewant = 0;
 #ifndef NANO_SMALL
 	}
 #endif
     }
 
     /* Get the equivalent x-coordinate of the new line. */
-    current_x = actual_x(current->data, new_pww);
+    current_x = actual_x(current->data, placewewant);
 
-    /* Update all the lines that need to be updated, and then set
-     * placewewant, so that the update will work properly. */
-    edit_redraw(old_current);
-    placewewant = new_pww;
+    /* Update all the lines that need to be updated. */
+    edit_redraw(old_current, old_pww);
 
     check_statblank();
     return 1;
@@ -141,7 +139,7 @@ int do_page_up(void)
 
 int do_page_down(void)
 {
-    int new_pww = placewewant;
+    int old_pww = placewewant;
     const filestruct *old_current = current;
 #ifndef DISABLE_WRAPPING
     wrap_reset();
@@ -151,7 +149,7 @@ int do_page_down(void)
      * there and put the cursor at the beginning of the line. */
     if (edittop->lineno + editwinrows > filebot->lineno) {
 	current = filebot;
-	new_pww = 0;
+	placewewant = 0;
     } else {
 	edit_scroll(DOWN, editwinrows - 2);
 
@@ -171,19 +169,17 @@ int do_page_down(void)
 	else {
 #endif
 	    current = edittop;
-	    new_pww = 0;
+	    placewewant = 0;
 #ifndef NANO_SMALL
 	}
 #endif
     }
 
     /* Get the equivalent x-coordinate of the new line. */
-    current_x = actual_x(current->data, new_pww);
+    current_x = actual_x(current->data, placewewant);
 
-    /* Update all the lines that need to be updated, and then set
-     * placewewant, so that the update will work properly. */
-    edit_redraw(old_current);
-    placewewant = new_pww;
+    /* Update all the lines that need to be updated. */
+    edit_redraw(old_current, old_pww);
 
     check_statblank();
     return 1;
diff --git a/src/nano.c b/src/nano.c
index 3cec1a254dbb6a05bc188e5fb75193372c2bbe8f..46eaa91e514e0431144377895ab117a70e07f3a8 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -1165,6 +1165,7 @@ int do_enter(void)
 #ifndef NANO_SMALL
 int do_next_word(void)
 {
+    int old_pww = placewewant;
     const filestruct *current_save = current;
     assert(current != NULL && current->data != NULL);
 
@@ -1190,7 +1191,7 @@ int do_next_word(void)
 
     /* Refresh the screen.  If current has run off the bottom, this
      * call puts it at the center line. */
-    edit_redraw(current_save);
+    edit_redraw(current_save, old_pww);
 
     return 0;
 }
@@ -1198,6 +1199,7 @@ int do_next_word(void)
 /* The same thing for backwards. */
 int do_prev_word(void)
 {
+    int old_pww = placewewant;
     const filestruct *current_save = current;
     assert(current != NULL && current->data != NULL);
 
@@ -1228,7 +1230,7 @@ int do_prev_word(void)
 
     /* Refresh the screen.  If current has run off the top, this call
      * puts it at the center line. */
-    edit_redraw(current_save);
+    edit_redraw(current_save, old_pww);
 
     return 0;
 }
@@ -2160,6 +2162,7 @@ int break_line(const char *line, int goal, int force)
 int do_para_search(justbegend search_type, size_t *quote, size_t *par,
 	size_t *indent, int do_refresh)
 {
+    int old_pww = placewewant;
     const filestruct *current_save = current;
     size_t quote_len;
 	/* Length of the initial quotation of the paragraph we
@@ -2235,7 +2238,7 @@ int do_para_search(justbegend search_type, size_t *quote, size_t *par,
 	    if (current->prev == NULL) {
 		placewewant = 0;
 		if (do_refresh)
-		    edit_redraw(current_save);
+		    edit_redraw(current_save, old_pww);
 #ifdef HAVE_REGEX_H
 		if (!do_restart)
 		    regfree(&qreg);
@@ -2256,7 +2259,7 @@ int do_para_search(justbegend search_type, size_t *quote, size_t *par,
 	    if (current->next == NULL) {
 		placewewant = 0;
 		if (do_refresh)
-		    edit_redraw(current_save);
+		    edit_redraw(current_save, old_pww);
 #ifdef HAVE_REGEX_H
 		regfree(&qreg);
 #endif
@@ -2347,7 +2350,7 @@ int do_para_search(justbegend search_type, size_t *quote, size_t *par,
 
     /* Refresh the screen if needed. */
     if (do_refresh)
-	edit_redraw(current_save);
+	edit_redraw(current_save, old_pww);
 
     /* Save the values of quote_len, par_len, and indent_len if
      * needed. */
diff --git a/src/proto.h b/src/proto.h
index 68565c0df96afd7acdc38fa24847783c4a89b638..951099896718dfd889bc73ac879e1532d275c899 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -540,7 +540,7 @@ void update_line(const filestruct *fileptr, size_t index);
 int need_horizontal_update(int old_placewewant);
 int need_vertical_update(int old_placewewant);
 void edit_scroll(updown direction, int nlines);
-void edit_redraw(const filestruct *old_current);
+void edit_redraw(const filestruct *old_current, int old_pww);
 void edit_refresh(void);
 void edit_update(filestruct *fileptr, topmidnone location);
 int statusq(int allowtabs, const shortcut *s, const char *def,
diff --git a/src/search.c b/src/search.c
index 4a7c1ef37e72cc6e3561194f76d4d3bfb154766a..de48d7da99e934a2e0ceecaca2f3a877caeb651a 100644
--- a/src/search.c
+++ b/src/search.c
@@ -361,7 +361,7 @@ int findnextstr(int can_display_wrap, int wholeword, const filestruct
 /* Search for a string. */
 int do_search(void)
 {
-    int i, fileptr_x = current_x, didfind;
+    int old_pww = placewewant, i, fileptr_x = current_x, didfind;
     filestruct *fileptr = current;
 
 #ifndef DISABLE_WRAPPING
@@ -419,8 +419,8 @@ int do_search(void)
 #endif
     }
 
-    edit_redraw(fileptr);
     placewewant = xplustabs();
+    edit_redraw(fileptr, old_pww);
     search_abort();
 
     return 1;
@@ -430,7 +430,7 @@ int do_search(void)
 /* Search for the next string without prompting. */
 int do_research(void)
 {
-    int fileptr_x = current_x, didfind;
+    int old_pww = placewewant, fileptr_x = current_x, didfind;
     filestruct *fileptr = current;
 
 #ifndef DISABLE_WRAPPING
@@ -472,8 +472,8 @@ int do_research(void)
     } else
         statusbar(_("No current search pattern"));
 
-    edit_redraw(fileptr);
     placewewant = xplustabs();
+    edit_redraw(fileptr, old_pww);
     search_abort();
 
     return 1;
@@ -587,7 +587,7 @@ char *replace_line(const char *needle)
 int do_replace_loop(const char *needle, const filestruct *real_current,
 	size_t *real_current_x, int wholewords)
 {
-    int replaceall = 0, numreplaced = -1;
+    int old_pww = placewewant, replaceall = 0, numreplaced = -1;
     size_t current_x_save = current_x;
     const filestruct *current_save = current;
 #ifdef HAVE_REGEX_H
@@ -635,7 +635,7 @@ int do_replace_loop(const char *needle, const filestruct *real_current,
 #endif
 
 	if (!replaceall)
-	    edit_redraw(current_save);
+	    edit_redraw(current_save, old_pww);
 
 #ifdef HAVE_REGEX_H
 	if (ISSET(USE_REGEXP))
@@ -905,7 +905,7 @@ int do_find_bracket(void)
     char ch_under_cursor, wanted_ch;
     const char *pos, *brackets = "([{<>}])";
     char regexp_pat[] = "[  ]";
-    int current_x_save, flagsave, count = 1;
+    int old_pww = placewewant, current_x_save, flagsave, count = 1;
     filestruct *current_save;
 
     ch_under_cursor = current->data[current_x];
@@ -949,8 +949,8 @@ int do_find_bracket(void)
 		count++;
 	    /* Found complementary bracket. */
 	    else if (--count == 0) {
-		edit_redraw(current_save);
 		placewewant = xplustabs();
+		edit_redraw(current_save, old_pww);
 		break;
 	    }
 	} else {
diff --git a/src/winio.c b/src/winio.c
index e09e74367d91ed98bf8f2def6be34be8d4b983be..a5140ff67f2be253be6b901c98cb250bf9f69cc8 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -2610,14 +2610,11 @@ void edit_scroll(updown direction, int nlines)
 }
 
 /* Update any lines between old_current and current that need to be
- * updated.  Note that we use placewewant to determine whether we need
- * updates and current_x to update current, so if placewewant needs to
- * be changed, it should be changed after calling this, and if current_x
- * needs to be changed, it should be changed before calling this.
- * Assume none of the text has changed since the last update. */
-void edit_redraw(const filestruct *old_current)
+ * updated.  Assume none of the text has changed since the last
+ * update. */
+void edit_redraw(const filestruct *old_current, int old_pww)
 {
-    int do_refresh = need_vertical_update(0);
+    int do_refresh = need_vertical_update(old_pww);
     const filestruct *foo;
 
     /* If either old_current or current is offscreen, refresh the screen