diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c
index 03af32b625a3ff4513cfcf989fe06cebde9a2b25..a614f23d3fbaa85a782fcd220be483069011a88d 100644
--- a/src/conio/bitmap_con.c
+++ b/src/conio/bitmap_con.c
@@ -134,7 +134,7 @@ rwlock_t		vstatlock;
 /* Forward declarations */
 
 static int bitmap_loadfont_locked(const char *filename);
-static struct vmem_cell * set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t x, size_t y, uint16_t cell, uint32_t fg, uint32_t bg);
+static struct vmem_cell * set_vmem_cell(size_t x, size_t y, uint16_t cell, uint32_t fg, uint32_t bg);
 static int bitmap_attr2palette_locked(uint8_t attr, uint32_t *fgp, uint32_t *bgp);
 static void	cb_drawrect(struct rectlist *data);
 static void request_redraw_locked(void);
@@ -317,7 +317,7 @@ bitmap_vmem_puttext_locked(int sx, int sy, int ex, int ey, struct vmem_cell *fil
 
 // vstatlock must be held
 static struct vmem_cell *
-set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t x, size_t y, uint16_t cell, uint32_t fg, uint32_t bg)
+set_vmem_cell(size_t x, size_t y, uint16_t cell, uint32_t fg, uint32_t bg)
 {
 	int		altfont;
 	int		font;
@@ -335,7 +335,7 @@ set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t x, size_t y, uint16_t cell, ui
 	if (font < 0 || font > 255)
 		font = 0;
 
-	struct vmem_cell *vc = vmem_cell_ptr(vmem_ptr, x, y);
+	struct vmem_cell *vc = vmem_cell_ptr(vstat.vmem, x, y);
 	vc->legacy_attr = cell >> 8;
 	vc->ch = cell & 0xff;
 	vc->fg = fg;
@@ -1055,21 +1055,21 @@ same_cell(struct vmem_cell *bitmap_cell, struct vmem_cell *c2)
 }
 
 static void
-bitmap_draw_from_vmem(struct vstat_vmem *vm, int sx, int sy, int ex, int ey)
+bitmap_draw_from_vmem(int sx, int sy, int ex, int ey)
 {
-	int so = vmem_cell_offset(vm, sx - 1, sy - 1);
-	int eo = vmem_cell_offset(vm, ex - 1, ey - 1);
+	int so = vmem_cell_offset(vstat.vmem, sx - 1, sy - 1);
+	int eo = vmem_cell_offset(vstat.vmem, ex - 1, ey - 1);
 	// Draw first chunk
 	if (eo < so) {
-		int rows = sy - vm->top_row;
-		int ney = vm->height - rows + 1;
-		bitmap_draw_vmem(sx, sy, ex, ney, &vm->vmem[so]);
+		int rows = sy - vstat.vmem->top_row;
+		int ney = vstat.vmem->height - rows + 1;
+		bitmap_draw_vmem(sx, sy, ex, ney, &vstat.vmem->vmem[so]);
 		so = 0;
 		sy += rows;
 	}
 
 	// Draw last chunk
-	bitmap_draw_vmem(sx, sy, ex, ey, &vm->vmem[so]);
+	bitmap_draw_vmem(sx, sy, ex, ey, &vstat.vmem->vmem[so]);
 }
 
 /*
@@ -1079,7 +1079,15 @@ bitmap_draw_from_vmem(struct vstat_vmem *vm, int sx, int sy, int ex, int ey)
  */
 static int update_from_vmem(int force)
 {
-	static struct video_stats vs;
+	static struct {
+		int cols;
+		int rows;
+		int bright_background;
+		int no_blink;
+		int blink_altcharset;
+		int no_bright;
+		int bright_altcharset;
+	} vs;
 	int x,y,width,height;
 	unsigned int pos;
 
@@ -1089,7 +1097,7 @@ static int update_from_vmem(int force)
 	if(!bitmap_initialized)
 		return(-1);
 
-	do_rwlock_wrlock(&vstatlock);
+	do_rwlock_rdlock(&vstatlock);
 
 	if (vstat.vmem == NULL) {
 		do_rwlock_unlock(&vstatlock);
@@ -1157,18 +1165,24 @@ static int update_from_vmem(int force)
 			}
 			else {
 				if (sx) {
-					bitmap_draw_from_vmem(vstat.vmem, sx, y + 1, ex, y + 1);
+					bitmap_draw_from_vmem(sx, y + 1, ex, y + 1);
 					sx = ex = 0;
 				}
 			}
 			pos = vmem_next_offset(vstat.vmem, pos);
 		}
 		if (sx) {
-			bitmap_draw_from_vmem(vstat.vmem, sx, y + 1, ex, y + 1);
+			bitmap_draw_from_vmem(sx, y + 1, ex, y + 1);
 			sx = ex = 0;
 		}
 	}
