diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index 0a32c5519c6281b627894a73187df6db41b993e2..0bc873a3d2d175cb34fb8c2bb0be4f90bfd5613a 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -27,23 +27,17 @@ struct sort_order_info {
 };
 
 struct sort_order_info sort_order[] = {
-	{
-		 "BBS Name"
+	 {
+		 NULL
+		,0
 		,0
-		,offsetof(struct bbslist, name)
-		,LIST_NAME_MAX+1
-	}
-	,{
-		 "Address"
 		,0
-		,offsetof(struct bbslist, addr)
-		,LIST_NAME_MAX+1
 	}
 	,{
-		 "Port"
+		 "BBS Name"
 		,0
-		,offsetof(struct bbslist, port)
-		,sizeof(short unsigned int)
+		,offsetof(struct bbslist, name)
+		,LIST_NAME_MAX+1
 	}
 	,{
 		 "Date Added"
@@ -63,6 +57,24 @@ struct sort_order_info sort_order[] = {
 		,offsetof(struct bbslist, calls)
 		,sizeof(unsigned int)
 	}
+	,{
+		 "Dialing List"
+		,0
+		,offsetof(struct bbslist, type)
+		,sizeof(int)
+	}
+	,{
+		 "Address"
+		,0
+		,offsetof(struct bbslist, addr)
+		,LIST_NAME_MAX+1
+	}
+	,{
+		 "Port"
+		,0
+		,offsetof(struct bbslist, port)
+		,sizeof(short unsigned int)
+	}
 	,{
 		 "Username"
 		,0
@@ -81,12 +93,6 @@ struct sort_order_info sort_order[] = {
 		,offsetof(struct bbslist, syspass)
 		,MAX_SYSPASS_LEN+1
 	}
-	,{
-		 "Dialing List"
-		,0
-		,offsetof(struct bbslist, type)
-		,sizeof(int)
-	}
 	,{
 		 "Connection Type"
 		,0
@@ -120,7 +126,7 @@ struct sort_order_info sort_order[] = {
 	,{
 		 "Upload Directory"
 		,0
-		,offsetof(struct bbslist, updir)
+		,offsetof(struct bbslist, uldir)
 		,MAX_PATH+1
 	}
 	,{
@@ -153,8 +159,16 @@ struct sort_order_info sort_order[] = {
 		,offsetof(struct bbslist, font)
 		,80
 	}
+	,{
+		 NULL
+		,0
+		,0
+		,0
+	}
 };
 
+int sortorder[sizeof(sort_order)/sizeof(struct sort_order_info)];
+
 char *sort_orders[]={"BBS Name","Address","Connection Type","Port","Date Added","Date Last Connected"};
 
 char *screen_modes[]={"Current", "80x25", "80x28", "80x43", "80x50", "80x60", "C64", "C128 (40col)", "C128 (80col)", "Atari", NULL};
@@ -286,7 +300,44 @@ int get_next_rate(int curr_rate) {
 	return(rates[i]);
 }
 
+int is_sorting(int chk)
+{
+	int i;
+
+	for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++)
+		if((abs(sortorder[i]))==chk)
+			return(1);
+	return(0);
+}
+
+int listcmp(const void *aptr, const void *bptr)
+{
+	const char *a=*(void **)(aptr);
+	const char *b=*(void **)(bptr);
+	int i;
+	int item;
+	int reverse;
+	int ret=0;
+
+	for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) {
+		item=abs(sortorder[i]);
+		reverse=(sortorder[i]<0?1:0)^(sort_order[item].reverse?1:0);
+		if(sort_order[item].name) {
+			ret=memcmp(a+sort_order[item].offset,b+sort_order[item].offset,sort_order[item].length);
+			if(ret) {
+				if(reverse)
+					ret=0-ret;
+				return(ret);
+			}
+		}
+		else {
+			return(ret);
+		}
+	}
+}
+
 void sort_list(struct bbslist **list, int *listcount)  {
+#if 0
 	struct bbslist *tmp;
 	unsigned int	i,j,swapped=1;
 
@@ -317,6 +368,124 @@ void sort_list(struct bbslist **list, int *listcount)  {
 			}
 		}
 	}
+#else
+	qsort(list, *listcount, sizeof(struct bbslist *), listcmp);
+#endif
+}
+
+void write_sortorder(void)
+{
+	char	inipath[MAX_PATH+1];
+	FILE	*inifile;
+	str_list_t	inicontents;
+	str_list_t	sortorders;
+	char	str[64];
+	int		i;
+
+	sortorders=strListInit();
+	for(i=0;sort_order[abs(sortorder[i])].name!=NULL;i++) {
+		sprintf(str,"%d",sortorder[i]);
+		strListPush(&sortorders, str);
+	}
+
+	get_syncterm_filename(inipath, sizeof(inipath), SYNCTERM_PATH_INI, FALSE);
+	if((inifile=fopen(inipath,"r"))!=NULL) {
+		inicontents=iniReadFile(inifile);
+		fclose(inifile);
+	}
+	else {
+		inicontents=strListInit();
+	}
+
+	iniSetStringList(&inicontents, "SyncTERM", "SortOrder", ",", sortorders, &ini_style);
+	if((inifile=fopen(inipath,"w"))!=NULL) {
+		iniWriteFile(inifile,inicontents);
+		fclose(inifile);
+	}
+	strListFree(&sortorders);
+	strListFree(&inicontents);
+}
+
+void edit_sorting(struct bbslist **list, int *listcount)
+{
+	char	opt[sizeof(sort_order)/sizeof(struct sort_order_info)][80];
+	char	*opts[sizeof(sort_order)/sizeof(struct sort_order_info)+1];
+	char	sopt[sizeof(sort_order)/sizeof(struct sort_order_info)][80];
+	char	*sopts[sizeof(sort_order)/sizeof(struct sort_order_info)+1];
+	int		changed=0;
+	int		curr=0,bar=0;
+	int		scurr=0,sbar=0;
+	int		ret,sret;
+	int		i,j;
+	str_list_t	sorting;
+	FILE		*inifile;
+
+	for(i=0;i<sizeof(sort_order)/sizeof(struct sort_order_info)+1;i++)
+		opts[i]=opt[i];
+	opts[i]=NULL;
+	for(i=0;i<sizeof(sort_order)/sizeof(struct sort_order_info)+1;i++)
+		sopts[i]=sopt[i];
+	sopts[i]=NULL;
+
+	for(;;) {
+		/* 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) {
+				SAFECOPY(opt[i], sort_order[abs(sortorder[i])].name);
+				if((sortorder[i]<0?1:0) ^ (sort_order[abs(sortorder[i])].reverse?1:0))
+					strcat(opt[i]," (reversed)");
+			}
+			else
+				opt[i][0]=0;
+		}
+		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 & MSK_INS) {		/* Insert sorting */
+			j=0;
+			for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) {
+				if(!is_sorting(i) && sort_order[i].name) {
+					SAFECOPY(sopt[j], sort_order[i].name);
+					j++;
+				}
+			}
+			if(j==0) {
+				uifc.helpbuf=	"All sort orders are present in the list.";
+				uifc.msg("No more sort orders.");
+			}
+			else {
+				sopt[j][0]=0;
+				sret=uifc.list(WIN_SAV|WIN_BOT|WIN_RHT
+							,0,0,0,&scurr,&sbar,"Sort Field",sopts);
+				if(sret>=0) {
+					/* Insert into array */
+					memmove(&(sortorder[ret&MSK_OFF])+1,&(sortorder[(ret&MSK_OFF)]),sizeof(sortorder)-sizeof(sortorder[0])*((ret&MSK_OFF)+1));
+					j=0;
+					for(i=0; i<sizeof(sort_order)/sizeof(struct sort_order_info); i++) {
+						if(!is_sorting(i) && sort_order[i].name) {
+							if(j==sret) {
+								sortorder[ret&MSK_OFF]=i;
+								break;
+							}
+							j++;
+						}
+					}
+					changed=1;
+				}
+			}
+		}
+		else if(ret & MSK_DEL) {		/* Delete criteria */
+			memmove(&(sortorder[ret&MSK_OFF]),&(sortorder[(ret&MSK_OFF)])+1,sizeof(sortorder)-sizeof(sortorder[0])*((ret&MSK_OFF)+1));
+		}
+		else {
+			sortorder[ret&MSK_OFF]=0-sortorder[ret&MSK_OFF];
+		}
+	}
+
+	/* Write back to the .ini file */
+	write_sortorder();
+	sort_list(list, listcount);
 }
 
 void free_list(struct bbslist **list, int listcount)
