diff --git a/src/files.c b/src/files.c
index 5c8d86f5e02642e490ea7269e7fcd34c56eea1bb..c895538ac407a2922085780c9895e0fda56cd07f 100644
--- a/src/files.c
+++ b/src/files.c
@@ -2017,9 +2017,9 @@ bool write_marked_file(const char *name, FILE *f_open, bool tmp,
  * to disk regardless of whether the mark is on, and without prompting if
  * the TEMP_FILE flag is set and the current file has a name.  Return 0
  * on error, 1 on success, and 2 when the buffer is to be discarded. */
-int do_writeout(bool exiting)
+int do_writeout(bool exiting, bool withprompt)
 {
-    int i;
+    int i = 0;
     bool result = FALSE;
     kind_of_writing_type method = OVERWRITE;
     char *given;
@@ -2033,12 +2033,6 @@ int do_writeout(bool exiting)
     /* Display newlines in filenames as ^J. */
     as_an_at = FALSE;
 
-    if (exiting && ISSET(TEMP_FILE) && openfile->filename[0] != '\0') {
-	if (write_file(openfile->filename, NULL, FALSE, OVERWRITE, FALSE))
-	    return 1;
-	/* If writing the file failed, go on to prompt for a new name. */
-    }
-
     given = mallocstrcpy(NULL,
 #ifndef NANO_TINY
 	(openfile->mark_set && !exiting) ? "" :
@@ -2073,6 +2067,11 @@ int do_writeout(bool exiting)
 
 	present_path = mallocstrcpy(present_path, "./");
 
+	/* When we shouldn't prompt, use the existing filename. */
+	if ((!withprompt || (ISSET(TEMP_FILE) && exiting)) &&
+				openfile->filename[0] != '\0')
+	    answer = mallocstrcpy(answer, openfile->filename);
+	else {
 	/* If we're using restricted mode, and the filename isn't blank,
 	 * disable tab completion. */
 	i = do_prompt(!ISSET(RESTRICTED) || openfile->filename[0] == '\0',
@@ -2087,6 +2086,7 @@ int do_writeout(bool exiting)
 		"", ""
 #endif
 		);
+	}
 
 	if (i < 0) {
 	    statusbar(_("Cancelled"));
@@ -2216,12 +2216,29 @@ int do_writeout(bool exiting)
 			(openfile->current_stat->st_mtime < st.st_mtime ||
 			openfile->current_stat->st_dev != st.st_dev ||
 			openfile->current_stat->st_ino != st.st_ino)) {
+		    int response;
 
 		    warn_and_shortly_pause(_("File on disk has changed"));
 
-		    if (do_yesno_prompt(FALSE, _("File was modified since "
-				"you opened it; continue saving? ")) < 1)
-			continue;
+		    response = do_yesno_prompt(FALSE, _("File was modified "
+				"since you opened it; continue saving? "));
+		    blank_statusbar();
+
+		    /* When in tool mode and not called by 'savefile',
+		     * overwrite the file right here when requested. */
+		    if (ISSET(TEMP_FILE) && withprompt) {
+			free(given);
+			if (response == 1)
+			    return write_file(openfile->filename,
+					NULL, FALSE, OVERWRITE, FALSE);
+			else if (response == 0)
+			    return 2;
+			else
+			    return 0;
+		    } else if (response != 1) {
+			free(given);
+			return 1;
+		    }
 		}
 #endif
 	    }
@@ -2250,7 +2267,7 @@ int do_writeout(bool exiting)
 void do_writeout_void(void)
 {
     /* If the user chose to discard the buffer, close it. */
-    if (do_writeout(FALSE) == 2)
+    if (do_writeout(FALSE, TRUE) == 2)
 	close_and_go();
 }
 
@@ -2258,10 +2275,8 @@ void do_writeout_void(void)
 /* If it has a name, write the current file to disk without prompting. */
 void do_savefile(void)
 {
-    if (openfile->filename[0] != '\0')
-	write_file(openfile->filename, NULL, FALSE, OVERWRITE, FALSE);
-    else
-	do_writeout_void();
+    if (do_writeout(FALSE, FALSE) == 2)
+	close_and_go();
 }
 #endif
 
diff --git a/src/nano.c b/src/nano.c
index 412b17ee17cc85824c4b2d0a53ae8e7186b5ed90..aa2faee6021ab9a5ef7681d40e646f5c51b30a61 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -1081,7 +1081,7 @@ void do_exit(void)
 
     /* If the user chose not to save, or if the user chose to save and
      * the save succeeded, we're ready to exit. */
-    if (i == 0 || (i == 1 && do_writeout(TRUE)))
+    if (i == 0 || (i == 1 && do_writeout(TRUE, TRUE) > 0))
 	close_and_go();
     else if (i != 1)
 	statusbar(_("Cancelled"));
diff --git a/src/proto.h b/src/proto.h
index 71c12d4092a08daf3b6ec9cab5455d849e3ab10a..5199fd53db0e1881224c61ce9dc73d7a1b2d712f 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -307,7 +307,7 @@ bool write_file(const char *name, FILE *f_open, bool tmp,
 bool write_marked_file(const char *name, FILE *f_open, bool tmp,
 	kind_of_writing_type method);
 #endif
-int do_writeout(bool exiting);
+int do_writeout(bool exiting, bool withprompt);
 void do_writeout_void(void);
 #ifndef NANO_TINY
 void do_savefile(void);
diff --git a/src/text.c b/src/text.c
index 1cc867d4f2ec43b9e998fe5ec2b7ae1a3f344cab..d09d7c4f751d55c2a175ed30472e402ee8a64e10 100644
--- a/src/text.c
+++ b/src/text.c
@@ -3084,7 +3084,7 @@ void do_linter(void)
 	if (i == -1) {
 	    statusbar(_("Cancelled"));
 	    return;
-	} else if (i == 1 && (do_writeout(FALSE) != TRUE))
+	} else if (i == 1 && (do_writeout(FALSE, FALSE) != 1))
 	    return;
     }