diff --git a/src/vte.c b/src/vte.c
index 60dea9b..a9f3bd2 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -4565,7 +4565,7 @@ vte_terminal_io_read(GIOChannel *channel,
 		     VteTerminal *terminal)
 {
 	int err = 0;
-	gboolean eof, again = TRUE;
+	gboolean eof;
 
 	_vte_debug_print (VTE_DEBUG_WORK, ".");
 
@@ -4578,56 +4578,37 @@ vte_terminal_io_read(GIOChannel *channel,
 		const int fd = g_io_channel_unix_get_fd (channel);
 		guchar *bp;
 		int rem, len;
-		guint bytes, max_bytes;
-
-		/* Limit the amount read between updates, so as to
-		 * 1. maintain fairness between multiple terminals;
-		 * 2. prevent reading the entire output of a command in one
-		 *    pass, i.e. we always try to refresh the terminal ~40Hz.
-		 *    See time_process_incoming() where we estimate the
-		 *    maximum number of bytes we can read/process in between
-		 *    updates.
-		 */
-		max_bytes = terminal->pvt->active ?
-		            g_list_length (active_terminals) - 1 : 0;
-		if (max_bytes) {
-			max_bytes = terminal->pvt->max_input_bytes / max_bytes;
-		} else {
-			max_bytes = VTE_MAX_INPUT_READ;
-		}
-		bytes = terminal->pvt->input_bytes;
-
+		gboolean active = FALSE;
 		chunk = terminal->pvt->incoming;
+		if (!chunk || chunk->len >= sizeof (chunk->data) - VTE_MAX_INPUT_READ / 4) {
+			chunk = get_chunk ();
+			chunk->next = chunks;
+			chunks = chunk;
+		}
+		rem = sizeof (chunk->data) - chunk->len;
+		rem = MIN (rem, VTE_MAX_INPUT_READ);
+		bp = chunk->data + chunk->len;
+		len = 0;
 		do {
-			if (!chunk || chunk->len >= 3*sizeof (chunk->data)/4) {
-				chunk = get_chunk ();
-				chunk->next = chunks;
-				chunks = chunk;
+			int ret = read (fd, bp, rem);
+			switch (ret){
+				case -1:
+					err = errno;
+					goto out;
+				case 0:
+					eof = TRUE;
+					goto out;
+				default:
+					bp += ret;
+					rem -= ret;
+					len += ret;
+					active = TRUE;
+					break;
 			}
-			rem = sizeof (chunk->data) - chunk->len;
-			bp = chunk->data + chunk->len;
-			len = 0;
-			do {
-				int ret = read (fd, bp, rem);
-				switch (ret){
-					case -1:
-						err = errno;
-						goto out;
-					case 0:
-						eof = TRUE;
-						goto out;
-					default:
-						bp += ret;
-						rem -= ret;
-						len += ret;
-						break;
-				}
-			} while (rem);
+		} while (rem);
 out:
-			chunk->len += len;
-			bytes += len;
-		} while (bytes < max_bytes &&
-		         chunk->len == sizeof (chunk->data));
+		terminal->pvt->input_bytes += len;
+		chunk->len += len;
 		if (chunk->len == 0 && chunk == chunks) {
 			chunks = chunks->next;
 			release_chunk (chunk);
@@ -4642,13 +4623,11 @@ out:
 			gdk_threads_leave ();
 		}
 		terminal->pvt->pty_input_active = len != 0;
-		terminal->pvt->input_bytes = bytes;
-		again = bytes < max_bytes;
 
-		_vte_debug_print (VTE_DEBUG_IO, "read %d/%d bytes, again? %s, active? %s\n",
-				bytes, max_bytes,
-				again ? "yes" : "no",
-				terminal->pvt->pty_input_active ? "yes" : "no");
+//		_vte_debug_print (VTE_DEBUG_IO, "read %d/%d bytes, again? %s, active? %s\n",
+//				bytes, max_bytes,
+//				again ? "yes" : "no",
+//				terminal->pvt->pty_input_active ? "yes" : "no");
 	}
 
 	/* Error? */
@@ -4678,11 +4657,11 @@ out:
 		} else {
 			vte_terminal_eof (channel, terminal);
 		}
