diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index 5cecc40893ce45fe416e7443d3870eb6f114fa29..17eabda21a3837b76b90ea5c8488cf7840ecdabd 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 
 #include <dirwrap.h>
+#include <ini_file.h>
 #include <uifc.h>
 
 #include "bbslist.h"
@@ -12,20 +13,6 @@ enum {
 	,SYSTEM_BBSLIST
 };
 
-struct bbslist_file {
-	char			name[LIST_NAME_MAX+1];
-	char			addr[LIST_ADDR_MAX+1];
-	short unsigned int port;
-	time_t			added;
-	time_t			connected;
-	unsigned int	calls;
-	char			user[MAX_USER_LEN+1];
-	char			password[MAX_PASSWD_LEN+1];
-	int				dumb;
-	int				reversed;
-	char			padding[256];
-};
-
 void sort_list(struct bbslist **list)  {
 	struct bbslist *tmp;
 	unsigned int	i,swapped=1;
@@ -44,49 +31,6 @@ void sort_list(struct bbslist **list)  {
 	}
 }
 
-void write_list(struct bbslist **list)
-{
-	char	*home;
-	char	listpath[MAX_PATH+1];
-	FILE	*listfile;
-	int		i;
-	struct bbslist_file bbs;
-	char	str[MAX_PATH+1];
-
-	home=getenv("HOME");
-	if(home==NULL)
-		getcwd(listpath,sizeof(listpath));
-	else
-		strcpy(listpath,home);
-	strncat(listpath,"/",sizeof(listpath));
-	strncat(listpath,"syncterm.lst",sizeof(listpath));
-	if(strlen(listpath)>MAX_PATH) {
-		fprintf(stderr,"Path to syncterm.lst too long");
-		return;
-	}
-	if((listfile=fopen(listpath,"wb"))!=NULL) {
-		for(i=0;list[i]->name[0];i++) {
-			strcpy(bbs.name,list[i]->name);
-			strcpy(bbs.addr,list[i]->addr);
-			bbs.port=list[i]->port;
-			bbs.added=list[i]->added;
-			bbs.connected=list[i]->connected;
-			bbs.calls=list[i]->calls;
-			bbs.dumb=list[i]->dumb;
-			strcpy(bbs.user,list[i]->user);
-			strcpy(bbs.password,list[i]->password);
-			fwrite(&bbs,sizeof(bbs),1,listfile);
-		}
-		fclose(listfile);
-	}
-	else {
-		uifc.helpbuf=	"`Can't save list`\n\n"
-						"The system is unable to save your dialing list\n";
-		sprintf(str,"Can't save list to %.*s",MAX_PATH-20,listpath);
-		uifc.msg(str);
-	}
-}
-
 /*
  * Reads in a BBS list from listpath using *i as the counter into bbslist
  * first BBS read goes into list[i]
@@ -94,37 +38,45 @@ void write_list(struct bbslist **list)
 void read_list(char *listpath, struct bbslist **list, int *i, int type)
 {
 	FILE	*listfile;
-	struct	bbslist_file	bbs;
+	char	*bbsname;
+	str_list_t	bbses;
+
 	if((listfile=fopen(listpath,"r"))!=NULL) {
-		while(*i<MAX_OPTS && fread(&bbs,sizeof(bbs),1,listfile)) {
+		bbses=iniGetSectionList(listfile,NULL);
+		while((bbsname=strListPop(&bbses))!=NULL) {
 			if((list[*i]=(struct bbslist *)malloc(sizeof(struct bbslist)))==NULL)
 				break;
-			strcpy(list[*i]->name,bbs.name);
-			strcpy(list[*i]->addr,bbs.addr);
-			list[*i]->port=bbs.port;
-			list[*i]->added=bbs.added;
-			list[*i]->connected=bbs.connected;
-			list[*i]->calls=bbs.calls;
-			strcpy(list[*i]->user,bbs.user);
-			strcpy(list[*i]->password,bbs.password);
-			list[*i]->dumb=bbs.dumb;
+			strcpy(list[*i]->name,bbsname);
+			iniGetString(listfile,bbsname,"Address","",list[*i]->addr);
+			list[*i]->port=iniGetShortInt(listfile,bbsname,"Port",513);
+			list[*i]->added=iniGetInteger(listfile,bbsname,"Added",0);
+			list[*i]->connected=iniGetInteger(listfile,bbsname,"LastConnected",0);
+			list[*i]->calls=iniGetInteger(listfile,bbsname,"TotalCalls",0);
+			iniGetString(listfile,bbsname,"UserName","",list[*i]->user);
+			iniGetString(listfile,bbsname,"Password","",list[*i]->password);
+			list[*i]->dumb=iniGetBool(listfile,bbsname,"BeDumb",0);
+			list[*i]->reversed=iniGetBool(listfile,bbsname,"Reversed",0);
 			list[*i]->type=type;
 			list[*i]->id=(*i)++;
 		}
 		fclose(listfile);
+		strListFreeStrings(bbses);
 	}
 
 	/* Add terminator */
 	list[*i]=(struct bbslist *)"";
 }
 
