diff --git a/src/ring.c b/src/ring.c
index 6eb3569..5836865 100644
--- a/src/ring.c
+++ b/src/ring.c
@@ -304,7 +304,7 @@ _vte_ring_thaw_row (VteRing *ring, gulong position, VteRowData *row, gboolean do
 }
 
 static void
-_vte_ring_reset_streams (VteRing *ring, gulong position)
+_vte_ring_reset_streams_at_position (VteRing *ring, gulong position)
 {
 	_vte_debug_print (VTE_DEBUG_RING, "Reseting streams to %lu.\n", position);
 
@@ -316,6 +316,14 @@ _vte_ring_reset_streams (VteRing *ring, gulong position)
 	ring->last_attr.i = basic_cell.i.attr;
 }
 
+void
+_vte_ring_reset (VteRing *ring)
+{
+	_vte_ring_reset_streams_at_position (ring, 0);
+	ring->start = ring->end = ring->writable = 0;
+	ring->cached_row_num = (gulong) -1;
+}
+
 static inline VteRowData *
 _vte_ring_writable_index (VteRing *ring, gulong position)
 {
@@ -353,7 +361,7 @@ _vte_ring_freeze_one_row (VteRing *ring)
 	VteRowData *row;
 
 	if (G_UNLIKELY (ring->writable == ring->start))
-		_vte_ring_reset_streams (ring, ring->writable);
+		_vte_ring_reset_streams_at_position (ring, ring->writable);
 
 	row = _vte_ring_writable_index (ring, ring->writable);
 	_vte_ring_freeze_row (ring, ring->writable, row);
@@ -385,7 +393,7 @@ _vte_ring_discard_one_row (VteRing *ring)
 {
 	ring->start++;
 	if (G_UNLIKELY (ring->start == ring->writable)) {
-		_vte_ring_reset_streams (ring, ring->writable);
+		_vte_ring_reset_streams_at_position (ring, ring->writable);
 	} else if (ring->start < ring->writable) {
 		VteRowRecord record;
 		_vte_stream_advance_tail (ring->row_stream, ring->start * sizeof (record));
@@ -473,7 +481,7 @@ _vte_ring_resize (VteRing *ring, gulong max_rows)
 	if ((gulong) _vte_ring_length (ring) > max_rows) {
 		ring->start = ring->end - max_rows;
 		if (ring->start >= ring->writable) {
-			_vte_ring_reset_streams (ring, ring->writable);
+			_vte_ring_reset_streams_at_position (ring, ring->writable);
 			ring->writable = ring->start;
 		}
 	}
diff --git a/src/ring.h b/src/ring.h
index ec38019..c23b06d 100644
--- a/src/ring.h
+++ b/src/ring.h
@@ -80,6 +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);
 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 9ee5e73..97c452d 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -11789,12 +11789,8 @@ vte_terminal_reset(VteTerminal *terminal,
         pvt->character_replacement = &pvt->character_replacements[0];
 	/* Clear the scrollback buffers and reset the cursors. */
 	if (clear_history) {
-		_vte_ring_fini(pvt->normal_screen.row_data);
-		_vte_ring_init(pvt->normal_screen.row_data, pvt->scrollback_lines);
-                _vte_ring_set_visible_rows_hint(pvt->normal_screen.row_data, pvt->row_count);
-		_vte_ring_fini(pvt->alternate_screen.row_data);
-		_vte_ring_init(pvt->alternate_screen.row_data, pvt->row_count);
-                _vte_ring_set_visible_rows_hint(pvt->alternate_screen.row_data, pvt->row_count);
+		_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;