-
-		again = FALSE;
 	}
 
-	return again;
+	return !eof &&
+		g_list_length (active_terminals) *
+		terminal->pvt->input_bytes < terminal->pvt->max_input_bytes;
 }
 
 /**
@@ -8610,7 +8589,7 @@ vte_terminal_init(VteTerminal *terminal)
 					      terminal);
 	pvt->incoming = NULL;
 	pvt->pending = g_array_new(FALSE, TRUE, sizeof(gunichar));
-	pvt->max_input_bytes = VTE_MAX_INPUT_READ;
+	pvt->max_input_bytes = G_MAXLONG;
 	pvt->cursor_blink_tag = 0;
 	pvt->outgoing = _vte_buffer_new();
 	pvt->outgoing_conv = VTE_INVALID_CONV;
@@ -15228,6 +15207,7 @@ process_timeout (gpointer data)
 {
 	GList *l, *next;
 	gboolean again;
+	gboolean multiple_active;
 
 	gdk_threads_enter();
 
@@ -15238,6 +15218,7 @@ process_timeout (gpointer data)
 			"Process timeout:  %d active\n",
 			g_list_length (active_terminals));
 
+	multiple_active = active_terminals->next != NULL;
 	for (l = active_terminals; l != NULL; l = next) {
 		VteTerminal *terminal = l->data;
 		gboolean active = FALSE;
@@ -15258,7 +15239,7 @@ process_timeout (gpointer data)
 		}
 		if (need_processing (terminal)) {
 			active = TRUE;
-			if (VTE_MAX_PROCESS_TIME) {
+			if (VTE_MAX_PROCESS_TIME && !multiple_active) {
 				time_process_incoming (terminal);
 			} else {
 				vte_terminal_process_incoming(terminal);
@@ -15355,6 +15336,7 @@ update_repeat_timeout (gpointer data)
 {
 	GList *l, *next;
 	gboolean again;
+	gboolean multiple_active;
 
 	gdk_threads_enter();
 
@@ -15365,6 +15347,7 @@ update_repeat_timeout (gpointer data)
 			"Repeat timeout:  %d active\n",
 			g_list_length (active_terminals));
 
+	multiple_active = active_terminals->next != NULL;
 	for (l = active_terminals; l != NULL; l = next) {
 		VteTerminal *terminal = l->data;
 
@@ -15387,7 +15370,7 @@ update_repeat_timeout (gpointer data)
 		}
 		vte_terminal_emit_adjustment_changed (terminal);
 		if (need_processing (terminal)) {
-			if (VTE_MAX_PROCESS_TIME) {
+			if (VTE_MAX_PROCESS_TIME && !multiple_active) {
 				time_process_incoming (terminal);
 			} else {
 				vte_terminal_process_incoming (terminal);
@@ -15452,6 +15435,7 @@ update_timeout (gpointer data)
 {
 	GList *l, *next;
 	gboolean redraw = FALSE;
+	gboolean multiple_active;
 
 	gdk_threads_enter();
 
@@ -15469,6 +15453,7 @@ update_timeout (gpointer data)
 		process_timeout_tag = 0;
 	}
 
+	multiple_active = active_terminals->next != NULL;
 	for (l = active_terminals; l != NULL; l = next) {
 		VteTerminal *terminal = l->data;
 
@@ -15491,7 +15476,7 @@ update_timeout (gpointer data)
 		}
 		vte_terminal_emit_adjustment_changed (terminal);
 		if (need_processing (terminal)) {
-			if (VTE_MAX_PROCESS_TIME) {
+			if (VTE_MAX_PROCESS_TIME && !multiple_active) {
 				time_process_incoming (terminal);
 			} else {
 				vte_terminal_process_incoming (terminal);