@@ -328,44 +497,80 @@ void free_list(struct bbslist **list, int listcount)
 	}
 }
 
-void read_item(FILE *listfile, struct bbslist *entry, char *bbsname, int id, int type)
+void read_item(str_list_t listfile, struct bbslist *entry, char *bbsname, int id, int type)
 {
 	BOOL	dumb;
 	char	home[MAX_PATH+1];
 
 	get_syncterm_filename(home, sizeof(home), SYNCTERM_DEFAULT_TRANSFER_PATH, FALSE);
-	if(bbsname != NULL)
+	if(bbsname != NULL) {
+#if 0
+		switch(type) {
+			case USER_BBSLIST:
+				SAFECOPY(entry->name,bbsname);
+				break;
+			case SYSTEM_BBSLIST:
+				sprintf(entry->name,"[%.*s]",sizeof(entry->name)-3,bbsname);
+				break;
+		}
+#else
 		SAFECOPY(entry->name,bbsname);
-	iniReadString(listfile,bbsname,"Address","",entry->addr);
-	entry->conn_type=iniReadEnum(listfile,bbsname,"ConnectionType",conn_types,CONN_TYPE_RLOGIN);
-	entry->port=iniReadShortInt(listfile,bbsname,"Port",conn_ports[entry->conn_type]);
-	entry->added=iniReadDateTime(listfile,bbsname,"Added",0);
-	entry->connected=iniReadDateTime(listfile,bbsname,"LastConnected",0);
-	entry->calls=iniReadInteger(listfile,bbsname,"TotalCalls",0);
-	iniReadString(listfile,bbsname,"UserName","",entry->user);
-	iniReadString(listfile,bbsname,"Password","",entry->password);
-	iniReadString(listfile,bbsname,"SystemPassword","",entry->syspass);
-	dumb=iniReadBool(listfile,bbsname,"BeDumb",0);
+#endif
+	}
+	iniGetString(listfile,bbsname,"Address","",entry->addr);
+	entry->conn_type=iniGetEnum(listfile,bbsname,"ConnectionType",conn_types,CONN_TYPE_RLOGIN);
+	entry->port=iniGetShortInt(listfile,bbsname,"Port",conn_ports[entry->conn_type]);
+	entry->added=iniGetDateTime(listfile,bbsname,"Added",0);
+	entry->connected=iniGetDateTime(listfile,bbsname,"LastConnected",0);
+	entry->calls=iniGetInteger(listfile,bbsname,"TotalCalls",0);
+	iniGetString(listfile,bbsname,"UserName","",entry->user);
+	iniGetString(listfile,bbsname,"Password","",entry->password);
+	iniGetString(listfile,bbsname,"SystemPassword","",entry->syspass);
+	dumb=iniGetBool(listfile,bbsname,"BeDumb",0);
 	if(dumb)
 		entry->conn_type=CONN_TYPE_RAW;
-	entry->reversed=iniReadBool(listfile,bbsname,"Reversed",0);
-	entry->screen_mode=iniReadEnum(listfile,bbsname,"ScreenMode",screen_modes,SCREEN_MODE_CURRENT);
-	entry->nostatus=iniReadBool(listfile,bbsname,"NoStatus",0);
-	iniReadString(listfile,bbsname,"DownloadPath",home,entry->dldir);
-	iniReadString(listfile,bbsname,"UploadPath",home,entry->uldir);
+	entry->reversed=iniGetBool(listfile,bbsname,"Reversed",0);
+	entry->screen_mode=iniGetEnum(listfile,bbsname,"ScreenMode",screen_modes,SCREEN_MODE_CURRENT);
+	entry->nostatus=iniGetBool(listfile,bbsname,"NoStatus",0);
+	iniGetString(listfile,bbsname,"DownloadPath",home,entry->dldir);
+	iniGetString(listfile,bbsname,"UploadPath",home,entry->uldir);
 
 	/* Log Stuff */
-	iniReadString(listfile,bbsname,"LogFile","",entry->logfile);
-	entry->xfer_loglevel=iniReadEnum(listfile,bbsname,"TransferLogLevel",log_levels,LOG_INFO);
-	entry->telnet_loglevel=iniReadEnum(listfile,bbsname,"TelnetLogLevel",log_levels,LOG_INFO);
+	iniGetString(listfile,bbsname,"LogFile","",entry->logfile);
+	entry->xfer_loglevel=iniGetEnum(listfile,bbsname,"TransferLogLevel",log_levels,LOG_INFO);
+	entry->telnet_loglevel=iniGetEnum(listfile,bbsname,"TelnetLogLevel",log_levels,LOG_INFO);
 
-	entry->bpsrate=iniReadInteger(listfile,bbsname,"BPSRate",0);
-	entry->music=iniReadInteger(listfile,bbsname,"ANSIMusic",CTERM_MUSIC_BANSI);
-	iniReadString(listfile,bbsname,"Font","Codepage 437 English",entry->font);
+	entry->bpsrate=iniGetInteger(listfile,bbsname,"BPSRate",0);
+	entry->music=iniGetInteger(listfile,bbsname,"ANSIMusic",CTERM_MUSIC_BANSI);
+	iniGetString(listfile,bbsname,"Font","Codepage 437 English",entry->font);
 	entry->type=type;
 	entry->id=id;
 }
 
