diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index 66c1230376a328a2e7ba723f1d6aa0cdc8ed8792..c545477e2f092b6fd8fe36fbb1eebcdc765463e7 100644
--- a/src/conio/ciolib.c
+++ b/src/conio/ciolib.c
@@ -169,6 +169,7 @@ int try_x_init(int mode)
 		cio_api.settitle=x_settitle;
 		cio_api.copytext=x_copytext;
 		cio_api.getcliptext=x_getcliptext;
+		cio_api.setfont=x_setfont;
 		return(1);
 	}
 	return(0);
diff --git a/src/conio/console.c b/src/conio/console.c
index 88e63e43a1f178587fe0b31e41cbf8ad1a807e70..bf3f9ab725d8393008cd6214f5e44ec377520878 100644
--- a/src/conio/console.c
+++ b/src/conio/console.c
@@ -129,6 +129,10 @@ sem_t	console_mode_changed;
 sem_t	copybuf_set;
 sem_t	pastebuf_set;
 sem_t	pastebuf_request;
+sem_t	font_set;
+int		new_font;
+int		font_force;
+int		setfont_return;
 pthread_mutex_t	copybuf_mutex;
 pthread_mutex_t	lines_mutex;
 char *copybuf=NULL;
@@ -1118,6 +1122,32 @@ video_async_event(void *crap)
 			case 0:
 				if(console_new_mode!=NO_NEW_MODE)
 					init_mode(console_new_mode);
+				if(x_current_font!=new_font) {
+					int oldfont=x_current_font;
+					x_current_font=new_font;
+					if(load_font(NULL,FW,FH,FontScale)) {
+						if(font_force) {
+							init_mode(3);
+							sem_wait(&console_mode_changed);
+							if(load_font(NULL,FW,FH,FontScale)) {
+								setfont_return=-1;
+								x_current_font=oldfont;
+								load_font(NULL,FW,FH,FontScale);
+							}
+							else
+								setfont_return=0;
+						}
+						else {
+							setfont_return=-1;
+							x_current_font=oldfont;
+							load_font(NULL,FW,FH,FontScale);
+						}
+					}
+					else
+						setfont_return=0;
+					resize_window();
+					sem_post(&font_set);
+				}
 				while(!sem_trywait(&x11_beep))
 					x11.XBell(dpy, 0);
 				if(!sem_trywait(&x11_name))
@@ -1314,6 +1344,7 @@ load_font(char *filename, int width, int height, int scale)
 		}
 		if(conio_fontdata[i].desc==NULL)
 			x_current_font=0;
+		new_font=x_current_font;
 	}
 	if(conio_fontdata[x_current_font].desc==NULL)
 		return(-1);
@@ -1356,12 +1387,11 @@ load_font(char *filename, int width, int height, int scale)
 						| ((fontdata[i*height+j] & 0x01) << 7);
 		}
 	}
-
 	if(pfnt!=0)
 		x11.XFreePixmap(dpy,pfnt);
-	scaledfont=scale_bitmap(font, FW, FH*256, &FontScale);
+	scaledfont=scale_bitmap(fontdata, FW, FH*256, &FontScale);
 	if(scaledfont==NULL)
-		pfnt=x11.XCreateBitmapFromData(dpy, win, font, FW, FH*256);
+		pfnt=x11.XCreateBitmapFromData(dpy, win, fontdata, FW, FH*256);
 	else {
 		FW*=scale;
 		FH*=scale;
@@ -1662,6 +1692,7 @@ console_init()
 	sem_init(&x11_beep,0,0);
 	sem_init(&x11_title,0,0);
 	sem_init(&x11_name,0,0);
+	sem_init(&font_set,0,0);
 	pthread_mutex_init(&copybuf_mutex, NULL);
 	pthread_mutex_init(&lines_mutex, NULL);
 
diff --git a/src/conio/console.h b/src/conio/console.h
index c15a0a73a375212b63ee238112be723ffc076d2d..5d8c475267e021508fa552a414afca5ef515f59c 100644
--- a/src/conio/console.h
+++ b/src/conio/console.h
@@ -49,6 +49,10 @@ extern sem_t	console_mode_changed;
 extern sem_t	copybuf_set;
 extern sem_t	pastebuf_request;
 extern sem_t	pastebuf_set;
+extern sem_t	font_set;
+extern int		new_font;
+extern int		font_force;
+extern int		setfont_return;
 extern pthread_mutex_t	copybuf_mutex;
 extern char *copybuf;
 extern char *pastebuf;
diff --git a/src/conio/x_cio.c b/src/conio/x_cio.c
index 4188ed56ab624df06db3175f9eef6a51fdd73722..6cec69c533be63222579ac663d836a259d666cd9 100644
--- a/src/conio/x_cio.c
+++ b/src/conio/x_cio.c
@@ -317,3 +317,11 @@ char *x_getcliptext(void)
 	sem_post(&pastebuf_request);
 	return(ret);
 }
+
+int x_setfont(int font, int force)
+{
+	font_force=force;
+	new_font=font;
+	sem_wait(&font_set);
+	return(setfont_return);
+}
diff --git a/src/conio/x_cio.h b/src/conio/x_cio.h
index 0af06fb9c3c1eddd6c7588e11cafddf1643917e4..e1015604748f8faef5f197449403ec90f3588dc3 100644
--- a/src/conio/x_cio.h
+++ b/src/conio/x_cio.h
@@ -65,6 +65,7 @@ void x_setname(const char *name);
 void x_settitle(const char *title);
 void x_copytext(const char *text, size_t buflen);
 char *x_getcliptext(void);
+int x_setfont(int font, int force);
 #ifdef __cplusplus
 }
 #endif