-int edit_list(struct bbslist *item)
+int edit_list(struct bbslist *item,char *listpath)
 {
 	char	opt[8][80];
 	char	*opts[8];
 	int		changed=0;
 	int		copt=0,i,j;
 	char	str[6];
+	FILE *listfile;
+	str_list_t	inifile;
+	char	tmp[LIST_NAME_MAX+1];
 
 	for(i=0;i<8;i++)
 		opts[i]=opt[i];
@@ -138,6 +90,12 @@ int edit_list(struct bbslist *item)
 		return(0);
 	}
 	opt[7][0]=0;
+	if((listfile=fopen(listpath,"r"))!=NULL) {
+		inifile=iniReadFile(listfile);
+		fclose(listfile);
+	}
+	else
+		return(0);
 	for(;;) {
 		sprintf(opt[0],"BBS Name:       %s",item->name);
 		sprintf(opt[1],"RLogin Address: %s",item->addr);
@@ -152,17 +110,25 @@ int edit_list(struct bbslist *item)
 						"Select item to edit.";
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&copt,NULL,"Edit Entry",opts)) {
 			case -1:
+				if((listfile=fopen(listpath,"w"))!=NULL) {
+					iniWriteFile(listfile,inifile);
+					fclose(listfile);
+				}
+				strListFreeStrings(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,item->name);
 				uifc.input(WIN_MID|WIN_SAV,0,0,"BBS Name",item->name,LIST_NAME_MAX,K_EDIT);
+				iniRenameSection(&inifile,tmp,item->name);
 				break;
 			case 1:
 				uifc.helpbuf=	"`RLogin 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,"RLogin Address",item->addr,LIST_ADDR_MAX,K_EDIT);
+				iniSetString(&inifile,item->name,"Address",item->addr,NULL);
 				break;
 			case 2:
 				i=item->port;
@@ -179,6 +145,7 @@ int edit_list(struct bbslist *item)
 				if(j<1 || j>65535)
 					j=513;
 				item->port=j;
+				iniSetShortInt(&inifile,item->name,"Port",item->port,NULL);
 				if(i!=j)
 					uifc.changes=1;
 				else
@@ -188,19 +155,23 @@ int edit_list(struct bbslist *item)
 				uifc.helpbuf=	"`Username`\n\n"
 								"Enter the username to attempt auto-login to the remote with.";
 				uifc.input(WIN_MID|WIN_SAV,0,0,"Username",item->user,MAX_USER_LEN,K_EDIT);
+				iniSetString(&inifile,item->name,"UserName",item->user,NULL);
 				break;
 			case 4:
 				uifc.helpbuf=	"`Password`\n\n"
 								"Enter your password for auto-login.";
 				uifc.input(WIN_MID|WIN_SAV,0,0,"Password",item->password,MAX_PASSWD_LEN,K_EDIT);
+				iniSetString(&inifile,item->name,"Password",item->password,NULL);
 				break;
 			case 5:
 				item->dumb=!item->dumb;
 				changed=1;
+				iniSetBool(&inifile,item->name,"BeDumb",item->dumb,NULL);
 				break;
 			case 6:
 				item->reversed=!item->reversed;
 				changed=1;
+				iniSetBool(&inifile,item->name,"Reversed",item->reversed,NULL);
 				break;
 		}
 		if(uifc.changes)
