diff --git a/ChangeLog b/ChangeLog
index 5b8876c557527fa75bbf32e5a5218d52591a18e5..b5acc186f7a1c54c64eb1cb63bdbbd39b746ff65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,11 @@ CVS Code -
 	  of nanogetstr with keys like ^Y and ^V.  New arg
 	  resetpos to nanogetstr(), added static int
 	  resetpos in statusq() (bug found by DLR).
+	- Fix constant curos updates from obliterating other
+	  system messages, and fix statusbar message length.
+	  Affects files.c:load_open_file(), nano.c:main(), 
+	  search.c:findnextstr(), winio.c:statusbar() and 
+	  do_cursorpos() (David Benbennick).
 - cut.c:
   do_cut_text()
 	- Fix incorrect cursor location when cutting long lines
diff --git a/files.c b/files.c
index b967d2584281f9efeff939c276c0b519074a384f..8805632090747d184101968d830b7429a98564d3 100644
--- a/files.c
+++ b/files.c
@@ -840,13 +840,6 @@ int load_open_file(void)
     clearok(topwin, FALSE);
     titlebar(NULL);
 
-    /* if we're constantly displaying the cursor position and
-       DISABLE_CURPOS isn't set, update it (and do so unconditionally,
-       in the rare case that the character count is the same but the
-       line count isn't) */
-    if (ISSET(CONSTUPDATE) && !ISSET(DISABLE_CURPOS))
-	do_cursorpos(0);
-
     /* now we're done */
     return 0;
 }
diff --git a/nano.c b/nano.c
index aff98d0fa63b92cd00d2b1c1cb9513f023eb6d83..b4a05526672b8e63e4a29e711e7cce7d157ba639 100644
--- a/nano.c
+++ b/nano.c
@@ -3451,6 +3451,9 @@ int main(int argc, char *argv[])
 	int keyhandled = 0;	/* Have we handled the keystroke yet? */
 	int kbinput;		/* Input from keyboard */
 
+	if (ISSET(CONSTUPDATE))
+	    do_cursorpos(1);
+
 #if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
 	currshortcut = main_list;
 #endif
@@ -3751,11 +3754,6 @@ int main(int argc, char *argv[])
 		    do_char(kbinput);
 	    }
 
-	if (ISSET(DISABLE_CURPOS))
-	    UNSET(DISABLE_CURPOS);
-	else if (ISSET(CONSTUPDATE))
-	    do_cursorpos(1);
-
 	reset_cursor();
 	wrefresh(edit);
     }
diff --git a/search.c b/search.c
index a8d4921e91012b3c316f2b04bfbd3b47cf2b0bb1..2966594c1d6a6fe560a2e21dc21ffd5247545f77 100644
--- a/search.c
+++ b/search.c
@@ -270,10 +270,8 @@ filestruct *findnextstr(int quiet, int bracket_mode,
 		    return NULL;
 		fileptr = fileage;
 		search_offscreen = 1;
-		if (!quiet) {
+		if (!quiet)
 		    statusbar(_("Search Wrapped"));
-		    SET(DISABLE_CURPOS);
-		}
 	    }
 
 	    /* Original start line reached */
@@ -324,10 +322,8 @@ filestruct *findnextstr(int quiet, int bracket_mode,
 		   return NULL;
 		fileptr = filebot;
 		search_offscreen = 1;
-		if (!quiet) {
+		if (!quiet)
 		    statusbar(_("Search Wrapped"));
-		    SET(DISABLE_CURPOS);
-		}
 	    }
 	    /* Original start line reached */
 	    if (fileptr == begin)
diff --git a/winio.c b/winio.c
index 1f221bd9bdededc368c4a31fe0821e9f51b4d63a..e4419cdabeb733514fed30914f1d6b7a9e82ab19 100644
--- a/winio.c
+++ b/winio.c
@@ -1417,67 +1417,66 @@ void statusbar(const char *msg, ...)
 
     wrefresh(bottomwin);
 
-    if (ISSET(CONSTUPDATE))
-	statblank = 1;
-    else
-	statblank = 25;
+    SET(DISABLE_CURPOS);
+    statblank = 26;
 }
 
+/*
+ * If constant is false, the user typed ^C so we unconditionally display
+ * the cursor position.  Otherwise, we display it only if the character
+ * position changed, and DISABLE_CURPOS is not set.
+ *
+ * If constant and DISABLE_CURPOS is set, we unset it and update old_i and
+ * old_totsize.  That way, we leave the current statusbar alone, but next
+ * time we will display. */
 int do_cursorpos(int constant)
 {
-    filestruct *fileptr;
-    float linepct = 0.0, bytepct = 0.0, colpct = 0.0;
-    long i = 0, j = 0;
-    static long old_i = -1, old_totsize = -1;
+    const filestruct *fileptr;
+    unsigned long i = 0;
+    static unsigned long old_i = 0;
+    static long old_totsize = -1;
 
-    if (current == NULL || fileage == NULL)
-	return 0;
-
-    if (old_i == -1)
-	old_i = i;
+    assert(current != NULL && fileage != NULL && totlines != 0);
 
     if (old_totsize == -1)
 	old_totsize = totsize;
 
-    colpct = 100 * (xplustabs() + 1) / (strlenpt(current->data) + 1);
-
-    for (fileptr = fileage; fileptr != current && fileptr != NULL;
-	 fileptr = fileptr->next)
+    for (fileptr = fileage; fileptr != current; fileptr = fileptr->next) {
+	assert(fileptr != NULL);
 	i += strlen(fileptr->data) + 1;
-
-    if (fileptr == NULL)
-	return -1;
-
+    }
     i += current_x;
 
-    j = totsize;
-
-    if (totsize > 0)
-	bytepct = 100 * i / totsize;
-
-    if (totlines > 0)
-	 linepct = 100 * current->lineno / totlines;
-
-#ifdef DEBUG
-    fprintf(stderr, "%s: linepct = %f, bytepct = %f\n",
-		"do_cursorpos()", linepct, bytepct);
-#endif
+    if (constant && ISSET(DISABLE_CURPOS)) {
+	UNSET(DISABLE_CURPOS);
+	old_i = i;
+	old_totsize = totsize;
+	return 0;
+    }
 
-    /* if constant is zero, display the position on the statusbar
+    /* if constant is false, display the position on the statusbar
        unconditionally; otherwise, only display the position when the
        character values have changed */
-    if (!constant || (old_i != i || old_totsize != totsize)) {
-	statusbar(_
-		  ("line %d/%d (%.0f%%), col %ld/%ld (%.0f%%), char %ld/%ld (%.0f%%)"),
-		  current->lineno, totlines, linepct, xplustabs() + 1, 
-		  strlenpt(current->data) + 1, colpct, i, j, bytepct);
+    if (!constant || old_i != i || old_totsize != totsize) {
+	unsigned long xpt = xplustabs() + 1;
+	unsigned long cur_len = strlenpt(current->data) + 1;
+	int linepct = 100 * current->lineno / totlines;
+	int colpct = 100 * xpt / cur_len;
+	int bytepct = totsize == 0 ? 0 : 100 * i / totsize;
+
+	statusbar(
+	    _("line %ld/%ld (%d%%), col %lu/%lu (%d%%), char %lu/%ld (%d%%)"),
+		    current->lineno, totlines, linepct,
+		    xpt, cur_len, colpct,
+		    i, totsize, bytepct);
+	UNSET(DISABLE_CURPOS);
     }
 
     old_i = i;
     old_totsize = totsize;
 
     reset_cursor();
-    return 1;
+    return 0;
 }
 
 int do_cursorpos_void(void)