diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c
index d5fdff0e601b70d03e8ae39790bf0f79bed4706e..ccdd2258e33c2fc72f55c9767ca577debb110ace 100644
--- a/src/syncterm/conn.c
+++ b/src/syncterm/conn.c
@@ -24,12 +24,12 @@
 #include "conn_telnet.h"
 
 struct conn_api conn_api;
-char *conn_types[]={"Unknown","RLogin","RLogin Reversed","Telnet","Raw","SSH","Modem"
+char *conn_types[]={"Unknown","RLogin","RLogin Reversed","Telnet","Raw","SSH","Modem","Direct COM"
 #ifdef __unix__
 ,"Shell"
 #endif
 ,NULL};
-short unsigned int conn_ports[]={0,513,513,23,0,22,0
+short unsigned int conn_ports[]={0,513,513,23,0,22,0,0
 #ifdef __unix__
 ,65535
 #endif
@@ -303,6 +303,7 @@ int conn_connect(struct bbslist *bbs)
 			conn_api.connect=ssh_connect;
 			conn_api.close=ssh_close;
 			break;
+		case CONN_TYPE_SERIAL:
 		case CONN_TYPE_MODEM:
 			conn_api.connect=modem_connect;
 			conn_api.close=modem_close;
diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h
index ac44872c2586453e4da86bde7eebd3fde997576f..00817e578985cf3a070168eed2d5f5b10679a198 100644
--- a/src/syncterm/conn.h
+++ b/src/syncterm/conn.h
@@ -21,6 +21,7 @@ enum {
 	,CONN_TYPE_RAW
 	,CONN_TYPE_SSH
 	,CONN_TYPE_MODEM
+	,CONN_TYPE_SERIAL
 #ifdef __unix__
 	,CONN_TYPE_SHELL
 #endif
diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c
index f57fc26f4a6af6aa6fae81f3cd46725f825fda27..1a6eb56eda6c63be32766894b2f77ecba8352c36 100644
--- a/src/syncterm/modem.c
+++ b/src/syncterm/modem.c
@@ -17,9 +17,6 @@
 
 static COM_HANDLE com=COM_HANDLE_INVALID;
 
-#ifdef __BORLANDC__
-#pragma argsused
-#endif
 void modem_input_thread(void *args)
 {
 	int		rd;
@@ -36,15 +33,20 @@ void modem_input_thread(void *args)
 			buffered+=conn_buf_put(&conn_inbuf, conn_api.rd_buf+buffered, buffer);
 			pthread_mutex_unlock(&(conn_inbuf.mutex));
 		}
-		if((comGetModemStatus(com)&COM_DCD) == 0)
-			break;
+		if(args==NULL) {
+			if((comGetModemStatus(com)&COM_DCD) == 0)
+				break;
+		}
+		else {
+			if((comGetModemStatus(com)&COM_DSR) == 0)
+				break;
+		}
 	}
+	if(args != NULL)
+		comLowerDTR(com);
 	conn_api.input_thread_running=0;
 }
 
-#ifdef __BORLANDC__
-#pragma argsused
-#endif
 void modem_output_thread(void *args)
 {
 	int		wr;
@@ -70,8 +72,14 @@ void modem_output_thread(void *args)
 		}
 		else
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
-		if((comGetModemStatus(com)&COM_DCD) == 0)
-			break;
+		if(args==NULL) {
+			if((comGetModemStatus(com)&COM_DCD) == 0)
+				break;
+		}
+		else {
+			if((comGetModemStatus(com)&COM_DSR) == 0)
+				break;
+		}
 	}
 	conn_api.output_thread_running=0;
 }
@@ -119,98 +127,122 @@ int modem_connect(struct bbslist *bbs)
 
 	init_uifc(TRUE, TRUE);
 
