diff --git a/src/vte-private.h b/src/vte-private.h
index 3ed7214..2baede4 100644
--- a/src/vte-private.h
+++ b/src/vte-private.h
@@ -336,6 +336,7 @@ struct _VteTerminalPrivate {
 
 	/* Adjustment updates pending. */
 	gboolean adjustment_changed_tag;
+	guint status_line_changed_pending;
 
 	/* Background images/"transparency". */
 	guint bg_update_pending;
diff --git a/src/vte.c b/src/vte.c
index aa06e51..0ae5818 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -708,9 +708,8 @@ #endif
 			      width, height);
 }
 
-/* Emit a "status-line-changed" signal. */
-void
-_vte_terminal_emit_status_line_changed(VteTerminal *terminal)
+static gboolean
+idle_vte_terminal_emit_status_line_changed(VteTerminal *terminal)
 {
 #ifdef VTE_DEBUG
 	if (_vte_debug_on(VTE_DEBUG_SIGNALS)) {
@@ -718,6 +717,19 @@ #ifdef VTE_DEBUG
 	}
 #endif
 	g_signal_emit_by_name(terminal, "status-line-changed");
+
+	terminal->pvt->status_line_changed_pending = VTE_INVALID_SOURCE;
+	return FALSE;
+}
+/* Emit a "status-line-changed" signal. */
+void
+_vte_terminal_emit_status_line_changed(VteTerminal *terminal)
+{
+	if (terminal->pvt->status_line_changed_pending == VTE_INVALID_SOURCE) {
+		terminal->pvt->status_line_changed_pending =
+			g_idle_add ((GSourceFunc) idle_vte_terminal_emit_status_line_changed,
+					terminal);
+	}
 }
 
 /* Emit an "increase-font-size" signal. */
@@ -6759,6 +6771,8 @@ #endif
 	pvt->screen = &terminal->pvt->normal_screen;
 	_vte_terminal_set_default_attributes(terminal);
 
+	pvt->status_line_changed_pending = VTE_INVALID_SOURCE;
+
 	/* Selection info. */
 	vte_terminal_set_word_chars(terminal, NULL);
 
@@ -7157,6 +7171,11 @@ #endif
 		g_source_remove(terminal->pvt->adjustment_changed_tag);
 	}
 
+	/* Cancel pending status line change notifications. */
+	if (terminal->pvt->status_line_changed_pending) {
+		g_source_remove(terminal->pvt->status_line_changed_pending);
+	}
+
 	/* Tabstop information. */
 	if (terminal->pvt->tabstops != NULL) {
 		g_hash_table_destroy(terminal->pvt->tabstops);
@@ -10570,6 +10589,8 @@ vte_terminal_get_mouse_autohide(VteTermi
 void
 vte_terminal_reset(VteTerminal *terminal, gboolean full, gboolean clear_history)
 {
+	gboolean emit;
+
 	g_return_if_fail(VTE_IS_TERMINAL(terminal));
 	/* Stop processing any of the data we've got backed up. */
 	vte_terminal_stop_processing (terminal);
@@ -10660,6 +10681,8 @@ vte_terminal_reset(VteTerminal *terminal
 			      TRUE);
 	}
 	terminal->pvt->alternate_screen.status_line_contents = g_string_new(NULL);
+	_vte_terminal_emit_status_line_changed (terminal);
+
 	/* Do more stuff we refer to as a "full" reset. */
 	if (full) {
 		vte_terminal_set_default_tabstops(terminal);