-	vs = vstat;
+	vs.cols = vstat.cols;
+	vs.rows = vstat.rows;
+	vs.bright_background = vstat.bright_background;
+	vs.no_blink = vstat.no_blink;
+	vs.blink_altcharset = vstat.blink_altcharset;
+	vs.no_bright = vstat.no_bright;
+	vs.bright_altcharset = vstat.bright_altcharset;
 	do_rwlock_unlock(&vstatlock);
 
 	return(0);
@@ -1203,7 +1217,7 @@ int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill)
 	do_rwlock_wrlock(&vstatlock);
 	for (y = sy - 1; y < ey; y++) {
 		for (x = sx - 1; x < ex; x++) {
-			set_vmem_cell(vstat.vmem, x, y, *(buf++), 0x00ffffff, 0x00ffffff);
+			set_vmem_cell(x, y, *(buf++), 0x00ffffff, 0x00ffffff);
 		}
 	}
 	do_rwlock_unlock(&vstatlock);
@@ -1455,7 +1469,7 @@ int bitmap_loadfont(const char *filename)
 }
 
 static void
-bitmap_movetext_screen(struct vstat_vmem *vm, int x, int y, int tox, int toy, int direction, int height, int width)
+bitmap_movetext_screen(int x, int y, int tox, int toy, int direction, int height, int width)
 {
 	int32_t sdestoffset;
 	ssize_t ssourcepos;
@@ -1478,10 +1492,10 @@ bitmap_movetext_screen(struct vstat_vmem *vm, int x, int y, int tox, int toy, in
 		height = vstat.rows - height;
 		toy = vstat.rows - (height - 1);
 		// Fill the bits with impossible data so they're redrawn
-		int bdoff = vmem_cell_offset(vm, 0, toy - 1);
+		int bdoff = vmem_cell_offset(vstat.vmem, 0, toy - 1);
 		for (int vy = 0; vy < height; vy++) {
 			memset(&bitmap_drawn[bdoff], 0x04, sizeof(*bitmap_drawn) * vstat.cols);
-			bdoff = vmem_next_row_offset(vm, bdoff);
+			bdoff = vmem_next_row_offset(vstat.vmem, bdoff);
 		}
 		pthread_mutex_unlock(&screenlock);
 		return;
@@ -1588,7 +1602,7 @@ int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy)
 		}
 	}
 
-	bitmap_movetext_screen(vstat.vmem, x, oy, tox, otoy, oscrolldown ? -1 : 1, oheight, width);
+	bitmap_movetext_screen(x, oy, tox, otoy, oscrolldown ? -1 : 1, oheight, width);
 	do_rwlock_unlock(&vstatlock);
 
 	return(1);
@@ -1606,7 +1620,7 @@ void bitmap_clreol(void)
 	row = cio_textinfo.cury + cio_textinfo.wintop - 1;
 	do_rwlock_wrlock(&vstatlock);
 	for(x=cio_textinfo.curx+cio_textinfo.winleft-2; x<cio_textinfo.winright; x++) {
-		set_vmem_cell(vstat.vmem, x, row - 1, fill, ciolib_fg, ciolib_bg);
+		set_vmem_cell(x, row - 1, fill, ciolib_fg, ciolib_bg);
 	}
 	do_rwlock_unlock(&vstatlock);
 }
@@ -1624,7 +1638,7 @@ void bitmap_clrscr(void)
 	cols = vstat.cols;
 	for (y = cio_textinfo.wintop - 1; y < cio_textinfo.winbottom && y < rows; y++) {
 		for (x = cio_textinfo.winleft - 1; x < cio_textinfo.winright && x < cols; x++) {
-			set_vmem_cell(vstat.vmem, x, y, fill, ciolib_fg, ciolib_bg);
+			set_vmem_cell(x, y, fill, ciolib_fg, ciolib_bg);
 		}
 	}
 	do_rwlock_unlock(&vstatlock);