diff --git a/ChangeLog b/ChangeLog
index 89013fcfed9a88ad3573fd3f3b32d3ec7a343f75..59d7c95b0a8e7746d69cd2935742ff12d040b853 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -199,6 +199,9 @@ Changes
 	  found, display "[string] not found" instead of "Replaced 0
 	  occurrences". (DLR)
 - utils.c:
+  is_cntrl_char()
+	- Rework to fix a problem with displaying certain high-bit
+	  characters. (David Benbennick; reported by Andrzej Marecki)
   align()
 	- Don't just assert that the string passed in isn't NULL; check
 	  that it isn't and only do the alignment when it isn't. (David
@@ -211,10 +214,13 @@ Changes
   charalloc()
 	- Removed and redefined as a macro that calls nmalloc(). (David
 	  Benbennick)
-  is_cntrl_char()
-	- Rework to fix a problem with displaying certain high-bit
-	  characters. (David Benbennick; reported by Andrzej Marecki)
 - winio.c:
+  nanogetstr()
+	- Tweak to make the cursor stay in the same place if we hit a
+	  prompt-changing toggle while it's in the middle of the string.
+	  Also fix minor problem with search history where the current
+	  search item could be at the bottom of the history twice in a
+	  row under certain conditions. (DLR)
   edit_refresh()
 	- Miscellaneous cleanups that fix a bug where the screen
 	  isn't updated after uncutting chunks of upwardly marked cut
diff --git a/nano.c b/nano.c
index e20378f2875101fd8d6f51ae5fb6ce0fab5dfa86..c6dc793c931fd86b6a71b5efd5bfa986f7ca9efb 100644
--- a/nano.c
+++ b/nano.c
@@ -2993,7 +2993,7 @@ int main(int argc, char *argv[])
     int optchr;
     int startline = 0;		/* Line to try and start at */
     int modify_control_seq;
-    int fill_flag_used = 0;		/* Was the fill option used? */
+    int fill_flag_used = 0;	/* Was the fill option used? */
     const shortcut *s;
 #ifdef HAVE_GETOPT_LONG
     int preserveopt = 0;	/* Did the cmdline include --preserve? */
diff --git a/search.c b/search.c
index 01e71b80b7fd292e6fbe10ad99f6a3398312249e..1ab222e4c9bfaf2c764b8acb13c21bcc7a36347f 100644
--- a/search.c
+++ b/search.c
@@ -158,8 +158,7 @@ int search_init(int replacing)
 	case -2:	/* Same string */
 #ifdef HAVE_REGEX_H
 	    if (ISSET(USE_REGEXP))
-		/* If we're in Pico mode, and answer is "", use
-		   last_search! */
+		/* If answer is "", use last_search! */
 		regexp_init(last_search);
 #endif
 	    break;
@@ -405,7 +404,7 @@ int do_search(void)
     if (fileptr == current && fileptr_x == current_x && didfind != NULL)
 	statusbar(_("This is the only occurrence"));
     else if (current->lineno <= edittop->lineno
-        || current->lineno >= editbot->lineno)
+	|| current->lineno >= editbot->lineno)
         edit_update(current, current_x);
 
     search_abort();
@@ -687,7 +686,7 @@ int do_replace(void)
     }
 
 #ifndef NANO_SMALL
-    if (strcmp(answer, ""))
+    if (answer[0] != '\0')
 	update_history(&search_history, answer);
 #endif	/* !NANO_SMALL */
 
@@ -712,7 +711,7 @@ int do_replace(void)
 		_("Replace with"));
 
 #ifndef NANO_SMALL
-    if (i == 0 && strcmp(answer, ""))
+    if (i == 0 && answer[0] != '\0')
 	update_history(&replace_history, answer);
 #endif	/* !NANO_SMALL */
 
