diff --git a/ChangeLog b/ChangeLog
index 868b063b1b4904aee25b5296a2b83b3ec12adf04..6af21bc090b016978954d9af19c9f70f327a6f9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -61,6 +61,13 @@ CVS code -
 	  the current file.  Changes to do_colorinit() (renamed
 	  color_init()), update_color() (renamed color_update()),
 	  write_file(), do_input(), and do_output(). (DLR)
+	- Simplify get_totals() to only get the total number of
+	  characters, and eliminate dependence on its old ability to get
+	  the total number of lines by renumber()ing when necessary and
+	  using the number of the last line of a filestruct.  Changes to
+	  read_file(), move_to_filestruct(), copy_from_filestruct(),
+	  do_justify(), get_totals() (renamed get_totsize()), and
+	  do_cursorpos(). (DLR)
 - files.c:
   open_file()
 	- Assert that filename isn't NULL, and don't do anything special
diff --git a/src/files.c b/src/files.c
index 2f2b734104a7e53b01f192e8bdf0df4d4ec08959..d25b5b430adc8e414d50e38e79d3e0e401a92bc8 100644
--- a/src/files.c
+++ b/src/files.c
@@ -381,8 +381,6 @@ void read_file(FILE *f, const char *filename)
 {
     size_t num_lines = 0;
 	/* The number of lines in the file. */
-    size_t num_chars;
-	/* The number of characters in the file. */
     size_t len = 0;
 	/* The length of the current line of the file. */
     size_t i = 0;
@@ -551,8 +549,8 @@ void read_file(FILE *f, const char *filename)
 	}
     }
 
-    get_totals(openfile->fileage, openfile->filebot, NULL, &num_chars);
-    openfile->totsize += num_chars;
+    openfile->totsize += get_totsize(openfile->fileage,
+	openfile->filebot);
 
 #ifndef NANO_SMALL
     if (format == 3)
diff --git a/src/nano.c b/src/nano.c
index 8ce2db679543cc7c2dfb452019e8e3085ba7be15..79982ac35abb87c1bdf819365b2f0197c7998511 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -179,7 +179,7 @@ void free_filestruct(filestruct *src)
     delete_node(src);
 }
 
