diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index ed65f5d25af5670057f86aa34b3d373841793bca..41da0381e469d26fbbdb517d856c3439193187b1 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -2390,6 +2390,7 @@ BOOL doterm(struct bbslist *bbs)
 	int ooii_mode=0;
 	recv_byte_buffer_len=recv_byte_buffer_pos=0;
 	struct mouse_state ms = {};
+	int speedwatch = 0;
 
 	gettextinfo(&txtinfo);
 	if(bbs->conn_type == CONN_TYPE_SERIAL)
@@ -2464,6 +2465,43 @@ BOOL doterm(struct bbslist *bbs)
 							nextchar = lastchar + 1/(long double)(speed/10);
 						}
 
+						switch (speedwatch) {
+							case 0:
+								if (inch == '\x1b')
+									speedwatch = 1;
+								break;
+							case 1:
+								if (inch == '[')
+									speedwatch = 2;
+								else
+									speedwatch = 0;
+								break;
+							case 2:
+								if (inch == '0' || inch == '1')
+									speedwatch = 3;
+								else
+									speedwatch = 0;
+								break;
+							case 3:
+								if (inch == ';')
+									speedwatch = 4;
+								else
+									speedwatch = 0;
+								break;
+							case 4:
+								if (inch >= '0' && inch <= '9')
+									break;
+								if (inch == '*')
+									speedwatch = 5;
+								else
+									speedwatch = 0;
+								break;
+							case 5:
+								if (inch == 'r')
+									remain = 1;
+								speedwatch = 0;
+								break;
+						}
 						j=strlen((char *)zrqbuf);
 						if(inch == zrqinit[j] || inch == zrinit[j]) {
 							zrqbuf[j]=inch;