diff --git a/ChangeLog b/ChangeLog
index 7ba928b6296c529dd0fd83f6e1ef73149016bdab..92d073c83def39919fd62e945ca69d16c655a160 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,12 +5,17 @@ CVS Code -
 	  Removed intl/ entirely, and a few more tweaks by gettextize.
 	- i18nized a few strings used in DEBUG mode. (DLR)
 	- Some chars being assigned 0 are now assigned '\0'. (DLR)
-	- Put header files in a more consistent order. (DLR)
+	- Put header file #includes in a more consistent order. (DLR)
 	- Remove some unneeded blank lines and spaces, and make some
 	  spacing more consistent. (DLR)
 	- When possible, use iscntrl() to determine whether a character
 	  is a control character or not. (DLR)
 	- Miscellaneous typo fixes. (DLR)
+	- Many fixes to the help browser and shortcut lists: efficiency
+	  updates, consistency fixes, help text fixes and improvements,
+	  and spacing improvements. (David Benbennick)
+	- Make more functions use const variables when possible. (David
+	  Benbennick)
 - files.c:
   read_file(), read_line():
 	- Rework to properly handle nulls in the input file, fix
@@ -52,10 +57,17 @@ CVS Code -
 	  with it, instead of calling clear_filename() in two places.
 	  Make startline an int instead of a long, since it's supposed to
 	  hold a line number. (DLR)
+	- Properly handle multiple -r settings on the command line. (Carl
+	  Drinkwater)
 - search.c:
   findnextstr():
 	- Update the current line at current_x if we don't find a match.
-	  (DLR)
+	  Also, pass current_x_find to strstrwrapper() so we know whether
+	  we're at the beginning of a string or not (see changes to
+	  strstrwrapper() below), and reset it between lines. (DLR)
+  do_gotoline():
+	- Make sure placewewant is zero after we go to a line. (David
+	  Benbennick)
   do_gotopos():
 	- Simplify the sanity check to only put x within the range of the
 	  current line; don't call actual_x() anymore. (DLR)
@@ -64,6 +76,10 @@ CVS Code -
 	  other than the terminating null in strings to newlines and
 	  back; they're used to handle null characters in files properly.
 	  (DLR)
+  strstrwrapper(): Set REG_NOTBOL when we're not at the beginning of a
+	  string, to avoid false positives when searching for regular
+	  expressions prefixed with ^. Make it take a new parameter,
+	  line_pos, to determine where we are in the string. (DLR)
 - winio.c:
   actual_x_from_start():
 	- Overhaul to make cursor placement more like that of Pico: add
@@ -74,6 +90,9 @@ CVS Code -
 	- After the user presses Enter at the prompt, refresh the edit
 	  window in case there's a list of possible filename matches
 	  (left over from attempted tab completion) on it. (DLR)
+  titlebar():
+	- Tweak text spacing and printing so that the titlebar text looks
+	  better on smaller terminals. (Carl Drinkwater)
   update_line():
 	- When marking control characters, make sure the mark moves
 	  forward by two characters inctead of one.  Rework control
diff --git a/global.c b/global.c
index 1a4157e5d1ccdc47e1122acb46d65a88a7d90120..e31373f4d76d996bfe0e30ad665d5ad68da3f4d7 100644
--- a/global.c
+++ b/global.c
@@ -338,7 +338,7 @@ void shortcut_init(int unjustify)
     nano_exit_msg = _("Exit from nano");
 #endif
 
-    nano_goto_msg = _("Goto a specific line number");
+    nano_goto_msg = _("Go to a specific line number");
     nano_justify_msg = _("Justify the current paragraph");
     nano_unjustify_msg = _("Unjustify after a justify");
     nano_replace_msg = _("Replace text within the editor");
@@ -369,7 +369,7 @@ void shortcut_init(int unjustify)
 	_("Make the current search or replace case (in)sensitive");
     nano_tofiles_msg = _("Go to file browser");
     nano_execute_msg = _("Execute external command");
-    nano_gotodir_msg = _("Goto Directory");
+    nano_gotodir_msg = _("Go to directory");
     nano_cancel_msg = _("Cancel the current function");
     nano_append_msg = _("Append to the current file");
     nano_prepend_msg = _("Prepend to the current file");
