diff --git a/src/vte.cc b/src/vte.cc
index 3a9a116..701891b 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -743,8 +743,8 @@ _vte_invalidate_cursor_once(VteTerminal *terminal, gboolean periodic)
 	if (terminal->pvt->cursor_visible) {
 		preedit_width = vte_terminal_preedit_width(terminal, FALSE);
 
-                row = terminal->pvt->cursor.row;
-                column = terminal->pvt->cursor.col;
+                row = terminal->pvt->screen->cursor.row;
+                column = terminal->pvt->screen->cursor.col;
 		columns = 1;
 		column = find_start_column (terminal, column, row);
 		cell = vte_terminal_find_charcell(terminal, column, row);
@@ -1843,8 +1843,7 @@ _vte_terminal_adjust_adjustments(VteTerminal *terminal)
 	 * area.  Leave the scrolling delta alone because it will be updated
 	 * when the adjustment changes. */
 	screen->insert_delta = MAX(screen->insert_delta, delta);
-        terminal->pvt->cursor.row = MAX(terminal->pvt->cursor.row,
-                                        screen->insert_delta);
+        screen->cursor.row = MAX(screen->cursor.row, screen->insert_delta);
 
 	if (screen->scroll_delta > screen->insert_delta) {
 		vte_terminal_queue_adjustment_value_changed(terminal,
@@ -2137,7 +2136,7 @@ _vte_terminal_ensure_row (VteTerminal *terminal)
 
 	/* Must make sure we're in a sane area. */
 	screen = terminal->pvt->screen;
-        v = terminal->pvt->cursor.row;
+        v = screen->cursor.row;
 
 	/* Figure out how many rows we need to add. */
 	delta = v - _vte_ring_next(screen->row_data) + 1;
@@ -2159,7 +2158,7 @@ vte_terminal_ensure_cursor(VteTerminal *terminal)
 	VteRowData *row;
 
 	row = _vte_terminal_ensure_row (terminal);
-        _vte_row_data_fill (row, &basic_cell.cell, terminal->pvt->cursor.col);
+        _vte_row_data_fill (row, &basic_cell.cell, terminal->pvt->screen->cursor.col);
 
 	return row;
 }
@@ -2177,7 +2176,7 @@ _vte_terminal_update_insert_delta(VteTerminal *terminal)
 	/* The total number of lines.  Add one to the cursor offset
 	 * because it's zero-based. */
 	rows = _vte_ring_next (screen->row_data);
-        delta = terminal->pvt->cursor.row - rows + 1;
+        delta = screen->cursor.row - rows + 1;
 	if (G_UNLIKELY (delta > 0)) {
 		vte_terminal_insert_rows (terminal, delta);
 		rows = _vte_ring_next (screen->row_data);
@@ -2189,7 +2188,7 @@ _vte_terminal_update_insert_delta(VteTerminal *terminal)
 	delta = screen->insert_delta;
 	delta = MIN(delta, rows - terminal->pvt->row_count);
 	delta = MAX(delta,
-                    terminal->pvt->cursor.row - (terminal->pvt->row_count - 1));
+                    screen->cursor.row - (terminal->pvt->row_count - 1));
 	delta = MAX(delta, _vte_ring_delta(screen->row_data));
 
 	/* Adjust the insert delta and scroll if needed. */
@@ -2921,7 +2920,7 @@ _vte_terminal_cleanup_fragments(VteTerminal *terminal,
                         cell_end->attr.columns = 1;
                         _vte_invalidate_cells(terminal,
                                               end, 1,
-                                              terminal->pvt->cursor.row, 1);
+                                              terminal->pvt->screen->cursor.row, 1);
                 }
         }
 
@@ -2947,7 +2946,7 @@ _vte_terminal_cleanup_fragments(VteTerminal *terminal,
                                         g_assert(start - col == 1);
                                         _vte_invalidate_cells(terminal,
                                                               col, 1,
-                                                              terminal->pvt->cursor.row, 1);
+                                                              terminal->pvt->screen->cursor.row, 1);
                                 }
                                 keep_going = FALSE;
                         }
@@ -2974,19 +2973,19 @@ _vte_terminal_cursor_down (VteTerminal *terminal)
 		start = screen->insert_delta;
 		end = start + terminal->pvt->row_count - 1;
 	}
-        if (terminal->pvt->cursor.row == end) {
+        if (screen->cursor.row == end) {
                 if (terminal->pvt->scrolling_restricted) {
 			if (start == screen->insert_delta) {
 				/* Scroll this line into the scrollback
 				 * buffer by inserting a line at the next
 				 * line and scrolling the area up. */
 				screen->insert_delta++;
-                                terminal->pvt->cursor.row++;
+                                screen->cursor.row++;
 				/* update start and end, as they are relative
 				 * to insert_delta. */
 				start++;
 				end++;
-                                _vte_terminal_ring_insert (terminal, terminal->pvt->cursor.row, FALSE);
+                                _vte_terminal_ring_insert (terminal, screen->cursor.row, FALSE);
 				/* Force the areas below the region to be
 				 * redrawn -- they've moved. */
 				_vte_terminal_scroll_region(terminal, start,
@@ -3008,7 +3007,7 @@ _vte_terminal_cursor_down (VteTerminal *terminal)
 			}
 		} else {
 			/* Scroll up with history. */
-                        terminal->pvt->cursor.row++;
+                        screen->cursor.row++;
 			_vte_terminal_update_insert_delta(terminal);
 		}
 
@@ -3020,7 +3019,7 @@ _vte_terminal_cursor_down (VteTerminal *terminal)
 		}
 	} else {
 		/* Otherwise, just move the cursor down. */
-                terminal->pvt->cursor.row++;
+                screen->cursor.row++;
 	}
 }
 
