diff --git a/src/vte-private.h b/src/vte-private.h
index f53c230..7d60fa9 100644
--- a/src/vte-private.h
+++ b/src/vte-private.h
@@ -366,6 +366,9 @@ struct _VteTerminalPrivate {
 	gboolean cursor_moved_pending;
 	gboolean contents_changed_pending;
 
+	/* Scroll delta of the scrollbar */
+	long active_screen_scroll_delta;
+
 	/* window name changes */
 	gchar *window_title_changed;
 	gchar *icon_title_changed;
diff --git a/src/vte.c b/src/vte.c
index 57980a6..45d1219 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -2093,26 +2093,24 @@ vte_terminal_queue_adjustment_changed(VteTerminal *terminal)
 }
 
 static void
-vte_terminal_queue_adjustment_value_changed(VteTerminal *terminal, glong v)
+vte_terminal_queue_adjustment_value_changed(VteTerminal *terminal)
 {
-	if (v != terminal->pvt->screen->scroll_delta) {
-		terminal->pvt->screen->scroll_delta = v;
+	if (terminal->pvt->screen->scroll_delta != terminal->pvt->active_screen_scroll_delta) {
+		terminal->pvt->active_screen_scroll_delta = terminal->pvt->screen->scroll_delta;
 		terminal->pvt->adjustment_value_changed_pending = TRUE;
 		add_update_timeout (terminal);
 	}
 }
 
 static void
-vte_terminal_queue_adjustment_value_changed_clamped(VteTerminal *terminal, glong v)
+vte_terminal_set_scroll_delta_clamped(VteTerminal *terminal, glong v)
 {
 	gdouble lower, upper;
 
 	lower = gtk_adjustment_get_lower(terminal->adjustment);
 	upper = gtk_adjustment_get_upper(terminal->adjustment);
 
-	v = CLAMP(v, lower, MAX (lower, upper - terminal->row_count));
-
-	vte_terminal_queue_adjustment_value_changed (terminal, v);
+	terminal->pvt->screen->scroll_delta = CLAMP(v, lower, MAX (lower, upper - terminal->row_count));
 }
 
 
@@ -2138,8 +2136,8 @@ _vte_terminal_adjust_adjustments(VteTerminal *terminal)
 					 screen->insert_delta);
 
 	if (screen->scroll_delta > screen->insert_delta) {
-		vte_terminal_queue_adjustment_value_changed(terminal,
-				screen->insert_delta);
+		screen->scroll_delta = screen->insert_delta;
+		vte_terminal_queue_adjustment_value_changed (terminal);
 	}
 }
 
@@ -2210,7 +2208,8 @@ vte_terminal_scroll_lines(VteTerminal *terminal, gint lines)
 	destination = terminal->pvt->screen->scroll_delta;
 	destination += lines;
 	/* Tell the scrollbar to adjust itself. */
-	vte_terminal_queue_adjustment_value_changed_clamped (terminal, destination);
+	vte_terminal_set_scroll_delta_clamped (terminal, destination);
+	vte_terminal_queue_adjustment_value_changed (terminal);
 }
 
 /* Scroll a fixed number of pages up or down, in the current screen. */
@@ -2224,16 +2223,15 @@ vte_terminal_scroll_pages(VteTerminal *terminal, gint pages)
 static void
 vte_terminal_maybe_scroll_to_top(VteTerminal *terminal)
 {
-	vte_terminal_queue_adjustment_value_changed (terminal,
-			_vte_ring_delta(terminal->pvt->screen->row_data));
+	terminal->pvt->screen->scroll_delta = _vte_ring_delta(terminal->pvt->screen->row_data);
+	vte_terminal_queue_adjustment_value_changed (terminal);
 }
 
 static void
 vte_terminal_maybe_scroll_to_bottom(VteTerminal *terminal)
 {
-	glong delta;
-	delta = terminal->pvt->screen->insert_delta;
-	vte_terminal_queue_adjustment_value_changed (terminal, delta);
+	terminal->pvt->screen->scroll_delta = terminal->pvt->screen->insert_delta;
+	vte_terminal_queue_adjustment_value_changed (terminal);
 	_vte_debug_print(VTE_DEBUG_ADJ,
 			"Snapping to bottom of screen\n");
 }
@@ -7202,7 +7200,8 @@ vte_terminal_autoscroll(VteTerminal *terminal)
 		if (terminal->adjustment) {
 			/* Try to scroll up by one line. */
 			adj = terminal->pvt->screen->scroll_delta - 1;
-			vte_terminal_queue_adjustment_value_changed_clamped (terminal, adj);
+			vte_terminal_set_scroll_delta_clamped (terminal, adj);
+			vte_terminal_queue_adjustment_value_changed (terminal);
 			extend = TRUE;
 		}
 		_vte_debug_print(VTE_DEBUG_EVENTS, "Autoscrolling down.\n");
@@ -7212,7 +7211,8 @@ vte_terminal_autoscroll(VteTerminal *terminal)
 		if (terminal->adjustment) {
 			/* Try to scroll up by one line. */
 			adj = terminal->pvt->screen->scroll_delta + 1;
-			vte_terminal_queue_adjustment_value_changed_clamped (terminal, adj);
+			vte_terminal_set_scroll_delta_clamped (terminal, adj);
+			vte_terminal_queue_adjustment_value_changed (terminal);
 			extend = TRUE;
 		}
 		_vte_debug_print(VTE_DEBUG_EVENTS, "Autoscrolling up.\n");
