diff --git a/server-client.c b/server-client.c
index 94548724..e8a9f757 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1322,6 +1322,16 @@ server_client_check_redraw(struct client *c)
 
 	c->flags &= ~(CLIENT_REDRAW|CLIENT_BORDERS|CLIENT_STATUS|
 	    CLIENT_STATUSFORCE);
+
+	if (needed) {
+		/*
+		 * We would have deferred the redraw unless the output buffer
+		 * was empty, so we can record how many bytes the redraw
+		 * generated.
+		 */
+		c->redraw = EVBUFFER_LENGTH(tty->out);
+		log_debug("%s: redraw added %zu bytes", c->name, c->redraw);
+	}
 }
 
 /* Set client title. */
diff --git a/tmux.h b/tmux.h
index 9e0d67c6..e8ad55ff 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1310,6 +1310,7 @@ struct client {
 
 	size_t		 written;
 	size_t		 discarded;
+	size_t		 redraw;
 
 	void		(*stdin_callback)(struct client *, int, void *);
 	void		*stdin_callback_data;
diff --git a/tty.c b/tty.c
index e951f25c..ba7a5158 100644
--- a/tty.c
+++ b/tty.c
@@ -233,7 +233,14 @@ tty_write_callback(__unused int fd, __unused short events, void *data)
 		return;
 	log_debug("%s: wrote %d bytes (of %zu)", c->name, nwrite, size);
 
-	if (tty_block_maybe(tty))
+	if (c->redraw > 0) {
+		if ((size_t)nwrite >= c->redraw)
+			c->redraw = 0;
+		else
+			c->redraw -= nwrite;
+		log_debug("%s: waiting for redraw, %zu bytes left", c->name,
+		    c->redraw);
+	} else if (tty_block_maybe(tty))
 		return;
 
 	if (EVBUFFER_LENGTH(tty->out) != 0)
@@ -488,7 +495,7 @@ tty_add(struct tty *tty, const char *buf, size_t len)
 	}
 
 	evbuffer_add(tty->out, buf, len);
-	log_debug("%s: %.*s", c->name, (int)len, (const char *)buf);
+	log_debug("%s: %.*s", c->name, (int)len, buf);
 	c->written += len;
 
 	if (tty_log_fd != -1)