diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index 20f42491831fdf5f85fa818f43906481ebbd2196..dc4f6221ad43627a6568aecc77ffe6eea19cb55f 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -5,6 +5,7 @@
 #include <ini_file.h>
 #include <uifc.h>
 #include "filepick.h"
+#include "allfonts.h"
 
 #include "syncterm.h"
 #include "bbslist.h"
@@ -103,7 +104,7 @@ void read_item(FILE *listfile, struct bbslist *entry, char *bbsname, int id, int
 	entry->loglevel=iniReadInteger(listfile,bbsname,"LogLevel",LOG_INFO);
 	entry->bpsrate=iniReadInteger(listfile,bbsname,"BPSRate",0);
 	entry->music=iniReadInteger(listfile,bbsname,"ANSIMusic",CTERM_MUSIC_BANSI);
-	entry->font=iniReadInteger(listfile,bbsname,"Font",default_font);
+	iniReadString(listfile,bbsname,"Font","Codepage 437 English",entry->font);
 	entry->type=type;
 }
 
@@ -191,7 +192,7 @@ int edit_list(struct bbslist *item,char *listpath,int isdefault)
 		sprintf(opt[i++],"Log Level         %s",log_levels[item->loglevel]);
 		sprintf(opt[i++],"Simulated BPS     %s",rate_names[get_rate_num(item->bpsrate)]);
 		sprintf(opt[i++],"ANSI Music        %s",music_names[item->music]);
-		sprintf(opt[i++],"Font              %s",font_names[item->font]);
+		sprintf(opt[i++],"Font              %s",item->font);
 		opt[i++][0]=0;
 		uifc.changes=0;
 
@@ -418,11 +419,11 @@ int edit_list(struct bbslist *item,char *listpath,int isdefault)
 								"Select the desired font for this connection.\n\n"
 								"Some fonts do not allow some modes.  When this is the case, 80x25 will be"
 								"forced.\n";
-				i=item->font;
-				uifc.list(WIN_SAV,0,0,0,&i,NULL,"Font",font_names);
-				if(i != item->font) {
-					item->font=i;
-					iniSetInteger(&inifile,itemname,"Font",item->font,&ini_style);
+				i=j=find_font_id(item->font);
+				uifc.list(WIN_SAV,0,0,0,&i,&j,"Font",font_names);
+				if(i!=find_font_id(item->font)) {
+					strcpy(item->font,font_names[i]);
+					iniSetString(&inifile,itemname,"Font",item->font,&ini_style);
 					changed=1;
 				}
 				break;
@@ -464,7 +465,7 @@ void add_bbs(char *listpath, struct bbslist *bbs)
 	iniSetInteger(&inifile,bbs->name,"LogLevel",bbs->loglevel,&ini_style);
 	iniSetInteger(&inifile,bbs->name,"BPSRate",bbs->bpsrate,&ini_style);
 	iniSetInteger(&inifile,bbs->name,"ANSIMusic",bbs->music,&ini_style);
-	iniSetInteger(&inifile,bbs->name,"Font",bbs->font,&ini_style);
+	iniSetString(&inifile,bbs->name,"Font",bbs->font,&ini_style);
 	if((listfile=fopen(listpath,"w"))!=NULL) {
 		iniWriteFile(listfile,inifile);
 		fclose(listfile);
@@ -489,13 +490,6 @@ void del_bbs(char *listpath, struct bbslist *bbs)
 	}
 }
 
-struct font_files {
-	char	*name;
-	char	*path8x8;
-	char	*path8x14;
-	char	*path8x16;
-};
-
 void free_font_files(struct font_files *ff)
 {
 	int	i;
@@ -600,6 +594,93 @@ struct font_files *read_font_files(int *count)
 	return(ret);
 }
 