@@ -912,7 +911,7 @@ void history_init(void)
 /* find first node containing string *s in history list *h */
 historytype *find_node(historytype *h, char *s)
 {
-    for ( ; h->next ; h = h->next)
+    for (; h->next != NULL; h = h->next)
 	if (strcmp(s, h->data) == 0)
 	    return h;
     return NULL;
@@ -945,10 +944,11 @@ void update_history(historyheadtype *h, char *s)
 {
     historytype *p;
 
-    if ((p = find_node(h->next, s))) {
-	if (p == h->next)		/* catch delete and re-insert of same string in 1st node */
+    if ((p = find_node(h->next, s)) != NULL) {
+	if (p == h->next)		/* catch delete and re-insert of
+					   same string in 1st node */
 	    goto up_hs;
-	remove_node(p);				/* delete identical older string */
+	remove_node(p);			/* delete identical older string */
 	h->count--;
     }
     if (h->count == MAX_SEARCH_HISTORY) {	/* list 'full', delete oldest */
@@ -957,14 +957,14 @@ void update_history(historyheadtype *h, char *s)
     }
     insert_node((historytype *)h, s);
     h->count++;
-up_hs:
+  up_hs:
     h->current = h->next;
 }
 
 /* return a pointer to either the next older history or NULL if no more */
 char *get_history_older(historyheadtype *h)
 {
-    if (h->current->next) {		/* any older entries ? */
+    if (h->current->next != NULL) {	/* any older entries? */
 	h->current = h->current->next;	/* yes */
 	return h->current->data;	/* return it */
     }
@@ -973,9 +973,9 @@ char *get_history_older(historyheadtype *h)
 
 char *get_history_newer(historyheadtype *h)
 {
-    if (h->current->prev) {
+    if (h->current->prev != NULL) {
 	h->current = h->current->prev;
-	if (h->current->prev)
+	if (h->current->prev != NULL)
 	    return h->current->data;
     }
     return NULL;
@@ -986,8 +986,8 @@ char *get_history_completion(historyheadtype *h, char *s)
 {
     historytype *p;
 
-    for (p = h->current->next ; p->next ; p = p->next) {
-	if ((strncmp(s, p->data, h->len) == 0) && (strlen(p->data) != h->len)) {
+    for (p = h->current->next; p->next != NULL; p = p->next) {
+	if (strncmp(s, p->data, h->len) == 0 && strlen(p->data) != h->len) {
 	    h->current = p;
 	    return p->data;
 	}
@@ -1002,7 +1002,7 @@ void free_history(historyheadtype *h)
 {
     historytype *p, *n;
 
-    for (p = h->next ; (n = p->next) ; p = n)
+    for (p = h->next; (n = p->next); p = n)
 	remove_node(p);
 }
 
diff --git a/winio.c b/winio.c
index 0cc4727828bc376a913351f32ac7cacd8381926e..31f7fee3a52600bfd08fefd1bbcb70e23b5c7833 100644
--- a/winio.c
+++ b/winio.c
@@ -197,7 +197,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
 		)
 {
     int kbinput;
-    int x;
+    static int x = -1;
 	/* the cursor position in 'answer' */
     int xend;
 	/* length of 'answer', the status bar text */
@@ -213,7 +213,14 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
     int last_kbinput = 0, ret2cb = 0;
 #endif
     xend = strlen(def);
-    x = xend;
+
+    /* Only put x at the end of the string if it's uninitialized or if
+       it would be past the end of the string as it is.  Otherwise,
+       leave it alone.  This is so the cursor position stays at the same
+       place if a prompt-changing toggle is pressed. */
+    if (x == -1 || x > xend)
+	x = xend;
+
     answer = (char *)nrealloc(answer, xend + 1);
     if (xend > 0)
 	strcpy(answer, def);
@@ -351,7 +358,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
 	case KEY_UP:
 	case NANO_UP_KEY:
 #ifndef NANO_SMALL
-	    if (history_list) {
+	    if (history_list != NULL) {
 
 		/* If there's no previous temp holder, or if we already
 		   arrowed back down to it and (possibly edited it),
@@ -376,17 +383,19 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
 	case KEY_DOWN:
 	case NANO_DOWN_KEY:
 #ifndef NANO_SMALL
-	    if (history_list) {
+	    if (history_list != NULL) {
 		/* get newer search from the history list */
 		if ((history = get_history_newer(history_list)) != NULL) {
 		    answer = mallocstrcpy(answer, history);
 		    xend = strlen(history);
 
-		/* Else if we ran out of history, regurgitate the temporary
-		   buffer */
+		/* else if we ran out of history, regurgitate the temporary
+		   buffer and blow away currentbuf */
 		} else if (currentbuf != NULL) {
 		    answer = mallocstrcpy(answer, currentbuf);
-		    xend = strlen(currentbuf);
+		    free(currentbuf);
+		    currentbuf = NULL;
+		    xend = strlen(answer);
 		    ret2cb = 1;
 		} else {
 		    answer = mallocstrcpy(answer, "");