diff --git a/ChangeLog b/ChangeLog
index ac7c55cff6c45b5f41bd928ea5dc667ffbfbefff..e51104ea953c98a98243d9f9f66025697db17bd3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -332,8 +332,11 @@ CVS code -
 	- Various cleanups.  Turn on the MORE_SPACE and NO_HELP flags
 	  before showing the credits, so that they use as much of the
 	  screen as possible, and set the flags back to their original
-	  values afterward.  Also, only call scrollok() just before and
-	  after we scroll. (DLR)
+	  values afterward.  Also, call wscrl(1) instead of scroll(),
+	  only call scrollok() just before and after we scroll, and
+	  tweak where screen updates occur so that messages are properly
+	  displayed when they first scroll onto the bottom line of the
+	  screen. (DLR)
 - configure.ac:
 	- Since we only use vsnprintf() now, remove the tests for
 	  snprintf(). (DLR)
diff --git a/src/winio.c b/src/winio.c
index abcfde8e91a2a87e6772480a05fa4d4291d97438..119e55044515cd3c2f64ebd60cb928da9f09df6f 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -4278,9 +4278,11 @@ void do_credits(void)
     blank_edit();
     blank_statusbar();
     blank_bottombars();
+
     wrefresh(topwin);
     wrefresh(edit);
     wrefresh(bottomwin);
+    napms(700);
 
     for (crpos = 0; crpos < CREDIT_LEN + editwinrows / 2; crpos++) {
 	if ((kbinput = wgetch(edit)) != ERR)
@@ -4303,16 +4305,23 @@ void do_credits(void)
 		start_x, what);
 	}
 
+	wrefresh(edit);
+
+	if ((kbinput = wgetch(edit)) != ERR)
+	    break;
 	napms(700);
+
 	scrollok(edit, TRUE);
-	scroll(edit);
+	wscrl(edit, 1);
 	scrollok(edit, FALSE);
 	wrefresh(edit);
+
 	if ((kbinput = wgetch(edit)) != ERR)
 	    break;
 	napms(700);
+
 	scrollok(edit, TRUE);
-	scroll(edit);
+	wscrl(edit, 1);
 	scrollok(edit, FALSE);
 	wrefresh(edit);
     }