@@ -3042,9 +3041,9 @@ _vte_terminal_drop_scrollback (VteTerminal *terminal)
 void
 _vte_terminal_restore_cursor (VteTerminal *terminal, VteScreen *screen)
 {
-        terminal->pvt->cursor.col = screen->saved.cursor.col;
-        terminal->pvt->cursor.row = screen->insert_delta + CLAMP(screen->saved.cursor.row,
-                                                                 0, terminal->pvt->row_count - 1);
+        screen->cursor.col = screen->saved.cursor.col;
+        screen->cursor.row = screen->insert_delta + CLAMP(screen->saved.cursor.row,
+                                                          0, terminal->pvt->row_count - 1);
 
         terminal->pvt->reverse_mode = screen->saved.reverse_mode;
         terminal->pvt->origin_mode = screen->saved.origin_mode;
@@ -3063,8 +3062,8 @@ _vte_terminal_restore_cursor (VteTerminal *terminal, VteScreen *screen)
 void
 _vte_terminal_save_cursor (VteTerminal *terminal, VteScreen *screen)
 {
-        screen->saved.cursor.col = terminal->pvt->cursor.col;
-        screen->saved.cursor.row = terminal->pvt->cursor.row - screen->insert_delta;
+        screen->saved.cursor.col = screen->cursor.col;
+        screen->saved.cursor.row = screen->cursor.row - screen->insert_delta;
 
         screen->saved.reverse_mode = terminal->pvt->reverse_mode;
         screen->saved.origin_mode = terminal->pvt->origin_mode;
@@ -3144,21 +3143,21 @@ _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
         columns = _vte_unichar_width(c, terminal->pvt->utf8_ambiguous_width);
 
 	/* If we're autowrapping here, do it. */
-        col = terminal->pvt->cursor.col;
+        col = screen->cursor.col;
 	if (G_UNLIKELY (columns && col + columns > terminal->pvt->column_count)) {
 		if (terminal->pvt->autowrap) {
 			_vte_debug_print(VTE_DEBUG_ADJ,
 					"Autowrapping before character\n");
 			/* Wrap. */
 			/* XXX clear to the end of line */
-                        col = terminal->pvt->cursor.col = 0;
+                        col = screen->cursor.col = 0;
 			/* Mark this line as soft-wrapped. */
 			row = _vte_terminal_ensure_row (terminal);
 			row->attr.soft_wrapped = 1;
 			_vte_terminal_cursor_down (terminal);
 		} else {
 			/* Don't wrap, stay at the rightmost column. */
-                        col = terminal->pvt->cursor.col =
+                        col = screen->cursor.col =
 				terminal->pvt->column_count - columns;
 		}
 		line_wrapped = TRUE;
@@ -3169,7 +3168,7 @@ _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
 			(long)c, c < 256 ? c : ' ',
                          (int)terminal->pvt->color_defaults.attr.fore,
                          (int)terminal->pvt->color_defaults.attr.back,
-                        col, columns, (long)terminal->pvt->cursor.row,
+                        col, columns, (long)screen->cursor.row,
 			(long)screen->insert_delta);
 
 
@@ -3182,7 +3181,7 @@ _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
 
 		_vte_debug_print(VTE_DEBUG_PARSE, "combining U+%04X", c);
 
-                row_num = terminal->pvt->cursor.row;
+                row_num = screen->cursor.row;
 		row = NULL;
 		if (G_UNLIKELY (col == 0)) {
 			/* We are at first column.  See if the previous line softwrapped.
@@ -3282,10 +3281,10 @@ _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
 		_vte_invalidate_cells(terminal,
 				col - columns,
 				insert ? terminal->pvt->column_count : columns,
-                                terminal->pvt->cursor.row, 1);
+                                screen->cursor.row, 1);
 	}
 
-        terminal->pvt->cursor.col = col;
+        screen->cursor.col = col;
 
 done:
 	/* We added text, so make a note of it. */
@@ -3724,12 +3723,12 @@ vte_terminal_process_incoming(VteTerminal *terminal)
 	bottom = screen->insert_delta == delta;
 
 	/* Save the current cursor position. */
-        cursor = terminal->pvt->cursor;
+        cursor = screen->cursor;
 	cursor_visible = terminal->pvt->cursor_visible;
 
         in_scroll_region = terminal->pvt->scrolling_restricted
-            && (terminal->pvt->cursor.row >= (screen->insert_delta + terminal->pvt->scrolling_region.start))
-            && (terminal->pvt->cursor.row <= (screen->insert_delta + terminal->pvt->scrolling_region.end));
+            && (screen->cursor.row >= (screen->insert_delta + terminal->pvt->scrolling_region.start))
+            && (screen->cursor.row <= (screen->insert_delta + terminal->pvt->scrolling_region.end));
 
 	/* We should only be called when there's data to process. */
 	g_assert(terminal->pvt->incoming ||
@@ -3839,8 +3838,8 @@ skip_chunk:
 			modified = TRUE;
 
                         new_in_scroll_region = terminal->pvt->scrolling_restricted
-                            && (terminal->pvt->cursor.row >= (screen->insert_delta + terminal->pvt->scrolling_region.start))
-                            && (terminal->pvt->cursor.row <= (screen->insert_delta + terminal->pvt->scrolling_region.end));
+                            && (screen->cursor.row >= (screen->insert_delta + terminal->pvt->scrolling_region.start))
+                            && (screen->cursor.row <= (screen->insert_delta + terminal->pvt->scrolling_region.end));
 
 			delta = screen->scroll_delta;	/* delta may have changed from sequence. */
 
@@ -3849,10 +3848,10 @@ skip_chunk:
                          */
 			if (invalidated_text &&
 					((new_in_scroll_region && !in_scroll_region) ||
-                                         (terminal->pvt->cursor.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK ||
-                                          terminal->pvt->cursor.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK     ||
-                                          terminal->pvt->cursor.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK ||
-                                          terminal->pvt->cursor.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK))) {
+                                         (screen->cursor.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK ||
+                                          screen->cursor.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK     ||
+                                          screen->cursor.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK ||
+                                          screen->cursor.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK))) {
 				/* Clip off any part of the box which isn't already on-screen. */
 				bbox_topleft.x = MAX(bbox_topleft.x, 0);
 				bbox_topleft.y = MAX(bbox_topleft.y, delta);
@@ -3931,20 +3930,18 @@ skip_chunk:
 				}
 			}
 
-			bbox_topleft.x = MIN(bbox_topleft.x,
-                                        terminal->pvt->cursor.col);
-			bbox_topleft.y = MIN(bbox_topleft.y,
-                                        terminal->pvt->cursor.row);
+			bbox_topleft.x = MIN(bbox_topleft.x, screen->cursor.col);
+			bbox_topleft.y = MIN(bbox_topleft.y, screen->cursor.row);
 
 			/* Insert the character. */
 			if (G_UNLIKELY (_vte_terminal_insert_char(terminal, c,
 						 FALSE, FALSE))) {
 				/* line wrapped, correct bbox */
 				if (invalidated_text &&
-                                                (terminal->pvt->cursor.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK	||
-                                                 terminal->pvt->cursor.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK	||
-                                                 terminal->pvt->cursor.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK	||
-                                                 terminal->pvt->cursor.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK)) {
+                                                (screen->cursor.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK	||
+                                                 screen->cursor.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK	||
+                                                 screen->cursor.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK	||
+                                                 screen->cursor.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK)) {
 					/* Clip off any part of the box which isn't already on-screen. */
 					bbox_topleft.x = MAX(bbox_topleft.x, 0);
 					bbox_topleft.y = MAX(bbox_topleft.y, delta);
@@ -3964,16 +3961,13 @@ skip_chunk:
 
 				}
 				bbox_topleft.x = MIN(bbox_topleft.x, 0);
-				bbox_topleft.y = MIN(bbox_topleft.y,
-                                                     terminal->pvt->cursor.row);
+				bbox_topleft.y = MIN(bbox_topleft.y, screen->cursor.row);
 			}
 			/* Add the cells over which we have moved to the region
 			 * which we need to refresh for the user. */
-			bbox_bottomright.x = MAX(bbox_bottomright.x,
-                                                 terminal->pvt->cursor.col);
+			bbox_bottomright.x = MAX(bbox_bottomright.x, screen->cursor.col);
                         /* cursor.row + 1 (defer until inv.) */
-			bbox_bottomright.y = MAX(bbox_bottomright.y,
-                                                 terminal->pvt->cursor.row);
+			bbox_bottomright.y = MAX(bbox_bottomright.y, screen->cursor.row);
 			invalidated_text = TRUE;
 
 			/* We *don't* emit flush pending signals here. */
@@ -4007,7 +4001,7 @@ skip_chunk:
 			 _vte_ring_delta(screen->row_data));
 		/* The cursor shouldn't be above or below the addressable
 		 * part of the display buffer. */
-                g_assert(terminal->pvt->cursor.row >= terminal->pvt->screen->insert_delta);
+                g_assert(screen->cursor.row >= screen->insert_delta);
 #endif
 
 next_match:
@@ -4082,8 +4076,8 @@ next_match:
 	}
 
 
