diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index 90cd5f0860161966840aec39867635b63538f38b..9518e7ef3144ba9995a17fd88cb39d9f865f75ac 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -148,20 +148,33 @@ int get_next_rate(int curr_rate) {
 	return(rates[i]);
 }
 
-void sort_list(struct bbslist **list)  {
+void sort_list(struct bbslist **list, int *listcount)  {
 	struct bbslist *tmp;
-	unsigned int	i,swapped=1;
+	unsigned int	i,j,swapped=1;
 
 	while(swapped) {
 		swapped=0;
 		for(i=1;list[i]!=NULL && list[i-1]->name[0] && list[i]->name[0];i++) {
 			int	cmp=stricmp(list[i-1]->name,list[i]->name);
-			if(cmp>0) {
+			if(cmp>0 || (cmp==0 && list[i-1]->type==SYSTEM_BBSLIST && list[i]->type==USER_BBSLIST)) {
 				tmp=list[i];
 				list[i]=list[i-1];
 				list[i-1]=tmp;
 				swapped=1;
 			}
+			if(cmp==0) {
+				/* Duplicate.  Remove the one from system BBS list */
+				free(list[i]);
+				for(j=i;list[j]!=NULL && list[j]->name[0];j++) {
+					list[j]=list[j+1];
+				}
+				for(j=0;list[j]!=NULL && list[j]->name[0];j++) {
+					list[j]->id=j;
+				}
+				(*listcount)--;
+				swapped=1;
+				break;
+			}
 		}
 	}
 }
@@ -262,11 +275,14 @@ int edit_list(struct bbslist *item,char *listpath,int isdefault)
 	for(i=0;i<18;i++)		/* <- Beware of magic number! */
 		opts[i]=opt[i];
 	if(item->type==SYSTEM_BBSLIST) {
-		uifc.helpbuf=	"`Cannot edit system BBS list`\n\n"
-						"SyncTERM supports system-wide and per-user lists.  You may only edit entries"
-						"in your own personal list.\n";
-		uifc.msg("Cannot edit system BBS list");
-		return(0);
+		char	*YesNo[3]={"Yes","No",""};
+		uifc.helpbuf=	"`Copy from system BBS list`\n\n"
+						"This BBS was loaded from the system BBS list.  In order to edit it, it\n"
+						"must be copied into your personal BBS list.\n";
+		if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Copy from system BBS list?",YesNo)!=0)
+			return(0);
+		item->type=USER_BBSLIST;
+		add_bbs(listpath, item);
 	}
 	if((listfile=fopen(listpath,"r"))!=NULL) {
 		inifile=iniReadFile(listfile);
@@ -692,6 +708,22 @@ write_ini:
 	}
 }
 
+void load_bbslist(struct bbslist **list, size_t listsize, struct bbslist *defaults, char *listpath, size_t listpathsize, char *shared_list, size_t shared_listsize, int *listcount)
+{
+	free_list(&list[0],*listcount);
+	*listcount=0;
+
+	memset(list,0,listsize);
+	memset(defaults,0,sizeof(struct bbslist));
+
+	read_list(listpath, list, defaults, listcount, USER_BBSLIST);
+
+	/* System BBS List */
+	if(stricmp(shared_list, listpath)) /* don't read the same list twice */
+		read_list(shared_list, list, defaults, listcount, SYSTEM_BBSLIST);
+	sort_list(list, listcount);
+}
+
 /*
  * Displays the BBS list and allows edits to user BBS list
  * Mode is one of BBSLIST_SELECT or BBSLIST_EDIT
@@ -728,18 +760,10 @@ struct bbslist *show_bbslist(int mode)
 	if(init_uifc(TRUE, TRUE))
 		return(NULL);
 
-	memset(list,0,sizeof(list));
-	memset(&defaults,0,sizeof(defaults));
-
 	get_syncterm_filename(listpath, sizeof(listpath), SYNCTERM_PATH_LIST, FALSE);
-	read_list(listpath, list, &defaults, &listcount, USER_BBSLIST);
-
-	/* System BBS List */
 	get_syncterm_filename(shared_list, sizeof(shared_list), SYNCTERM_PATH_LIST, TRUE);
-	if(stricmp(shared_list, listpath)) /* don't read the same list twice */
-		read_list(shared_list, list, &defaults, &listcount, SYSTEM_BBSLIST);
+	load_bbslist(list, sizeof(list), &defaults, listpath, sizeof(listpath), shared_list, sizeof(shared_list), &listcount);
 
-	sort_list(list);
 	uifc.helpbuf=	"`SyncTERM Settings Menu`\n\n";
 	uifc.list(WIN_T2B|WIN_RHT|WIN_IMM|WIN_INACT
 		,0,0,0,&sopt,&sbar,"SyncTERM Settings",settings_menu);
@@ -789,7 +813,7 @@ struct bbslist *show_bbslist(int mode)
 							if(list[opt]) {
 								i=list[opt]->id;
 								if(edit_list(list[opt],listpath,FALSE)) {
-									sort_list(list);
+									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)
 											opt=j;
@@ -857,7 +881,7 @@ struct bbslist *show_bbslist(int mode)
 							}
 							else {
 								add_bbs(listpath,list[listcount-1]);
-								sort_list(list);
+								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==listcount-1)
 										opt=j;
@@ -894,15 +918,7 @@ struct bbslist *show_bbslist(int mode)
 							if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,str,YesNo)!=0)
 								break;
 							del_bbs(listpath,list[opt]);
-							free(list[opt]);
-							for(i=opt;list[i]!=NULL && list[i]->name[0];i++) {
-								list[i]=list[i+1];
-							}
-							for(i=0;list[i]!=NULL && list[i]->name[0];i++) {
-								list[i]->id=i;
-							}
-							listcount--;
-							oldopt=-1;
+							load_bbslist(list, sizeof(list), &defaults, listpath, sizeof(listpath), shared_list, sizeof(shared_list), &listcount);
 							break;
 						case MSK_EDIT:
 							if(safe_mode) {
@@ -914,7 +930,7 @@ struct bbslist *show_bbslist(int mode)
 							}
 							i=list[opt]->id;
 							if(edit_list(list[opt],listpath,FALSE)) {
-								sort_list(list);
+								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)
 										opt=j;
@@ -935,7 +951,7 @@ struct bbslist *show_bbslist(int mode)
 						}
 						i=list[opt]->id;
 						if(edit_list(list[opt],listpath,FALSE)) {
-							sort_list(list);
+							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)
 									opt=j;
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 5efd20102d0af70c30b7917d66e7404aa3f0904e..9bb14ba941a5ede6f846d95f79abf4f5dd62672f 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -1086,6 +1086,10 @@ int main(int argc, char **argv)
 			bbs->connected=time(NULL);
 			bbs->calls++;
 			if(bbs->id != -1) {
+				if(bbs->type==SYSTEM_BBSLIST) {
+					bbs->type=USER_BBSLIST;
+					add_bbs(listpath, bbs);
+				}
 				if((listfile=fopen(listpath,"r"))!=NULL) {
 					inifile=iniReadFile(listfile);
 					fclose(listfile);