@@ -541,10 +541,20 @@ void shortcut_init(int unjustify)
 		IFHELP(nano_enter_msg, 0),
 		KEY_ENTER, NANO_CONTROL_M, NOVIEW, do_enter_void);
 
-    sc_init_one(&main_list, NANO_GOTO_KEY, _("Goto Line"),
+    sc_init_one(&main_list, NANO_GOTO_KEY, _("Go To Line"),
 		    IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY),
 		    NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void);
 
+#ifndef NANO_SMALL
+    sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"),
+		IFHELP(_("Move forward one word"), 0),
+		0, 0, VIEW, do_next_word_void);
+
+    sc_init_one(&main_list, -9, _("Prev Word"),
+		IFHELP(_("Move backward one word"), NANO_PREVWORD_KEY), 0, 0,
+		VIEW, do_prev_word_void);
+#endif
+
 #if (!defined NANO_SMALL) && (defined HAVE_REGEX_H)
     sc_init_one(&main_list, -9, _("Find Other Bracket"),
 		    IFHELP(nano_bracket_msg, NANO_BRACKET_KEY),
@@ -560,15 +570,6 @@ void shortcut_init(int unjustify)
 		    0, 0, VIEW, open_nextfile_void);
 #endif
 
-#ifndef NANO_SMALL
-    sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"),
-		IFHELP(_("Move forward one word"), 0),
-		0, 0, VIEW, do_next_word_void);
-    sc_init_one(&main_list, -9, _("Prev Word"),
-		IFHELP(_("Move backward one word"), NANO_PREVWORD_KEY), 0, 0,
-		VIEW, do_prev_word_void);
-#endif
-
     free_shortcutage(&whereis_list);
 
     sc_init_one(&whereis_list, NANO_HELP_KEY, _("Get Help"),
@@ -587,7 +588,7 @@ void shortcut_init(int unjustify)
     sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"),
 		IFHELP(nano_replace_msg, 0), 0, 0, VIEW, do_replace);
 
-    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Goto Line"), 
+    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
 		IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
 
 #ifndef NANO_SMALL
@@ -620,7 +621,7 @@ void shortcut_init(int unjustify)
     sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
 		IFHELP(nano_whereis_msg, 0), 0, 0, VIEW, do_search);
 
-    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Goto Line"), 
+    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
 		IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
 
 #ifndef NANO_SMALL
@@ -747,8 +748,8 @@ void shortcut_init(int unjustify)
     sc_init_one(&browser_list, NANO_HELP_KEY, _("Get Help"),
 		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
 
-    sc_init_one(&browser_list, NANO_EXIT_KEY, _("Exit"),
-		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW, 0);
+    sc_init_one(&browser_list, NANO_CANCEL_KEY, _("Cancel"),
+		IFHELP(nano_cancel_msg, 0), NANO_EXIT_FKEY, 0, VIEW, 0);
 
     sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
 		IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY,
@@ -758,7 +759,7 @@ void shortcut_init(int unjustify)
 		IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY,
 		KEY_NPAGE, VIEW, 0);
 
-    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Goto"),
+    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Go To Dir"),
 		IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY),
 		NANO_GOTO_FKEY, 0, VIEW, 0);
 
diff --git a/nano.c b/nano.c
index 5a2d18bf9cebdc6745186cceecbdf33552076c60..25f94a2fe5db2294e709681a692a737dcdb90459 100644
--- a/nano.c
+++ b/nano.c
@@ -70,10 +70,6 @@ int wrap_at = 0;/* Right justified fill value, allows resize */
 struct termios oldterm;		/* The user's original term settings */
 static struct sigaction act;	/* For all our fun signal handlers */
 
-#ifndef DISABLE_HELP
-static char *help_text_init = "";	/* Initial message, not including shortcuts */
-#endif
-
 char *last_search = NULL;	/* Last string we searched for */
 char *last_replace = NULL;	/* Last replacement string */
 int search_last_line;		/* Is this the last search line? */
@@ -248,33 +244,7 @@ void global_init(int save_cutbuffer)
 
 }
 
