diff --git a/src/vte.c b/src/vte.c
index 1bda1a9..153b79c 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -178,6 +178,8 @@ static GTimer *process_timer;
 
 static const GtkBorder default_padding = { 1, 1, 1, 1 };
 
+static gboolean process_incoming_keep_going = TRUE;  // FIXME!!! Obviously not suitable for mainstream commit.
+
 /* process incoming data without copying */
 static struct _vte_incoming_chunk *free_chunks;
 static struct _vte_incoming_chunk *
@@ -3752,7 +3754,7 @@ skip_chunk:
 	bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
 	bbox_topleft.x = bbox_topleft.y = G_MAXINT;
 
-	while (start < wcount && !leftovers) {
+	while (start < wcount && !leftovers && process_incoming_keep_going) {
 		const char *match;
 		const gunichar *next;
 		GValueArray *params = NULL;
@@ -4057,6 +4059,13 @@ next_match:
 			(long) unichars->len,
 			(long) _vte_incoming_chunks_length(terminal->pvt->incoming),
 			_vte_incoming_chunks_count(terminal->pvt->incoming));
+
+        if (!process_incoming_keep_going) {
+                /* We broke out from the inner loop, but actually want to continue. */
+                process_incoming_keep_going = TRUE;
+                if (terminal->pvt->incoming || terminal->pvt->pending->len > 0)
+                        vte_terminal_process_incoming(terminal);
+        }
 }
 
 static inline void
@@ -12365,12 +12374,9 @@ vte_terminal_reset(VteTerminal *terminal,
         g_object_freeze_notify(G_OBJECT(terminal));
 
 	/* Stop processing any of the data we've got backed up. */
-	vte_terminal_stop_processing (terminal);
+        process_incoming_keep_going = FALSE;
 
-	/* Clear the input and output buffers. */
-	_vte_incoming_chunks_release (pvt->incoming);
-	pvt->incoming = NULL;
-	g_array_set_size(pvt->pending, 0);
+        /* Clear the output buffer. */
 	_vte_byte_array_clear(pvt->outgoing);
 	/* Reset charset substitution state. */
 	_vte_iso2022_state_free(pvt->iso2022);
