diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c
index 36253ca23f1fc66ba0c7f964c0a516b66211593f..39e199cdf55d7437d03bf7ba0bff5cb78913529b 100644
--- a/src/syncterm/modem.c
+++ b/src/syncterm/modem.c
@@ -27,7 +27,7 @@ void modem_input_thread(void *args)
 	while(com != COM_HANDLE_INVALID && !conn_api.terminate) {
 		rd=comReadBuf(com, conn_api.rd_buf, conn_api.rd_buf_size, NULL, 100);
 		if(rd <= 0) {
-			if(comGetModemStatus(com)&COM_DCD)
+			if(comGetModemStatus(com)&COM_DCD == 0)
 				break;
 		}
 		buffered=0;
@@ -60,16 +60,16 @@ void modem_output_thread(void *args)
 			sent=0;
 			while(sent < wr) {
 				ret=comWriteBuf(com, conn_api.wr_buf+sent, wr-sent);
-				if(ret==COM_ERROR) {
-					if(comGetModemStatus(com)&COM_DCD == 0)
-						break;
-				}
 				sent+=ret;
+				if(ret==COM_ERROR)
+					break;
+			}
+			if(ret==COM_ERROR) {
 			}
 		}
 		else
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
-		if(ret==-1)
+		if(comGetModemStatus(com)&COM_DCD == 0)
 			break;
 	}
 	conn_api.output_thread_running=0;
@@ -137,8 +137,10 @@ int modem_connect(struct bbslist *bbs)
 						"The modem did not respond to the initializtion string\n"
 						"Check your init string and phone number.\n");
 		conn_api.terminate=-1;
-		return(INVALID_SOCKET);
+		return(-1);
 	}
+uifc.pop(NULL);
+uifc.pop(respbuf);
 	if(strstr(respbuf, settings.mdm.init_string))
 	if(modem_response(respbuf, sizeof(respbuf), 5)) {
 		modem_close();
@@ -147,9 +149,10 @@ int modem_connect(struct bbslist *bbs)
 						"The modem did not respond to the initializtion string\n"
 						"Check your init string and phone number.\n");
 		conn_api.terminate=-1;
-		return(INVALID_SOCKET);
+		return(-1);
 	}
-	if(strstr(respbuf, settings.mdm.init_string))
+uifc.pop(NULL);
+uifc.pop(respbuf);
 
 	if(!strstr(respbuf, "OK")) {
 		modem_close();
@@ -157,12 +160,12 @@ int modem_connect(struct bbslist *bbs)
 		uifcmsg("Initialization Error",	"`Initialization Error`\n\n"
 						"Your initialization string caused an error.\n");
 		conn_api.terminate=-1;
-		return(INVALID_SOCKET);
+		return(-1);
 	}
 
 	uifc.pop(NULL);
 	uifc.pop("Dialing...");
-	comWriteString(com, "ATD");
+	comWriteString(com, "ATDT");
 	comWriteString(com, bbs->addr);
 	comWriteString(com, "\r");
 	
@@ -173,17 +176,27 @@ int modem_connect(struct bbslist *bbs)
 		uifcmsg("No Answer",	"`No Answer`\n\n"
 						"The modem did not connect withing 30 seconds.\n");
 		conn_api.terminate=-1;
-		return(INVALID_SOCKET);
+		return(-1);
 	}
-	if(!strstr(respbuf, "CONNECT")) {
 uifc.pop(NULL);
 uifc.pop(respbuf);
+	if(modem_response(respbuf, sizeof(respbuf), 30)) {
+		modem_close();
+		uifc.pop(NULL);
+		uifcmsg("No Answer",	"`No Answer`\n\n"
+						"The modem did not connect withing 30 seconds.\n");
+		conn_api.terminate=-1;
+		return(-1);
+	}
+uifc.pop(NULL);
+uifc.pop(respbuf);
+	if(!strstr(respbuf, "CONNECT")) {
 		modem_close();
 		uifc.pop(NULL);
 		uifcmsg("Connection Failed",	"`Connection Failed`\n\n"
 						"SyncTERM was unable to establish a connection.\n");
 		conn_api.terminate=-1;
-		return(INVALID_SOCKET);
+		return(-1);
 	}
 
 	uifc.pop(NULL);