diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index ebb7b72969488d8ee10322baa61f93d740bc0b20..9c49461a04900400023d1277772173244e7c06ad 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -251,7 +251,7 @@ void viewofflinescroll(void)
 	textattr(uifc.hclr|(uifc.bclr<<4)|BLINK);
     gettextinfo(&sbtxtinfo);
 
-	for(i=0;!i;) {
+	for(i=0;!i && !quitting;) {
 		if(top<1)
 			top=1;
 		if(top>(int)scrollback_lines)
@@ -271,6 +271,11 @@ void viewofflinescroll(void)
 			case 0xff:
 			case 0:
 				switch(key|getch()<<8) {
+					case CIO_KEY_QUIT:
+						check_exit(TRUE);
+						if (quitting)
+							i=1;
+						break;
 					case CIO_KEY_MOUSE:
 						getmouse(&mevent);
 						switch(mevent.event) {
@@ -505,7 +510,7 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c
 		sopts[i]=sopt[i];
 	sopts[i]=NULL;
 
-	for(;;) {
+	for(;!quitting;) {
 		/* Build ordered list of sort order */
 		for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) {
 			if(sort_order[abs(sortorder[i])].name) {
@@ -524,8 +529,10 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c
 						"To reverse a sort order, highlight it and press enter";
 		ret=uifc.list(WIN_XTR|WIN_DEL|WIN_INS|WIN_INSACT|WIN_ACT|WIN_SAV
 					,0,0,0,&curr,&bar,"Sort Order",opts);
-		if(ret==-1)
-			break;
+		if(ret==-1) {
+			if(check_exit(FALSE))
+				break;
+		}
 		if(ret & MSK_INS) {		/* Insert sorting */
 			j=0;
 			for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) {
@@ -537,6 +544,8 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c
 			if(j==0) {
 				uifc.helpbuf=	"All sort orders are present in the list.";
 				uifc.msg("No more sort orders.");
+				if(check_exit(FALSE))
+					break;
 			}
 			else {
 				sopt[j][0]=0;
@@ -557,6 +566,10 @@ void edit_sorting(struct bbslist **list, int *listcount, int *ocur, int *obar, c
 						}
 					}
 				}
+				else {
+					if(check_exit(FALSE))
+						break;
+				}
 			}
 		}
 		else if(ret & MSK_DEL) {		/* Delete criteria */
@@ -732,8 +745,10 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 						"This entry was loaded from the system directory.  In order to edit it, it\n"
 						"must be copied into your personal directory.\n";
 		i=0;
-		if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Copy from system directory?",YesNo)!=0)
+		if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Copy from system directory?",YesNo)!=0) {
+			check_exit(FALSE);
 			return(0);
+		}
 		item->type=USER_BBSLIST;
 		add_bbs(listpath, item);
 	}
@@ -749,7 +764,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 		itemname=NULL;
 	else
 		itemname=item->name;
-	for(;;) {
+	for(;!quitting;) {
 		i=0;
 		if(!isdefault) {
 			sprintf(opt[i++], "Name              %s",itemname);
@@ -810,13 +825,17 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 			i++;	/* no port number */
 		switch(i) {
 			case -1:
+				check_exit(FALSE);
 				if((!isdefault) && (itemname!=NULL) && (itemname[0]==0)) {
 					uifc.helpbuf=	"`Cancel Save`\n\n"
 									"This entry has no name and can therefore not be saved.\n"
 									"Selecting `No` will return to editing mode.\n";
 					i=0;
-					if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Cancel Save?",YesNo)!=0)
+					if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Cancel Save?",YesNo)!=0) {
+						quitting=FALSE;
+						check_exit(FALSE);
 						break;
+					}
 					strListFree(&inifile);
 					return(0);
 				}
@@ -834,22 +853,29 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 									"Enter the name of the entry as it is to appear in the directory.";
 					strcpy(tmp,itemname);
 					uifc.input(WIN_MID|WIN_SAV,0,0,"Name",tmp,LIST_NAME_MAX,K_EDIT);
+					check_exit(FALSE);
+					if(quitting)
+						break;
 					if(stricmp(tmp,itemname) && list_name_check(list, tmp, NULL, FALSE)) {
 						uifc.helpbuf=	"`Entry Name Already Exists`\n\n"
 										"An entry with that name already exists in the directory.\n"
 										"Please choose a unique name.\n";
 						uifc.msg("Entry Name Already Exists!");
+						check_exit(FALSE);
 					}
 					else {
-						iniRenameSection(&inifile,itemname,tmp);
-						strcpy(itemname, tmp);
-					}
-					if(itemname[0]==0) {
-						uifc.helpbuf=	"`Can Not Use and Empty Name`\n\n"
-										"Entry names can not be empty.  Please enter an entry name.\n";
-						uifc.msg("Can not use an empty name");
+						if(tmp[0]==0) {
+							uifc.helpbuf=	"`Can Not Use and Empty Name`\n\n"
+											"Entry names can not be empty.  Please enter an entry name.\n";
+							uifc.msg("Can not use an empty name");
+							check_exit(FALSE);
+						}
+						else {
+							iniRenameSection(&inifile,itemname,tmp);
+							strcpy(itemname, tmp);
+						}
 					}
-				} while(itemname[0]==0);
+				} while(tmp[0]==0 && !quitting);
 				break;
 			case 1:
 				uifc.helpbuf=address_help;
@@ -859,6 +885,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 					:item->conn_type==CONN_TYPE_SHELL ? "Command"
 					: "Address"
 					,item->addr,LIST_ADDR_MAX,K_EDIT);
+				check_exit(FALSE);
 				iniSetString(&inifile,itemname,"Address",item->addr,&ini_style);
 				break;
 			case 3:
@@ -869,6 +896,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 								"Telnet is generally port 23, RLogin is generally 513 and SSH is\n"
 								"generally 22\n";
 				uifc.input(WIN_MID|WIN_SAV,0,0,"TCP Port",str,5,K_EDIT|K_NUMBER);
+				check_exit(FALSE);
 				j=atoi(str);
 				if(j<1 || j>65535)
 					j=conn_ports[item->conn_type];
@@ -884,6 +912,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 								"Enter the username to attempt auto-login to the remote with.\n"
 								"For SSH, this must be the SSH user name.";
 				uifc.input(WIN_MID|WIN_SAV,0,0,"Username",item->user,MAX_USER_LEN,K_EDIT);
+				check_exit(FALSE);
 				iniSetString(&inifile,itemname,"UserName",item->user,&ini_style);
 				break;
 			case 5:
@@ -891,6 +920,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 								"Enter your password for auto-login.\n"
 								"For SSH, this must be the SSH password if it exists.\n";
 				uifc.input(WIN_MID|WIN_SAV,0,0,"Password",item->password,MAX_PASSWD_LEN,K_EDIT);
+				check_exit(FALSE);
 				iniSetString(&inifile,itemname,"Password",item->password,&ini_style);
 				break;
 			case 6:
@@ -900,6 +930,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 								"Synchronet, or non-sysop accounts, this can be used for simple\n"
 								"scripting.";
 				uifc.input(WIN_MID|WIN_SAV,0,0,"System Password",item->syspass,MAX_SYSPASS_LEN,K_EDIT);
+				check_exit(FALSE);
 				iniSetString(&inifile,itemname,"SystemPassword",item->syspass,&ini_style);
 				break;
 			case 2:
@@ -908,6 +939,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 				uifc.helpbuf=conn_type_help;
 				switch(uifc.list(WIN_SAV,0,0,0,&(item->conn_type),NULL,"Connection Type",&(conn_types[1]))) {
 					case -1:
+						check_exit(FALSE);
 						item->conn_type=i;
 						break;
 					default:
@@ -935,6 +967,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 								"Select the screen size for this connection\n";
 				switch(uifc.list(WIN_SAV,0,0,0,&(item->screen_mode),NULL,"Screen Mode",screen_modes)) {
 					case -1:
+						check_exit(FALSE);
 						item->screen_mode=i;
 						break;
 					default:
@@ -978,18 +1011,24 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 								"Enter the path where downloads will be placed.";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Download Path",item->dldir,MAX_PATH,K_EDIT)>=0)
 					iniSetString(&inifile,itemname,"DownloadPath",item->dldir,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 10:
 				uifc.helpbuf=	"`Upload Path`\n\n"
 								"Enter the path where uploads will be browsed from.";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Upload Path",item->uldir,MAX_PATH,K_EDIT)>=0)
 					iniSetString(&inifile,itemname,"UploadPath",item->uldir,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 11:
 				uifc.helpbuf=	"`Log Filename`\n\n"
 								"Enter the path to the optional log file.";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Log File",item->logfile,MAX_PATH,K_EDIT)>=0)
 					iniSetString(&inifile,itemname,"LogFile",item->logfile,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 12:
 				item->xfer_loglevel--;
@@ -1025,6 +1064,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 				i=get_rate_num(item->bpsrate);
 				switch(uifc.list(WIN_SAV,0,0,0,&i,NULL,"Comm Rate (BPS)",rate_names)) {
 					case -1:
+						check_exit(FALSE);
 						break;
 					default:
 						item->bpsrate=rates[i];
@@ -1059,6 +1099,8 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 					iniSetInteger(&inifile,itemname,"ANSIMusic",item->music,&ini_style);
 					changed=1;
 				}
+				else
+					check_exit(FALSE);
 				break;
 			case 17:
 				uifc.helpbuf=address_family_help;
@@ -1068,6 +1110,8 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 					iniSetEnum(&inifile, itemname, "AddressFamily", address_families, item->address_family, &ini_style);
 					changed=1;
 				}
+				else
+					check_exit(FALSE);
 				break;
 			case 18:
 				uifc.helpbuf=	"`Font`\n\n"
@@ -1077,6 +1121,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd
 				i=j=find_font_id(item->font);
 				switch(uifc.list(WIN_SAV,0,0,0,&i,&j,"Font",font_names)) {
 					case -1:
+						check_exit(FALSE);
 						break;
 					default:
 					if(i!=find_font_id(item->font)) {
@@ -1181,7 +1226,7 @@ void change_settings(void)
 		opt[i]=opts[i];
 	opt[i]=NULL;
 
-	for(;;) {
+	for(;!quitting;) {
 
 		uifc.helpbuf=	"`Program Settings Menu`\n\n"
 						"~ Confirm Program Exit ~\n"
@@ -1221,6 +1266,7 @@ void change_settings(void)
 		sprintf(opts[10],"TERM For Shell          %s",settings.TERM);
 		switch(uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0,0,&cur,NULL,"Program Settings",opt)) {
 			case -1:
+				check_exit(FALSE);
 				goto write_ini;
 			case 0:
 				settings.confirm_close=!settings.confirm_close;
@@ -1236,6 +1282,7 @@ void change_settings(void)
 								"Select the screen mode/size for at startup\n";
 				switch(i=uifc.list(WIN_SAV,0,0,0,&j,NULL,"Startup Screen Mode",screen_modes)) {
 					case -1:
+						check_exit(FALSE);
 						continue;
 					default:
 						settings.startup_mode=j;
@@ -1308,6 +1355,7 @@ void change_settings(void)
 								;
 				switch(i=uifc.list(WIN_SAV,0,0,0,&j,NULL,"Video Output Mode",output_types)) {
 					case -1:
+						check_exit(FALSE);
 						continue;
 					default:
 						settings.output_mode=output_map[j];
@@ -1327,6 +1375,7 @@ void change_settings(void)
 					if(j<1) {
 						uifc.helpbuf=	"There must be at least one line in the scrollback buffer.";
 						uifc.msg("Cannot set lines to less than one.");
+						check_exit(FALSE);
 					}
 					else {
 						tmpscroll=(unsigned char *)realloc(scrollback_buf,80*2*j);
@@ -1334,6 +1383,7 @@ void change_settings(void)
 							uifc.helpbuf="The selected scrollback size is too large.\n"
 										 "Please reduce the number of lines.";
 							uifc.msg("Cannot allocate space for scrollback.");
+							check_exit(FALSE);
 						}
 						else {
 							if(scrollback_lines > (unsigned)j)
@@ -1344,6 +1394,8 @@ void change_settings(void)
 						}
 					}
 				}
+				else
+					check_exit(FALSE);
 				break;
 			case 5:
 				uifc.helpbuf=	"`Modem/Comm Device`\n\n"
@@ -1353,6 +1405,8 @@ void change_settings(void)
 								"`\"";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Modem/Comm Device",settings.mdm.device_name,INI_MAX_VALUE_LEN,K_EDIT)>=0)
 					iniSetString(&inicontents,"SyncTERM","ModemDevice",settings.mdm.device_name,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 6:
 				uifc.helpbuf=	"`Modem/Comm Rate`\n\n"
@@ -1366,6 +1420,8 @@ void change_settings(void)
 					settings.mdm.com_rate=strtol(str,NULL,10);
 					iniSetLongInt(&inicontents,"SyncTERM","ModemComRate",settings.mdm.com_rate,&ini_style);
 				}
+				else
+					check_exit(FALSE);
 				break;
 
 			case 7:
@@ -1390,6 +1446,8 @@ void change_settings(void)
 								"Disable Software Flow      &I0\n";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Modem Init String",settings.mdm.init_string,INI_MAX_VALUE_LEN-1,K_EDIT)>=0)
 					iniSetString(&inicontents,"SyncTERM","ModemInit",settings.mdm.init_string,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 8:
 				uifc.helpbuf=   "`Modem Dial String`\n\n"
@@ -1397,12 +1455,16 @@ void change_settings(void)
 								"Example: \"`ATDT`\" will dial a Hayes-compatible modem in touch-tone mode.";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Modem Dial String",settings.mdm.dial_string,INI_MAX_VALUE_LEN-1,K_EDIT)>=0)
 					iniSetString(&inicontents,"SyncTERM","ModemDial",settings.mdm.dial_string,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 9:
 				uifc.helpbuf=   "`List Path`\n\n"
 								"The complete path to the BBS list goes here.\n";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"List Path",settings.list_path,MAX_PATH,K_EDIT)>=0)
 					iniSetString(&inicontents,"SyncTERM","ListPath",settings.list_path,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 			case 10:
 				uifc.helpbuf=   "`TERM For Shell`\n\n"
@@ -1410,6 +1472,8 @@ void change_settings(void)
 								"Example: \"`ansi`\" will select a dumb ANSI mode.";
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"TERM",settings.TERM,LIST_NAME_MAX,K_EDIT)>=0)
 					iniSetString(&inicontents,"SyncTERM","TERM",settings.TERM,&ini_style);
+				else
+					check_exit(FALSE);
 				break;
 		}
 	}
@@ -1493,8 +1557,12 @@ struct bbslist *show_bbslist(char *current, int connected)
 	uifc.list(WIN_T2B|WIN_RHT|WIN_EXTKEYS|WIN_DYN|WIN_HLP|WIN_ACT|WIN_INACT
 		,0,0,0,&sopt,&sbar,"SyncTERM Settings",connected?connected_settings_menu:settings_menu);
 	for(;;) {
+		if (quitting)
+			return NULL;
 		if (!at_settings) {
 			for(;!at_settings;) {
+				if (quitting)
+					return NULL;
 				if(connected)
 					uifc.helpbuf=	"`SyncTERM Directory`\n\n"
 									"Commands:\n\n"
@@ -1592,12 +1660,8 @@ struct bbslist *show_bbslist(char *current, int connected)
 							}
 							break;
 						case -1:		/* ESC */
-							if(!connected) {
-								if(settings.confirm_close && !confirm("Are you sure you want to exit?",NULL))
-									continue;
-							}
-							// Fall-through
-						case -2-CIO_KEY_QUIT:
+							if (!check_exit(TRUE))
+								continue;
 							free_list(&list[0],listcount);
 							return(NULL);
 					}
@@ -1612,6 +1676,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 												"The total combined size of loaded entries is currently the highest\n"
 												"supported size.  You must delete entries before adding more.";
 								uifc.msg("Max List size reached!");
+								check_exit(FALSE);
 								break;
 							}
 							if(safe_mode) {
@@ -1619,13 +1684,17 @@ struct bbslist *show_bbslist(char *current, int connected)
 												"SyncTERM is currently running in safe mode.  This means you cannot add to the\n"
 												"directory.";
 								uifc.msg("Cannot edit list in safe mode");
+								check_exit(FALSE);
 								break;
 							}
 							tmp[0]=0;
 							uifc.changes=0;
 							uifc.helpbuf=	"`Name`\n\n"
 											"Enter the name of the entry as it is to appear in the directory.";
-							uifc.input(WIN_MID|WIN_SAV,0,0,"Name",tmp,LIST_NAME_MAX,K_EDIT);
+							if(uifc.input(WIN_MID|WIN_SAV,0,0,"Name",tmp,LIST_NAME_MAX,K_EDIT)==-1) {
+								if (check_exit(FALSE))
+									break;
+							}
 							if(!uifc.changes)
 								break;
 							if(list_name_check(list, tmp, NULL, FALSE)) {
@@ -1633,6 +1702,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 												"An entry with that name already exists in the directory.\n"
 												"Please choose a unique name.\n";
 								uifc.msg("Entry Name Already Exists!");
+								check_exit(FALSE);
 								break;
 							}
 							listcount++;
@@ -1659,6 +1729,10 @@ struct bbslist *show_bbslist(char *current, int connected)
 								}
 								uifc.changes=1;
 							}
+							else {
+								if (check_exit(FALSE))
+									break;
+							}
 
 							if(uifc.changes) {
 								uifc.changes=0;
@@ -1669,8 +1743,9 @@ struct bbslist *show_bbslist(char *current, int connected)
 									:list[listcount-1]->conn_type==CONN_TYPE_SHELL ? "Command"
 									:"Address"
 									,list[listcount-1]->addr,LIST_ADDR_MAX,K_EDIT);
+								check_exit(FALSE);
 							}
-							if(!uifc.changes) {
+							if(quitting || !uifc.changes) {
 								FREE_AND_NULL(list[listcount-1]);
 								list[listcount-1]=list[listcount];
 								listcount--;
@@ -1696,6 +1771,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 												"Reach over to your fridge, grab a cold one...\n"
 												"Watch the seagulls in their dance...\n";
 								uifc.msg("It's gone, calm down man!");
+								check_exit(FALSE);
 								break;
 							}
 							if(safe_mode) {
@@ -1703,12 +1779,14 @@ struct bbslist *show_bbslist(char *current, int connected)
 												"SyncTERM is currently running in safe mode.  This means you cannot remove from the\n"
 												"directory.";
 								uifc.msg("Cannot edit list in safe mode");
+								check_exit(FALSE);
 								break;
 							}
 							if(list[opt]->type==SYSTEM_BBSLIST) {
 								uifc.helpbuf=	"`Cannot delete from system list`\n\n"
 												"This entry was loaded from the system-wide list and cannot be deleted.";
 								uifc.msg("Cannot delete system list entries");
+								check_exit(FALSE);
 								break;
 							}
 							sprintf(str,"Delete %s?",list[opt]->name);
@@ -1725,6 +1803,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 												"SyncTERM is currently running in safe mode.  This means you cannot edit the\n"
 												"directory.";
 								uifc.msg("Cannot edit list in safe mode");
+								check_exit(FALSE);
 								break;
 							}
 							if(edit_list(list, list[opt],settings.list_path,FALSE)) {
@@ -1741,6 +1820,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 											"SyncTERM is currently running in safe mode.  This means you cannot edit the\n"
 											"directory.";
 							uifc.msg("Cannot edit list in safe mode");
+							check_exit(FALSE);
 						}
 						else if(edit_list(list, list[opt],settings.list_path,FALSE)) {
 							load_bbslist(list, sizeof(list), &defaults, settings.list_path, sizeof(settings.list_path), shared_list, sizeof(shared_list), &listcount, &opt, &bar, list[opt]?strdup(list[opt]->name):NULL);
@@ -1756,7 +1836,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 			}
 		}
 		else {
-			for(;at_settings;) {
+			for(;at_settings && !quitting;) {
 				uifc.helpbuf=	"`SyncTERM Settings Menu`\n\n"
 								"~ Default Connection Settings ~\n"
 								"        Modify the settings that are used by default for new entries\n\n"
@@ -1799,12 +1879,8 @@ struct bbslist *show_bbslist(char *current, int connected)
 						at_settings=!at_settings;
 						break;
 					case -1:		/* ESC */
-						if(!connected) {
-							if(settings.confirm_close && !confirm("Are you sure you want to exit?",NULL))
-								continue;
-						}
-						// Fall-through
-					case -2-CIO_KEY_QUIT:
+						if (!check_exit(TRUE))
+							continue;
 						free_list(&list[0],listcount);
 						return(NULL);
 					case 0:			/* Edit default connection settings */
@@ -1815,6 +1891,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 						uifc.helpbuf=	"Mouse actions are not yet user conifurable."
 										"This item is here to remind me to implement it.";
 						uifc.msg("This section not yet functional");
+						check_exit(FALSE);
 						break;
 #endif
 					case 1: {		/* Screen Mode */
@@ -1839,7 +1916,7 @@ struct bbslist *show_bbslist(char *current, int connected)
 									|WIN_SEL|WIN_INACT
 									,0,0,0,&opt,&bar,"Directory",(char **)list);
 							}
-							else if (i==-2-CIO_KEY_QUIT) {
+							else if (check_exit(FALSE)) {
 								free_list(&list[0],listcount);
 								return(NULL);
 							}
diff --git a/src/syncterm/fonts.c b/src/syncterm/fonts.c
index 7debb4c0845b6373486f9f17b67490f305fa2483..4fa1ad621c81ddb972c25042e3ade6ec4d81c73b 100644
--- a/src/syncterm/fonts.c
+++ b/src/syncterm/fonts.c
@@ -78,6 +78,7 @@ void save_font_files(struct font_files *fonts)
 	else {
 		uifc.helpbuf="There was an error writing the INI file.\nCheck permissions and try again.\n";
 		uifc.msg("Cannot write to the .ini file!");
+		check_exit(FALSE);
 	}
 
 	strListFree(&fontnames);
@@ -238,7 +239,7 @@ void font_management(void)
 	fonts=read_font_files(&count);
 	opts[4][0]=0;
 
-	for(;;) {
+	for(;!quitting;) {
 		uifc.helpbuf=	"`Font Management`\n\n"
 						"Allows you to add and remove font files to/from the default font set.\n\n"
 						"`INS` Adds a new font.\n"
@@ -256,11 +257,12 @@ void font_management(void)
 		}
 		i=uifc.list(WIN_SAV|WIN_INS|WIN_INSACT|WIN_DEL|WIN_XTR|WIN_ACT,0,0,0,&cur,&bar,"Font Management",opt);
 		if(i==-1) {
+			check_exit(FALSE);
 			save_font_files(fonts);
 			free_font_files(fonts);
 			return;
 		}
-		for(;;) {
+		for(;!quitting;) {
 			char 	*fontmask;
 			int		show_filepick=0;
 			char	**path;
@@ -277,12 +279,15 @@ void font_management(void)
 			if(i&MSK_INS) {
 				str[0]=0;
 				uifc.helpbuf="Enter the name of the font as you want it to appear\nin menus.";
-				if(uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,0)==-1)
+				if(uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,0)==-1) {
+					check_exit(FALSE);
 					break;
+				}
 				count++;
 				tmp=(struct font_files *)realloc(fonts, sizeof(struct font_files)*(count+1));
 				if(tmp==NULL) {
 					uifc.msg("realloc() failure, cannot add font.");
+					check_exit(FALSE);
 					count--;
 					break;
 				}
@@ -303,16 +308,21 @@ void font_management(void)
 			sprintf(opts[3],"8x16  %.50s",fonts[cur].path8x16?fonts[cur].path8x16:"<undefined>");
 			opts[4][0]=0;
 			i=uifc.list(WIN_SAV|WIN_ACT|WIN_INS|WIN_INSACT|WIN_DEL|WIN_RHT|WIN_BOT,0,0,0,&fcur,&fbar,"Font Details",opt);
-			if(i==-1)
+			if(i==-1) {
+				check_exit(FALSE);
 				break;
+			}
 			switch(i) {
 				case 0:
 					SAFECOPY(str,fonts[cur].name);
 					FREE_AND_NULL(fonts[cur].name);
 					uifc.helpbuf="Enter the name of the font as you want it to appear\nin menus.";
-					uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,K_EDIT);
-					fonts[cur].name=strdup(str);
-					show_filepick=0;
+					if (uifc.input(WIN_SAV|WIN_MID,0,0,"Font Name",str,50,K_EDIT)==-1)
+						check_exit(FALSE);
+					else {
+						fonts[cur].name=strdup(str);
+						show_filepick=0;
+					}
 					break;
 				case 1:
 					sprintf(str,"8x8 %.50s",fonts[cur].name);
@@ -344,6 +354,7 @@ void font_management(void)
 				if(savbuf==NULL) {
 					uifc.helpbuf="malloc() has failed.  Available Memory is dangerously low.";
 					uifc.msg("malloc() failure.");
+					check_exit(FALSE);
 					continue;
 				}
 				gettext(1,2,ti.screenwidth,ti.screenheight-1,savbuf);
@@ -352,6 +363,8 @@ void font_management(void)
 					FREE_AND_NULL(*path);
 					*(path)=strdup(fpick.selected[0]);
 				}
+				else
+					check_exit(FALSE);
 				filepick_free(&fpick);
 				puttext(1,2,ti.screenwidth,ti.screenheight-1,savbuf);
 			}
diff --git a/src/syncterm/menu.c b/src/syncterm/menu.c
index 423887fa397672bcf32cbfd19d979344f7b1653b..49731624ef272fdeeccadb21543277fd08e02978 100644
--- a/src/syncterm/menu.c
+++ b/src/syncterm/menu.c
@@ -40,7 +40,7 @@ void viewscroll(void)
 	top=cterm->backpos;
 	gotoxy(1,1);
 	textattr(uifc.hclr|(uifc.bclr<<4)|BLINK);
-	for(i=0;!i;) {
+	for(i=0;(!i) && (!quitting);) {
 		if(top<1)
 			top=1;
 		if(top>cterm->backpos)
@@ -57,6 +57,9 @@ void viewscroll(void)
 			case 0xff:
 			case 0:
 				switch(key|getch()<<8) {
+					case CIO_KEY_QUIT:
+						check_exit(TRUE);
+						break;
 					case CIO_KEY_MOUSE:
 						getmouse(&mevent);
 						switch(mevent.event) {
@@ -85,6 +88,7 @@ void viewscroll(void)
 										"~ H ~ or ~ Page Up ~    Scrolls up one screen\n"
 										"~ L ~ or ~ Page Down ~  Scrolls down one screen\n";
 						uifc.showhelp();
+						check_exit(FALSE);
 						uifcbail();
 						drawwin();
 						break;
@@ -153,7 +157,7 @@ int syncmenu(struct bbslist *bbs, int *speed)
 		opts[1]="Disconnect ("ALT_KEY_NAMEP"-H)";
 	}
 
-	for(ret=0;!ret;) {
+	for(ret=0;(!ret) && (!quitting);) {
 		init_uifc(FALSE, !(bbs->nostatus));
 		uifc.helpbuf=	"`Online Menu`\n\n"
 						"`Scrollback`     Allows to you to view the scrollback buffer\n"
@@ -174,6 +178,7 @@ int syncmenu(struct bbslist *bbs, int *speed)
 		i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&opt,NULL,"SyncTERM Online Menu",opts);
 		switch(i) {
 			case -1:	/* Cancel */
+				check_exit(FALSE);
 				ret=1;
 				break;
 			case 0:		/* Scrollback */
@@ -198,9 +203,10 @@ int syncmenu(struct bbslist *bbs, int *speed)
 				}
 				break;
 			case 5:		/* Output rate */
-				if(bbs->conn_type==CONN_TYPE_MODEM || bbs->conn_type==CONN_TYPE_SERIAL)
+				if(bbs->conn_type==CONN_TYPE_MODEM || bbs->conn_type==CONN_TYPE_SERIAL) {
 					uifcmsg("Not supported for this connection type"
 						,"Cannot change the display rate for Modem/Serial connections.");
+				}
 				else if(speed != NULL) {
 					j=get_rate_num(*speed);
 					uifc.helpbuf="`Output Rate`\n\n"
@@ -208,6 +214,8 @@ int syncmenu(struct bbslist *bbs, int *speed)
 							"data on the screen.  This rate is a maximum, not guaranteed to be attained\n"
 							"In general, you will only use this option for ANSI animations.";
 					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,NULL,"Output Rate",rate_names);
+					if (i==-1)
+						check_exit(FALSE);
 					if(i>=0)
 						*speed = rates[i];
 				}
@@ -220,6 +228,8 @@ int syncmenu(struct bbslist *bbs, int *speed)
 						"window.  For the selected log level, messages of that level and those above\n"
 						"it will be displayed.";
 				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,NULL,"Log Level",log_levels);
+				if (i==-1)
+					check_exit(FALSE);
 				if(i>=0)
 					log_level = j;
 				ret=6;
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 2a773ba014d1807d83de157b7f76c6e884ad416d..306c99fdac13fd59d48a41c679f750c92025e59c 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -100,6 +100,7 @@ unsigned int  scrollback_cols=80;
 int	safe_mode=0;
 FILE* log_fp;
 extern ini_style_t ini_style;
+BOOL quitting=FALSE;
 
 #ifdef _WINSOCKAPI_
 
@@ -770,6 +771,19 @@ char *output_enum[]={
 	,"SDLOverlayFullscreen"
 ,NULL};
 
+BOOL check_exit(BOOL force)
+{
+	if (force || (uifc.exit_flags & UIFC_XF_QUIT)) {
+		if (settings.confirm_close) {
+			if (!confirm("Are you sure you want to exit?",NULL))
+				return false;
+		}
+		quitting=TRUE;
+		return TRUE;
+	}
+	return FALSE;
+}
+
 void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults)
 {
 	char *p1, *p2, *p3;
@@ -1506,7 +1520,7 @@ int main(int argc, char **argv)
 		return(1);
 
 	load_font_files();
-	while(bbs!=NULL || (bbs=show_bbslist(last_bbs, FALSE))!=NULL) {
+	while((!quitting) && (bbs!=NULL || (bbs=show_bbslist(last_bbs, FALSE))!=NULL)) {
     		gettextinfo(&txtinfo);	/* Current mode may have changed while in show_bbslist() */
 		FREE_AND_NULL(last_bbs);
 		if(!conn_connect(bbs)) {
@@ -1548,7 +1562,8 @@ int main(int argc, char **argv)
 				fprintf(log_fp,"%.15s Log opened\n", ctime(&now)+4);
 			}
 
-			exit_now=doterm(bbs);
+			if(doterm(bbs))
+				quitting=TRUE;
 			setvideoflags(0);
 
 			if(log_fp!=NULL) {
@@ -1568,7 +1583,7 @@ int main(int argc, char **argv)
 			}
 			settitle("SyncTERM");
 		}
-		if(exit_now || url[0]) {
+		if(quitting || url[0]) {
 			if(bbs != NULL && bbs->id==-1) {
 				if(!safe_mode) {
 					if(settings.prompt_save) {
diff --git a/src/syncterm/syncterm.h b/src/syncterm/syncterm.h
index 5e42cffce0e2d559b7c57173838d31b5ef9c2521..5aaca55d76a55a28ad1a719d46ad59b2ca96ef85 100644
--- a/src/syncterm/syncterm.h
+++ b/src/syncterm/syncterm.h
@@ -66,17 +66,20 @@ extern unsigned int   scrollback_lines;
 extern unsigned int  scrollback_mode;
 extern unsigned int  scrollback_cols;
 extern struct syncterm_settings settings;
-void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults);
+extern BOOL quitting;
 extern int default_font;
 extern char *font_names[];
 extern int safe_mode;
-char *get_syncterm_filename(char *fn, int fnlen, int type, int shared);
-void load_settings(struct syncterm_settings *set);
 extern char *output_types[];
 extern int output_map[];
 extern char *output_descrs[];
 extern char *output_enum[];
+
+void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults);
+char *get_syncterm_filename(char *fn, int fnlen, int type, int shared);
+void load_settings(struct syncterm_settings *set);
 int ciolib_to_screen(int screen);
 int screen_to_ciolib(int ciolib);
+BOOL check_exit(BOOL force);
 
 #endif
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 8b79af80d382a5846e7e463db57951a276bb6fb5..7fa7292ab841efc2a2bd8940c765f800cc4224ff 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -302,6 +302,11 @@ static BOOL zmodem_check_abort(void* vp)
 	time_t					now=time(NULL);
 	int						key;
 
+	if (quitting) {
+		zm->cancelled=TRUE;
+		zm->local_abort=TRUE;
+		return TRUE;
+	}
 	if(last_check != now) {
 		last_check=now;
 		if(zm!=NULL) {
@@ -318,6 +323,12 @@ static BOOL zmodem_check_abort(void* vp)
 						key |= (getch() << 8);
 						if(key==CIO_KEY_MOUSE)
 							getmouse(NULL);
+						if (key==CIO_KEY_QUIT) {
+							if (check_exit(FALSE)) {
+								zm->cancelled=TRUE;
+								zm->local_abort=TRUE;
+							}
+						}
 						break;
 				}
 			}
@@ -712,6 +723,7 @@ void begin_upload(struct bbslist *bbs, BOOL autozm, int lastch)
 	result=filepick(&uifc, "Upload", &fpick, bbs->uldir, NULL, UIFC_FP_ALLOWENTRY);
 	
 	if(result==-1 || fpick.files<1) {
+		check_exit(FALSE);
 		filepick_free(&fpick);
 		uifcbail();
 		puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf);
@@ -791,6 +803,9 @@ void begin_download(struct bbslist *bbs)
 	uifc.helpbuf="Select Protocol";
 	hold_update=FALSE;
 	switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Protocol",opts)) {
+		case -1:
+			check_exit(FALSE);
+			break;
 		case 0:
 			zmodem_download(bbs);
 			break;
@@ -999,6 +1014,7 @@ void guts_transfer(struct bbslist *bbs)
 			result=filepick(&uifc, "Upload", &fpick, bbs->uldir, NULL, UIFC_FP_ALLOWENTRY);
 
 			if(result==-1 || fpick.files<1) {
+				check_exit(FALSE);
 				filepick_free(&fpick);
 				uifcbail();
 				setup_mouse_events();
@@ -1125,7 +1141,10 @@ void zmodem_upload(struct bbslist *bbs, FILE *fp, char *path)
 	lprintf(LOG_NOTICE,"Hit any key to continue...");
 	if(log_fp!=NULL)
 		fflush(log_fp);
-	getch();
+	if (getch()==0) {
+		if (getch()<<8 == CIO_KEY_QUIT)
+			check_exit(FALSE);
+	}
 
 	erase_transfer_window();
 }
@@ -1160,6 +1179,13 @@ BOOL zmodem_duplicate_callback(void *cbdata, void *zm_void)
 		i=0;
 		uifc.helpbuf="Duplicate file... choose action\n";
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Duplicate File Name",opts)) {
+			case -1:
+				if (check_exit(FALSE)) {
+					ret=FALSE;
+					break;
+				}
+				loop=TRUE;
+				break;
 			case 0:	/* Overwrite */
 				sprintf(fpath,"%s/%s",cb->bbs->dldir,zm->current_file_name);
 				unlink(fpath);
@@ -1228,7 +1254,10 @@ void zmodem_download(struct bbslist *bbs)
 	lprintf(LOG_NOTICE,"Hit any key to continue...");
 	if(log_fp!=NULL)
 		fflush(log_fp);
-	getch();
+	if (getch()==0) {
+		if (getch()<<8 == CIO_KEY_QUIT)
+			check_exit(FALSE);
+	}
 
 	erase_transfer_window();
 }
@@ -1249,6 +1278,11 @@ static BOOL xmodem_check_abort(void* vp)
 	if (xm == NULL)
 		return FALSE;
 
+	if (quitting) {
+		xm->cancelled=TRUE;
+		return TRUE;
+	}
+
 	if(last_check != now) {
 		last_check=now;
 		while(kbhit()) {
@@ -1263,6 +1297,10 @@ static BOOL xmodem_check_abort(void* vp)
 					key |= (getch() << 8);
 					if(key==CIO_KEY_MOUSE)
 						getmouse(NULL);
+					if (key==CIO_KEY_QUIT) {
+						if (check_exit(FALSE))
+							xm->cancelled=TRUE;
+					}
 					break;
 			}
 		}
@@ -1503,7 +1541,10 @@ void xmodem_upload(struct bbslist *bbs, FILE *fp, char *path, long mode, int las
 	lprintf(LOG_NOTICE,"Hit any key to continue...");
 	if(log_fp!=NULL)
 		fflush(log_fp);
-	getch();
+	if (getch()==0) {
+		if (getch()<<8 == CIO_KEY_QUIT)
+			check_exit(FALSE);
+	}
 
 	erase_transfer_window();
 }
@@ -1537,6 +1578,13 @@ BOOL xmodem_duplicate(xmodem_t *xm, struct bbslist *bbs, char *path, size_t path
 		i=0;
 		uifc.helpbuf="Duplicate file... choose action\n";
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Duplicate File Name",opts)) {
+			case -1:
+				if (check_exit(FALSE)) {
+					ret=FALSE;
+					break;
+				}
+				loop=TRUE;
+				break;
 			case 0:	/* Overwrite */
 				unlink(path);
 				ret=TRUE;
@@ -1858,7 +1906,10 @@ end:
 	lprintf(LOG_NOTICE,"Hit any key to continue...");
 	if(log_fp!=NULL)
 		fflush(log_fp);
-	getch();
+	if (getch()==0) {
+		if (getch()<<8 == CIO_KEY_QUIT)
+			check_exit(FALSE);
+	}
 
 	erase_transfer_window();
 }
@@ -1904,6 +1955,8 @@ void music_control(struct bbslist *bbs)
 				"according to the ANSI spec.  Specifically ESC[|.";
 	if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"ANSI Music Setup",opts)!=-1)
 		cterm->music_enable=i;
+	else
+		check_exit(FALSE);
 	uifcbail();
 	setup_mouse_events();
 	puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf);
@@ -1934,6 +1987,7 @@ void font_control(struct bbslist *bbs)
 		case CIOLIB_MODE_ANSI:
 			uifcmsg("Not supported in this video output mode."
 				,"Font cannot be changed in the current video output mode");
+			check_exit(FALSE);
 			break;
 		default:
 			i=j=getfont();
@@ -1944,6 +1998,7 @@ void font_control(struct bbslist *bbs)
 				if(k & MSK_INS) {
 					struct file_pick fpick;
 					j=filepick(&uifc, "Load Font From File", &fpick, ".", NULL, 0);
+					check_exit(FALSE);
 
 					if(j!=-1 && fpick.files>=1)
 						loadfont(fpick.selected[0]);
@@ -1957,6 +2012,8 @@ void font_control(struct bbslist *bbs)
 						enable_xlat = TRUE;
 				}
 			}
+			else
+				check_exit(FALSE);
 		break;
 	}
 	uifcbail();
@@ -1997,11 +2054,14 @@ void capture_control(struct bbslist *bbs)
 					"Don't do that though.  :-)";
 		if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Type",opts)!=-1) {
 			j=filepick(&uifc, "Capture File", &fpick, bbs->dldir, NULL, UIFC_FP_ALLOWENTRY);
+			check_exit(FALSE);
 
 			if(j!=-1 && fpick.files>=1)
 				cterm_openlog(cterm, fpick.selected[0], i?CTERM_LOG_RAW:CTERM_LOG_ASCII);
 			filepick_free(&fpick);
 		}
+		else
+			check_exit(FALSE);
 	}
 	else {
 		if(cterm->log & CTERM_LOG_PAUSED) {
@@ -2015,6 +2075,9 @@ void capture_control(struct bbslist *bbs)
 						"~ Close ~   Closes the log\n\n";
 			if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Control",opts)!=-1) {
 				switch(i) {
+					case -1:
+						check_exit(FALSE);
+						break;
 					case 0:
 						cterm->log=cterm->log & CTERM_LOG_MASK;
 						break;
@@ -2035,6 +2098,9 @@ void capture_control(struct bbslist *bbs)
 						"~ Close ~ Closes the log\n\n";
 			if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Control",opts)!=-1) {
 				switch(i) {
+					case -1:
+						check_exit(FALSE);
+						break;
 					case 0:
 						cterm->log=cterm->log |= CTERM_LOG_PAUSED;
 						break;
@@ -2267,7 +2333,7 @@ BOOL doterm(struct bbslist *bbs)
 	/* Main input loop */
 	oldmc=hold_update;
 	showmouse();
-	for(;;) {
+	for(;!quitting;) {
 		hold_update=TRUE;
 		sleep=TRUE;
 		if(!term.nostatus)
@@ -2293,6 +2359,7 @@ BOOL doterm(struct bbslist *bbs)
 							}
 #endif
 							uifcmsg("Disconnected","`Disconnected`\n\nRemote host dropped connection");
+							check_exit(FALSE);
 							cterm_clearscreen(cterm, cterm->attr);	/* Clear screen into scrollback */
 							scrollback_lines=cterm->backpos;
 							cterm_end(cterm);
@@ -2461,20 +2528,24 @@ BOOL doterm(struct bbslist *bbs)
 		hold_update=oldmc;
 
 		/* Get local input */
-		while(kbhit()) {
+		while(quitting || kbhit()) {
 			struct mouse_event mevent;
 
 			updated=TRUE;
 			gotoxy(wherex(), wherey());
-			key=getch();
-			if(key==0 || key==0xff) {
-				key|=getch()<<8;
-				if(cterm->doorway_mode && ((key & 0xff) == 0) && key != 0x2c00 /* ALT-Z */) {
-					ch[0]=0;
-					ch[1]=key>>8;
-					conn_send(ch,2,0);
-					key=0;
-					continue;
+			if (quitting)
+				key = CIO_KEY_QUIT;
+			else {
+				key=getch();
+				if(key==0 || key==0xff) {
+					key|=getch()<<8;
+					if(cterm->doorway_mode && ((key & 0xff) == 0) && key != 0x2c00 /* ALT-Z */) {
+						ch[0]=0;
+						ch[1]=key>>8;
+						conn_send(ch,2,0);
+						key=0;
+						continue;
+					}
 				}
 			}
 
@@ -2586,24 +2657,14 @@ BOOL doterm(struct bbslist *bbs)
 						break;
 					}
 					/* FALLTHROUGH for curses/ansi modes */
-				case CIO_KEY_QUIT:
 				case 0x2d00:	/* Alt-X - Exit */
+				case CIO_KEY_QUIT:
+					if(!check_exit(TRUE))
+						break;
+					// Fallthrough
 				case 0x2300:	/* Alt-H - Hangup */
 					{
-						char *opts[3]={
-										 "Yes"
-										,"No"
-										,""
-									  };
-						char *buf;
-
-   						gettextinfo(&txtinfo);
-						buf=(char *)malloc(txtinfo.screenheight*txtinfo.screenwidth*2);
-						gettext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf);
-						i=0;
-						init_uifc(FALSE, FALSE);
-						uifc.helpbuf="Selecting Yes closes the connection\n";
-						if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Disconnect... Are you sure?",opts)==0) {
+						if(quitting || confirm("Disconnect... Are you sure?", "Selecting Yes closes the connection\n")) {
 #ifdef WITH_WXWIDGETS
 							if(html_mode != HTML_MODE_HIDDEN) {
 								hide_html();
@@ -2611,7 +2672,6 @@ BOOL doterm(struct bbslist *bbs)
 								html_mode=HTML_MODE_HIDDEN;
 							}
 #endif
-							uifcbail();
 							setup_mouse_events();
 							cterm_clearscreen(cterm,cterm->attr);	/* Clear screen into scrollback */
 							scrollback_lines=cterm->backpos;
@@ -2619,13 +2679,9 @@ BOOL doterm(struct bbslist *bbs)
 							conn_close();
 							hidemouse();
 							hold_update=oldmc;
-							free(buf);
 							return(key==0x2d00 /* Alt-X? */ || key == CIO_KEY_QUIT);
 						}
-						uifcbail();
 						setup_mouse_events();
-						puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf);
-						free(buf);
 						window(txtinfo.winleft,txtinfo.wintop,txtinfo.winright,txtinfo.winbottom);
 						textattr(txtinfo.attribute);
 						gotoxy(txtinfo.curx,txtinfo.cury);
diff --git a/src/syncterm/uifcinit.c b/src/syncterm/uifcinit.c
index ac53827bad1275e3a7c2c08d20b5ec505968bede..3b0aa5bce5dd546efe04028cf1b7cf895c582bfa 100644
--- a/src/syncterm/uifcinit.c
+++ b/src/syncterm/uifcinit.c
@@ -95,6 +95,7 @@ void uifcmsg(char *msg, char *helpbuf)
 	if(uifc_initialized) {
 		uifc.helpbuf=helpbuf;
 		uifc.msg(msg);
+		check_exit(FALSE);
 	}
 	else
 		fprintf(stderr,"%s\n",msg);
@@ -120,6 +121,7 @@ void uifcinput(char *title, int len, char *msg, int mode, char *helpbuf)
 	if(uifc_initialized) {
 		uifc.helpbuf=helpbuf;
 		uifc.input(WIN_MID|WIN_SAV, 0, 0, title, msg, len, mode);
+		check_exit(FALSE);
 	}
 	else
 		fprintf(stderr,"%s\n",msg);
@@ -150,8 +152,10 @@ int confirm(char *msg, char *helpbuf)
 	init_uifc(FALSE, FALSE);
 	if(uifc_initialized) {
 		uifc.helpbuf=helpbuf;
-		if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&copt,NULL,msg,options)!=0)
+		if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&copt,NULL,msg,options)!=0) {
+			check_exit(FALSE);
 			ret=FALSE;
+		}
 	}
 	if(!i) {
 		uifcbail();