-#ifndef DISABLE_HELP
-void init_help_msg(void)
-{
-
-    help_text_init =
-	_(" nano help text\n\n "
-	  "The nano editor is designed to emulate the functionality and "
-	  "ease-of-use of the UW Pico text editor.  There are four main "
-	  "sections of the editor: The top line shows the program "
-	  "version, the current filename being edited, and whether "
-	  "or not the file has been modified.  Next is the main editor "
-	  "window showing the file being edited.  The status line is "
-	  "the third line from the bottom and shows important messages. "
-	  "The bottom two lines show the most commonly used shortcuts "
-	  "in the editor.\n\n "
-	  "The notation for shortcuts is as follows: Control-key "
-	  "sequences are notated with a caret (^) symbol and are entered "
-	  "with the Control (Ctrl) key.  Escape-key sequences are notated "
-	  "with the Meta (M) symbol and can be entered using either the "
-	  "Esc, Alt or Meta key depending on your keyboard setup.  The "
-	  "following keystrokes are available in the main editor window. "
-	  "Optional keys are shown in parentheses:\n\n");
-}
-#endif
-
-/* Make a copy of a node to a pointer (space will be malloc()ed).  This
-   does NOT copy the data members used only by open_files. */
+/* Make a copy of a node to a pointer (space will be malloc()ed). */
 filestruct *copy_node(filestruct * src)
 {
     filestruct *dst;
@@ -2514,17 +2484,16 @@ int do_justify(void)
 }
 
 #ifndef DISABLE_HELP