@@ -208,11 +179,60 @@ int edit_list(struct bbslist *item)
 	}
 }
 
+void add_bbs(char *listpath, struct bbslist *bbs)
+{
+	FILE *listfile;
+	str_list_t	inifile;
+
+	if((listfile=fopen(listpath,"r"))!=NULL) {
+		inifile=iniReadFile(listfile);
+		fclose(listfile);
+	}
+	else {
+		inifile=strListInit();
+	}
+	/* 
+	 * Redundant:
+	 * iniAddSection(&inifile,bbs->name,NULL);
+	 */
+	iniSetString(&inifile,bbs->name,"Address",bbs->addr,NULL);
+	iniSetShortInt(&inifile,bbs->name,"Port",bbs->port,NULL);
+	iniSetInteger(&inifile,bbs->name,"Added",bbs->added,NULL);
+	iniSetInteger(&inifile,bbs->name,"LastConnected",bbs->connected,NULL);
+	iniSetInteger(&inifile,bbs->name,"TotalCalls",bbs->calls,NULL);
+	iniSetString(&inifile,bbs->name,"UserName",bbs->user,NULL);
+	iniSetString(&inifile,bbs->name,"Password",bbs->password,NULL);
+	iniSetBool(&inifile,bbs->name,"BeDumb",bbs->dumb,NULL);
+	iniSetBool(&inifile,bbs->name,"Reversed",bbs->reversed,NULL);
+	if((listfile=fopen(listpath,"w"))!=NULL) {
+		iniWriteFile(listfile,inifile);
+		fclose(listfile);
+	}
+	strListFreeStrings(inifile);
+}
+
+void del_bbs(char *listpath, struct bbslist *bbs)
+{
+	FILE *listfile;
+	str_list_t	inifile;
+
+	if((listfile=fopen(listpath,"r"))!=NULL) {
+		inifile=iniReadFile(listfile);
+		fclose(listfile);
+		iniRemoveSection(&inifile,bbs->name);
+		if((listfile=fopen(listpath,"w"))!=NULL) {
+			iniWriteFile(listfile,inifile);
+			fclose(listfile);
+		}
+		strListFreeStrings(inifile);
+	}
+}
+
 /*
  * Displays the BBS list and allows edits to user BBS list
  * Mode is one of BBSLIST_SELECT or BBSLIST_EDIT
  */
-struct bbslist *show_bbslist(int mode)
+struct bbslist *show_bbslist(int mode, char *path)
 {
 	char	*home;
 	char	listpath[MAX_PATH+1];
@@ -231,11 +251,12 @@ struct bbslist *show_bbslist(int mode)
 	/* User BBS list */
 	home=getenv("HOME");
 	if(home==NULL)
-		getcwd(listpath,sizeof(listpath));
+		home=getenv("USERPROFILE");
+	if(home==NULL)
+		strcpy(listpath,path);
 	else
 		strcpy(listpath,home);
-	strncat(listpath,"/",sizeof(listpath));
-	strncat(listpath,"syncterm.lst",sizeof(listpath));
+	strncat(listpath,"/syncterm.lst",sizeof(listpath));
 	if(strlen(listpath)>MAX_PATH) {
 		fprintf(stderr,"Path to syncterm.lst too long");
 		return(NULL);
@@ -351,7 +372,7 @@ struct bbslist *show_bbslist(int mode)
 							if(list[j]->id==listcount-1)
 								opt=j;
 						}
-						write_list(list);
+						add_bbs(listpath,list[listcount-1]);
 					}
 					break;
 				case MSK_DEL:
@@ -371,6 +392,7 @@ struct bbslist *show_bbslist(int mode)
 						uifc.msg("It's gone, calm down man!");
 						break;
 					}
