diff --git a/src/vte.cc b/src/vte.cc
index 4343f1f8..7adf595e 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -1944,20 +1944,13 @@ VteTerminalPrivate::emit_adjustment_changed()
 		m_adjustment_changed_pending = FALSE;
 	}
 	if (m_adjustment_value_changed_pending) {
-		double v, delta;
+		double v;
 		_vte_debug_print(VTE_DEBUG_SIGNALS,
 				"Emitting adjustment_value_changed.\n");
 		m_adjustment_value_changed_pending = FALSE;
 		v = gtk_adjustment_get_value(m_vadjustment);
 		if (!_vte_double_equal(v, m_screen->scroll_delta)) {
-			/* this little dance is so that the scroll_delta is
-			 * updated immediately, but we still handled scrolling
-			 * via the adjustment - e.g. user interaction with the
-			 * scrollbar
-			 */
-			delta = m_screen->scroll_delta;
-			m_screen->scroll_delta = v;
-			gtk_adjustment_set_value(m_vadjustment, delta);
+			gtk_adjustment_set_value(m_vadjustment, m_screen->scroll_delta);
 		}
 	}
 }
@@ -1980,6 +1973,8 @@ VteTerminalPrivate::queue_adjustment_value_changed(double v)
                                  v);
 		m_screen->scroll_delta = v;
 		m_adjustment_value_changed_pending = true;
+		/* Both of the following two lines are required, and in this order... why??? */
+		invalidate_all();
 		add_update_timeout(this);
 	}
 }