@@ -8018,7 +8018,6 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
 	VteRing *ring = screen->row_data;
 	gboolean was_scrolled_to_top = (screen->scroll_delta == _vte_ring_delta(ring));
 	gboolean was_scrolled_to_bottom = (screen->scroll_delta == screen->insert_delta);
-	glong new_scroll_delta;
 	long cursor_saved_absolute_row = screen->insert_delta + screen->cursor_saved.row;
 
 	_vte_debug_print(VTE_DEBUG_RESIZE,
@@ -8045,7 +8044,7 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
 	if (_vte_ring_length(ring) <= terminal->row_count) {
 		/* Everything fits without scrollbars. Align at top. */
 		screen->insert_delta = _vte_ring_delta(ring);
-		new_scroll_delta = screen->insert_delta;
+		screen->scroll_delta = screen->insert_delta;
 		_vte_debug_print(VTE_DEBUG_RESIZE,
 				"Everything fits without scrollbars\n");
 	} else {
@@ -8053,17 +8052,17 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
 		screen->insert_delta = _vte_ring_next(ring) - terminal->row_count;
 		if (was_scrolled_to_bottom) {
 			/* Was scrolled to bottom, keep this way. */
-			new_scroll_delta = screen->insert_delta;
+			screen->scroll_delta = screen->insert_delta;
 			_vte_debug_print(VTE_DEBUG_RESIZE,
 					"Scroll to bottom\n");
 		} else if (was_scrolled_to_top) {
 			/* Was scrolled to top, keep this way. Not sure if this special case is worth it. */
-			new_scroll_delta = _vte_ring_delta(ring);
+			screen->scroll_delta = _vte_ring_delta(ring);
 			_vte_debug_print(VTE_DEBUG_RESIZE,
 					"Scroll to top\n");
 		} else {
 			/* Try to scroll so that the bottom visible row stays. */
-			new_scroll_delta = screen->scroll_delta + old_rows - terminal->row_count;
+			screen->scroll_delta = screen->scroll_delta + old_rows - terminal->row_count;
 			_vte_debug_print(VTE_DEBUG_RESIZE,
 					"Scroll so bottom row stays\n");
 		}
@@ -8077,14 +8076,9 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
 			"New  ring_delta=%ld  ring_next=%ld\n"
 			"New  insert_delta=%ld  scroll_delta=%ld\n\n",
 			_vte_ring_delta(ring), _vte_ring_next(ring),
-			screen->insert_delta, new_scroll_delta);
+			screen->insert_delta, screen->scroll_delta);
 
-	if (screen == terminal->pvt->screen)
-		vte_terminal_queue_adjustment_value_changed (
-				terminal,
-				new_scroll_delta);
-	else
-		screen->scroll_delta = new_scroll_delta;
+	vte_terminal_queue_adjustment_value_changed (terminal);
 }
 
 /**
@@ -8434,6 +8428,7 @@ vte_terminal_init(VteTerminal *terminal)
 #endif
 
 	vte_terminal_set_vadjustment(terminal, NULL);
+	pvt->active_screen_scroll_delta = 0;
 
 
 	/* Set up dummy metrics, value != 0 to avoid division by 0 */
@@ -11438,7 +11433,8 @@ vte_terminal_scroll(GtkWidget *widget, GdkEventScroll *event)
 	} else {
 		/* Perform a history scroll. */
 		v += terminal->pvt->screen->scroll_delta;
-		vte_terminal_queue_adjustment_value_changed_clamped (terminal, v);
+		vte_terminal_set_scroll_delta_clamped (terminal, v);
+		vte_terminal_queue_adjustment_value_changed (terminal);
 	}
 
 	return TRUE;
@@ -13842,10 +13838,7 @@ vte_terminal_set_scrollback_lines(VteTerminal *terminal, glong lines)
 	}
 
 	/* Adjust the scrollbars to the new locations. */
-	/* Hack: force a change in scroll_delta even if the value remains, so that
-	   vte_term_q_adj_val_changed() doesn't shortcut to no-op, see bug 676075. */
-	terminal->pvt->screen->scroll_delta = -1;
-	vte_terminal_queue_adjustment_value_changed (terminal, scroll_delta);
+	vte_terminal_queue_adjustment_value_changed (terminal);
 	_vte_terminal_adjust_adjustments_full (terminal);
 
         g_object_notify(object, "scrollback-lines");
@@ -15434,11 +15427,15 @@ vte_terminal_search_rows (VteTerminal *terminal,
 	value = gtk_adjustment_get_value(terminal->adjustment);
 	page_size = gtk_adjustment_get_page_size(terminal->adjustment);
 	if (backward) {
-		if (end_row < value || end_row >= value + page_size)
-			vte_terminal_queue_adjustment_value_changed_clamped (terminal, end_row - page_size + 1);
+		if (end_row < value || end_row >= value + page_size) {
+			vte_terminal_set_scroll_delta_clamped (terminal, end_row - page_size + 1);
+			vte_terminal_queue_adjustment_value_changed (terminal);
+		}
 	} else {
-		if (start_row < value || start_row >= value + page_size)
-			vte_terminal_queue_adjustment_value_changed_clamped (terminal, start_row);
+		if (start_row < value || start_row >= value + page_size) {
+			vte_terminal_set_scroll_delta_clamped (terminal, start_row);
+			vte_terminal_queue_adjustment_value_changed (terminal);
+		}
 	}
 
 	return TRUE;