+					del_bbs(listpath,list[opt]);
 					free(list[opt]);
 					for(i=opt;list[i]->name[0];i++) {
 						list[i]=list[i+1];
@@ -378,7 +400,6 @@ struct bbslist *show_bbslist(int mode)
 					for(i=0;list[i]->name[0];i++) {
 						list[i]->id=i;
 					}
-					write_list(list);
 					listcount--;
 					break;
 			}
@@ -386,9 +407,8 @@ struct bbslist *show_bbslist(int mode)
 		else {
 			if(mode==BBSLIST_EDIT) {
 				i=list[opt]->id;
-				if(edit_list(list[opt])) {
+				if(edit_list(list[opt],listpath)) {
 					sort_list(list);
-					write_list(list);
 					for(j=0;list[j]->name[0];j++) {
 						if(list[j]->id==i)
 							opt=j;
diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h
index 626c155ba96771131e46d1db88ee92852c1d14f6..61e899864beaa85eb368faf3d7f5a98795a9a4cb 100644
--- a/src/syncterm/bbslist.h
+++ b/src/syncterm/bbslist.h
@@ -28,6 +28,6 @@ struct bbslist {
 	int				reversed;
 };
 
-struct bbslist *show_bbslist(int mode);
+struct bbslist *show_bbslist(int mode,char *path);
 
 #endif
diff --git a/src/syncterm/objects.mk b/src/syncterm/objects.mk
index 9caf64fbad64093d7ac770d25045fa3448d8e496..7f2c7f7cbfecc6bcf1560bff60d7cc5c37ded5f8 100644
--- a/src/syncterm/objects.mk
+++ b/src/syncterm/objects.mk
@@ -3,8 +3,11 @@ OBJS	:=	${LIBODIR}/syncterm.${OFILE} \
 			${LIBODIR}/uifcinit.${OFILE} \
 			${LIBODIR}/rlogin.${OFILE} \
 			${LIBODIR}/sockwrap.${OFILE} \
+			${LIBODIR}/dirwrap.${OFILE} \
 			${LIBODIR}/filewrap.${OFILE} \
 			${LIBODIR}/term.${OFILE} \
 			${LIBODIR}/genwrap.${OFILE} \
+			${LIBODIR}/ini_file.${OFILE} \
+			${LIBODIR}/str_list.${OFILE} \
 			${LIBODIR}/window.${OFILE} \
 			${LIBODIR}/menu.${OFILE}
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 85b1c6a7ff6d1288011fd6a052a9fc46d56ddecc..51866551a842af7cf2b196331278eb2d536b0087 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -1,6 +1,8 @@
 #include <stdlib.h>
 #include <ciolib.h>
 
+#include <dirwrap.h>
+
 #include "bbslist.h"
 #include "rlogin.h"
 #include "uifcinit.h"
@@ -36,18 +38,24 @@ int main(int argc, char **argv)
 {
 	struct bbslist *bbs;
 	struct	text_info txtinfo;
+	char	drive[MAX_PATH];
+	char	path[MAX_PATH];
+	char	fname[MAX_PATH];
+	char	ext[MAX_PATH];
 
 	if(!winsock_startup())
 		return(1);
 
     gettextinfo(&txtinfo);
 	if((txtinfo.screenwidth<40) || txtinfo.screenheight<24) {
-		fputs("Window too small, must be at lest 80x24\n",stderr);
+		fputs("Window too small, must be at least 80x24\n",stderr);
 		return(1);
 	}
-
+	_splitpath(argv[0],drive,path,fname,ext);
+	strcat(drive,path);
+	FULLPATH(path,drive,sizeof(path));
 	atexit(uifcbail);
-	while((bbs=show_bbslist(BBSLIST_SELECT))!=NULL) {
+	while((bbs=show_bbslist(BBSLIST_SELECT,path))!=NULL) {
 		if(!rlogin_connect(bbs->addr,bbs->port,bbs->reversed?bbs->password:bbs->user,bbs->reversed?bbs->user:bbs->password,bbs->dumb)) {
 			/* ToDo: Update the entry with new lastconnected */
 			/* ToDo: Disallow duplicate entries */