-/* Renumbers all entries in a filestruct, starting with fileptr. */
+/* Renumber all entries in a filestruct, starting with fileptr. */
 void renumber(filestruct *fileptr)
 {
     ssize_t line;
@@ -300,7 +300,6 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot,
 	filestruct *top, size_t top_x, filestruct *bot, size_t bot_x)
 {
     filestruct *top_save;
-    size_t part_totsize;
     bool at_edittop;
 #ifndef NANO_SMALL
     bool mark_inside = FALSE;
@@ -332,8 +331,7 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot,
 
     /* Get the number of characters in the text, and subtract it from
      * totsize. */
-    get_totals(top, bot, NULL, &part_totsize);
-    openfile->totsize -= part_totsize;
+    openfile->totsize -= get_totsize(top, bot);
 
     if (*file_top == NULL) {
 	/* If file_top is empty, just move all the text directly into
@@ -341,7 +339,12 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot,
 	 * (lack of) text at the end of file_top. */
 	*file_top = openfile->fileage;
 	*file_bot = openfile->filebot;
+
+	/* Renumber starting with file_top. */
+	renumber(*file_top);
     } else {
+	filestruct *file_bot_save = *file_bot;
+
 	/* Otherwise, tack the text in top onto the text at the end of
 	 * file_bot. */
 	(*file_bot)->data = charealloc((*file_bot)->data,
@@ -357,6 +360,11 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot,
 	    (*file_bot)->next->prev = *file_bot;
 	    *file_bot = openfile->filebot;
 	}
+
+	/* Renumber starting with the line after the original
+	 * file_bot. */
+	if (file_bot_save->next != NULL)
+	    renumber(file_bot_save->next);
     }
 
     /* Since the text has now been saved, remove it from the filestruct.
@@ -403,7 +411,6 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot,
 void copy_from_filestruct(filestruct *file_top, filestruct *file_bot)
 {
     filestruct *top_save;
-    size_t part_totlines, part_totsize;
     bool at_edittop;
 
     assert(file_top != NULL && file_bot != NULL);
@@ -428,11 +435,10 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot)
     if (openfile->fileage == openfile->filebot)
 	openfile->current_x += strlen(filepart->top_data);
 
-    /* Get the number of lines and the number of characters in the saved
-     * text, and add the latter to totsize. */
-    get_totals(openfile->fileage, openfile->filebot, &part_totlines,
-	&part_totsize);
-    openfile->totsize += part_totsize;
+    /* Get the number of characters in the text, and add it to
+     * totsize. */
+    openfile->totsize += get_totsize(openfile->fileage,
+	openfile->filebot);
 
     /* If the top of the partition was the top of the edit window, set
      * edittop to where the saved text now starts, and update the
@@ -441,7 +447,7 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot)
      * current line. */
     if (at_edittop)
 	openfile->edittop = openfile->fileage;
-    openfile->current_y += part_totlines - 1;
+    openfile->current_y += openfile->filebot->lineno - 1;
 
     top_save = openfile->fileage;
 
@@ -2430,8 +2436,6 @@ const char *do_alt_speller(char *tempfile_name)
 
 #ifndef NANO_SMALL
     if (old_mark_set) {
-	size_t part_totsize;
-
 	/* If the mark was on, partition the filestruct so that it
 	 * contains only the marked text, and keep track of whether the
 	 * temp file (which should contain the spell-checked marked
@@ -2442,10 +2446,8 @@ const char *do_alt_speller(char *tempfile_name)
 	added_magicline = (openfile->filebot->data[0] != '\0');
 
 	/* Get the number of characters in the marked text, and subtract
-	 * it from the saved value of totsize.  Note that we don't need
-	 * to save totlines. */
-	get_totals(top, bot, NULL, &part_totsize);
-	totsize_save -= part_totsize;
+	 * it from the saved value of totsize. */
+	totsize_save -= get_totsize(top, bot);
     }
 #endif
 
@@ -3434,9 +3436,9 @@ void do_justify(bool full_justify)
     /* We are now done justifying the paragraph or the file, so clean
      * up.  totlines, totsize, and current_y have been maintained above.
      * Set last_par_line to the new end of the paragraph, update
-     * fileage, and renumber() since edit_refresh() needs the line
-     * numbers to be right (but only do the last two if we actually
-     * justified something). */
+     * fileage, and renumber since edit_refresh() needs the line numbers
+     * to be right (but only do the last two if we actually justified
+     * something). */
     last_par_line = openfile->current;
     if (first_par_line != NULL) {
 	if (first_par_line->prev == NULL)
@@ -3474,7 +3476,7 @@ void do_justify(bool full_justify)
 	/* Splice the justify buffer back into the file, but only if we
 	 * actually justified something. */
 	if (first_par_line != NULL) {
-	    filestruct *bot_save;
+	    filestruct *top_save;
 
 	    /* Partition the filestruct so that it contains only the
 	     * text of the justified paragraph. */
@@ -3487,17 +3489,16 @@ void do_justify(bool full_justify)
 	    openfile->fileage = jusbuffer;
 	    openfile->filebot = jusbottom;
 
-	    bot_save = openfile->filebot;
+	    top_save = openfile->fileage;
 
 	    /* Unpartition the filestruct so that it contains all the
 	     * text again.  Note that the justified paragraph has been
 	     * replaced with the unjustified paragraph. */
 	    unpartition_filestruct(&filepart);
 
-	     /* Renumber starting with the ending line of the old
+	     /* Renumber starting with the beginning line of the old
 	      * partition. */
-	    if (bot_save->next != NULL)
-		renumber(bot_save->next);
+	    renumber(top_save);
 
 	    /* Restore variables from before the justify. */
 	    openfile->totsize = totsize_save;
diff --git a/src/proto.h b/src/proto.h
index f79d5cbbf7d4d9ccddf68f09376468085401fd37..a93b108ad9b4007a1a2dc38c08dc1aa4372f3b17 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -565,8 +565,7 @@ void remove_magicline(void);
 void mark_order(const filestruct **top, size_t *top_x, const filestruct
 	**bot, size_t *bot_x, bool *right_side_up);
 #endif
-void get_totals(const filestruct *begin, const filestruct *end, size_t
-	*lines, size_t *size);
+size_t get_totsize(const filestruct *begin, const filestruct *end);
 
 /* Public functions in winio.c. */
 #ifndef NANO_SMALL
diff --git a/src/utils.c b/src/utils.c
index 423b032f718b39a773b34c12c2ab2f0a9e577bad..026c1c4f6eef7eb01bf7671818e14052f44f0958 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -430,47 +430,32 @@ void mark_order(const filestruct **top, size_t *top_x, const filestruct
 }
 #endif
 
-/* Calculate the number of lines and the number of characters between
- * begin and end, and return them in lines and size, respectively. */
-void get_totals(const filestruct *begin, const filestruct *end, size_t
-	*lines, size_t *size)
+/* Calculate the number of characters between begin and end, and return
+ * it. */
+size_t get_totsize(const filestruct *begin, const filestruct *end)
 {
+    size_t totsize = 0;
     const filestruct *f;
 
-    if (lines != NULL)
-	*lines = 0;
-    if (size != NULL)
-	*size = 0;
-
     /* Go through the lines from begin to end->prev, if we can. */
-    for (f = begin; f != NULL && f != end; f = f->next) {
-	/* Count this line. */
-	if (lines != NULL)
-	    (*lines)++;
-
+    for (f = begin; f != end && f != NULL; f = f->next) {
 	/* Count the number of characters on this line. */
-	if (size != NULL) {
-	    *size += mbstrlen(f->data);
+	totsize += mbstrlen(f->data);
 
-	    /* Count the newline if we have one. */
-	    if (f->next != NULL)
-		(*size)++;
-	}
+	/* Count the newline if we have one. */
+	if (f->next != NULL)
+	    totsize++;
     }
 
     /* Go through the line at end, if we can. */
     if (f != NULL) {
-	/* Count this line. */
-	if (lines != NULL)
-	    (*lines)++;
-
 	/* Count the number of characters on this line. */
-	if (size != NULL) {
-	    *size += mbstrlen(f->data);
+	totsize += mbstrlen(f->data);
 
-	    /* Count the newline if we have one. */
-	    if (f->next != NULL)
-		(*size)++;
-	}
+	/* Count the newline if we have one. */
+	if (f->next != NULL)
+	    totsize++;
     }
+
+    return totsize;
 }
diff --git a/src/winio.c b/src/winio.c
index 5aa7039242780895cf98f323c8aa2ffab1424264..636892981655c8a687925dd7923ebcc60008e29a 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -3829,7 +3829,7 @@ void do_cursorpos(bool constant)
     f = openfile->current->next;
     openfile->current->data[openfile->current_x] = '\0';
     openfile->current->next = NULL;
-    get_totals(openfile->fileage, openfile->current, NULL, &i);
+    i = get_totsize(openfile->fileage, openfile->current);
     openfile->current->data[openfile->current_x] = c;
     openfile->current->next = f;