-        if ((cursor.col != terminal->pvt->cursor.col) ||
-            (cursor.row != terminal->pvt->cursor.row)) {
+        if ((cursor.col != terminal->pvt->screen->cursor.col) ||
+            (cursor.row != terminal->pvt->screen->cursor.row)) {
 		/* invalidate the old and new cursor positions */
 		if (cursor_visible)
 			_vte_invalidate_cell(terminal, cursor.col, cursor.row);
@@ -4099,11 +4093,9 @@ next_match:
 	/* Tell the input method where the cursor is. */
 	if (gtk_widget_get_realized (&terminal->widget)) {
 		GdkRectangle rect;
-                rect.x = terminal->pvt->cursor.col *
-			 terminal->pvt->char_width + terminal->pvt->padding.left;
+                rect.x = terminal->pvt->screen->cursor.col * terminal->pvt->char_width + terminal->pvt->padding.left;
 		rect.width = terminal->pvt->char_width;
-                rect.y = (terminal->pvt->cursor.row - delta) *
-			 terminal->pvt->char_height + terminal->pvt->padding.top;
+                rect.y = (terminal->pvt->screen->cursor.row - delta) * terminal->pvt->char_height + terminal->pvt->padding.top;
 		rect.height = terminal->pvt->char_height;
 		gtk_im_context_set_cursor_location(terminal->pvt->im_context,
 						   &rect);
@@ -4830,8 +4822,7 @@ vte_terminal_key_press(GtkWidget *widget, GdkEventKey *event)
 		/* If we're in margin bell mode and on the border of the
 		 * margin, bell. */
 		if (terminal->pvt->margin_bell) {
-                        if ((terminal->pvt->cursor.col +
-			     (glong) terminal->pvt->bell_margin) ==
+                        if ((terminal->pvt->screen->cursor.col + (glong) terminal->pvt->bell_margin) ==
 			     terminal->pvt->column_count) {
 				_vte_terminal_beep (terminal);
 			}
@@ -6530,10 +6521,10 @@ vte_terminal_get_cursor_position(VteTerminal *terminal,
 {
 	g_return_if_fail(VTE_IS_TERMINAL(terminal));
 	if (column) {
-                *column = terminal->pvt->cursor.col;
+                *column = terminal->pvt->screen->cursor.col;
 	}
 	if (row) {
-                *row = terminal->pvt->cursor.row;
+                *row = terminal->pvt->screen->cursor.row;
 	}
 }
 
@@ -8058,14 +8049,14 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
 			"     cursor_saved (relative to insert_delta)  row=%ld  col=%ld\n",
 			screen == &terminal->pvt->normal_screen ? "normal" : "alternate",
 			screen->insert_delta, screen->scroll_delta,
-                        terminal->pvt->cursor.row, terminal->pvt->cursor.row - screen->scroll_delta + 1, terminal->pvt->cursor.col,
+                        screen->cursor.row, screen->cursor.row - screen->scroll_delta + 1, screen->cursor.col,
                         screen->saved.cursor.row, screen->saved.cursor.col);
 
         cursor_saved_absolute.row = screen->saved.cursor.row + screen->insert_delta;
         cursor_saved_absolute.col = screen->saved.cursor.col;
 	below_viewport.row = screen->scroll_delta + old_rows;
 	below_viewport.col = 0;
-        below_current_paragraph.row = terminal->pvt->cursor.row + 1;
+        below_current_paragraph.row = screen->cursor.row + 1;
 	while (below_current_paragraph.row < _vte_ring_next(ring)
 	    && _vte_ring_index(ring, below_current_paragraph.row - 1)->attr.soft_wrapped) {
 		below_current_paragraph.row++;
@@ -8075,15 +8066,12 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
         markers[0] = &cursor_saved_absolute;
         markers[1] = &below_viewport;
         markers[2] = &below_current_paragraph;
-        if (screen == terminal->pvt->screen) {
-                /* Tracking the current cursor only makes sense on the active screen. */
-                markers[3] = &terminal->pvt->cursor;
-                if (terminal->pvt->has_selection) {
-                        /* selection_end is inclusive, make it non-inclusive, see bug 722635. */
-                        terminal->pvt->selection_end.col++;
-                        markers[4] = &terminal->pvt->selection_start;
-                        markers[5] = &terminal->pvt->selection_end;
-		}
+        markers[3] = &screen->cursor;
+        if (terminal->pvt->has_selection) {
+                /* selection_end is inclusive, make it non-inclusive, see bug 722635. */
+                terminal->pvt->selection_end.col++;
+                markers[4] = &terminal->pvt->selection_start;
+                markers[5] = &terminal->pvt->selection_end;
 	}
 
 	old_top_lines = below_current_paragraph.row - screen->insert_delta;
@@ -8111,7 +8099,7 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
 		}
 	}
 
-	if (screen == terminal->pvt->screen && terminal->pvt->has_selection) {
+        if (terminal->pvt->has_selection) {
 		/* Make selection_end inclusive again, see above. */
 		terminal->pvt->selection_end.col--;
 	}
@@ -8160,7 +8148,7 @@ vte_terminal_screen_set_size(VteTerminal *terminal, VteScreen *screen, glong old
                         "     cursor (absolute)  row=%ld  (visual line %ld)  col=%ld\n"
 			"     cursor_saved (relative to insert_delta)  row=%ld  col=%ld\n\n",
 			screen->insert_delta, new_scroll_delta,
-                        terminal->pvt->cursor.row, terminal->pvt->cursor.row - new_scroll_delta + 1, terminal->pvt->cursor.col,
+                        screen->cursor.row, screen->cursor.row - new_scroll_delta + 1, screen->cursor.col,
                         screen->saved.cursor.row, screen->saved.cursor.col);
 
 	if (screen == terminal->pvt->screen)
@@ -8225,10 +8213,10 @@ vte_terminal_set_size(VteTerminal *terminal, glong columns, glong rows)
                 vte_terminal_set_scrollback_lines(terminal,
                                                   terminal->pvt->scrollback_lines);
                 /* Ensure the cursor is valid */
-                terminal->pvt->cursor.row = CLAMP (terminal->pvt->cursor.row,
-                                                    _vte_ring_delta (terminal->pvt->screen->row_data),
-                                                    MAX (_vte_ring_delta (terminal->pvt->screen->row_data),
-                                                         _vte_ring_next (terminal->pvt->screen->row_data) - 1));
+                terminal->pvt->screen->cursor.row = CLAMP (terminal->pvt->screen->cursor.row,
+                                                           _vte_ring_delta (terminal->pvt->screen->row_data),
+                                                           MAX (_vte_ring_delta (terminal->pvt->screen->row_data),
+                                                                _vte_ring_next (terminal->pvt->screen->row_data) - 1));
 
 		_vte_terminal_adjust_adjustments_full (terminal);
 		gtk_widget_queue_resize_no_redraw (&terminal->widget);
@@ -9963,8 +9951,8 @@ vte_terminal_paint_cursor(VteTerminal *terminal)
 
 	screen = terminal->pvt->screen;
 	delta = screen->scroll_delta;
-        col = terminal->pvt->cursor.col;
-        drow = terminal->pvt->cursor.row;
+        col = screen->cursor.col;
+        drow = screen->cursor.row;
 	row = drow - delta;
 	width = terminal->pvt->char_width;
 	height = terminal->pvt->char_height;
@@ -10104,7 +10092,7 @@ vte_terminal_paint_im_preedit_string(VteTerminal *terminal)
 	height = terminal->pvt->char_height;
 	delta = screen->scroll_delta;
 
-        row = terminal->pvt->cursor.row - delta;
+        row = screen->cursor.row - delta;
 
 	/* Find out how many columns the pre-edit string takes up. */
 	columns = vte_terminal_preedit_width(terminal, FALSE);
@@ -10112,7 +10100,7 @@ vte_terminal_paint_im_preedit_string(VteTerminal *terminal)
 
 	/* If the pre-edit string won't fit on the screen if we start
 	 * drawing it at the cursor's position, move it left. */
-        col = terminal->pvt->cursor.col;
+        col = screen->cursor.col;
 	if (col + columns > terminal->pvt->column_count) {
 		col = MAX(0, terminal->pvt->column_count - columns);
 	}
@@ -12035,7 +12023,7 @@ vte_terminal_set_scrollback_lines(VteTerminal *terminal, glong lines)
         /* The main screen gets the full scrollback buffer. */
         screen = &terminal->pvt->normal_screen;
         lines = MAX (lines, terminal->pvt->row_count);
-        next = MAX (terminal->pvt->cursor.row + 1,
+        next = MAX (screen->cursor.row + 1,
                     _vte_ring_next (screen->row_data));
         _vte_ring_resize (screen->row_data, lines);
         low = _vte_ring_delta (screen->row_data);
@@ -12234,10 +12222,12 @@ vte_terminal_reset(VteTerminal *terminal,
                 pvt->screen = &pvt->normal_screen;
                 pvt->normal_screen.scroll_delta = pvt->normal_screen.insert_delta =
                         _vte_ring_reset(pvt->normal_screen.row_data);
+                pvt->normal_screen.cursor.row = pvt->normal_screen.insert_delta;
+                pvt->normal_screen.cursor.col = 0;
                 pvt->alternate_screen.scroll_delta = pvt->alternate_screen.insert_delta =
                         _vte_ring_reset(pvt->alternate_screen.row_data);
-                pvt->cursor.row = pvt->screen->insert_delta;
-                pvt->cursor.col = 0;
+                pvt->alternate_screen.cursor.row = pvt->alternate_screen.insert_delta;
+                pvt->alternate_screen.cursor.col = 0;
                 /* Adjust the scrollbar to the new location. */
                 /* 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 730599. */
diff --git a/src/vteinternal.hh b/src/vteinternal.hh
index 04d8104..f2152e6 100644
--- a/src/vteinternal.hh
+++ b/src/vteinternal.hh
@@ -102,12 +102,13 @@ struct _vte_incoming_chunk{
 typedef struct _VteScreen VteScreen;
 struct _VteScreen {
         VteRing row_data[1];	/* buffer contents */
+        VteVisualPosition cursor;  /* absolute value, from the beginning of the terminal history */
         long scroll_delta;	/* scroll offset */
         long insert_delta;	/* insertion offset */
 
         /* Stuff saved along with the cursor */
         struct {
-                VteVisualPosition cursor;
+                VteVisualPosition cursor;  /* onscreen coordinate, that is, relative to insert_delta */
                 gboolean reverse_mode;
                 gboolean origin_mode;
                 gboolean sendrecv_mode;
@@ -208,7 +209,6 @@ public:
 	struct _VteScreen normal_screen, alternate_screen, *screen;
 
         /* Values we save along with the cursor */
-        VteVisualPosition cursor;	/* relative to the insertion delta */
         gboolean reverse_mode;	/* reverse mode */
         gboolean origin_mode;	/* origin mode */
         gboolean sendrecv_mode;	/* sendrecv mode */
diff --git a/src/vteseq.cc b/src/vteseq.cc
index af27ff5..bf76995 100644
--- a/src/vteseq.cc
+++ b/src/vteseq.cc
@@ -261,8 +261,8 @@ vte_terminal_emit_resize_window(VteTerminal *terminal,
 static void
 _vte_terminal_ensure_cursor_is_onscreen (VteTerminal *terminal)
 {
-        if (G_UNLIKELY (terminal->pvt->cursor.col >= terminal->pvt->column_count))
-                terminal->pvt->cursor.col = terminal->pvt->column_count - 1;
+        if (G_UNLIKELY (terminal->pvt->screen->cursor.col >= terminal->pvt->column_count))
+                terminal->pvt->screen->cursor.col = terminal->pvt->column_count - 1;
 }
 
 static void
@@ -279,8 +279,8 @@ _vte_terminal_home_cursor (VteTerminal *terminal)
                 origin = 0;
         }
 
-        terminal->pvt->cursor.row = screen->insert_delta + origin;
-        terminal->pvt->cursor.col = 0;
+        screen->cursor.row = screen->insert_delta + origin;
+        screen->cursor.col = 0;
 }
 
 /* Clear the entire screen. */
@@ -291,7 +291,7 @@ _vte_terminal_clear_screen (VteTerminal *terminal)
 	VteScreen *screen;
 	screen = terminal->pvt->screen;
 	initial = screen->insert_delta;
-        row = terminal->pvt->cursor.row - screen->insert_delta;
+        row = screen->cursor.row - screen->insert_delta;
 	initial = _vte_ring_next(screen->row_data);
 	/* Add a new screen's worth of rows. */
 	for (i = 0; i < terminal->pvt->row_count; i++)
@@ -299,7 +299,7 @@ _vte_terminal_clear_screen (VteTerminal *terminal)
 	/* Move the cursor and insertion delta to the first line in the
 	 * newly-cleared area and scroll if need be. */
 	screen->insert_delta = initial;
-        terminal->pvt->cursor.row = row + screen->insert_delta;
+        screen->cursor.row = row + screen->insert_delta;
 	_vte_terminal_adjust_adjustments(terminal);
 	/* Redraw everything. */
 	_vte_invalidate_all(terminal);
@@ -318,9 +318,9 @@ _vte_terminal_clear_current_line (VteTerminal *terminal)
 
 	/* If the cursor is actually on the screen, clear data in the row
 	 * which corresponds to the cursor. */
-        if (_vte_ring_next(screen->row_data) > terminal->pvt->cursor.row) {
+        if (_vte_ring_next(screen->row_data) > screen->cursor.row) {
 		/* Get the data for the row which the cursor points to. */
-                rowdata = _vte_ring_index_writable (screen->row_data, terminal->pvt->cursor.row);
+                rowdata = _vte_ring_index_writable (screen->row_data, screen->cursor.row);
 		g_assert(rowdata != NULL);
 		/* Remove it. */
 		_vte_row_data_shrink (rowdata, 0);
@@ -330,7 +330,7 @@ _vte_terminal_clear_current_line (VteTerminal *terminal)
 		/* Repaint this row. */
 		_vte_invalidate_cells(terminal,
 				      0, terminal->pvt->column_count,
-                                      terminal->pvt->cursor.row, 1);
+                                      screen->cursor.row, 1);
 	}
 
 	/* We've modified the display.  Make a note of it. */
@@ -347,7 +347,7 @@ _vte_terminal_clear_above_current (VteTerminal *terminal)
 	screen = terminal->pvt->screen;
 	/* If the cursor is actually on the screen, clear data in the row
 	 * which corresponds to the cursor. */
-        for (i = screen->insert_delta; i < terminal->pvt->cursor.row; i++) {
+        for (i = screen->insert_delta; i < screen->cursor.row; i++) {
 		if (_vte_ring_next(screen->row_data) > i) {
 			/* Get the data for the row we're erasing. */
 			rowdata = _vte_ring_index_writable (screen->row_data, i);
@@ -430,9 +430,9 @@ static void
 vte_sequence_handler_normal_screen (VteTerminal *terminal, GValueArray *params)
 {
         /* cursor.row includes insert_delta, adjust accordingly */
-        terminal->pvt->cursor.row -= terminal->pvt->screen->insert_delta;
+        long cr = terminal->pvt->screen->cursor.row - terminal->pvt->screen->insert_delta;
         terminal->pvt->screen = &terminal->pvt->normal_screen;
-        terminal->pvt->cursor.row += terminal->pvt->screen->insert_delta;
+        terminal->pvt->screen->cursor.row = cr + terminal->pvt->screen->insert_delta;
 
         /* Make sure the ring is large enough */
         _vte_terminal_ensure_row(terminal);
@@ -443,9 +443,9 @@ static void
 vte_sequence_handler_alternate_screen (VteTerminal *terminal, GValueArray *params)
 {
         /* cursor.row includes insert_delta, adjust accordingly */
-        terminal->pvt->cursor.row -= terminal->pvt->screen->insert_delta;
+        long cr = terminal->pvt->screen->cursor.row - terminal->pvt->screen->insert_delta;
         terminal->pvt->screen = &terminal->pvt->alternate_screen;
-        terminal->pvt->cursor.row += terminal->pvt->screen->insert_delta;
+        terminal->pvt->screen->cursor.row = cr + terminal->pvt->screen->insert_delta;
 
         /* Make sure the ring is large enough */
         _vte_terminal_ensure_row(terminal);
@@ -591,7 +591,7 @@ vte_sequence_handler_multiple_r(VteTerminal *terminal,
                                 VteTerminalSequenceHandler handler)
 {
         vte_sequence_handler_multiple_limited(terminal, params, handler,
-                                              terminal->pvt->column_count - terminal->pvt->cursor.col);
+                                              terminal->pvt->column_count - terminal->pvt->screen->cursor.col);
 }
 
 static void
@@ -1035,7 +1035,7 @@ vte_sequence_handler_cursor_back_tab (VteTerminal *terminal, GValueArray *params
 	long newcol;
 
 	/* Calculate which column is the previous tab stop. */
-        newcol = terminal->pvt->cursor.col;
+        newcol = terminal->pvt->screen->cursor.col;
 
 	if (terminal->pvt->tabstops != NULL) {
 		/* Find the next tabstop. */
@@ -1051,7 +1051,7 @@ vte_sequence_handler_cursor_back_tab (VteTerminal *terminal, GValueArray *params
 	/* Warp the cursor. */
 	_vte_debug_print(VTE_DEBUG_PARSE,
 			"Moving cursor to column %ld.\n", (long)newcol);
-        terminal->pvt->cursor.col = newcol;
+        terminal->pvt->screen->cursor.col = newcol;
 }
 
 /* Clear from the cursor position (inclusive!) to the beginning of the line. */
@@ -1067,11 +1067,11 @@ _vte_sequence_handler_cb (VteTerminal *terminal, GValueArray *params)
 	/* Get the data for the row which the cursor points to. */
 	rowdata = _vte_terminal_ensure_row(terminal);
         /* Clean up Tab/CJK fragments. */
-        _vte_terminal_cleanup_fragments (terminal, 0, terminal->pvt->cursor.col + 1);
+        _vte_terminal_cleanup_fragments (terminal, 0, terminal->pvt->screen->cursor.col + 1);
 	/* Clear the data up to the current column with the default
 	 * attributes.  If there is no such character cell, we need
 	 * to add one. */
-        for (i = 0; i <= terminal->pvt->cursor.col; i++) {
+        for (i = 0; i <= terminal->pvt->screen->cursor.col; i++) {
 		if (i < (glong) _vte_row_data_length (rowdata)) {
 			/* Muck with the cell in this location. */
 			pcell = _vte_row_data_get_writable (rowdata, i);
@@ -1083,8 +1083,8 @@ _vte_sequence_handler_cb (VteTerminal *terminal, GValueArray *params)
 	}
 	/* Repaint this row. */
 	_vte_invalidate_cells(terminal,
-                              0, terminal->pvt->cursor.col+1,
-                              terminal->pvt->cursor.row, 1);
+                              0, terminal->pvt->screen->cursor.col+1,
+                              terminal->pvt->screen->cursor.row, 1);
 
 	/* We've modified the display.  Make a note of it. */
 	terminal->pvt->text_deleted_flag = TRUE;
@@ -1103,19 +1103,19 @@ _vte_sequence_handler_cd (VteTerminal *terminal, GValueArray *params)
 	screen = terminal->pvt->screen;
 	/* If the cursor is actually on the screen, clear the rest of the
 	 * row the cursor is on and all of the rows below the cursor. */
-        i = terminal->pvt->cursor.row;
+        i = screen->cursor.row;
 	if (i < _vte_ring_next(screen->row_data)) {
 		/* Get the data for the row we're clipping. */
 		rowdata = _vte_ring_index_writable (screen->row_data, i);
                 /* Clean up Tab/CJK fragments. */
-                if ((glong) _vte_row_data_length (rowdata) > terminal->pvt->cursor.col)
-                        _vte_terminal_cleanup_fragments (terminal, terminal->pvt->cursor.col, _vte_row_data_length (rowdata));
+                if ((glong) _vte_row_data_length (rowdata) > screen->cursor.col)
+                        _vte_terminal_cleanup_fragments (terminal, screen->cursor.col, _vte_row_data_length (rowdata));
 		/* Clear everything to the right of the cursor. */
 		if (rowdata)
-                        _vte_row_data_shrink (rowdata, terminal->pvt->cursor.col);
+                        _vte_row_data_shrink (rowdata, screen->cursor.col);
 	}
 	/* Now for the rest of the lines. */
-        for (i = terminal->pvt->cursor.row + 1;
+        for (i = screen->cursor.row + 1;
 	     i < _vte_ring_next(screen->row_data);
 	     i++) {
 		/* Get the data for the row we're removing. */
@@ -1125,7 +1125,7 @@ _vte_sequence_handler_cd (VteTerminal *terminal, GValueArray *params)
 			_vte_row_data_shrink (rowdata, 0);
 	}
 	/* Now fill the cleared areas. */
-        for (i = terminal->pvt->cursor.row;
+        for (i = screen->cursor.row;
 	     i < screen->insert_delta + terminal->pvt->row_count;
 	     i++) {
 		/* Retrieve the row's data, creating it if necessary. */
@@ -1167,12 +1167,12 @@ _vte_sequence_handler_ce (VteTerminal *terminal, GValueArray *params)
 	/* Get the data for the row which the cursor points to. */
 	rowdata = _vte_terminal_ensure_row(terminal);
 	g_assert(rowdata != NULL);
-        if ((glong) _vte_row_data_length (rowdata) > terminal->pvt->cursor.col) {
+        if ((glong) _vte_row_data_length (rowdata) > terminal->pvt->screen->cursor.col) {
                 /* Clean up Tab/CJK fragments. */
-                _vte_terminal_cleanup_fragments (terminal, terminal->pvt->cursor.col, _vte_row_data_length (rowdata));
+                _vte_terminal_cleanup_fragments (terminal, terminal->pvt->screen->cursor.col, _vte_row_data_length (rowdata));
                 /* Remove the data at the end of the array until the current column
                  * is the end of the array. */
-                _vte_row_data_shrink (rowdata, terminal->pvt->cursor.col);
+                _vte_row_data_shrink (rowdata, terminal->pvt->screen->cursor.col);
 		/* We've modified the display.  Make a note of it. */
 		terminal->pvt->text_deleted_flag = TRUE;
 	}
@@ -1183,10 +1183,10 @@ _vte_sequence_handler_ce (VteTerminal *terminal, GValueArray *params)
 	rowdata->attr.soft_wrapped = 0;
 	/* Repaint this row. */
 	_vte_invalidate_cells(terminal,
-                              terminal->pvt->cursor.col,
+                              terminal->pvt->screen->cursor.col,
 			      terminal->pvt->column_count -
-                              terminal->pvt->cursor.col,
-                              terminal->pvt->cursor.row, 1);
+                              terminal->pvt->screen->cursor.col,
+                              terminal->pvt->screen->cursor.row, 1);
 }
 
 /* Move the cursor to the given column (horizontal position), 1-based. */
@@ -1206,7 +1206,7 @@ vte_sequence_handler_cursor_character_absolute (VteTerminal *terminal, GValueArr
 		}
 	}
 
-        terminal->pvt->cursor.col = val;
+        terminal->pvt->screen->cursor.col = val;
 }
 
 /* Move the cursor to the given position, 1-based. */
@@ -1244,15 +1244,15 @@ vte_sequence_handler_cursor_position (VteTerminal *terminal, GValueArray *params
 			}
 		}
 	}
-        terminal->pvt->cursor.row = rowval + screen->insert_delta;
-        terminal->pvt->cursor.col = colval;
+        screen->cursor.row = rowval + screen->insert_delta;
+        screen->cursor.col = colval;
 }
 
 /* Carriage return. */
 static void
 vte_sequence_handler_carriage_return (VteTerminal *terminal, GValueArray *params)
 {
-        terminal->pvt->cursor.col = 0;
+        terminal->pvt->screen->cursor.col = 0;
 }
 
 /* Restrict scrolling and updates to a subset of the visible lines. */
@@ -1316,7 +1316,7 @@ vte_sequence_handler_set_scrolling_region (VteTerminal *terminal, GValueArray *p
 static void
 vte_sequence_handler_cursor_next_line (VteTerminal *terminal, GValueArray *params)
 {
-        terminal->pvt->cursor.col = 0;
+        terminal->pvt->screen->cursor.col = 0;
         vte_sequence_handler_cursor_down (terminal, params);
 }
 
@@ -1324,7 +1324,7 @@ vte_sequence_handler_cursor_next_line (VteTerminal *terminal, GValueArray *param
 static void
 vte_sequence_handler_cursor_preceding_line (VteTerminal *terminal, GValueArray *params)
 {
-        terminal->pvt->cursor.col = 0;
+        terminal->pvt->screen->cursor.col = 0;
         vte_sequence_handler_cursor_up (terminal, params);
 }
 
@@ -1356,7 +1356,7 @@ vte_sequence_handler_line_position_absolute (VteTerminal *terminal, GValueArray
         }
         val = val - 1 + origin;
         val = CLAMP(val, origin, rowmax);
-        terminal->pvt->cursor.row = screen->insert_delta + val;
+        screen->cursor.row = screen->insert_delta + val;
 }
 
 /* Delete a character at the current cursor position. */
@@ -1371,12 +1371,12 @@ _vte_sequence_handler_dc (VteTerminal *terminal, GValueArray *params)
 
 	screen = terminal->pvt->screen;
 
-        if (_vte_ring_next(screen->row_data) > terminal->pvt->cursor.row) {
+        if (_vte_ring_next(screen->row_data) > screen->cursor.row) {
 		long len;
 		/* Get the data for the row which the cursor points to. */
-                rowdata = _vte_ring_index_writable (screen->row_data, terminal->pvt->cursor.row);
+                rowdata = _vte_ring_index_writable (screen->row_data, screen->cursor.row);
 		g_assert(rowdata != NULL);
-                col = terminal->pvt->cursor.col;
+                col = screen->cursor.col;
 		len = _vte_row_data_length (rowdata);
 		/* Remove the column. */
 		if (col < len) {
@@ -1390,7 +1390,7 @@ _vte_sequence_handler_dc (VteTerminal *terminal, GValueArray *params)
 			/* Repaint this row. */
 			_vte_invalidate_cells(terminal,
 					col, len - col,
-                                        terminal->pvt->cursor.row, 1);
+                                        screen->cursor.row, 1);
 		}
 	}
 
@@ -1433,7 +1433,7 @@ vte_sequence_handler_cursor_down (VteTerminal *terminal, GValueArray *params)
                 }
         }
 
-        terminal->pvt->cursor.row = MIN(terminal->pvt->cursor.row + val, end);
+        screen->cursor.row = MIN(screen->cursor.row + val, end);
 }
 
 /* Erase characters starting at the cursor position (overwriting N with
@@ -1462,14 +1462,14 @@ vte_sequence_handler_erase_characters (VteTerminal *terminal, GValueArray *param
 
 	/* Clear out the given number of characters. */
 	rowdata = _vte_terminal_ensure_row(terminal);
-        if (_vte_ring_next(screen->row_data) > terminal->pvt->cursor.row) {
+        if (_vte_ring_next(screen->row_data) > screen->cursor.row) {
 		g_assert(rowdata != NULL);
                 /* Clean up Tab/CJK fragments. */
-                _vte_terminal_cleanup_fragments (terminal, terminal->pvt->cursor.col, terminal->pvt->cursor.col + count);
+                _vte_terminal_cleanup_fragments (terminal, screen->cursor.col, screen->cursor.col + count);
 		/* Write over the characters.  (If there aren't enough, we'll
 		 * need to create them.) */
 		for (i = 0; i < count; i++) {
-                        col = terminal->pvt->cursor.col + i;
+                        col = screen->cursor.col + i;
 			if (col >= 0) {
 				if (col < (glong) _vte_row_data_length (rowdata)) {
 					/* Replace this cell with the current
@@ -1484,8 +1484,8 @@ vte_sequence_handler_erase_characters (VteTerminal *terminal, GValueArray *param
 		}
 		/* Repaint this row. */
 		_vte_invalidate_cells(terminal,
-                                      terminal->pvt->cursor.col, count,
-                                      terminal->pvt->cursor.row, 1);
+                                      screen->cursor.col, count,
+                                      screen->cursor.row, 1);
 	}
 
 	/* We've modified the display.  Make a note of it. */
@@ -1507,11 +1507,11 @@ _vte_sequence_handler_insert_character (VteTerminal *terminal, GValueArray *para
 
         _vte_terminal_ensure_cursor_is_onscreen(terminal);
 
-        save = terminal->pvt->cursor;
+        save = terminal->pvt->screen->cursor;
 
 	_vte_terminal_insert_char(terminal, ' ', TRUE, TRUE);
 
-        terminal->pvt->cursor = save;
+        terminal->pvt->screen->cursor = save;
 }
 
 /* Insert N blank characters. */
@@ -1535,9 +1535,9 @@ vte_sequence_handler_backspace (VteTerminal *terminal, GValueArray *params)
 {
         _vte_terminal_ensure_cursor_is_onscreen(terminal);
 
-        if (terminal->pvt->cursor.col > 0) {
+        if (terminal->pvt->screen->cursor.col > 0) {
 		/* There's room to move left, so do so. */
-                terminal->pvt->cursor.col--;
+                terminal->pvt->screen->cursor.col--;
 	}
 }
 
@@ -1557,7 +1557,7 @@ vte_sequence_handler_cursor_backward (VteTerminal *terminal, GValueArray *params
                         val = MAX(g_value_get_long(value), 1);
                 }
         }
-        terminal->pvt->cursor.col = MAX(terminal->pvt->cursor.col - val, 0);
+        terminal->pvt->screen->cursor.col = MAX(terminal->pvt->screen->cursor.col - val, 0);
 }
 
 /* Cursor right N columns. */
@@ -1578,9 +1578,9 @@ vte_sequence_handler_cursor_forward (VteTerminal *terminal, GValueArray *params)
                 }
         }
         /* The cursor can be further to the right, don't move in that case. */
-        if (terminal->pvt->cursor.col < terminal->pvt->column_count) {
+        if (terminal->pvt->screen->cursor.col < terminal->pvt->column_count) {
 		/* There's room to move right. */
-                terminal->pvt->cursor.col = MIN(terminal->pvt->cursor.col + val,
+                terminal->pvt->screen->cursor.col = MIN(terminal->pvt->screen->cursor.col + val,
                                                 terminal->pvt->column_count - 1);
 	}
 }
@@ -1589,7 +1589,7 @@ vte_sequence_handler_cursor_forward (VteTerminal *terminal, GValueArray *params)
 static void
 vte_sequence_handler_next_line (VteTerminal *terminal, GValueArray *params)
 {
-        terminal->pvt->cursor.col = 0;
+        terminal->pvt->screen->cursor.col = 0;
 	_vte_terminal_cursor_down (terminal);
 }
 
@@ -1763,7 +1763,7 @@ vte_sequence_handler_reverse_index (VteTerminal *terminal, GValueArray *params)
 		end = start + terminal->pvt->row_count - 1;
 	}
 
-        if (terminal->pvt->cursor.row == start) {
+        if (screen->cursor.row == start) {
 		/* If we're at the top of the scrolling region, add a
 		 * line at the top to scroll the bottom off. */
 		_vte_terminal_ring_remove (terminal, end);
@@ -1775,7 +1775,7 @@ vte_sequence_handler_reverse_index (VteTerminal *terminal, GValueArray *params)
 				      start, 2);
 	} else {
 		/* Otherwise, just move the cursor up. */
-                terminal->pvt->cursor.row--;
+                screen->cursor.row--;
 	}
 	/* Adjust the scrollbars if necessary. */
 	_vte_terminal_adjust_adjustments(terminal);
@@ -1791,7 +1791,7 @@ vte_sequence_handler_tab_set (VteTerminal *terminal, GValueArray *params)
 		terminal->pvt->tabstops = g_hash_table_new(NULL, NULL);
 	}
 	_vte_terminal_set_tabstop(terminal,
-                                 terminal->pvt->cursor.col);
+                                  terminal->pvt->screen->cursor.col);
 }
 
 /* Tab. */
@@ -1801,7 +1801,7 @@ vte_sequence_handler_tab (VteTerminal *terminal, GValueArray *params)
 	long old_len, newcol, col;
 
 	/* Calculate which column is the next tab stop. */
-        newcol = col = terminal->pvt->cursor.col;
+        newcol = col = terminal->pvt->screen->cursor.col;
 
 	g_assert (col >= 0);
 
@@ -1873,10 +1873,10 @@ vte_sequence_handler_tab (VteTerminal *terminal, GValueArray *params)
 		}
 
 		_vte_invalidate_cells (terminal,
-                                terminal->pvt->cursor.col,
-                                newcol - terminal->pvt->cursor.col,
-                                terminal->pvt->cursor.row, 1);
-                terminal->pvt->cursor.col = newcol;
+                                       terminal->pvt->screen->cursor.col,
+                                       newcol - terminal->pvt->screen->cursor.col,
+                                       terminal->pvt->screen->cursor.row, 1);
+                terminal->pvt->screen->cursor.col = newcol;
 	}
 }
 
@@ -1901,7 +1901,7 @@ vte_sequence_handler_tab_clear (VteTerminal *terminal, GValueArray *params)
 	}
 	if (param == 0) {
 		_vte_terminal_clear_tabstop(terminal,
-                                           terminal->pvt->cursor.col);
+                                            terminal->pvt->screen->cursor.col);
 	} else
 	if (param == 3) {
 		if (terminal->pvt->tabstops != NULL) {
@@ -1939,7 +1939,7 @@ vte_sequence_handler_cursor_up (VteTerminal *terminal, GValueArray *params)
                 }
         }
 
-        terminal->pvt->cursor.row = MAX(terminal->pvt->cursor.row - val, start);
+        screen->cursor.row = MAX(screen->cursor.row - val, start);
 }
 
 /* Vertical tab. */
@@ -2593,7 +2593,7 @@ vte_sequence_handler_insert_lines (VteTerminal *terminal, GValueArray *params)
 		}
 	}
 	/* Find the region we're messing with. */
