diff --git a/ChangeLog b/ChangeLog
index 3c720a84dc7ccaaafc7932158a2a9cfcba6f26d4..9a448acfd663f5003b6524022cd6fb22a986740a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -56,6 +56,11 @@ CVS code -
 	  do_insertfile_void(), shortcut_init(), toggle_init(),
 	  help_init(), print_view_warning(), usage(), and do_mark().
 	  (Benno Schulenberg, minor tweaks by DLR)
+	- Properly preserve the cursor position when going from the
+	  "Read File" or "Save File As" prompt to the file browser to
+	  the "Go To Directory" prompt, and then canceling back to the
+	  "Read File" or "Save File As" prompt.  Changes to
+	  get_prompt_string() and do_prompt(). (DLR)
 - browser.c:
   do_browser()
 	- Refactor the mouse support, modeling it after do_mouse() for
diff --git a/src/prompt.c b/src/prompt.c
index ee1440edbae88404514c656f0fa27e0d612c8e54..1d67d88ab0a35940ae678769e7b9b0a2cf6c9f1e 100644
--- a/src/prompt.c
+++ b/src/prompt.c
@@ -33,6 +33,10 @@ static size_t statusbar_x = (size_t)-1;
 	/* The cursor position in answer. */
 static size_t statusbar_pww = (size_t)-1;
 	/* The place we want in answer. */
+static size_t old_statusbar_x = (size_t)-1;
+	/* The old cursor position in answer, if any. */
+static size_t old_statusbar_pww = (size_t)-1;
+	/* The old place we want in answer, if any. */
 static bool reset_statusbar_x = FALSE;
 	/* Should we reset the cursor position at the statusbar
 	 * prompt? */
@@ -965,13 +969,20 @@ int get_prompt_string(bool allow_tabs,
     answer = mallocstrcpy(answer, curranswer);
     curranswer_len = strlen(answer);
 
-    /* Only put statusbar_x at the end of the string (and change
-     * statusbar_pww to match) if it's uninitialized, if it would be
-     * past the end of curranswer, or if reset_statusbar_x is TRUE.
-     * Otherwise, leave it alone.  This is so the cursor position stays
-     * at the same place if a prompt-changing toggle is pressed. */
-    if (statusbar_x == (size_t)-1 || statusbar_x > curranswer_len ||
-		reset_statusbar_x) {
+    /* If reset_statusbar_x is TRUE, restore statusbar_x and
+     * statusbar_pww to what they were before this prompt.  Then, if
+     * statusbar_x is uninitialized or past the end of curranswer, put
+     * statusbar_x at the end of the string and update statusbar_pww
+     * based on it.  We do these things so that the cursor position
+     * stays at the right place if a prompt-changing toggle is pressed,
+     * or if this prompt was started from another prompt and we cancel
+     * out of it. */
+    if (reset_statusbar_x) {
+	statusbar_x = old_statusbar_x;
+	statusbar_pww = old_statusbar_pww;
+    }
+
+    if (statusbar_x == (size_t)-1 || statusbar_x > curranswer_len) {
 	statusbar_x = curranswer_len;
 	statusbar_pww = statusbar_xplustabs();
     }
@@ -1126,8 +1137,8 @@ int get_prompt_string(bool allow_tabs,
      * associated function, so reset statusbar_x and statusbar_pww. */
     if (kbinput == NANO_CANCEL_KEY || kbinput == NANO_ENTER_KEY ||
 	ran_func) {
-	statusbar_x = (size_t)-1;
-	statusbar_pww = (size_t)-1;
+	statusbar_x = old_statusbar_x;
+	statusbar_pww = old_statusbar_pww;
     }
 
     return kbinput;
@@ -1192,6 +1203,9 @@ int do_prompt(bool allow_tabs,
     free(prompt);
     prompt = NULL;
 
+    old_statusbar_x = statusbar_x;
+    old_statusbar_pww = statusbar_pww;
+
     reset_statusbar_x = FALSE;
 
     switch (retval) {