diff --git a/src/files.c b/src/files.c
index aa2ceab203ccd5e7dac0b56320ac89e706283d68..d53c794ac840c2fdbb1acb58ed4a3550ae22648e 100644
--- a/src/files.c
+++ b/src/files.c
@@ -2828,8 +2828,11 @@ void load_history(void)
 		/* Encode any embedded NUL as 0x0A. */
 		unsunder(line, read);
 		update_history(history, line);
-	    } else
+	    } else if (history == &search_history)
 		history = &replace_history;
+	   else
+		history = &execute_history;
+
 	}
 
 	fclose(hist);
@@ -2871,7 +2874,7 @@ void save_history(void)
 
     /* If the histories are unchanged or empty, don't bother saving them. */
     if (!history_has_changed() || (searchbot->lineno == 1 &&
-				replacebot->lineno == 1))
+		replacebot->lineno == 1 && executebot->lineno == 1))
 	return;
 
     searchhist = histfilename();
@@ -2888,7 +2891,8 @@ void save_history(void)
 	/* Don't allow others to read or write the history file. */
 	chmod(searchhist, S_IRUSR | S_IWUSR);
 
-	if (!writehist(hist, searchage) || !writehist(hist, replaceage))
+	if (!writehist(hist, searchage) || !writehist(hist, replaceage) ||
+				!writehist(hist, executetop))
 	    fprintf(stderr, _("Error writing %s: %s\n"), searchhist,
 			strerror(errno));