+/*
+ * Checks if bbsname already is listed in list
+ * setting *pos to the position if not NULL.
+ * optionally only if the entry is a user list
+ * entry
+ */
+int list_name_check(struct bbslist **list, char *bbsname, int *pos, int useronly)
+{
+	int i;
+
+	if(list==NULL)
+		return(0);
+	for(i=0; list[i]!=NULL; i++) {
+		if(useronly && list[i]->type != USER_BBSLIST)
+			continue;
+		if(strcmp(list[i]->name,bbsname)==0) {
+			if(pos)
+				*pos=i;
+			return(1);
+		}
+	}
+	return(0);
+}
+
 /*
  * Reads in a BBS list from listpath using *i as the counter into bbslist
  * first BBS read goes into list[i]
@@ -375,23 +580,28 @@ void read_list(char *listpath, struct bbslist **list, struct bbslist *defaults,
 	FILE	*listfile;
 	char	*bbsname;
 	str_list_t	bbses;
+	str_list_t	inilines;
 
 	if((listfile=fopen(listpath,"r"))!=NULL) {
+		inilines=iniReadFile(listfile);
+		fclose(listfile);
 		if(defaults != NULL)
-			read_item(listfile,defaults,NULL,-1,type);
-		bbses=iniReadSectionList(listfile,NULL);
-		while((bbsname=strListPop(&bbses))!=NULL) {
-			if((list[*i]=(struct bbslist *)malloc(sizeof(struct bbslist)))==NULL)
-				break;
-			read_item(listfile,list[*i],bbsname,*i,type);
-			(*i)++;
+			read_item(inilines,defaults,NULL,-1,type);
+		bbses=iniGetSectionList(inilines,NULL);
+		while((bbsname=strListRemove(&bbses,0))!=NULL) {
+			if(!list_name_check(list, bbsname, NULL, FALSE)) {
+				if((list[*i]=(struct bbslist *)malloc(sizeof(struct bbslist)))==NULL)
+					break;
+				read_item(inilines,list[*i],bbsname,*i,type);
+				(*i)++;
+			}
 		}
-		fclose(listfile);
-		strListFreeStrings(bbses);
+		strListFree(&bbses);
+		strListFree(&inilines);
 	}
 	else {
 		if(defaults != NULL && type==USER_BBSLIST)
-			read_item(listfile,defaults,NULL,-1,type);
+			read_item(NULL,defaults,NULL,-1,type);
 	}
 
 #if 0	/* This isn't necessary (NULL is a sufficient) */
