diff --git a/src/move.c b/src/move.c
index 3ea27e70ec6a8f6a32c332ea25b32b66f0f292da..02202cdd7a978540a8c49c37e40e556331d99494 100644
--- a/src/move.c
+++ b/src/move.c
@@ -114,14 +114,14 @@ void do_page_up(void)
 #ifndef NANO_SMALL
 	/* If we're in smooth scrolling mode and there's at least one
 	 * page of text left, move the current line of the edit window
-	 * up a page. */
+	 * up a page, and then get the equivalent x-coordinate of the
+	 * current line. */
 	if (ISSET(SMOOTH_SCROLL) && openfile->current->lineno >
 		editwinrows - 2) {
 	    int i = 0;
 	    for (; i < editwinrows - 2; i++)
 		openfile->current = openfile->current->prev;
 
-	    /* Get the equivalent x-coordinate of the new line. */
 	    openfile->current_x = actual_x(openfile->current->data,
 		openfile->placewewant);
 	}
@@ -137,6 +137,7 @@ void do_page_up(void)
 	}
 #endif
 
+	/* Scroll the edit window down a page. */
 	edit_scroll(UP, editwinrows - 2);
     }
 
@@ -160,14 +161,15 @@ void do_page_down(void)
 #ifndef NANO_SMALL
 	/* If we're in smooth scrolling mode and there's at least one
 	 * page of text left, move the current line of the edit window
-	 * down a page. */
+	 * down a page, and then get the equivalent x-coordinate of the
+	 * current line. */
 	if (ISSET(SMOOTH_SCROLL) && openfile->current->lineno +
 		editwinrows - 2 <= openfile->filebot->lineno) {
 	    int i = 0;
+
 	    for (; i < editwinrows - 2; i++)
 		openfile->current = openfile->current->next;
 
-	    /* Get the equivalent x-coordinate of the new line. */
 	    openfile->current_x = actual_x(openfile->current->data,
 		openfile->placewewant);
 	}
@@ -183,6 +185,7 @@ void do_page_down(void)
 	}
 #endif
 
+	/* Scroll the edit window down a page. */
 	edit_scroll(DOWN, editwinrows - 2);
     }
 
@@ -202,13 +205,15 @@ void do_up(void)
 
     assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
 
+    /* Move the current line of the edit window up, and then get the
+     * equivalent x-coordinate of the current line. */
     openfile->current = openfile->current->prev;
     openfile->current_x = actual_x(openfile->current->data,
 	openfile->placewewant);
 
-    /* If we're on the first row of the edit window, scroll up one line
-     * if we're in smooth scrolling mode, or up half a page if we're
-     * not. */
+    /* If we're on the first row of the edit window, scroll the edit
+     * window up one line if we're in smooth scrolling mode, or up half
+     * a page if we're not. */
     if (openfile->current_y == 0)
 	edit_scroll(UP,
 #ifndef NANO_SMALL
@@ -238,13 +243,15 @@ void do_down(void)
 
     assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
 
+    /* Move the current line of the edit window down, and then get the
+     * equivalent x-coordinate of the current line. */
     openfile->current = openfile->current->next;
     openfile->current_x = actual_x(openfile->current->data,
 	openfile->placewewant);
 
-    /* If we're on the last row of the edit window, scroll down one line
-     * if we're in smooth scrolling mode, or down half a page if we're
-     * not. */
+    /* If we're on the last row of the edit window, scroll the edit
+     * window down one line if we're in smooth scrolling mode, or down
+     * half a page if we're not. */
     if (openfile->current_y == editwinrows - 1)
 	edit_scroll(DOWN,
 #ifndef NANO_SMALL
diff --git a/src/winio.c b/src/winio.c
index 6dcb743d53817497c56e2450b66859cd95519f72..e6c494cfbcf5c165b4f1993e35894b5fdf8c28b0 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -3503,11 +3503,8 @@ int need_vertical_update(size_t old_pww)
 /* Scroll the edit window in the given direction and the given number
  * of lines, and draw new lines on the blank lines left after the
  * scrolling.  direction is the direction to scroll, either UP or DOWN,
- * and nlines is the number of lines to scroll.  Don't redraw the old
- * topmost or bottommost line (where we assume current is) before
- * scrolling or draw the new topmost or bottommost line after scrolling
- * (where we assume current will be), since we don't know where we are
- * on the page or whether we'll stay there. */
+ * and nlines is the number of lines to scroll.  We assume that current
+ * and current_x are up to date, and only change edittop. */
 void edit_scroll(updown direction, int nlines)
 {
     filestruct *foo;
@@ -3528,43 +3525,38 @@ void edit_scroll(updown direction, int nlines)
 	    if (openfile->edittop->prev == NULL)
 		break;
 	    openfile->edittop = openfile->edittop->prev;
-	    scroll_rows--;
 	} else {
 	    if (openfile->edittop->next == NULL)
 		break;
 	    openfile->edittop = openfile->edittop->next;
-	    scroll_rows++;
 	}
+
+	scroll_rows++;
     }
 
     /* Scroll the text on the screen up or down scroll_rows lines,
      * depending on the value of direction. */
     scrollok(edit, TRUE);
-    wscrl(edit, scroll_rows);
+    wscrl(edit, (direction == UP) ? -scroll_rows : scroll_rows);
     scrollok(edit, FALSE);
 
     foo = openfile->edittop;
-    if (direction != UP) {
-	int slines = editwinrows - nlines - 1;
-	for (; slines > 0 && foo != NULL; slines--)
+
+    if (direction == DOWN) {
+	for (i = editwinrows - nlines - 1; i > 0 && foo != NULL; i--)
 	    foo = foo->next;
     }
 
-    /* And draw new lines on the blank top or bottom lines of the edit
+    /* Draw new lines on the blank top or bottom lines of the edit
      * window, depending on the value of direction. */
-    while (foo != NULL && scroll_rows != 0) {
+    scroll_rows++;
+
+    while (scroll_rows > 0 && foo != NULL) {
 	update_line(foo, (foo == openfile->current) ?
 		openfile->current_x : 0);
 	foo = foo->next;
-
-	if (direction == UP)
-	    scroll_rows++;
-	else
-	    scroll_rows--;
+	scroll_rows--;
     }
-
-    update_line(foo, (foo == openfile->current) ?
-	openfile->current_x : 0);
 }
 
 /* Update any lines between old_current and current that need to be