diff --git a/src/vte.c b/src/vte.c
index f16a707..36bef60 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -9504,6 +9504,8 @@ #endif
 	klass->text_deleted = NULL;
 	klass->text_scrolled = NULL;
 
+	klass->beep = NULL;
+
 	/* Register some signals of our own. */
 	klass->eof_signal =
 		g_signal_new("eof",
@@ -9749,6 +9751,22 @@ #endif
 			     _vte_marshal_VOID__INT,
 			     G_TYPE_NONE, 1, G_TYPE_INT);
 
+	/**
+	 * VteTerminal::beep
+	 * @terminal: the terminal on which the beep was triggered
+	 *
+	 * The beep signal is emitted whenever a child app emits a bell escape
+	 * code.
+	 */
+	g_signal_new("beep",
+			G_OBJECT_CLASS_TYPE(klass),
+			G_SIGNAL_RUN_LAST,
+			G_STRUCT_OFFSET(VteTerminalClass, beep),
+			NULL,
+			NULL,
+			_vte_marshal_VOID__VOID,
+			G_TYPE_NONE, 0);
+
 #ifdef VTE_DEBUG
 	/* Turn on debugging if we were asked to. */
 	if (getenv("VTE_DEBUG_FLAGS") != NULL) {
diff --git a/src/vte.h b/src/vte.h
index a5c4963..c72ce0b 100644
--- a/src/vte.h
+++ b/src/vte.h
@@ -94,8 +94,9 @@ struct _VteTerminalClass {
 	void (*text_deleted)(VteTerminal* terminal);
 	void (*text_scrolled)(VteTerminal* terminal, gint delta);
 
+	void (*beep)(VteTerminal *terminal);
+
 	/* Padding for future expansion. */
-	void (*vte_reserved1)(void);
 	void (*vte_reserved2)(void);
 	void (*vte_reserved3)(void);
 	void (*vte_reserved4)(void);
diff --git a/src/vteseq.c b/src/vteseq.c
index 5cc03d1..bc33cc3 100644
--- a/src/vteseq.c
+++ b/src/vteseq.c
@@ -1155,6 +1155,9 @@ vte_sequence_handler_bl(VteTerminal *ter
 		/* Visual bell. */
 		vte_sequence_handler_vb(terminal, match, match_quark, params);
 	}
+	/* and let the app do something, e.g. set the window urgency flag */
+	g_signal_emit_by_name(terminal, "beep");
+
 	return FALSE;
 }
 