+void load_font_files(void)
+{
+	int count=0;
+	int i;
+	int	nextfont=CONIO_FIRST_FREE_FONT;
+	struct font_files *ff;
+	FILE *fontfile;
+	char	*fontdata;
+
+	ff=read_font_files(&count);
+	for(i=0; i<count; i++) {
+		if(conio_fontdata[nextfont].eight_by_sixteen)
+			FREE_AND_NULL(conio_fontdata[nextfont].eight_by_sixteen);
+		if(conio_fontdata[nextfont].eight_by_fourteen)
+			FREE_AND_NULL(conio_fontdata[nextfont].eight_by_fourteen);
+		if(conio_fontdata[nextfont].eight_by_sixteen)
+			FREE_AND_NULL(conio_fontdata[nextfont].eight_by_eight);
+		if(conio_fontdata[nextfont].desc)
+			FREE_AND_NULL(conio_fontdata[nextfont].desc);
+		if(ff[i].name)
+			conio_fontdata[nextfont].desc=strdup(ff[i].name);
+		else
+			continue;
+		if(ff[i].path8x8) {
+			if((fontfile=fopen(ff[i].path8x8,"r"))!=NULL) {
+				if((fontdata=(char *)malloc(2048))!=NULL) {
+					if(fread(fontdata, 1, 2048, fontfile)==2048) {
+						conio_fontdata[nextfont].eight_by_eight=fontdata;
+					}
+					else {
+						free(fontdata);
+					}
+				}
+			}
+		}
+		if(ff[i].path8x14) {
+			if((fontfile=fopen(ff[i].path8x14,"r"))!=NULL) {
+				if((fontdata=(char *)malloc(3584))!=NULL) {
+					if(fread(fontdata, 1, 3584, fontfile)==3584) {
+						conio_fontdata[nextfont].eight_by_fourteen=fontdata;
+					}
+					else {
+						free(fontdata);
+					}
+				}
+			}
+		}
+		if(ff[i].path8x16) {
+			if((fontfile=fopen(ff[i].path8x16,"r"))!=NULL) {
+				if((fontdata=(char *)malloc(4096))!=NULL) {
+					if(fread(fontdata, 1, 4096, fontfile)==4096) {
+						conio_fontdata[nextfont].eight_by_sixteen=fontdata;
+					}
+					else {
+						free(fontdata);
+					}
+				}
+			}
+		}
+		nextfont++;
+	}
+	free_font_files(ff);
+
+	for(i=0; conio_fontdata[i].desc != NULL; i++) {
+		font_names[i]=conio_fontdata[i].desc;
+		if(!strcmp(conio_fontdata[i].desc,"Codepage 437 English")) {
+			default_font=i;
+		}
+	}
+	font_names[i]="";
+}
+
+int	find_font_id(char *name)
+{
+	int ret=0;
+	int i;
+
+	for(i=0; i<256; i++) {
+		if(!conio_fontdata[i].desc)
+			continue;
+		if(!strcmp(conio_fontdata[i].desc,name)) {
+			ret=i;
+			break;
+		}
+	}
+}
+
 void font_management(void)
 {
 	int i,j;
diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h
index 53d80e410bddfcd71735ba73d7ce56dac806155d..d73bdda91b0aaa87f3adb5640be095043801178e 100644
--- a/src/syncterm/bbslist.h
+++ b/src/syncterm/bbslist.h
@@ -55,7 +55,14 @@ struct bbslist {
 	int				loglevel;
 	int				bpsrate;
 	int				music;
-	int				font;
+	char			font[80];
+};
+
+struct font_files {
+	char	*name;
+	char	*path8x8;
+	char	*path8x14;
+	char	*path8x16;
 };
 
 struct bbslist *show_bbslist(int mode);
@@ -67,5 +74,10 @@ void read_list(char *listpath, struct bbslist **list, struct bbslist *defaults,
 void free_list(struct bbslist **list, int listcount);
 void add_bbs(char *listpath, struct bbslist *bbs);
 int  get_rate_num(int rate);
+void free_font_files(struct font_files *ff);
+void save_font_files(struct font_files *fonts);
+struct font_files *read_font_files(int *count);
+void load_font_files(void);
+int	find_font_id(char *name);
 
 #endif
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 99175551af5ff639f6872124037b750ec7b857c1..bf643664b044bfaaf9de9e8ac25354b1ee3c6b85 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -33,7 +33,7 @@ char* syncterm_version = "SyncTERM 0.6"
 	;
 
 char *inpath=NULL;
-int default_font;
+int default_font=0;
 char *font_names[sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)];
 
 #ifdef _WINSOCKAPI_
@@ -87,7 +87,7 @@ void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_def
 		bbs->port=(dflt_conn_type==CONN_TYPE_TELNET)?23:513;
 		bbs->loglevel=LOG_INFO;
 		bbs->music=CTERM_MUSIC_BANSI;
-		bbs->font=default_font;
+		strcpy(bbs->font,"Codepage 437 English");
 	}
 	p1=url;
 	if(!strnicmp("rlogin://",url,9)) {
@@ -347,14 +347,6 @@ int main(int argc, char **argv)
 
 	initciolib(ciolib_mode);
 
-	for(i=0; conio_fontdata[i].desc != NULL; i++) {
-		font_names[i]=conio_fontdata[i].desc;
-		if(!strcmp(conio_fontdata[i].desc,"Codepage 437 English")) {
-			default_font=i;
-		}
-	}
-	font_names[i]="";
-
     gettextinfo(&txtinfo);
 	if((txtinfo.screenwidth<40) || txtinfo.screenheight<24) {
 		fputs("Window too small, must be at least 80x24\n",stderr);
@@ -396,6 +388,7 @@ int main(int argc, char **argv)
 	if(!winsock_startup())
 		return(1);
 
+	load_font_files();
 	while(bbs!=NULL || (bbs=show_bbslist(BBSLIST_SELECT))!=NULL) {
     		gettextinfo(&txtinfo);	/* Current mode may have changed while in show_bbslist() */
 		if(!conn_connect(bbs->addr,bbs->port,bbs->reversed?bbs->password:bbs->user,bbs->reversed?bbs->user:bbs->password,bbs->syspass,bbs->conn_type,bbs->bpsrate)) {
@@ -417,7 +410,8 @@ int main(int argc, char **argv)
 				}
 			}
 			uifcbail();
-			setfont(bbs->font,TRUE);
+			load_font_files();
+			setfont(find_font_id(bbs->font),TRUE);
 			switch(bbs->screen_mode) {
 				case SCREEN_MODE_80X25:
 					textmode(C80);
@@ -442,6 +436,13 @@ int main(int argc, char **argv)
 				return(1);
 			exit_now=doterm(bbs);
 			setfont(default_font,TRUE);
+			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);
+			}
+			load_font_files();
 			textmode(txtinfo.currmode);
 			settitle("SyncTERM");
 		}