diff --git a/src/vte-private.h b/src/vte-private.h
index c666338..42dfb8b 100644
--- a/src/vte-private.h
+++ b/src/vte-private.h
@@ -255,6 +255,7 @@ struct _VteTerminalPrivate {
 	gboolean meta_sends_escape;
 	gboolean audible_bell;
 	gboolean visible_bell;
+	gboolean urgent_bell;
 	gboolean margin_bell;
 	guint bell_margin;
 	gboolean allow_bold;
@@ -343,6 +344,9 @@ struct _VteTerminalPrivate {
 	guint window_title_changed_pending;
 	guint icon_title_changed_pending;
 
+	/* Urgent flashing. */
+	guint urgency_hint_tag;
+
 	/* Background images/"transparency". */
 	guint bg_update_pending;
 	gboolean bg_transparent;
diff --git a/src/vte.c b/src/vte.c
index 9b7fe6c..469e8a5 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -6849,6 +6849,7 @@ #endif
 	vte_terminal_set_delete_binding(terminal, VTE_ERASE_AUTO);
 	pvt->meta_sends_escape = TRUE;
 	pvt->audible_bell = TRUE;
+	pvt->urgent_bell = TRUE;
 	pvt->bell_margin = 10;
 	pvt->allow_bold = TRUE;
 	pvt->nrc_mode = TRUE;
@@ -7129,6 +7130,11 @@ #endif
 		terminal->pvt->icon_title_changed_pending = VTE_INVALID_SOURCE;
 	}
 
+	if (terminal->pvt->urgency_hint_tag != VTE_INVALID_SOURCE) {
+		g_source_remove (terminal->pvt->urgency_hint_tag);
+		terminal->pvt->urgency_hint_tag = VTE_INVALID_SOURCE;
+	}
+
 
 	/* Unmap the widget if it hasn't been already. */
 	if (GTK_WIDGET_MAPPED(widget)) {
@@ -9862,6 +9868,39 @@ vte_terminal_get_visible_bell(VteTermina
 }
 
 /**
+ * vte_terminal_set_urgent_bell:
+ * @terminal: a #VteTerminal
+ * @is_urgent: %TRUE if the terminal should flash urgency (a WM property)
+ *
+ * Controls whether or not the terminal will mark itself urgent
+ * user when the child outputs the "bl" sequence. 
+ *
+ * since 0.15.2
+ */
+void
+vte_terminal_set_urgent_bell(VteTerminal *terminal, gboolean is_urgent)
+{
+	g_return_if_fail(VTE_IS_TERMINAL(terminal));
+	terminal->pvt->urgent_bell = is_urgent;
+}
+
+/**
+ * vte_terminal_get_urgent_bell:
+ * @terminal: a #VteTerminal
+ *
+ * Checks whether or not the terminal will present flash urgency
+ * user when the child outputs the "bl" sequence. 
+ *
+ * Returns: %TRUE if urgent hint is enabled, %FALSE if not
+ */
+gboolean
+vte_terminal_get_urgent_bell(VteTerminal *terminal)
+{
+	g_return_val_if_fail(VTE_IS_TERMINAL(terminal), FALSE);
+	return terminal->pvt->urgent_bell;
+}
+
+/**
  * vte_terminal_set_allow_bold:
  * @terminal: a #VteTerminal
  * @allow_bold: %TRUE if the terminal should attempt to draw bold text
diff --git a/src/vte.h b/src/vte.h
index a5c4963..bd1fb1b 100644
--- a/src/vte.h
+++ b/src/vte.h
@@ -237,6 +237,8 @@ void vte_terminal_set_audible_bell(VteTe
 gboolean vte_terminal_get_audible_bell(VteTerminal *terminal);
 void vte_terminal_set_visible_bell(VteTerminal *terminal, gboolean is_visible);
 gboolean vte_terminal_get_visible_bell(VteTerminal *terminal);
+void vte_terminal_set_urgent_bell(VteTerminal *terminal, gboolean is_urgent);
+gboolean vte_terminal_get_urgent_bell(VteTerminal *terminal);
 void vte_terminal_set_scroll_background(VteTerminal *terminal, gboolean scroll);
 void vte_terminal_set_scroll_on_output(VteTerminal *terminal, gboolean scroll);
 void vte_terminal_set_scroll_on_keystroke(VteTerminal *terminal,
diff --git a/src/vteseq.c b/src/vteseq.c
index 220c6a2..aee656e 100644
--- a/src/vteseq.c
+++ b/src/vteseq.c
@@ -1066,6 +1066,15 @@ vte_terminal_beep(VteTerminal *terminal)
 	gdk_display_beep(display);
 }
 
+static gboolean
+vte_terminal_remove_urgency_hint(VteTerminal *terminal)
+{
+	GtkWidget *widget = gtk_widget_get_toplevel (&terminal->widget);
+	gtk_window_set_urgency_hint (GTK_WINDOW (widget), FALSE);
+	terminal->pvt->urgency_hint_tag = VTE_INVALID_SOURCE;
+	return FALSE;
+}
+
 /* Beep. */
 static gboolean
 vte_sequence_handler_bl(VteTerminal *terminal,
@@ -1081,6 +1090,17 @@ vte_sequence_handler_bl(VteTerminal *ter
 		/* Visual bell. */
 		vte_sequence_handler_vb(terminal, match, match_quark, params);
 	}
+	if (terminal->pvt->urgent_bell && GTK_WIDGET_REALIZED (terminal)) {
+		GtkWidget *widget = gtk_widget_get_toplevel (&terminal->widget);
+		gtk_window_set_urgency_hint (GTK_WINDOW (widget), TRUE);
+		if (terminal->pvt->urgency_hint_tag == VTE_INVALID_SOURCE) {
+			g_source_remove (terminal->pvt->urgency_hint_tag);
+		}
+		terminal->pvt->urgency_hint_tag =
+			g_timeout_add (1000,
+				       (GSourceFunc)vte_terminal_remove_urgency_hint,
+				       terminal);
+	}
 	return FALSE;
 }
 