-        row = terminal->pvt->cursor.row;
+        row = screen->cursor.row;
         if (terminal->pvt->scrolling_restricted) {
                 end = screen->insert_delta + terminal->pvt->scrolling_region.end;
 	} else {
@@ -2612,7 +2612,7 @@ vte_sequence_handler_insert_lines (VteTerminal *terminal, GValueArray *params)
 		_vte_terminal_ring_remove (terminal, end);
 		_vte_terminal_ring_insert (terminal, row, TRUE);
 	}
-        terminal->pvt->cursor.col = 0;
+        screen->cursor.col = 0;
 	/* Update the display. */
 	_vte_terminal_scroll_region(terminal, row, end - row + 1, param);
 	/* Adjust the scrollbars if necessary. */
@@ -2640,7 +2640,7 @@ vte_sequence_handler_delete_lines (VteTerminal *terminal, GValueArray *params)
 		}
 	}
 	/* Find the region we're messing with. */
-        row = terminal->pvt->cursor.row;
+        row = screen->cursor.row;
         if (terminal->pvt->scrolling_restricted) {
                 end = screen->insert_delta + terminal->pvt->scrolling_region.end;
 	} else {
@@ -2660,7 +2660,7 @@ vte_sequence_handler_delete_lines (VteTerminal *terminal, GValueArray *params)
 		_vte_terminal_ring_remove (terminal, row);
 		_vte_terminal_ring_insert (terminal, end, TRUE);
 	}
