diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index a29fa997f30e5cd6863379bc1e85684fee223ddc..f933ce1001115aed095f5a3be91615b47b7c5125 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -49,6 +49,7 @@
 #include "keys.h"
 
 #include "cterm.h"
+#include "allfonts.h"
 
 #define	BUFSIZE	2048
 
@@ -482,6 +483,41 @@ void do_ansi(char *retbuf, size_t retsize, int *speed)
 							}
 						}
 						break;
+					case '{':
+						if(cterm.escbuf[1] == '=') {	/* Font loading */
+							i=255;
+							j=0;
+							if(strlen(cterm.escbuf)>2) {
+								if((p=strtok(cterm.escbuf+1,";"))!=NULL) {
+									i=atoi(p);
+									if(!i && cterm.escbuf[2] != '0')
+										i=255;
+									if((p=strtok(NULL,";"))!=NULL) {
+										j=atoi(p);
+									}
+								}
+							}
+							if(i>255)
+								break;
+							cterm.font_start_time=time(NULL);
+							cterm.font_read=0;
+							cterm.font_slot=i;
+							switch(j) {
+								case 0:
+									cterm.font_size=4096;
+									break;
+								case 1:
+									cterm.font_size=3586;
+									break;
+								case 2:
+									cterm.font_size=2048;
+									break;
+								default:
+									cterm.font_size=0;
+									break;
+							}
+						}
+						break;
 				}
 				break;
 			}
@@ -1006,6 +1042,7 @@ void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsign
 	char *in;
 	char	*out;
 
+	memset(&cterm, 0, sizeof(cterm));
 	cterm.x=xpos;
 	cterm.y=ypos;
 	cterm.height=height;
@@ -1162,7 +1199,42 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, size_t retsize,
 			prn[0]=0;
 			for(j=0;j<buflen;j++) {
 				ch[0]=buf[j];
-				if(cterm.sequence) {
+				if(cterm.font_size) {
+					cterm.fontbuf[cterm.font_read++]=ch[0];
+					if(cterm.font_read == cterm.font_size) {
+						char *buf;
+
+						if((buf=(char *)malloc(cterm.font_size))!=NULL) {
+							memcpy(buf,cterm.fontbuf,cterm.font_size);
+							if(cterm.font_slot >= CONIO_FIRST_FREE_FONT) {
+								switch(cterm.font_size) {
+									case 4096:
+										FREE_AND_NULL(conio_fontdata[cterm.font_slot].eight_by_sixteen);
+										conio_fontdata[cterm.font_slot].eight_by_sixteen=buf;
+										FREE_AND_NULL(conio_fontdata[cterm.font_slot].desc);
+										conio_fontdata[cterm.font_slot].desc=strdup("Remote Defined Font");
+										break;
+									case 3586:
+										FREE_AND_NULL(conio_fontdata[cterm.font_slot].eight_by_fourteen);
+										conio_fontdata[cterm.font_slot].eight_by_fourteen=buf;
+										FREE_AND_NULL(conio_fontdata[cterm.font_slot].desc);
+										conio_fontdata[cterm.font_slot].desc=strdup("Remote Defined Font");
+										break;
+									case 2048:
+										FREE_AND_NULL(conio_fontdata[cterm.font_slot].eight_by_eight);
+										conio_fontdata[cterm.font_slot].eight_by_eight=buf;
+										FREE_AND_NULL(conio_fontdata[cterm.font_slot].desc);
+										conio_fontdata[cterm.font_slot].desc=strdup("Remote Defined Font");
+										break;
+								}
+							}
+							else
+								FREE_AND_NULL(buf);
+						}
+						cterm.font_size=0;
+					}
+				}
+				else if(cterm.sequence) {
 					k=strlen(cterm.escbuf);
 					strcat(cterm.escbuf,ch);
 					if(k) {
@@ -1346,5 +1418,13 @@ void cterm_closelog()
 
 void cterm_end(void)
 {
+	int i;
+
 	cterm_closelog();
+	for(i=CONIO_FIRST_FREE_FONT; i < 256; i++) {
+		FREE_AND_NULL(conio_fontdata[i].eight_by_sixteen);
+		FREE_AND_NULL(conio_fontdata[i].eight_by_fourteen);
+		FREE_AND_NULL(conio_fontdata[i].eight_by_eight);
+		FREE_AND_NULL(conio_fontdata[i].desc);
+	}
 }
diff --git a/src/conio/cterm.h b/src/conio/cterm.h
index 6f9e5e351eb279bf0e33f70696d1b4ac2680730f..c613e2f169df48de41704374d46c4922dda0c71a 100644
--- a/src/conio/cterm.h
+++ b/src/conio/cterm.h
@@ -78,6 +78,11 @@ struct cterminal {
 	int log;
 	FILE* logfile;
 	char	DA[1024];
+	char	fontbuf[4096];
+	int		font_slot;
+	int		font_size;
+	int		font_read;
+	int		font_start_time;
 };
 
 #define CTERM_MUSIC_SYNCTERM	0
diff --git a/src/conio/cterm.txt b/src/conio/cterm.txt
index 349fd2822aaaeef10b594df4f1657f6472d2cf76..02af3cddbd22e830095b684d880c4029eb82ebf7 100644
--- a/src/conio/cterm.txt
+++ b/src/conio/cterm.txt
@@ -90,6 +90,21 @@ CSI = [p1] M
 
 	SOURCE: CTerm only.
 
+CSI = [ p1 [ ; p2 ] ] {
+	NON-STANDARD EXTENSION.
+	Defaults:  p1 = 255  p2 = 0
+	Indicates that a font block is following.
+	p1 indicates the font slot to place the loaded font into.  This must
+	be higher than the last default defined font (See CSI sp D for list
+	of predefined fonts)  p2 indicates font size according to the
+	following table:
+		0 - 8x16 font, 4096 bytes.
+		1 - 8x14 font, 3586 bytes.
+		2 - 8x8 font, 2048 bytes.
+
+	SOURCE: CTerm only.
+
+
 CSI [ p1 [ ; p2 ] ] * r
 	NON-STANDARD EXTENSION.
 	Set the output emulation speed.