+/* This function allocates help_text, and stores the help string in it. 
+ * help_text should be NULL initially. */
 void help_init(void)
 {
-    int i, sofar = 0, helplen;
-    long allocsize = 1;		/* How much space we're gonna need for the help text */
+    size_t allocsize = 1;	/* space needed for help_text */
     char *ptr = NULL;
 #ifndef NANO_SMALL
-    toggle *t;
+    const toggle *t;
 #endif
-    shortcut *s;
-
-    helplen = length_of_list(currshortcut);
+    const shortcut *s;
 
     /* First set up the initial help text for the current function */
     if (currshortcut == whereis_list || currshortcut == replace_list
@@ -2534,29 +2503,29 @@ void help_init(void)
 		"for, then hit enter.  If there is a match for the text you "
 		"entered, the screen will be updated to the location of the "
 		"nearest match for the search string.\n\n "
-		"If using Pico Mode via the -p or --pico flags, using the "
-		"Meta-P toggle or using a nanorc file, the previous search "
+		"If using Pico Mode via the -p or --pico flags, the "
+		"Meta-P toggle, or a nanorc file, the previous search "
 		"string will be shown in brackets after the Search: prompt.  "
-		"Hitting enter without entering any text will perform the "
-		"previous search. Otherwise, the previous string will be "
-		"placed in front of the cursor, and can be edited or deleted "
-		"before hitting enter.\n\n The following functions keys are "
+		"Hitting Enter without entering any text will perform the "
+		"previous search.  Otherwise, the previous string will be "
+		"placed before the cursor, and can be edited or deleted "
+		"before hitting enter.\n\n The following function keys are "
 		"available in Search mode:\n\n");
     else if (currshortcut == goto_list)
-	ptr = _("Goto Line Help Text\n\n "
+	ptr = _("Go To Line Help Text\n\n "
 		"Enter the line number that you wish to go to and hit "
 		"Enter.  If there are fewer lines of text than the "
 		"number you entered, you will be brought to the last line "
-		"of the file.\n\n The following functions keys are "
-		"available in Goto Line mode:\n\n");
+		"of the file.\n\n The following function keys are "
+		"available in Go To Line mode:\n\n");
     else if (currshortcut == insertfile_list)
 	ptr = _("Insert File Help Text\n\n "
 		"Type in the name of a file to be inserted into the current "
 		"file buffer at the current cursor location.\n\n "
 		"If you have compiled nano with multiple file buffer "
 		"support, and enable multiple buffers with the -F "
-		"or --multibuffer command line flags, the Meta-F toggle or "
-		"using a nanorc file, inserting a file will cause it to be "
+		"or --multibuffer command line flags, the Meta-F toggle, or "
+		"a nanorc file, inserting a file will cause it to be "
 		"loaded into a separate buffer (use Meta-< and > to switch "
 		"between file buffers).\n\n If you need another blank "
 		"buffer, do not enter any filename, or type in a "
@@ -2566,14 +2535,13 @@ void help_init(void)
     else if (currshortcut == writefile_list)
 	ptr = _("Write File Help Text\n\n "
 		"Type the name that you wish to save the current file "
-		"as and hit enter to save the file.\n\n "
-		"If you are using the marker code with Ctrl-^ and have "
-		"selected text, you will be prompted to save only the "
-		"selected portion to a separate file.  To reduce the "
-		"chance of overwriting the current file with just a portion "
-		"of it, the current filename is not the default in this "
-		"mode.\n\n The following function keys are available in "
-		"Write File mode:\n\n");
+		"as and hit Enter to save the file.\n\n If you have "
+		"selected text with Ctrl-^, you will be prompted to "
+		"save only the selected portion to a separate file.  To "
+		"reduce the chance of overwriting the current file with "
+		"just a portion of it, the current filename is not the "
+		"default in this mode.\n\n The following function keys "
+		"are available in Write File mode:\n\n");
 #ifndef DISABLE_BROWSER
     else if (currshortcut == browser_list)
 	ptr = _("File Browser Help Text\n\n "
@@ -2582,17 +2550,17 @@ void help_init(void)
 		"or writing.  You may use the arrow keys or Page Up/"
 		"Down to browse through the files, and S or Enter to "
 		"choose the selected file or enter the selected "
-		"directory. To move up one level, select the directory "
+		"directory.  To move up one level, select the directory "
 		"called \"..\" at the top of the file list.\n\n The "
-		"following functions keys are available in the file "
+		"following function keys are available in the file "
 		"browser:\n\n");
     else if (currshortcut == gotodir_list)
-	ptr = _("Browser Goto Directory Help Text\n\n "
+	ptr = _("Browser Go To Directory Help Text\n\n "
 		"Enter the name of the directory you would like to "
 		"browse to.\n\n If tab completion has not been disabled, "
 		"you can use the TAB key to (attempt to) automatically "
-		"complete the directory name.\n\n  The following function "
-		"keys are available in Browser GotoDir mode:\n\n");
+		"complete the directory name.\n\n The following function "
+		"keys are available in Browser Go To Directory mode:\n\n");
 #endif
     else if (currshortcut == spell_list)
 	ptr = _("Spell Check Help Text\n\n "
@@ -2612,107 +2580,117 @@ void help_init(void)
 		"available in this mode:\n\n");
 #endif
     else /* Default to the main help list */
-	ptr = help_text_init;
+	ptr = _(" nano help text\n\n "
+	  "The nano editor is designed to emulate the functionality and "
+	  "ease-of-use of the UW Pico text editor.  There are four main "
+	  "sections of the editor: The top line shows the program "
+	  "version, the current filename being edited, and whether "
+	  "or not the file has been modified.  Next is the main editor "
+	  "window showing the file being edited.  The status line is "
+	  "the third line from the bottom and shows important messages. "
+	  "The bottom two lines show the most commonly used shortcuts "
+	  "in the editor.\n\n "
+	  "The notation for shortcuts is as follows: Control-key "
+	  "sequences are notated with a caret (^) symbol and are entered "
+	  "with the Control (Ctrl) key.  Escape-key sequences are notated "
+	  "with the Meta (M) symbol and can be entered using either the "
+	  "Esc, Alt or Meta key depending on your keyboard setup.  The "
+	  "following keystrokes are available in the main editor window.  "
+	  "Alternative keys are shown in parentheses:\n\n");
 
-    /* Compute the space needed for the shortcut lists - we add 15 to
-       have room for the shortcut abbrev and its possible alternate keys */
-    s = currshortcut;
-    for (i = 0; i <= helplen - 1; i++) {
-	if (s->help != NULL)
-	    allocsize += strlen(s->help) + 15;
-	s = s->next;
+    assert(currshortcut != NULL);
+    /* Compute the space needed for the shortcut lists */
+    for (s = currshortcut; s != NULL; s = s->next) {
+	assert(s->help != NULL);
+	/* Each shortcut has at most 24 chars for the shortcut keys, plus
+	 * the help description, plus 1 for \n. */
+	allocsize += strlen(s->help) + 25;
     }
 
 #ifndef NANO_SMALL
-    /* If we're on the main list, we also allocate space for toggle help text. */
+    /* If we're on the main list, we also count the toggle help text. */
     if (currshortcut == main_list) {
-	for (t = toggles; t != NULL; t = t->next)
-	    if (t->desc != NULL)
-		allocsize += strlen(t->desc) + 30;
+	for (t = toggles; t != NULL; t = t->next) {
+	    size_t len;
+
+	    assert(t->desc != NULL);
+	    len = strlen(t->desc);
+
+	    /* 6 for "M-%c\t\t\t", which fills 24 columns. */
+	    allocsize += 6 + (len < COLS-24 ? len : COLS-24);
+	}
     }
 #endif /* !NANO_SMALL */
 
     allocsize += strlen(ptr);
 
-    if (help_text != NULL)
-	free(help_text);
+    /* Other routines should have set help_text to NULL before */
+    assert(help_text == NULL);
 
     /* Allocate space for the help text */
     help_text = charalloc(allocsize);
 
     /* Now add the text we want */
     strcpy(help_text, ptr);
-    sofar = strlen(help_text);
+    ptr = help_text + strlen(help_text);
 
     /* Now add our shortcut info */
-    s = currshortcut;
-    for (i = 0; i <= helplen - 1; i++) {
+    for (s = currshortcut; s != NULL; s = s->next) {
+	/* true if the character in s->altval is shown in first column */
 	int meta_shortcut = 0;
 
 	if (s->val > 0 && s->val < 32)
-	    sofar += sprintf(help_text + sofar, "^%c\t", s->val + 64);
+	    ptr += sprintf(ptr, "^%c", s->val + 64);
 #ifndef NANO_SMALL
 	else if (s->val == NANO_CONTROL_SPACE)
-	    sofar += sprintf(help_text + sofar, "^%s\t", _("Space"));
-#endif
-	else if (s->altval > 0)
+	    ptr += snprintf(ptr, 8, "^%s", _("Space"));
+	else if (s->altval == NANO_ALT_SPACE) {
 	    meta_shortcut = 1;
-	else
-	    help_text[sofar++] = '\t';
-
-	if (!meta_shortcut) {
-	    if (s->misc1 > KEY_F0 && s->misc1 <= KEY_F(64))
-		sofar += sprintf(help_text + sofar, "(F%d)",
-				s->misc1 - KEY_F0);
-	    help_text[sofar++] = '\t';
+	    ptr += snprintf(ptr, 8, "M-%s", _("Space"));
 	}
-
-#ifndef NANO_SMALL
-	if (s->altval == NANO_ALT_SPACE)
-	    sofar += sprintf(help_text + sofar, "M-%s",	_("Space"));
-	else
 #endif
-	if (s->altval > 0)
-	    sofar += sprintf(help_text + sofar,
-		(meta_shortcut ? "M-%c" : "(M-%c)"), s->altval -
-		(('A' <= s->altval && s->altval <= 'Z') || 'a' <= s->altval
-			? 32 : 0));
+	else if (s->altval > 0) {
+	    meta_shortcut = 1;
+	    ptr += sprintf(ptr, "M-%c", s->altval -
+			(('A' <= s->altval && s->altval <= 'Z') ||
+			'a' <= s->altval ? 32 : 0));
+	}
 	/* Hack */
-	else if (s->val >= 'a')
-	    sofar += sprintf(help_text + sofar,
-		(meta_shortcut ? "(M-%c)\t" : "M-%c\t"), s->val - 32);
-
-	help_text[sofar++] = '\t';
-
-	if (meta_shortcut) {
-	    if (s->misc1 > KEY_F0 && s->misc1 <= KEY_F(64))
-		sofar += sprintf(help_text + sofar,
-				"(F%d)", s->misc1 - KEY_F0);
-	    help_text[sofar++] = '\t';
-	    help_text[sofar++] = '\t';
+	else if (s->val >= 'a') {
+	    meta_shortcut = 1;
+	    ptr += sprintf(ptr, "M-%c", s->val - 32);
 	}
 
-	if (s->help != NULL)
-	    sofar += sprintf(help_text + sofar, "%s", s->help);
+	*(ptr++) = '\t';
+
+	if (s->misc1 > KEY_F0 && s->misc1 <= KEY_F(64))
+	    ptr += sprintf(ptr, "(F%d)", s->misc1 - KEY_F0);
 
-	help_text[sofar++] = '\n';
+	*(ptr++) = '\t';
 
-	s = s->next;
+	if (!meta_shortcut && s->altval > 0)
+	    ptr += sprintf(ptr, "(M-%c)", s->altval -
+		(('A' <= s->altval && s->altval <= 'Z') || 'a' <= s->altval
+			? 32 : 0));
+
+	*(ptr++) = '\t';
+
+	ptr += sprintf(ptr, "%s\n", s->help);
     }
 
 #ifndef NANO_SMALL
     /* And the toggles... */
     if (currshortcut == main_list)
 	for (t = toggles; t != NULL; t = t->next) {
-	    sofar += sprintf(help_text + sofar, "M-%c\t\t\t",
-				t->val - 32);
-	    if (t->desc != NULL) {
-		sofar += sprintf(help_text + sofar,
-				_("%s enable/disable"), t->desc);
-	    }
-	    help_text[sofar++] = '\n';
+	    ptr += sprintf(ptr, "M-%c\t\t\t", t->val - 32);
+	    ptr += snprintf(ptr, COLS-24, _("%s enable/disable\n"),
+				t->desc);
 	}
 #endif /* !NANO_SMALL */
+
+    /* If all went well, we didn't overwrite the allocated space for
+       help_text. */
+    assert(strlen(help_text) < allocsize);
 }
 #endif
 
@@ -3007,6 +2985,8 @@ int main(int argc, char *argv[])
 	    fill = atoi(optarg);
 	    if (fill < 0)
 		wrap_at = fill;
+	    else if (fill > 0)
+		wrap_at = 0;
 	    else if (fill == 0) {
 		usage();	/* To stop bogus data (like a string) */
 		finish(1);
@@ -3093,10 +3073,6 @@ int main(int argc, char *argv[])
     /* Set up some global variables */
     global_init(0);
     shortcut_init(0);
-#ifndef DISABLE_HELP
-    init_help_msg();
-    help_init();
-#endif
     signal_init();
 
 #ifdef DEBUG
diff --git a/proto.h b/proto.h
index f13a64bc1697f30e3c78a720422e8dedfea98223..1c4436a66b3d6ca6091d4fedf51f44420533c058 100644
--- a/proto.h
+++ b/proto.h
@@ -114,7 +114,7 @@ void thanks_for_all_the_fish(void);
 char *revstrstr(char *haystack, char *needle, char *rev_start);
 char *stristr(char *haystack, char *needle);
 char *revstristr(char *haystack, char *needle, char *rev_start);
-char *strstrwrapper(char *haystack, char *needle, char *rev_start);
+char *strstrwrapper(char *haystack, char *needle, char *rev_start, int line_pos);
 int search_init(int replacing);
 int renumber(filestruct * fileptr);
 int free_filestruct(filestruct * src);
diff --git a/search.c b/search.c
index 2862a6a399c9fc175fdcce3ef13dd798d32da0de..aee3e3cd7aa56801f735cbf71f0e88c0ecf8eb5f 100644
--- a/search.c
+++ b/search.c
@@ -268,7 +268,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 	searchstr = &fileptr->data[current_x_find];
 
 	/* Look for needle in searchstr */
-	while ((found = strstrwrapper(searchstr, needle, rev_start)) == NULL) {
+	while ((found = strstrwrapper(searchstr, needle, rev_start, current_x_find)) == NULL) {
 
 	    /* finished processing file, get out */
 	    if (search_last_line) {
@@ -279,6 +279,10 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 	    }
 
 	    update_line(fileptr, 0);
+
+	    /* reset current_x_find between lines */
+	    current_x_find = 0;
+
 	    fileptr = fileptr->next;
 
 	    if (fileptr == editbot)
@@ -286,7 +290,8 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 
 	    /* EOF reached ?, wrap around once */
 	    if (fileptr == NULL) {
-		if (bracket_mode)		/* don't wrap if looking for bracket match */
+		/* don't wrap if looking for bracket match */
+		if (bracket_mode)
 		    return NULL;
 		fileptr = fileage;
 		past_editbuff = 1;
@@ -332,7 +337,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 	searchstr = fileptr->data;
 
 	/* Look for needle in searchstr */
-	while ((found = strstrwrapper(searchstr, needle, rev_start)) == NULL) {
+	while ((found = strstrwrapper(searchstr, needle, rev_start, current_x_find)) == NULL) {
 
 	    /* finished processing file, get out */
 	    if (search_last_line) {
@@ -342,6 +347,10 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 	    }
 
 	    update_line(fileptr, 0);
+
+	    /* reset current_x_find between lines */
+	    current_x_find = 0;
+
 	    fileptr = fileptr->prev;
 
 	    if (fileptr == edittop->prev)
@@ -811,14 +820,8 @@ void goto_abort(void)
 
 int do_gotoline(int line, int save_pos)
 {
-    int i = 1;
-
     if (line <= 0) {		/* Ask for it */
-
-	int j = 0;
-
-	j = statusq(0, goto_list, "", _("Enter line number"));
-	if (j != 0) {
+	if (statusq(0, goto_list, "", _("Enter line number"))) {
 	    statusbar(_("Aborted"));
 	    goto_abort();
 	    return 0;
@@ -834,7 +837,7 @@ int do_gotoline(int line, int save_pos)
 	}
     }
 
-    for (current = fileage; ((current->next != NULL) && (i < line)); i++)
+    for (current = fileage; current->next != NULL && line > 1; line--)
 	current = current->next;
 
     current_x = 0;
@@ -846,7 +849,7 @@ int do_gotoline(int line, int save_pos)
     else
 	edit_update(current, CENTER);
 
-    placewewant = xplustabs();
+    placewewant = 0;
     goto_abort();
     return 1;
 }
diff --git a/utils.c b/utils.c
index 207a9f79c423f3fdff6c7ef6cf44d53d829eb1bd..f86ff47b6980446d0bf11fbec5c4cc48073dcea3 100644
--- a/utils.c
+++ b/utils.c
@@ -137,15 +137,15 @@ char *stristr(char *haystack, char *needle)
     return NULL;
 }
 
-char *strstrwrapper(char *haystack, char *needle, char *rev_start)
+char *strstrwrapper(char *haystack, char *needle, char *rev_start, int line_pos)
 {
 
 #ifdef HAVE_REGEX_H
-    int  result;
+    int result;
 
     if (ISSET(USE_REGEXP)) {
 	if (!ISSET(REVERSE_SEARCH)) {
-	    result = regexec(&search_regexp, haystack, 10, regmatches, 0);
+	    result = regexec(&search_regexp, haystack, 10, regmatches, (line_pos > 0) ? REG_NOTBOL : 0);
 	    if (!result)
 		return haystack + regmatches[0].rm_so;
 #ifndef NANO_SMALL
@@ -155,12 +155,13 @@ char *strstrwrapper(char *haystack, char *needle, char *rev_start)
 	    /* do a quick search forward first */
 	    if (!(regexec(&search_regexp, haystack, 10, regmatches, 0))) {
 		/* there's a match somewhere in the line - now search for it backwards, much slower */
-		for(i = rev_start ; i >= haystack ; --i)
-		    if (!(result = regexec(&search_regexp, i, 10, regmatches, 0))) {
+		for (i = rev_start; i >= haystack; --i) {
+		    if (!(result = regexec(&search_regexp, i, 10, regmatches, (i > haystack) ? REG_NOTBOL : 0))) {
 			j = i + regmatches[0].rm_so;
 			if (j <= rev_start)
 			    return j;
 		    }
+		}
 	    }
 #endif
 	}
@@ -172,7 +173,7 @@ char *strstrwrapper(char *haystack, char *needle, char *rev_start)
 	if (ISSET(REVERSE_SEARCH))
 	    return revstrstr(haystack, needle, rev_start);
         else
-	    return strstr(haystack,needle);
+	    return strstr(haystack, needle);
 
     } else {
 	if (ISSET(REVERSE_SEARCH))
diff --git a/winio.c b/winio.c
index 525dd428c1bb5850da000665f25891989339cb05..6d1da81d8ae9bbc539e58d5bb14dc4f7b83746cb 100644
--- a/winio.c
+++ b/winio.c
@@ -68,7 +68,7 @@ int do_last_line(void)
 }
 
 /* Like xplustabs, but for a specific index of a specific filestruct */
-int xpt(filestruct * fileptr, int index)
+int xpt(const filestruct *fileptr, int index)
 {
     int i, tabs = 0;
 
@@ -558,36 +558,37 @@ void titlebar(char *path)
     wattron(topwin, A_REVERSE);
 #endif
 
-
-    mvwaddstr(topwin, 0, 3, VERMSG);
+    mvwaddnstr(topwin, 0, 2, VERMSG, COLS - 3);
 
     space = COLS - strlen(VERMSG) - strlen(VERSION) - 21;
 
     namelen = strlen(what);
 
-    if (what[0] == '\0')
-	mvwaddstr(topwin, 0, COLS / 2 - 6, _("New Buffer"));
-    else {
-	if (namelen > space) {
-	    if (path == NULL)
-		waddstr(topwin, _("  File: ..."));
-	    else
-		waddstr(topwin, _("   DIR: ..."));
-	    waddstr(topwin, &what[namelen - space]);
-	} else {
-	    if (path == NULL)
-		mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
-			  _("File: "));
-	    else
-		mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
-			  _(" DIR: "));
-	    waddstr(topwin, what);
+    if (space > 0) {
+        if (what[0] == '\0')
+      	    mvwaddstr(topwin, 0, COLS / 2 - 6, _("New Buffer"));
+        else {
+    	    if (namelen > space) {
+	        if (path == NULL)
+		    waddstr(topwin, _("  File: ..."));
+    	    	else
+		    waddstr(topwin, _("   DIR: ..."));
+	        waddstr(topwin, &what[namelen - space]);
+    	    } else {
+	        if (path == NULL)
+		    mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
+		    	      _("File: "));
+ 	        else
+		    mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
+			      _(" DIR: "));
+	        waddstr(topwin, what);
+	    }
 	}
-    }
+    } /* If we don't have space, we shouldn't bother */
     if (ISSET(MODIFIED))
-	mvwaddstr(topwin, 0, COLS - 10, _("Modified"));
+	mvwaddstr(topwin, 0, COLS - 11, _(" Modified "));
     else if (ISSET(VIEW_MODE))
-	mvwaddstr(topwin, 0, COLS - 10, _("View"));
+	mvwaddstr(topwin, 0, COLS - 11, _(" View "));
 
 #ifdef ENABLE_COLOR
     color_off(topwin, COLOR_TITLEBAR);
@@ -1733,12 +1734,11 @@ int do_cursorpos_void(void)
     return do_cursorpos(0);
 }
 
-/* Our broken, non-shortcut list compliant help function.
-   But, hey, it's better than nothing, and it's dynamic! */
+/* Our shortcut-list-compliant help function, which is
+ * better than nothing, and dynamic! */
 int do_help(void)
 {
 #ifndef DISABLE_HELP
-    char *ptr, *end;
     int i, j, row = 0, page = 1, kbinput = 0, no_more = 0, kp, kp2;
     int no_help_flag = 0;
     shortcut *oldshortcut;
@@ -1748,8 +1748,9 @@ int do_help(void)
     wattroff(bottomwin, A_REVERSE);
     blank_statusbar();
 
+    /* set help_text as the string to display */
     help_init();
-    ptr = help_text;
+    assert(help_text != NULL);
 
     oldshortcut = currshortcut;
 
@@ -1771,7 +1772,8 @@ int do_help(void)
 	bottombars(help_list);
 
     do {
-	ptr = help_text;
+	const char *ptr = help_text;
+
 	switch (kbinput) {
 #ifndef DISABLE_MOUSE
 #ifdef NCURSES_MOUSE_VERSION
@@ -1842,14 +1844,10 @@ int do_help(void)
 	    }
 	}
 
-	if (i > 1) {
-
-	}
-
 	i = 0;
 	j = 0;
 	while (i < editwinrows && *ptr != '\0') {
-	    end = ptr;
+	    const char *end = ptr;
 	    while (*end != '\n' && *end != '\0' && j != COLS - 5) {
 		end++;
 		j++;
@@ -1895,6 +1893,11 @@ int do_help(void)
     nano_disabled_msg();
 #endif
 
+    /* The help_init() at the beginning allocated help_text, which has
+       now been written to screen. */
+    free(help_text);
+    help_text = NULL;
+
     return 1;
 }