@@ -400,7 +610,7 @@ void read_list(char *listpath, struct bbslist **list, struct bbslist *defaults,
 #endif
 }
 
-int edit_list(struct bbslist *item,char *listpath,int isdefault)
+int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isdefault)
 {
 	char	opt[18][80];	/* <- Beware of magic number! */
 	char	*opts[19];		/* <- Beware of magic number! */
@@ -486,14 +696,23 @@ int edit_list(struct bbslist *item,char *listpath,int isdefault)
 						fclose(listfile);
 					}
 				}
-				strListFreeStrings(inifile);
+				strListFree(&inifile);
 				return(changed);
 			case 0:
 				uifc.helpbuf=	"`BBS Name`\n\n"
 								"Enter the BBS name as it is to appear in the list.";
 				strcpy(tmp,itemname);
 				uifc.input(WIN_MID|WIN_SAV,0,0,"BBS Name",itemname,LIST_NAME_MAX,K_EDIT);
-				iniRenameSection(&inifile,tmp,itemname);
+				if(strcmp(tmp,itemname) && list_name_check(list, itemname, NULL, FALSE)) {
+					uifc.helpbuf=	"`BBS Already Exists`\n\n"
+									"A BBS with that name already exists in the list.\n"
+									"Please choose a unique BBS name.\n";
+					uifc.msg("BBS Already Exists!");
+					strcpy(itemname,tmp);
+				}
+				else {
+					iniRenameSection(&inifile,tmp,itemname);
+				}
 				break;
 			case 1:
 				uifc.helpbuf=	"`Address`\n\n"
