diff --git a/src/vte.cc b/src/vte.cc
index 4343f1f8..907e9d3e 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -454,6 +454,21 @@ VteTerminalPrivate::invalidate_all()
 	} else {
                 gtk_widget_queue_draw(m_widget);
 	}
+	return;
+}
+
+static gboolean
+vte_terminal_invalidate_all_soon (gpointer user_data)
+{
+	VteTerminalPrivate *that = (VteTerminalPrivate *) user_data;
+	that->invalidate_all();
+	return G_SOURCE_REMOVE;
+}
+
+void
+VteTerminalPrivate::invalidate_all_soon()
+{
+	g_timeout_add (0, vte_terminal_invalidate_all_soon, this);
 }
 
 /* FIXMEchpe: remove this obsolete function. It became useless long ago
@@ -8046,7 +8061,7 @@ VteTerminalPrivate::vadjustment_value_changed()
 	if (!_vte_double_equal(dy, 0)) {
 		_vte_debug_print(VTE_DEBUG_ADJ,
 			    "Scrolling by %f\n", dy);
-                invalidate_all();
+                invalidate_all_soon();
 		emit_text_scrolled(dy);
 		queue_contents_changed();
 	} else {
diff --git a/src/vteinternal.hh b/src/vteinternal.hh
index f25c87ec..293e346d 100644
--- a/src/vteinternal.hh
+++ b/src/vteinternal.hh
@@ -735,6 +735,7 @@ public:
                                bool block = false);
         void invalidate_selection();
         void invalidate_all();
+        void invalidate_all_soon();
 
         void reset_update_rects();
         bool invalidate_dirty_rects_and_process_updates();
