diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c
index a66bb4563f8ef908a902a66f2b4d965302ee1718..5dcdbb952177f8cc8f5f890cb18aeaa19ba5bd0f 100644
--- a/src/syncterm/conn.c
+++ b/src/syncterm/conn.c
@@ -184,17 +184,20 @@ int conn_send(char *buffer, size_t buflen, unsigned int timeout)
 	return(0);
 }
 
-int conn_connect(char *addr, int port, char *ruser, char *passwd, char *syspass, int conn_type, int speed)
+int conn_connect(struct bbslist *bbs)
 {
 	HOSTENT *ent;
 	SOCKADDR_IN	saddr;
 	char	*p;
 	unsigned int	neta;
+	char	*ruser;
+	char	*passwd;
 
 	init_uifc(TRUE, TRUE);
 
+	con_type=bbs->conn_type;
 #ifdef USE_CRYPTLIB
-	if(conn_type==CONN_TYPE_SSH) {
+	if(con_type==CONN_TYPE_SSH) {
 		if(!crypt_loaded)
 			init_crypt();
 		if(!crypt_loaded) {
@@ -214,20 +217,25 @@ int conn_connect(char *addr, int port, char *ruser, char *passwd, char *syspass,
 	}
 #endif
 
-	con_type=conn_type;
-	for(p=addr;*p;p++)
+	ruser=bbs->user;
+	passwd=bbs->password;
+	if(con_type==CONN_TYPE_RLOGIN && bbs->reversed) {
+		passwd=bbs->user;
+		ruser=bbs->password;
+	}
+	for(p=bbs->addr;*p;p++)
 		if(*p!='.' && !isdigit(*p))
 			break;
 
 	if(!(*p))
-		neta=inet_addr(addr);
+		neta=inet_addr(bbs->addr);
 	else {
 		uifc.pop("Lookup up host");
-		if((ent=gethostbyname(addr))==NULL) {
+		if((ent=gethostbyname(bbs->addr))==NULL) {
 			char str[LIST_ADDR_MAX+17];
 
 			uifc.pop(NULL);
-			sprintf(str,"Cannot resolve %s!",addr);
+			sprintf(str,"Cannot resolve %s!",bbs->addr);
 			uifcmsg(str,	"`Cannot Resolve Host`\n\n"
 							"The system is unable to resolve the hostname... double check the spelling.\n"
 							"If it's not an issue with your DNS settings, the issue is probobly\n"
@@ -250,14 +258,14 @@ int conn_connect(char *addr, int port, char *ruser, char *passwd, char *syspass,
 	memset(&saddr,0,sizeof(saddr));
 	saddr.sin_addr.s_addr = neta;
 	saddr.sin_family = AF_INET;
-	saddr.sin_port   = htons((WORD)port);
+	saddr.sin_port   = htons((WORD)bbs->port);
 
 	if(connect(conn_socket, (struct sockaddr *)&saddr, sizeof(saddr))) {
 		char str[LIST_ADDR_MAX+20];
 
 		conn_close();
 		uifc.pop(NULL);
-		sprintf(str,"Cannot connect to %s!",addr);
+		sprintf(str,"Cannot connect to %s!",bbs->addr);
 		uifcmsg(str,	"`Unable to connect`\n\n"
 						"Cannot connect to the remote system... it is down or unreachable.");
 		return(-1);
@@ -273,9 +281,9 @@ int conn_connect(char *addr, int port, char *ruser, char *passwd, char *syspass,
 			conn_send("",1,1000);
 			conn_send(passwd,strlen(passwd)+1,1000);
 			conn_send(ruser,strlen(ruser)+1,1000);
-			if(speed) {
+			if(bbs->bpsrate) {
 				char	sbuf[30];
-				sprintf(sbuf, "ansi-bbs/%d", speed);
+				sprintf(sbuf, "ansi-bbs/%d", bbs->bpsrate);
 
 				conn_send(sbuf, strlen(sbuf)+1,1000);
 			}
diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h
index 5150ac2443c2fab7ee889db91400e59ecf62499f..066f7a898bc13e48ab6fc33f7934e5c7d46e73cf 100644
--- a/src/syncterm/conn.h
+++ b/src/syncterm/conn.h
@@ -5,6 +5,8 @@
 
 #include "sockwrap.h"
 
+#include "bbslist.h"
+
 extern SOCKET conn_socket;
 extern char *conn_types[];
 extern int conn_ports[];
@@ -22,7 +24,7 @@ enum {
 
 int conn_recv(char *buffer, size_t buflen, unsigned int timeout);
 int conn_send(char *buffer, size_t buflen, unsigned int timeout);
-int conn_connect(char *addr, int port, char *ruser, char *passwd, char *syspass, int conn_type, int speed);
+int conn_connect(struct bbslist *bbs);
 int conn_close(void);
 BOOL conn_is_connected(void);
 void conn_settype(int type);
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 26f1ac0d748052af606b220fba2253a7eef7ee27..26d3b3b60b570697f84e42284318e02e6deab43a 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -419,9 +419,6 @@ int main(int argc, char **argv)
 	else
 		FULLPATH(path,inpath,sizeof(path));
 	atexit(uifcbail);
-#ifdef USE_CRYPTLIB
-	atexit(exit_crypt);
-#endif
 
 	scrollback_buf=malloc(80*2*settings.backlines);	/* Terminal width is *always* 80 cols */
 	if(scrollback_buf==NULL) {
@@ -458,7 +455,7 @@ int main(int argc, char **argv)
 	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)) {
+		if(!conn_connect(bbs)) {
 			/* ToDo: Update the entry with new lastconnected */
 			/* ToDo: Disallow duplicate entries */
 			bbs->connected=time(NULL);
@@ -499,8 +496,12 @@ int main(int argc, char **argv)
 			sprintf(str,"SyncTERM - %s",bbs->name);
 			settitle(str);
 			term.nostatus=bbs->nostatus;
-			if(drawwin())
+			if(drawwin()) {
+#ifdef USE_CRYPTLIB
+				atexit(exit_crypt);
+#endif
 				return(1);
+			}
 			if(log_fp==NULL && bbs->logfile[0])
 				log_fp=fopen(bbs->logfile,"a");
 			if(log_fp!=NULL) {
@@ -550,6 +551,9 @@ int main(int argc, char **argv)
 #ifdef _WINSOCKAPI_
 	if(WSAInitialized && WSACleanup()!=0) 
 		fprintf(stderr,"!WSACleanup ERROR %d",ERROR_VALUE);
+#endif
+#ifdef USE_CRYPTLIB
+				atexit(exit_crypt);
 #endif
 	return(0);