diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h
index e64be6305e3d35f1c1afe5d5b9a4b4279631f3e4..c8c16d022022d51d6993570efa95e4eebc843fec 100644
--- a/src/conio/ciolib.h
+++ b/src/conio/ciolib.h
@@ -277,10 +277,10 @@ struct vmem_cell {
 	uint8_t legacy_attr;
 	uint8_t ch;
 	uint8_t font;
-	uint32_t fg;	/* RGB 00RRGGBB High bit indicates palette colour
+	uint32_t fg;	/* RGB 80RRGGBB High bit clear indicates palette colour
 			 * bit 26 indicates it is dirty and must be redrawn
 			 */
-	uint32_t bg;	/* RGB 00RRGGBB High bit indicates palette colour
+	uint32_t bg;	/* RGB 80RRGGBB High bit clear indicates palette colour
 			 * bit 24 indicates double-height
 			 * bit 25 indicates Prestel
 			 * bit 26 indicates pixel graphics present
diff --git a/src/syncterm/CHANGES b/src/syncterm/CHANGES
index 56e2df9c13055bee4a0e12cc281ada1f352183e0..fd1af4bfaf586eb5496fd1b3ea20613141150f68 100644
--- a/src/syncterm/CHANGES
+++ b/src/syncterm/CHANGES
@@ -9,6 +9,7 @@ Fix X11 mode scaling and fullscreen with minimal X servers
 Massively improve output performance
 Add option to configure audio output
 Lower audio output volume by 12dB
+Reimplement status bar code
 
 Version 1.4a
 ------------
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 9ba03fb6c06fd1f4066389c4c79f646459514f5e..ca849d483d7dc1a696c1a11f357df4a97555b123 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -319,175 +319,136 @@ cleanup:
 	return;
 }
 
+static struct vmem_cell *status_bar;
+size_t status_bar_sz;
+bool force_status_update = false;
+
 void
 update_status(struct bbslist *bbs, int speed, int ooii_mode, bool ata_inv)
 {
-	char nbuf[LIST_NAME_MAX + 10 + 11 + 7 + 10 + 6 + 1]; /*
-                                                 * Room for "Name (Logging) (115300) (DrWy) (OOTerm2) (INV)" and terminator
-                                                 * SAFE and Logging should me be possible.
-                                                 */
-	int               oldscroll;
-	int               olddmc = hold_update;
-	struct  text_info txtinfo;
-	int64_t           now;
-	static int64_t    lastupd = 0;
-	static int        oldspeed = 0;
-	static int        lastmouse = 0;
-	int               newmouse;
-	int               timeon;
-	char              sep;
-	int               oldfont_norm;
-	int               oldfont_bright;
+	size_t i;
+	int avail = 30;
+	int timeon;
+	int rc;
+	char nbuf[31]; /*
+                        * Room for "Name (Logging) (115300) (DrWy) (OOTerm2) (INV)" and terminator
+                        * SAFE and Logging should be possible.
+                        */
+	char sbuf[10];
+	char tobuf[9];
+	char fullbuf[81];
+	int64_t now = xp_fast_timer64();
 	struct mouse_state *ms = cterm->mouse_state_change_cbdata;
+	static int64_t lastupd = 0;
+	static int oldspeed = 0;
+	static uint32_t oldbits = UINT32_MAX;
+	uint32_t newbits;
 
 	if (term.nostatus)
 		return;
 
-	now = xp_fast_timer64();
-	newmouse = ((ms->mode == MM_OFF) ? 1 : 0) | (ms->flags & MS_FLAGS_DISABLED);
-	if (rip_did_reinit) {
-		rip_did_reinit = false;
-	}
-	else {
-		if ((now == lastupd) && (speed == oldspeed) && (newmouse == lastmouse)) {
+	if (status_bar == NULL || status_bar_sz != term.width) {
+		free(status_bar);
+		status_bar_sz = term.width;
+		status_bar = calloc(status_bar_sz, sizeof(status_bar[0]));
+		if (status_bar == NULL) {
+			status_bar_sz = 0;
 			return;
 		}
+		for (i = 0; i < status_bar_sz; i++) {
+			status_bar[i].fg = 0x80ffff54;
+			status_bar[i].bg = 0x800000a8;
+			status_bar[i].ch = ' ';
+			status_bar[i].font = 0;
+			status_bar[i].legacy_attr = 0x4b;
+		}
 	}
 
-	oldfont_norm = getfont(1);
-	oldfont_bright = getfont(2);
-	setfont(0, false, 1);
-	setfont(0, false, 2);
-	switch (getfont(1)) {
-		case 0:
-		case 17:
-		case 18:
-		case 19:
-		case 25:
-		case 26:
-		case 27:
-		case 28:
-		case 29:
-		case 31:
-			sep = 0xb3;
-			break;
-		default:
-			sep = '|';
-	}
-	lastupd = now;
-	lastmouse = newmouse;
-	oldspeed = speed;
-	timeon = now - bbs->fast_connected;
-	if (timeon > 360000)
-		timeon = 360000;
-	else if (timeon < 0)
-		timeon = 0;
-	gettextinfo(&txtinfo);
-	oldscroll = _wscroll;
-	hold_update = true;
-	textattr(YELLOW | (BLUE << 4));
-
-        /* Move to status line thinger */
-	window(term.x - 1, term.y + term.height - 1, term.x + term.width - 2, term.y + term.height - 1);
-	gotoxy(1, 1);
-	_wscroll = 0;
-	strcpy(nbuf, bbs->name);
+	if (term.width < 80)
+		lastupd = now;
+	if (ata_inv)
+		newbits = 1;
+	else
+		newbits = 0;
 	if (safe_mode)
-		strcat(nbuf, " (SAFE)");
+		newbits |= 0x02;
 	if (cterm->log)
-		strcat(nbuf, " (Logging)");
-	if (speed)
-		sprintf(strchr(nbuf, 0), " (%d)", speed);
+		newbits |= 0x04;
 	if (cterm->doorway_mode)
-		strcat(nbuf, " (DrWy)");
-	switch (ooii_mode) {
-		case 1:
-			strcat(nbuf, " (OOTerm)");
-			break;
-		case 2:
-			strcat(nbuf, " (OOTerm1)");
-			break;
-		case 3:
-			strcat(nbuf, " (OOTerm2)");
-			break;
+		newbits |= 0x08;
+	if (ooii_mode >= 1 && ooii_mode <= 3)
+		newbits |= (ooii_mode << 4);
+	if (force_status_update) {
+		newbits |= 0x40;
+		force_status_update = false;
 	}
-	if (ata_inv)
-		strcat(nbuf, " (INV)");
-	ciolib_setcolour(11, 4);
-	switch (cio_api.mode) {
+	if (rip_did_reinit)
+		rip_did_reinit = false;
+	else {
+		if ((now == lastupd) && (speed == oldspeed) && (oldbits == newbits))
+			return;
+	}
+	lastupd = now;
+	oldspeed = speed;
+	oldbits = newbits;
+
+	switch(cio_api.mode) {
 		case CIOLIB_MODE_CURSES:
 		case CIOLIB_MODE_CURSES_IBM:
 		case CIOLIB_MODE_ANSI:
-			if (term.width < 80) {
-				cprintf(" %-30.30s %c %-6.6s ",
-				    nbuf,
-				    sep,
-				    conn_types[bbs->conn_type]);
-			}
-			else if (timeon > 359999) {
-				cprintf(" %-29.29s %c %-6.6s %c Connected: Too Long %c CTRL-S for menu ",
-				    nbuf,
-				    sep,
-				    conn_types[bbs->conn_type],
-				    sep,
-				    sep);
-			}
-			else {
-				cprintf(" %-29.29s %c %-6.6s %c Connected: %02d:%02d:%02d %c CTRL-S for menu ",
-				    nbuf,
-				    sep,
-				    conn_types[bbs->conn_type],
-				    sep,
-				    timeon / 3600,
-				    (timeon / 60) % 60,
-				    timeon % 60,
-				    sep);
-			}
-			break;
-		default:
-			if (term.width < 80) {
-				cprintf(" %-30.30s %c %-6.6s %*s",
-				    nbuf,
-				    sep,
-				    conn_types[bbs->conn_type],
-				    term.width - 40, "");
-			}
-			else if (timeon > 359999) {
-				cprintf(" %-30.30s %c %-6.6s %c Connected: Too Long %c "ALT_KEY_NAME3CH "-Z for menu ",
-				    nbuf,
-				    sep,
-				    conn_types[bbs->conn_type],
-				    sep,
-				    sep);
-			}
-			else {
-				cprintf(
-					" %-30.30s %c %-6.6s %c Connected: %02d:%02d:%02d %c "ALT_KEY_NAME3CH "-Z for menu ",
-					nbuf,
-					sep,
-					conn_types[bbs->conn_type],
-					sep,
-					timeon / 3600,
-					(timeon / 60) % 60,
-					timeon % 60,
-					sep);
-			}
-			break; /*    1+29     +3    +6    +3    +11        +3+3+2        +3    +6    +4  +5 */
+			if (term.width >= 80)
+				avail = 29;
+	}
+
+	if (speed)
+		snprintf(sbuf, sizeof(sbuf), " (%d)", speed);
+	else
+		sbuf[0] = 0;
+	rc = snprintf(nbuf, avail + 1, "%s%s%s%s%s%s%s", bbs->name, safe_mode ? " (SAFE)" : ""
+	    , cterm->log ? " (Logging)" : "", sbuf, cterm->doorway_mode ? " (DrWy)" : ""
+	    , ooii_mode == 1 ? " (OOTerm)" : ooii_mode == 2 ? " (OOTerm1)" : ooii_mode == 3 ? " (OOTerm2)" : ""
+	    , ata_inv ? " (INV)" : "");
+	if (rc > avail) {
+		nbuf[avail - 1] = '.';
+		nbuf[avail - 2] = '.';
+		nbuf[avail - 3] = '.';
+	}
+	if (term.width >= 80) {
+		timeon = now - bbs->fast_connected;
+		if (timeon > 360000)
+			timeon = 360000;
+		else if (timeon < 0)
+			timeon = 0;
+		if (timeon > 359999)
+			strlcpy(tobuf, "Too Long", sizeof(tobuf));
+		else
+			snprintf(tobuf, sizeof(tobuf), "%02d:%02d:%02d", timeon / 3600, (timeon / 60) % 60
+			    , timeon % 60);
+		snprintf(fullbuf, sizeof(fullbuf), " %-*.*s %c %-6.6s %c Connected: %s %c %s", avail, avail, nbuf, 0xb3
+		    , conn_types[bbs->conn_type], 0xb3, tobuf, 0xb3
+		    , avail == 29 ? "CTRL-S for menu" : ALT_KEY_NAME3CH "-Z for menu ");
+	}
+	else {
+		snprintf(fullbuf, sizeof(fullbuf), " %-*.*s %c %-6.6s ", avail, avail, nbuf, 0xb3
+		    , conn_types[bbs->conn_type]);
+	}
+	if (ms->mode == 0) {
+		status_bar[30].ch = ' ';
+	}
+	for (i = 1; fullbuf[i]; i++) {
+		status_bar[i].ch = fullbuf[i];
 	}
-	if (wherex() - term.y + 1 >= term.width)
-		clreol();
 	if (ms->mode != 0) {
-		gotoxy(31, 1);
-		ciolib_setcolour((ms->flags & MS_FLAGS_DISABLED) ? 8 : 11, 4);
-		putch('M');
+		// TODO: Clear before M?
+		//status_bar[29].ch = ' ';
+		status_bar[30].ch = 'M';
+		if (ms->flags & MS_FLAGS_DISABLED)
+			status_bar[30].fg = 0x80545454;
+		else
+			status_bar[30].fg = 0x80ffff54;
 	}
-	_wscroll = oldscroll;
-	setfont(oldfont_norm, 0, 1);
-	setfont(oldfont_bright, 0, 2);
-	textattr(txtinfo.attribute);
-	window(txtinfo.winleft, txtinfo.wintop, txtinfo.winright, txtinfo.winbottom);
-	gotoxy(txtinfo.curx, txtinfo.cury);
-	hold_update = olddmc;
+	vmem_puttext(term.x - 1, term.y + term.height - 1, term.x + term.width - 2, term.y + term.height - 1
+	    , status_bar);
 }
 
 #if defined(_WIN32) && defined(_DEBUG) && defined(DUMP)
@@ -4218,6 +4179,7 @@ doterm(struct bbslist *bbs)
 	if (bbs->rip)
 		ms.mode = MM_RIP;
 	setup_mouse_events(&ms);
+	force_status_update = true;
 	for (; !quitting;) {
 		hold_update = true;
 		sleep = true;