@@ -762,7 +981,7 @@ void add_bbs(char *listpath, struct bbslist *bbs)
 		iniWriteFile(listfile,inifile);
 		fclose(listfile);
 	}
-	strListFreeStrings(inifile);
+	strListFree(&inifile);
 }
 
 void del_bbs(char *listpath, struct bbslist *bbs)
@@ -780,7 +999,7 @@ void del_bbs(char *listpath, struct bbslist *bbs)
 			iniWriteFile(listfile,inifile);
 			fclose(listfile);
 		}
-		strListFreeStrings(inifile);
+		strListFree(&inifile);
 	}
 }
 
@@ -1053,6 +1272,7 @@ struct bbslist *show_bbslist(int mode)
 								"Commands:\n\n"
 								"~ CTRL-D ~ Quick-dial a URL\n"
 								"~ CTRL-E ~ to edit the selected entry\n"
+								"~ CTRL-S ~ to modify the sort order\n"
 								" ~ ENTER ~ to dial the selected entry";
 				if(opt != oldopt) {
 					if(list[opt]!=NULL && list[opt]->name[0]) {
@@ -1068,12 +1288,15 @@ struct bbslist *show_bbslist(int mode)
 				oldopt=opt;
 				val=uifc.list((listcount<MAX_OPTS?WIN_XTR:0)
 					|WIN_ACT|WIN_INSACT|WIN_DELACT|WIN_UNGETMOUSE
-					|WIN_T2B|WIN_INS|WIN_DEL|WIN_EDIT|WIN_EXTKEYS|WIN_DYN
+					|WIN_T2B|WIN_INS|WIN_DEL|WIN_EDIT|WIN_EXTKEYS|WIN_DYN|WIN_HLP
 					,0,0,0,&opt,&bar,mode==BBSLIST_SELECT?"Directory":"Edit",(char **)list);
 				if(val==listcount)
 					val=listcount|MSK_INS;
 				if(val<0) {
 					switch(val) {
+						case -2-0x13:	/* CTRL-S - Sort */
+							edit_sorting(list,&listcount);
+							break;
 						case -2-0x3000:	/* ALT-B - Scrollback */
 							viewofflinescroll();
 							break;
@@ -1084,14 +1307,14 @@ struct bbslist *show_bbslist(int mode)
 						case -2-0x4d00:	/* Right Arrow */
 						case -11:		/* TAB */
 							uifc.list((listcount<MAX_OPTS?WIN_XTR:0)
-								|WIN_T2B|WIN_IMM|WIN_INACT
+								|WIN_T2B|WIN_IMM|WIN_INACT|WIN_HLP
 								,0,0,0,&opt,&bar,mode==BBSLIST_SELECT?"Directory":"Edit",(char **)list);
 							at_settings=!at_settings;
 							break;
 						case -7:		/* CTRL-E */
 							if(list[opt]) {
 								i=list[opt]->id;
-								if(edit_list(list[opt],listpath,FALSE)) {
+								if(edit_list(list, list[opt],listpath,FALSE)) {
 									load_bbslist(list, sizeof(list), &defaults, listpath, sizeof(listpath), shared_list, sizeof(shared_list), &listcount);
 									for(j=0;list[j]!=NULL && list[j]->name[0];j++) {
 										if(list[j]->id==i)
@@ -1121,6 +1344,8 @@ struct bbslist *show_bbslist(int mode)
 					}
 				}
 				else if(val&MSK_ON) {
+					char tmp[LIST_NAME_MAX+1];
+				
 					switch(val&MSK_ON) {
 						case MSK_INS:
 							if(listcount>=MAX_OPTS) {
@@ -1137,22 +1362,32 @@ struct bbslist *show_bbslist(int mode)
 								uifc.msg("Cannot edit list in safe mode");
 								break;
 							}
+							tmp[0]=0;
+							uifc.changes=0;
+							uifc.helpbuf=	"`BBS Name`\n\n"
+											"Enter the BBS name as it is to appear in the list.";
+							uifc.input(WIN_MID|WIN_SAV,0,0,"BBS Name",tmp,LIST_NAME_MAX,K_EDIT);
+							if(!uifc.changes)
+								break;
+							if(list_name_check(list, tmp, NULL, FALSE)) {
+								uifc.helpbuf=	"`BBS Already Exists`\n\n"
+												"A BBS with that name already exists in the list.\n"
+												"Please choose a unique BBS name.\n";
+								uifc.msg("BBS Already Exists!");
+								break;
+							}
 							listcount++;
 							list[listcount]=list[listcount-1];
 							list[listcount-1]=(struct bbslist *)malloc(sizeof(struct bbslist));
 							memcpy(list[listcount-1],&defaults,sizeof(struct bbslist));
 							list[listcount-1]->id=listcount-1;
-							uifc.changes=0;
-							uifc.helpbuf=	"`BBS Name`\n\n"
-											"Enter the BBS name as it is to appear in the list.";
+							strcpy(list[listcount-1]->name,tmp);
 							uifc.input(WIN_MID|WIN_SAV,0,0,"BBS Name",list[listcount-1]->name,LIST_NAME_MAX,K_EDIT);
-							if(uifc.changes) {
-								uifc.changes=0;
-								uifc.helpbuf=	"`Address`\n\n"
-												"Enter the domain name of the system to connect to ie:\n"
-												"nix.synchro.net";
-								uifc.input(WIN_MID|WIN_SAV,0,0,"Address",list[listcount-1]->addr,LIST_ADDR_MAX,K_EDIT);
-							}
+							uifc.changes=0;
+							uifc.helpbuf=	"`Address`\n\n"
+											"Enter the domain name of the system to connect to ie:\n"
+											"nix.synchro.net";
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Address",list[listcount-1]->addr,LIST_ADDR_MAX,K_EDIT);
 							if(!uifc.changes) {
 								FREE_AND_NULL(list[listcount-1]);
 								list[listcount-1]=list[listcount];
@@ -1214,7 +1449,7 @@ struct bbslist *show_bbslist(int mode)
 								break;
 							}
 							i=list[opt]->id;
-							if(edit_list(list[opt],listpath,FALSE)) {
+							if(edit_list(list, list[opt],listpath,FALSE)) {
 								load_bbslist(list, sizeof(list), &defaults, listpath, sizeof(listpath), shared_list, sizeof(shared_list), &listcount);
 								for(j=0;list[j]!=NULL && list[j]->name[0];j++) {
 									if(list[j]->id==i)
@@ -1235,7 +1470,7 @@ struct bbslist *show_bbslist(int mode)
 							break;
 						}
 						i=list[opt]->id;
-						if(edit_list(list[opt],listpath,FALSE)) {
+						if(edit_list(list, list[opt],listpath,FALSE)) {
 							load_bbslist(list, sizeof(list), &defaults, listpath, sizeof(listpath), shared_list, sizeof(shared_list), &listcount);
 							for(j=0;list[j]!=NULL && list[j]->name[0];j++) {
 								if(list[j]->id==i)
@@ -1290,7 +1525,7 @@ struct bbslist *show_bbslist(int mode)
 						free_list(&list[0],listcount);
 						return(NULL);
 					case 0:			/* Edit default connection settings */
-						edit_list(&defaults,listpath,TRUE);
+						edit_list(NULL, &defaults,listpath,TRUE);
 						break;
 					case 1:			/* Mouse Actions setup */
 						uifc.helpbuf=	"Mouse actions are not yet user conifurable."
@@ -1356,7 +1591,7 @@ struct bbslist *show_bbslist(int mode)
 								init_uifc(TRUE, TRUE);
 							}
 							uifc.list((listcount<MAX_OPTS?WIN_XTR:0)
-								|WIN_T2B|WIN_IMM|WIN_INACT
+								|WIN_T2B|WIN_IMM|WIN_INACT|WIN_HLP
 								,0,0,0,&opt,&bar,mode==BBSLIST_SELECT?"Directory":"Edit",(char **)list);
 						}
 						break;
diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h
index 996b6e2d4352fa408dbce2f339da42d392262211..2919c92d606c1e8e596e27bf6909a87b72affc34 100644
--- a/src/syncterm/bbslist.h
+++ b/src/syncterm/bbslist.h
@@ -74,8 +74,9 @@ struct bbslist *show_bbslist(int mode);
 extern char *log_levels[];
 extern char *rate_names[];
 extern int rates[];
+extern int sortorder[];
 extern ini_style_t ini_style;
-void read_item(FILE *listfile, struct bbslist *entry, char *bbsname, int id, int type);
+void read_item(str_list_t listfile, struct bbslist *entry, char *bbsname, int id, int type);
 void read_list(char *listpath, struct bbslist **list, struct bbslist *defaults, int *i, int type);
 void free_list(struct bbslist **list, int listcount);
 void add_bbs(char *listpath, struct bbslist *bbs);
diff --git a/src/syncterm/fonts.c b/src/syncterm/fonts.c
index 54b8f1abf7c26e3c9ebe5edaf1beab6e24fd5731..b987c1f17a1b17681a34b91600291b5c5dd4ccd1 100644
--- a/src/syncterm/fonts.c
+++ b/src/syncterm/fonts.c
@@ -78,8 +78,8 @@ void save_font_files(struct font_files *fonts)
 		uifc.msg("Cannot write to the .ini file!");
 	}
 
-	strListFreeStrings(fontnames);
-	strListFreeStrings(ini_file);
+	strListFree(&fontnames);
+	strListFree(&ini_file);
 }
 
 struct font_files *read_font_files(int *count)
@@ -118,7 +118,7 @@ struct font_files *read_font_files(int *count)
 			ret[*count-1].path8x16=strdup(fontpath);
 	}
 	fclose(inifile);
-	strListFreeStrings(fonts);
+	strListFree(&fonts);
 	return(ret);
 }
 
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index e628c164d0ffe4646e9458518b19ec9e4797de2c..2d14230838b11f6d45a7c5d44a9ec5b4755094c9 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -966,6 +966,9 @@ void load_settings(struct syncterm_settings *set)
 {
 	FILE	*inifile;
 	char	inipath[MAX_PATH+1];
+	int		i=0;
+	str_list_t	sortby;
+	char	*order;
 
 	get_syncterm_filename(inipath, sizeof(inipath), SYNCTERM_PATH_INI, FALSE);
 	inifile=fopen(inipath,"r");
@@ -977,6 +980,14 @@ void load_settings(struct syncterm_settings *set)
 	/* Modem settings */
 	iniReadString(inifile, "SyncTERM", "ModemInit", "AT&F", set->mdm.init_string);
 	iniReadString(inifile, "SyncTERM", "ModemDevice", DEFAULT_MODEM_DEV, set->mdm.device_name);
+
+	/* Sort order */
+	sortby=iniReadStringList(inifile, "SyncTERM", "SortOrder", ",", "5,1");
+	while((order=strListRemove(&sortby,0))!=NULL) {
+		sortorder[i++]=atoi(order);
+	}
+	strListFree(&sortby);
+
 	if(inifile)
 		fclose(inifile);
 }
@@ -1150,9 +1161,12 @@ int main(int argc, char **argv)
 		if((listfile=fopen(listpath,"r"))==NULL)
 			parse_url(url, bbs, conn_type, TRUE);
 		else {
-			read_item(listfile, bbs, NULL, 0, USER_BBSLIST);
-			parse_url(url, bbs, conn_type, FALSE);
+			str_list_t	inilines;
+			inilines=iniReadFile(listfile);
 			fclose(listfile);
+			read_item(inilines, bbs, NULL, 0, USER_BBSLIST);
+			parse_url(url, bbs, conn_type, FALSE);
+			strListFree(&inilines);
 		}
 		if(bbs->port==0)
 			goto USAGE;
@@ -1183,7 +1197,7 @@ int main(int argc, char **argv)
 						iniWriteFile(listfile,inifile);
 						fclose(listfile);
 					}
-					strListFreeStrings(inifile);
+					strListFree(&inifile);
 				}
 			}
 			uifcbail();