-        terminal->pvt->cursor.col = 0;
+        screen->cursor.col = 0;
 	/* Update the display. */
 	_vte_terminal_scroll_region(terminal, row, end - row + 1, -param);
 	/* Adjust the scrollbars if necessary. */
@@ -2700,12 +2700,12 @@ vte_sequence_handler_device_status_report (VteTerminal *terminal, GValueArray *p
                                         origin = 0;
                                         rowmax = terminal->pvt->row_count - 1;
                                 }
-                                rowval = terminal->pvt->cursor.row - screen->insert_delta - origin;
+                                rowval = screen->cursor.row - screen->insert_delta - origin;
                                 rowval = CLAMP(rowval, 0, rowmax);
 				g_snprintf(buf, sizeof(buf),
 					   _VTE_CAP_CSI "%ld;%ldR",
                                            rowval + 1,
-                                           CLAMP(terminal->pvt->cursor.col + 1,
+                                           CLAMP(screen->cursor.col + 1,
                                                  1, terminal->pvt->column_count));
 				vte_terminal_feed_child(terminal, buf, -1);
 				break;
@@ -2742,12 +2742,12 @@ vte_sequence_handler_dec_device_status_report (VteTerminal *terminal, GValueArra
                                         origin = 0;
                                         rowmax = terminal->pvt->row_count - 1;
                                 }
-                                rowval = terminal->pvt->cursor.row - screen->insert_delta - origin;
+                                rowval = screen->cursor.row - screen->insert_delta - origin;
                                 rowval = CLAMP(rowval, 0, rowmax);
 				g_snprintf(buf, sizeof(buf),
 					   _VTE_CAP_CSI "?%ld;%ldR",
                                            rowval + 1,
-                                           CLAMP(terminal->pvt->cursor.col + 1,
+                                           CLAMP(screen->cursor.col + 1,
                                                  1, terminal->pvt->column_count));
 				vte_terminal_feed_child(terminal, buf, -1);
 				break;
