diff --git a/ChangeLog b/ChangeLog
index 136d3be72691070507d93d5da306f9fe77d947fb..0badeffed103c54d4a1b36a993c3a8e27dbe1935 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -134,6 +134,12 @@ CVS code -
   replace_line()
 	- Make new_line_size and search_match_count size_t's, for
 	  consistency. (DLR)
+  do_replace_loop()
+	- When moving to the next match, update the screen using
+	  edit_refresh() instead of edit_redraw(), as the latter won't
+	  work properly when we've replaced one or more instances of a
+	  string in copy and haven't yet updated current->data to match
+	  copy. (DLR)
 - utils.c:
   num_of_digits()
 	- Use a size_t instead of an int, and rename to digits(). (DLR)
diff --git a/src/search.c b/src/search.c
index 0fbdac9a6af116415dfce7dbb6ffea415b132bcc..45ec4f6fb63f6728069861151a610cd8c03fd55c 100644
--- a/src/search.c
+++ b/src/search.c
@@ -681,7 +681,6 @@ ssize_t do_replace_loop(const char *needle, const filestruct
 {
     ssize_t numreplaced = -1;
     size_t match_len;
-    size_t pww_save = placewewant;
     bool replaceall = FALSE;
 #ifdef HAVE_REGEX_H
     /* The starting-line match and bol/eol regex flags. */
@@ -743,10 +742,8 @@ ssize_t do_replace_loop(const char *needle, const filestruct
 	}
 #endif
 
-	if (!replaceall) {
-	    edit_redraw(real_current, pww_save);
-	    pww_save = placewewant;
-	}
+	if (!replaceall)
+	    edit_refresh();
 
 	/* Record for the return value that we found the search
 	 * string. */