diff --git a/src/ring.c b/src/ring.c
index 59330b2..1b0082c 100644
--- a/src/ring.c
+++ b/src/ring.c
@@ -309,21 +309,23 @@ _vte_ring_reset_streams (VteRing *ring, gulong position)
 	_vte_debug_print (VTE_DEBUG_RING, "Reseting streams to %lu.\n", position);
 
 	_vte_stream_reset (ring->row_stream, position * sizeof (VteRowRecord));
-	_vte_stream_reset (ring->text_stream, 0);
-	_vte_stream_reset (ring->attr_stream, 0);
+        _vte_stream_reset (ring->text_stream, _vte_stream_head (ring->text_stream));
+        _vte_stream_reset (ring->attr_stream, _vte_stream_head (ring->attr_stream));
 
 	ring->last_attr_text_start_offset = 0;
 	ring->last_attr.i = basic_cell.i.attr;
 }
 
-void
+long
 _vte_ring_reset (VteRing *ring)
 {
-        _vte_debug_print (VTE_DEBUG_RING, "Reseting the ring.\n");
+        _vte_debug_print (VTE_DEBUG_RING, "Reseting the ring to %lu.\n", ring->end);
 
-        _vte_ring_reset_streams (ring, 0);
-        ring->start = ring->end = ring->writable = 0;
+        _vte_ring_reset_streams (ring, ring->end);
+        ring->start = ring->writable = ring->end;
         ring->cached_row_num = (gulong) -1;
+
+        return ring->end;
 }
 
 static inline VteRowData *
diff --git a/src/ring.h b/src/ring.h
index c23b06d..201159c 100644
--- a/src/ring.h
+++ b/src/ring.h
@@ -80,7 +80,7 @@ VteRowData *_vte_ring_index_writable (VteRing *ring, gulong position);
 
 void _vte_ring_init (VteRing *ring, gulong max_rows);
 void _vte_ring_fini (VteRing *ring);
-void _vte_ring_reset (VteRing *ring);
+long _vte_ring_reset (VteRing *ring);
 void _vte_ring_resize (VteRing *ring, gulong max_rows);
 void _vte_ring_shrink (VteRing *ring, gulong max_len);
 VteRowData *_vte_ring_insert (VteRing *ring, gulong position);
diff --git a/src/vte.c b/src/vte.c
index 07508c4..45abbe0 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -11839,23 +11839,17 @@ vte_terminal_reset(VteTerminal *terminal,
 	/* Clear the scrollback buffers and reset the cursors. Switch to normal screen. */
 	if (clear_history) {
                 pvt->screen = &pvt->normal_screen;
-                _vte_ring_reset(pvt->normal_screen.row_data);
-                _vte_ring_reset(pvt->alternate_screen.row_data);
-                pvt->normal_screen.saved.cursor.row = 0;
-                pvt->normal_screen.saved.cursor.col = 0;
-		pvt->normal_screen.scroll_delta = 0;
-		pvt->normal_screen.insert_delta = 0;
-                pvt->alternate_screen.saved.cursor.row = 0;
-                pvt->alternate_screen.saved.cursor.col = 0;
-		pvt->alternate_screen.scroll_delta = 0;
-		pvt->alternate_screen.insert_delta = 0;
-                pvt->cursor.row = 0;
+                pvt->normal_screen.scroll_delta = pvt->normal_screen.insert_delta =
+                        _vte_ring_reset(pvt->normal_screen.row_data);
+                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;
                 /* 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. */
                 pvt->screen->scroll_delta = -1;
-                vte_terminal_queue_adjustment_value_changed (terminal, 0);
+                vte_terminal_queue_adjustment_value_changed (terminal, pvt->screen->insert_delta);
 		_vte_terminal_adjust_adjustments_full (terminal);
 	}
         /* DECSCUSR cursor style */
