diff --git a/src/conio/console.c b/src/conio/console.c
index a783865f13bc48fe1a0055e52a819838040dd3ba..8edcd13d3c4053eb3a9fa3c9e5a2913e9d2db714 100644
--- a/src/conio/console.c
+++ b/src/conio/console.c
@@ -432,23 +432,30 @@ video_update_text()
 
     static char buf[256];
     int r, c;
-    int attr = vmem[0] & 0xff00;
+    int attr;
     XGCValues v;
+	WORD *vmemc;
+	int cursrow;
+	int curscol;
+	int flush=0;
 
+	cursrow=CursRow;
+	curscol=CursCol;
 	wakeup_poll();	/* Wake up anyone waiting on kbd poll */
 
-	setgc(attr);
-
+    vmemc = (WORD *)malloc(DpyCols*(DpyRows+1)*sizeof(WORD));
+	memcpy(vmemc, vmem, DpyCols*(DpyRows+1)*sizeof(WORD));
 	for (r = 0; r < (DpyRows+1); ++r) {
 	    if (!lines[r].changed) {
 			for (c = 0; c < DpyCols; ++c) {
-				if ((lines[r].data[c] != vmem[r * DpyCols + c]) 
+				if ((lines[r].data[c] != vmemc[r * DpyCols + c]) 
 						|| (lines[r].data[c] & 0x8000 && show != os)
 						|| (lines[r].exposed[c])
-						|| (((r == or && c==oc) || (r == CursRow && c==CursCol)) && (or != CursRow || oc !=CursCol))) {
-					setgc(vmem[r * DpyCols + c]  & 0xff00);
-					x11.XCopyPlane(dpy,pfnt,win,gc,0,FH*(vmem[r * DpyCols + c]&0xff),FW,FH,c*FW+2,r*FH+2,1);
+						|| (((r == or && c==oc) || (r == cursrow && c==curscol)) && (or != cursrow || oc !=curscol))) {
+					setgc(vmemc[r * DpyCols + c]  & 0xff00);
+					x11.XCopyPlane(dpy,pfnt,win,gc,0,FH*(vmemc[r * DpyCols + c]&0xff),FW,FH,c*FW+2,r*FH+2,1);
 					lines[r].changed = 2;
+					flush=1;
 				}
 			}
 	    }
@@ -458,23 +465,22 @@ video_update_text()
 
 		reset_poll();
 		memcpy(lines[r].data,
-			&vmem[r * DpyCols], sizeof(WORD) * DpyCols);
+			&vmemc[r * DpyCols], sizeof(WORD) * DpyCols);
 
 		if(lines[r].changed==1) {
 			for (c = 0; c < DpyCols; ++c) {
-				setgc(vmem[r * DpyCols + c]  & 0xff00);
-				x11.XCopyPlane(dpy,pfnt,win,gc,0,FH*(vmem[r * DpyCols + c]&0xff),FW,FH,c*FW+2,r*FH+2,1);
+				setgc(vmemc[r * DpyCols + c]  & 0xff00);
+				x11.XCopyPlane(dpy,pfnt,win,gc,0,FH*(vmemc[r * DpyCols + c]&0xff),FW,FH,c*FW+2,r*FH+2,1);
 			}
 		}
 		lines[r].changed = 0;
 		memset(lines[r].exposed,0,CONSOLE_MAX_COLS * sizeof(u_char));
-		x11.XFlush(dpy);
 	}
 
 	if (CursStart <= CursEnd && CursEnd <= FH &&
-	    (show != os) && CursRow < (DpyRows+1) &&CursCol < DpyCols) {
+	    (show != os) && cursrow < (DpyRows+1) &&curscol < DpyCols) {
 
-	    attr = vmem[CursRow * DpyCols +CursCol] & 0xff00;
+	    attr = vmemc[cursrow * DpyCols +curscol] & 0xff00;
 	    v.foreground = pixels[(attr >> 8) & 0x0f] ^
 			pixels[(attr >> 12) & 0x07];
 	    if (v.foreground) {
@@ -485,15 +491,19 @@ video_update_text()
 	    }
 	    x11.XChangeGC(dpy, cgc, GCForeground | GCFunction, &v);
 	    x11.XFillRectangle(dpy, win, cgc,
-			   2 +CursCol * FW,
-			   2 + CursRow * FH + CursStart * FS,
+			   2 +curscol * FW,
+			   2 + cursrow * FH + CursStart * FS,
 			   FW, (CursEnd + 1)*FS - (CursStart*FS));
-		x11.XFlush(dpy);
+		flush=1;
 	}
 
-	or =CursRow;
-	oc =CursCol;
+	free(vmemc);
+
+	or =cursrow;
+	oc =curscol;
 	os =show;
+	if(flush)
+		x11.XFlush(dpy);
 }
 
 void