-	if((com=comOpen(settings.mdm.device_name)) == COM_HANDLE_INVALID) {
-		uifcmsg("Cannot Open Modem",	"`Cannot Open Modem`\n\n"
-						"Cannot open the specified modem device.\n");
-		conn_api.terminate=-1;
-		return(-1);
+	if(bbs->conn_type == CONN_TYPE_SERIAL) {
+		if((com=comOpen(settings.mdm.device_name)) == COM_HANDLE_INVALID) {
+			uifcmsg("Cannot Open Port",	"`Cannot Open Port`\n\n"
+							"Cannot open the specified serial device.\n");
+			conn_api.terminate=-1;
+			return(-1);
+		}
+		if(rates[bbs->bpsrate]) {
+			if(!comSetBaudRate(com, rates[bbs->bpsrate])) {
+				uifcmsg("Cannot Set Baud Rate",	"`Cannot Set Baud Rate`\n\n"
+								"Cannot open the specified serial device.\n");
+				conn_api.terminate=-1;
+				return(-1);
+			}
+		}
+		if(!comRaiseDTR(com)) {
+			uifcmsg("Cannot Raise DTR",	"`Cannot Raise DTR`\n\n"
+							"comRaiseDTR() returned an error.\n");
+			conn_api.terminate=-1;
+			return(-1);
+		}
 	}
-	if(settings.mdm.com_rate) {
-		if(!comSetBaudRate(com, settings.mdm.com_rate)) {
-			uifcmsg("Cannot Set Baud Rate",	"`Cannot Set Baud Rate`\n\n"
+	else {
+		if((com=comOpen(settings.mdm.device_name)) == COM_HANDLE_INVALID) {
+			uifcmsg("Cannot Open Modem",	"`Cannot Open Modem`\n\n"
 							"Cannot open the specified modem device.\n");
 			conn_api.terminate=-1;
 			return(-1);
 		}
-	}
-	if(!comRaiseDTR(com)) {
-		uifcmsg("Cannot Raise DTR",	"`Cannot Raise DTR`\n\n"
-						"comRaiseDTR() returned an error.\n");
-		conn_api.terminate=-1;
-		return(-1);
-	}
-
-	/* drain keyboard input to avoid accidental cancel */
-	while(kbhit())
-		getch();
+		if(settings.mdm.com_rate) {
+			if(!comSetBaudRate(com, settings.mdm.com_rate)) {
+				uifcmsg("Cannot Set Baud Rate",	"`Cannot Set Baud Rate`\n\n"
+								"Cannot open the specified modem device.\n");
+				conn_api.terminate=-1;
+				return(-1);
+			}
+		}
+		if(!comRaiseDTR(com)) {
+			uifcmsg("Cannot Raise DTR",	"`Cannot Raise DTR`\n\n"
+							"comRaiseDTR() returned an error.\n");
+			conn_api.terminate=-1;
+			return(-1);
+		}
 
-	uifc.pop("Initializing...");
+		/* drain keyboard input to avoid accidental cancel */
+		while(kbhit())
+			getch();
 
-	comWriteString(com, settings.mdm.init_string);
-	comWriteString(com, "\r");
+		uifc.pop("Initializing...");
+
+		comWriteString(com, settings.mdm.init_string);
+		comWriteString(com, "\r");
+
+		/* Wait for "OK" */
+		while(1) {
+			if((ret=modem_response(respbuf, sizeof(respbuf), 5))!=0) {
+				modem_close();
+				uifc.pop(NULL);
+				if(ret<0)
+					uifcmsg("Modem Not Responding",	"`Modem Not Responding`\n\n"
+								"The modem did not respond to the initializtion string\n"
+								"Check your init string and phone number.\n");
+				conn_api.terminate=-1;
+				return(-1);
+			}
+			if(strstr(respbuf, settings.mdm.init_string))	/* Echo is on */
+				continue;
+			break;
+		}
 
-	/* Wait for "OK" */
-	while(1) {
-		if((ret=modem_response(respbuf, sizeof(respbuf), 5))!=0) {
+		if(!strstr(respbuf, "OK")) {
 			modem_close();
 			uifc.pop(NULL);
-			if(ret<0)
-				uifcmsg("Modem Not Responding",	"`Modem Not Responding`\n\n"
-							"The modem did not respond to the initializtion string\n"
-							"Check your init string and phone number.\n");
+			uifcmsg(respbuf,	"`Initialization Error`\n\n"
+							"The modem did not respond favorably to your initialization string.\n");
 			conn_api.terminate=-1;
 			return(-1);
 		}
-		if(strstr(respbuf, settings.mdm.init_string))	/* Echo is on */
-			continue;
-		break;
-	}
 
-	if(!strstr(respbuf, "OK")) {
-		modem_close();
 		uifc.pop(NULL);
-		uifcmsg(respbuf,	"`Initialization Error`\n\n"
-						"The modem did not respond favorably to your initialization string.\n");
-		conn_api.terminate=-1;
-		return(-1);
-	}
+		uifc.pop("Dialing...");
+		comWriteString(com, settings.mdm.dial_string);
+		comWriteString(com, bbs->addr);
+		comWriteString(com, "\r");
+
+		/* Wait for "CONNECT" */
+		while(1) {
+			if((ret=modem_response(respbuf, sizeof(respbuf), 60))!=0) {
+				modem_close();
+				uifc.pop(NULL);
+				if(ret<0)
+					uifcmsg(respbuf,	"`No Answer`\n\n"
+								"The modem did not connect within 60 seconds.\n");
+				conn_api.terminate=-1;
+				return(-1);
+			}
+			if(strstr(respbuf, bbs->addr))	/* Dial command echoed */
+				continue;
+			break;
+		}
 
-	uifc.pop(NULL);
-	uifc.pop("Dialing...");
-	comWriteString(com, settings.mdm.dial_string);
-	comWriteString(com, bbs->addr);
-	comWriteString(com, "\r");
-
-	/* Wait for "CONNECT" */
-	while(1) {
-		if((ret=modem_response(respbuf, sizeof(respbuf), 60))!=0) {
+		if(!strstr(respbuf, "CONNECT")) {
 			modem_close();
 			uifc.pop(NULL);
-			if(ret<0)
-				uifcmsg(respbuf,	"`No Answer`\n\n"
-							"The modem did not connect within 60 seconds.\n");
+			uifcmsg(respbuf,	"`Connection Failed`\n\n"
+							"SyncTERM was unable to establish a connection.\n");
 			conn_api.terminate=-1;
 			return(-1);
 		}
-		if(strstr(respbuf, bbs->addr))	/* Dial command echoed */
-			continue;
-		break;
-	}
 
-	if(!strstr(respbuf, "CONNECT")) {
-		modem_close();
 		uifc.pop(NULL);
-		uifcmsg(respbuf,	"`Connection Failed`\n\n"
-						"SyncTERM was unable to establish a connection.\n");
-		conn_api.terminate=-1;
-		return(-1);
+		uifc.pop(respbuf);
+		SLEEP(1000);
+		uifc.pop(NULL);
 	}
 
-	uifc.pop(NULL);
-	uifc.pop(respbuf);
-	SLEEP(1000);
-	uifc.pop(NULL);
-
 	if(!create_conn_buf(&conn_inbuf, BUFFER_SIZE)) {
 		modem_close();
 		return(-1);
@@ -236,8 +268,14 @@ int modem_connect(struct bbslist *bbs)
 	}
 	conn_api.wr_buf_size=BUFFER_SIZE;
 
-	_beginthread(modem_output_thread, 0, NULL);
-	_beginthread(modem_input_thread, 0, NULL);
+	if(bbs->conn_type == CONN_TYPE_SERIAL) {
+		_beginthread(modem_output_thread, 0, (void *)-1);
+		_beginthread(modem_input_thread, 0, (void *)-1);
+	}
+	else {
+		_beginthread(modem_output_thread, 0, NULL);
+		_beginthread(modem_input_thread, 0, NULL);
+	}
 
 	uifc.pop(NULL);