diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c
index 67eab3f01c42b843c304c765bcc3e4a2830d6522..c23acbfe8cc7f7e5726564a50886059a5008029e 100644
--- a/src/syncterm/conn.c
+++ b/src/syncterm/conn.c
@@ -365,7 +365,7 @@ conn_send(const void *vbuffer, size_t buflen, unsigned int timeout)
 	return found;
 }
 
-SOCKET
+bool
 conn_connect(struct bbslist *bbs)
 {
 	char str[64];
@@ -433,16 +433,16 @@ conn_connect(struct bbslist *bbs)
 			    "The connection type of this entry is not supported by this build.\n"
 			    "Either the protocol was disabled at compile time, or is\n"
 			    "unsupported on this plattform.");
-			conn_api.terminate = 1;
+			conn_api.terminate = true;
 	}
 	if (conn_api.connect) {
 		if (conn_api.connect(bbs)) {
-			conn_api.terminate = 1;
+			conn_api.terminate = true;
 			while (conn_api.input_thread_running == 1 || conn_api.output_thread_running == 1)
 				SLEEP(1);
 		}
 		else {
-			while (conn_api.terminate == 0
+			while ((!conn_api.terminate)
 			    && (conn_api.input_thread_running == 0 || conn_api.output_thread_running == 0))
 				SLEEP(1);
 		}
@@ -608,7 +608,7 @@ connected:
 		freeaddrinfo(res);
 	if (!bbs->hidepopups)
 		uifc.pop(NULL);
-	conn_api.terminate = -1;
+	conn_api.terminate = true;
 	if (!bbs->hidepopups) {
 		switch (failcode) {
 			case FAILURE_RESOLVE:
diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h
index 5544f0389c53d594530b30a9e7ff0a69d6bdfa91..3c7a1275e1afdf435887989d249f97b79c3a529f 100644
--- a/src/syncterm/conn.h
+++ b/src/syncterm/conn.h
@@ -5,6 +5,7 @@
 #ifndef _CONN_H_
 #define _CONN_H_
 
+#include <stdatomic.h>
 #include <stdbool.h>
 
 #include "bbslist.h"
@@ -70,9 +71,9 @@ struct conn_api {
 	int               type;
 	int               nostatus;
 	cterm_emulation_t emulation;
-	volatile int      input_thread_running;
-	volatile int      output_thread_running;
-	volatile int      terminate;
+	atomic_int        input_thread_running;
+	atomic_int        output_thread_running;
+	atomic_bool       terminate;
 	unsigned char    *rd_buf;
 	size_t            rd_buf_size;
 	unsigned char    *wr_buf;
@@ -96,7 +97,7 @@ struct conn_buffer {
 int conn_recv_upto(void *buffer, size_t buflen, unsigned int timeout);
 int conn_send(const void *buffer, size_t buflen, unsigned int timeout);
 int conn_send_raw(const void *buffer, size_t buflen, unsigned int timeout);
-SOCKET conn_connect(struct bbslist *bbs);
+bool conn_connect(struct bbslist *bbs);
 int conn_close(void);
 bool conn_connected(void);
 size_t conn_data_waiting(void);
diff --git a/src/syncterm/conn_conpty.c b/src/syncterm/conn_conpty.c
index af4e72e73e17fa00d6656f61e36bd107e79d7332..1d68a708e5d6f67a956b84f278a5e0aae2e1eec1 100644
--- a/src/syncterm/conn_conpty.c
+++ b/src/syncterm/conn_conpty.c
@@ -1,5 +1,4 @@
 #define WIN32_LEAN_AND_MEAN
-#include <stdatomic.h>
 #include <stdbool.h>
 #include <windows.h>
 #include <wincon.h>
@@ -17,8 +16,6 @@ PROCESS_INFORMATION pi;
 HPCON cpty;
 enum ciolib_codepage codepage;
 
-static atomic_bool terminate;
-
 static size_t
 get_utf8_span(const uint8_t *b, size_t sz)
 {
@@ -64,7 +61,7 @@ conpty_input_thread(void *args)
 
 	SetThreadName("PTY Input");
 	conn_api.input_thread_running = 1;
-	while (!terminate && !conn_api.terminate) {
+	while (!conn_api.terminate) {
 		if (GetExitCodeProcess(pi.hProcess, &ec)) {
 			if (ec != STILL_ACTIVE)
 				break;
@@ -84,7 +81,7 @@ conpty_input_thread(void *args)
 		if (cps == NULL)
 			break;
 		buffered = 0;
-		while (!terminate && !conn_api.terminate && buffered < sz) {
+		while (!conn_api.terminate && buffered < sz) {
 			pthread_mutex_lock(&(conn_inbuf.mutex));
 			buffer = conn_buf_wait_free(&conn_inbuf, sz - buffered, 100);
 			buffered += conn_buf_put(&conn_inbuf, cps + buffered, buffer);
@@ -95,7 +92,7 @@ conpty_input_thread(void *args)
 			memmove(conn_api.rd_buf, &conn_api.rd_buf[utf8_span], fill);
 		free(cps);
 	}
-	terminate = true;
+	conn_api.terminate = true;
 	conn_api.input_thread_running = 2;
 }
 
@@ -108,7 +105,7 @@ conpty_output_thread(void *args)
 
 	SetThreadName("PTY Output");
 	conn_api.output_thread_running = 1;
-	while (!terminate && !conn_api.terminate) {
+	while (!conn_api.terminate) {
 		if (GetExitCodeProcess(pi.hProcess, &ec)) {
 			if (ec != STILL_ACTIVE)
 				break;
@@ -127,9 +124,9 @@ conpty_output_thread(void *args)
 			if (utf == NULL)
 				break;
 			size_t sent = 0;
-			while (!terminate && !conn_api.terminate && sent < sz) {
+			while (!conn_api.terminate && sent < sz) {
 				if (!WriteFile(inputWrite, utf + sent, sz - sent, &ret, NULL)) {
-					terminate = true;
+					conn_api.terminate = true;
 					break;
 				}
 				sent += ret;
@@ -140,7 +137,7 @@ conpty_output_thread(void *args)
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
 		}
 	}
-	terminate = true;
+	conn_api.terminate = true;
 	conn_api.output_thread_running = 2;
 }
 
@@ -271,7 +268,6 @@ int conpty_connect(struct bbslist *bbs)
 	}
 	conn_api.wr_buf_size = BUFFER_SIZE;
 
-	terminate = false;
 	_beginthread(conpty_output_thread, 0, NULL);
 	_beginthread(conpty_input_thread, 0, NULL);
 
@@ -284,8 +280,7 @@ conpty_close(void)
 	char garbage[1024];
 	DWORD ret;
 
-	conn_api.terminate = 1;
-	terminate = true;
+	conn_api.terminate = true;
 	TerminateProcess(pi.hProcess, 0);
 	WaitForSingleObject(pi.hProcess, 1000);
 	ClosePseudoConsole(cpty);
diff --git a/src/syncterm/conn_pty.c b/src/syncterm/conn_pty.c
index a4c408fd2ec3f5be8f9073762bb71328c4fe2469..cec4e8cf7e6d4b8ae5bea0735d76f16960e79214 100644
--- a/src/syncterm/conn_pty.c
+++ b/src/syncterm/conn_pty.c
@@ -5,7 +5,6 @@
 #ifdef __unix__
 
 #include <signal.h>   // kill()
-#include <stdatomic.h>
 #include <sys/wait.h> // WEXITSTATUS
 #include <unistd.h>   /* _POSIX_VDISABLE - needed when termios.h is broken */
 
@@ -147,7 +146,6 @@
 #include "uifcinit.h"
 #include "window.h"
 extern int default_font;
-static atomic_bool terminated;
 
 #ifdef NEEDS_CFMAKERAW
 
@@ -317,7 +315,7 @@ pty_input_thread(void *args)
 
 	SetThreadName("PTY Input");
 	conn_api.input_thread_running = 1;
-	while (master != -1 && !conn_api.terminate && !terminated) {
+	while (master != -1 && !conn_api.terminate) {
 		if ((i = waitpid(child_pid, &status, WNOHANG)))
 			break;
 		FD_ZERO(&rds);
@@ -336,14 +334,14 @@ pty_input_thread(void *args)
 				break;
 		}
 		buffered = 0;
-		while (buffered < rd && !conn_api.terminate && !terminated) {
+		while (buffered < rd && !conn_api.terminate) {
 			pthread_mutex_lock(&(conn_inbuf.mutex));
 			buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100);
 			buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
 			pthread_mutex_unlock(&(conn_inbuf.mutex));
 		}
 	}
-	terminated = true;
+	conn_api.terminate = true;
 	conn_api.input_thread_running = 2;
 }
 
@@ -362,7 +360,7 @@ pty_output_thread(void *args)
 
 	SetThreadName("PTY Output");
 	conn_api.output_thread_running = 1;
-	while (master != -1 && !conn_api.terminate && !terminated) {
+	while (master != -1 && !conn_api.terminate) {
 		if (waitpid(child_pid, &status, WNOHANG))
 			break;
 		pthread_mutex_lock(&(conn_outbuf.mutex));
@@ -372,7 +370,7 @@ pty_output_thread(void *args)
 			wr = conn_buf_get(&conn_outbuf, conn_api.wr_buf, conn_api.wr_buf_size);
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
 			sent = 0;
-			while (master != -1 && sent < wr && !conn_api.terminate && !terminated) {
+			while (master != -1 && sent < wr && !conn_api.terminate) {
 				FD_ZERO(&wds);
 				FD_SET(master, &wds);
 				tv.tv_sec = 0;
@@ -399,7 +397,7 @@ pty_output_thread(void *args)
 		if (ret == -1)
 			break;
 	}
-	terminated = true;
+	conn_api.terminate = true;
 	conn_api.output_thread_running = 2;
 }
 
@@ -564,7 +562,6 @@ pty_connect(struct bbslist *bbs)
 	}
 	conn_api.wr_buf_size = BUFFER_SIZE;
 
-	terminated = false;
 	_beginthread(pty_output_thread, 0, NULL);
 	_beginthread(pty_input_thread, 0, NULL);
 
@@ -578,8 +575,7 @@ pty_close(void)
 	char   garbage[1024];
 	int oldmaster;
 
-	terminated = true;
-	conn_api.terminate = 1;
+	conn_api.terminate = true;
 	start = time(NULL);
 	kill(child_pid, SIGHUP);
 	while (waitpid(child_pid, &status, WNOHANG) == 0) {
diff --git a/src/syncterm/conn_telnet.c b/src/syncterm/conn_telnet.c
index 7ca50c5eac6aeb426279053b80a66cc6497f83cc..680146ca949e5e08d476fa28f4e14f15b6f57a37 100644
--- a/src/syncterm/conn_telnet.c
+++ b/src/syncterm/conn_telnet.c
@@ -149,7 +149,6 @@ telnet_connect(struct bbslist *bbs)
 	conn_api.rx_parse_cb = telnet_rx_parse_cb;
 	conn_api.tx_parse_cb = telnet_tx_parse_cb;
 
-	rlogin_clear_terminated();
 	_beginthread(rlogin_output_thread, 0, NULL);
 	_beginthread(rlogin_input_thread, 0, bbs);
 	// Suppress Go Aheads (both directions)
diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c
index 1d5b214aba3b4e300b927b7f83eaa4bce6294631..3c11e4ecc84179847ae30a9b2425658642265f13 100644
--- a/src/syncterm/modem.c
+++ b/src/syncterm/modem.c
@@ -2,7 +2,6 @@
 
 /* $Id: modem.c,v 1.32 2020/06/27 08:27:39 deuce Exp $ */
 
-#include <stdatomic.h>
 #include <stdbool.h>
 #include <stdlib.h>
 
@@ -17,7 +16,6 @@
 
 static COM_HANDLE com = COM_HANDLE_INVALID;
 static bool seven_bits = false;
-static atomic_bool terminated;
 
 void
 modem_input_thread(void *args)
@@ -33,7 +31,7 @@ modem_input_thread(void *args)
 		if ((comGetModemStatus(com) & COM_DSR) == 0)
 			monitor_dsr = false;
 	}
-	while (com != COM_HANDLE_INVALID && !conn_api.terminate && !terminated) {
+	while (com != COM_HANDLE_INVALID && !conn_api.terminate) {
 		rd = comReadBuf(com, (char *)conn_api.rd_buf, conn_api.rd_buf_size, NULL, 100);
 		// Strip high bits... we *should* check the parity
 		if (seven_bits) {
@@ -41,7 +39,7 @@ modem_input_thread(void *args)
 				conn_api.rd_buf[i] &= 0x7f;
 		}
 		buffered = 0;
-		while (com != COM_HANDLE_INVALID && buffered < rd && !conn_api.terminate && !terminated) {
+		while (com != COM_HANDLE_INVALID && buffered < rd && !conn_api.terminate) {
 			pthread_mutex_lock(&(conn_inbuf.mutex));
 			buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100);
 			buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
@@ -56,7 +54,7 @@ modem_input_thread(void *args)
 				break;
 		}
 	}
-	terminated = true;
+	conn_api.terminate = true;
 	if (args != NULL)
 		comLowerDTR(com);
 	conn_api.input_thread_running = 2;
@@ -77,7 +75,7 @@ modem_output_thread(void *args)
 		if ((comGetModemStatus(com) & COM_DSR) == 0)
 			monitor_dsr = false;
 	}
-	while (com != COM_HANDLE_INVALID && !conn_api.terminate && !terminated) {
+	while (com != COM_HANDLE_INVALID && !conn_api.terminate) {
 		pthread_mutex_lock(&(conn_outbuf.mutex));
 		wr = conn_buf_wait_bytes(&conn_outbuf, 1, 100);
 		if (wr) {
@@ -88,7 +86,7 @@ modem_output_thread(void *args)
 					conn_api.wr_buf[i] &= 0x7f;
 			}
 			sent = 0;
-			while (com != COM_HANDLE_INVALID && sent < wr && !conn_api.terminate && !terminated) {
+			while (com != COM_HANDLE_INVALID && sent < wr && !conn_api.terminate) {
 				// coverity[overflow:SUPPRESS]
 				ret = comWriteBuf(com, conn_api.wr_buf + sent, wr - sent);
 				if (ret > 0)
@@ -109,7 +107,7 @@ modem_output_thread(void *args)
 				break;
 		}
 	}
-	terminated = true;
+	conn_api.terminate = true;
 	conn_api.output_thread_running = 2;
 }
 
@@ -170,7 +168,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Open Port", "`Cannot Open Port`\n\n"
 				    "Cannot open the specified serial device.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			return -1;
 		}
 		if (bbs->bpsrate) {
@@ -178,7 +176,7 @@ modem_connect(struct bbslist *bbs)
 				if (!bbs->hidepopups)
 					uifcmsg("Cannot Set Baud Rate", "`Cannot Set Baud Rate`\n\n"
 					    "Cannot open the specified serial device.\n");
-				conn_api.terminate = -1;
+				conn_api.terminate = true;
 				comClose(com);
 				return -1;
 			}
@@ -187,7 +185,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Set Parity", "`Cannot Set Parity`\n\n"
 				    "Cannot open the specified serial device.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			comClose(com);
 			return -1;
 		}
@@ -195,7 +193,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Set Data Bits", "`Cannot Set Data Bits`\n\n"
 				    "Cannot open the specified serial device.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			comClose(com);
 			return -1;
 		}
@@ -213,7 +211,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Raise DTR", "`Cannot Raise DTR`\n\n"
 				    "comRaiseDTR() returned an error.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			comClose(com);
 			return -1;
 		}
@@ -223,7 +221,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Open Modem", "`Cannot Open Modem`\n\n"
 				    "Cannot open the specified modem device.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			return -1;
 		}
 		if (settings.mdm.com_rate) {
@@ -231,7 +229,7 @@ modem_connect(struct bbslist *bbs)
 				if (!bbs->hidepopups)
 					uifcmsg("Cannot Set Baud Rate", "`Cannot Set Baud Rate`\n\n"
 					    "Cannot open the specified modem device.\n");
-				conn_api.terminate = -1;
+				conn_api.terminate = true;
 				comClose(com);
 				return -1;
 			}
@@ -240,7 +238,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Set Parity", "`Cannot Set Parity`\n\n"
 				    "Cannot open the specified serial device.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			comClose(com);
 			return -1;
 		}
@@ -248,7 +246,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Set Data Bits", "`Cannot Set Data Bits`\n\n"
 				    "Cannot open the specified serial device.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			comClose(com);
 			return -1;
 		}
@@ -265,7 +263,7 @@ modem_connect(struct bbslist *bbs)
 			if (!bbs->hidepopups)
 				uifcmsg("Cannot Raise DTR", "`Cannot Raise DTR`\n\n"
 				    "comRaiseDTR() returned an error.\n");
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			comClose(com);
 			return -1;
 		}
@@ -297,7 +295,7 @@ modem_connect(struct bbslist *bbs)
 						    "Check your init string and phone number.\n");
 					}
 				}
-				conn_api.terminate = -1;
+				conn_api.terminate = true;
 				return -1;
 			}
 			if (strstr(respbuf, settings.mdm.init_string)) /* Echo is on */
@@ -312,7 +310,7 @@ modem_connect(struct bbslist *bbs)
 				uifcmsg(respbuf, "`Initialization Error`\n\n"
 				    "The modem did not respond favorably to your initialization string.\n");
 			}
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			return -1;
 		}
 
@@ -334,7 +332,7 @@ modem_connect(struct bbslist *bbs)
 						uifcmsg(respbuf, "`No Answer`\n\n"
 						    "The modem did not connect within 60 seconds.\n");
 				}
-				conn_api.terminate = -1;
+				conn_api.terminate = true;
 				return -1;
 			}
 			if (strstr(respbuf, bbs->addr)) /* Dial command echoed */
@@ -349,7 +347,7 @@ modem_connect(struct bbslist *bbs)
 				uifcmsg(respbuf, "`Connection Failed`\n\n"
 				    "SyncTERM was unable to establish a connection.\n");
 			}
-			conn_api.terminate = -1;
+			conn_api.terminate = true;
 			return -1;
 		}
 
@@ -386,7 +384,6 @@ modem_connect(struct bbslist *bbs)
 	}
 	conn_api.wr_buf_size = BUFFER_SIZE;
 
-	terminated = false;
 	if ((bbs->conn_type == CONN_TYPE_SERIAL) || (bbs->conn_type == CONN_TYPE_SERIAL_NORTS)) {
 		_beginthread(modem_output_thread, 0, (void *)-1);
 		_beginthread(modem_input_thread, 0, (void *)-1);
@@ -405,7 +402,7 @@ modem_connect(struct bbslist *bbs)
 int
 serial_close(void)
 {
-	conn_api.terminate = 1;
+	conn_api.terminate = true;
 
 	while (conn_api.input_thread_running == 1 || conn_api.output_thread_running == 1)
 		SLEEP(1);
@@ -424,8 +421,7 @@ modem_close(void)
 	char   garbage[1024];
 	COM_HANDLE oldcom;
 
-	terminated = true;
-	conn_api.terminate = 1;
+	conn_api.terminate = true;
 
 	if ((comGetModemStatus(com) & COM_DCD) == 0) /* DCD already low */
 		goto CLOSEIT;
diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index d5523083cbf483a57c32a3611a02e6d4022124f1..5573e7a4d5c01d23e88800716ccd59ac773bbbc8 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -2,7 +2,6 @@
 
 /* $Id: rlogin.c,v 1.38 2020/06/27 00:04:50 deuce Exp $ */
 
-#include <stdatomic.h>
 #include <stdlib.h>
 
 #include "bbslist.h"
@@ -11,12 +10,6 @@
 #include "uifcinit.h"
 
 SOCKET rlogin_sock = INVALID_SOCKET;
-static bool terminated;
-
-void rlogin_clear_terminated(void)
-{
-	terminated = false;
-}
 
 #ifdef __BORLANDC__
  #pragma argsused
@@ -31,13 +24,13 @@ rlogin_input_thread(void *args)
 
 	SetThreadName("RLogin Input");
 	conn_api.input_thread_running = 1;
-	while (rlogin_sock != INVALID_SOCKET && !conn_api.terminate && !terminated) {
+	while (rlogin_sock != INVALID_SOCKET && !conn_api.terminate) {
 		if (socket_readable(rlogin_sock, 100)) {
 			rd = recv(rlogin_sock, conn_api.rd_buf, conn_api.rd_buf_size, 0);
 			if (rd <= 0)
 				break;
 			buffered = 0;
-			while (rlogin_sock != INVALID_SOCKET && buffered < rd && !conn_api.terminate && !terminated) {
+			while (rlogin_sock != INVALID_SOCKET && buffered < rd && !conn_api.terminate) {
 				pthread_mutex_lock(&(conn_inbuf.mutex));
 				buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 1000);
 				buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
@@ -45,7 +38,7 @@ rlogin_input_thread(void *args)
 			}
 		}
 	}
-	terminated = true;
+	conn_api.terminate = true;
 	conn_api.input_thread_running = 2;
 }
 
@@ -62,7 +55,7 @@ rlogin_output_thread(void *args)
 
 	SetThreadName("RLogin Output");
 	conn_api.output_thread_running = 1;
-	while (rlogin_sock != INVALID_SOCKET && !conn_api.terminate && !terminated) {
+	while (rlogin_sock != INVALID_SOCKET && !conn_api.terminate) {
 		pthread_mutex_lock(&(conn_outbuf.mutex));
 		ret = 0;
 		wr = conn_buf_wait_bytes(&conn_outbuf, 1, 100);
@@ -70,7 +63,7 @@ rlogin_output_thread(void *args)
 			wr = conn_buf_get(&conn_outbuf, conn_api.wr_buf, conn_api.wr_buf_size);
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
 			sent = 0;
-			while (rlogin_sock != INVALID_SOCKET && sent < wr && !conn_api.terminate && !terminated) {
+			while (rlogin_sock != INVALID_SOCKET && sent < wr && !conn_api.terminate) {
 				if (socket_writable(rlogin_sock, 100)) {
 					// coverity[overflow:SUPPRESS]
 					ret = sendsocket(rlogin_sock, conn_api.wr_buf + sent, wr - sent);
@@ -87,7 +80,7 @@ rlogin_output_thread(void *args)
 		if (ret < 0)
 			break;
 	}
-	terminated = true;
+	conn_api.terminate = true;
 	conn_api.output_thread_running = 2;
 }
 
@@ -208,7 +201,6 @@ rlogin_connect(struct bbslist *bbs)
 			return -1;
 	}
 
-	terminated = false;
 	_beginthread(rlogin_output_thread, 0, NULL);
 	_beginthread(rlogin_input_thread, 0, NULL);
 
@@ -224,8 +216,7 @@ rlogin_close(void)
 	char garbage[1024];
 	SOCKET oldsock;
 
-	terminated = true;
-	conn_api.terminate = 1;
+	conn_api.terminate = true;
 	oldsock = rlogin_sock;
 	rlogin_sock = INVALID_SOCKET;
 	while (conn_api.input_thread_running == 1 || conn_api.output_thread_running == 1) {
diff --git a/src/syncterm/rlogin.h b/src/syncterm/rlogin.h
index b4574eb94479d79ef402461a1b26631ce0a25363..e7fc52640aeeed97214a47ece11081bd0de1d01d 100644
--- a/src/syncterm/rlogin.h
+++ b/src/syncterm/rlogin.h
@@ -2,7 +2,6 @@
 
 #ifndef _RLOGIN_H_
 #define _RLOGIN_H_
-void rlogin_clear_terminated(void);
 int rlogin_connect(struct bbslist *bbs);
 int rlogin_close(void);
 void rlogin_input_thread(void *args);
diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c
index 59f5aff6918a13f344bf7ce395cdac0054f9adac..c01e98d650dea3c6374af03bf5814bbf053fd432 100644
--- a/src/syncterm/ssh.c
+++ b/src/syncterm/ssh.c
@@ -32,7 +32,6 @@ SOCKET          ssh_sock = INVALID_SOCKET;
 CRYPT_SESSION   ssh_session;
 int             ssh_channel = -1;
 atomic_bool     ssh_active;
-atomic_bool     ssh_complete;
 pthread_mutex_t ssh_mutex;
 pthread_mutex_t ssh_tx_mutex;
 int             sftp_channel = -1;
@@ -64,7 +63,7 @@ FlushData(CRYPT_SESSION sess)
 {
 	int ret = cryptFlushData(sess);
 	if (ret == CRYPT_ERROR_COMPLETE || ret == CRYPT_ERROR_READ)
-		ssh_complete = true;
+		conn_api.terminate = true;
 	return ret;
 }
 
@@ -75,7 +74,7 @@ PopData(CRYPT_HANDLE e, void *buf, int len, int *copied)
 	int ret = cryptPopData(e, buf, len, copied);
 	cryptSetAttribute(ssh_session, CRYPT_OPTION_NET_READTIMEOUT, 30);
 	if (ret == CRYPT_ERROR_COMPLETE || ret == CRYPT_ERROR_READ)
-		ssh_complete = true;
+		conn_api.terminate = true;
 	return ret;
 }
 
@@ -84,7 +83,7 @@ PushData(CRYPT_HANDLE e, void *buf, int len, int *copied)
 {
 	int ret = cryptPushData(e, buf, len, copied);
 	if (ret == CRYPT_ERROR_COMPLETE || ret == CRYPT_ERROR_WRITE)
-		ssh_complete = true;
+		conn_api.terminate = true;
 	return ret;
 }
 
@@ -192,12 +191,12 @@ ssh_input_thread(void *args)
 
 	SetThreadName("SSH Input");
 	conn_api.input_thread_running = 1;
-	while (ssh_active && !conn_api.terminate && !ssh_complete) {
+	while (ssh_active && !conn_api.terminate) {
 		sftp_do_finish = false;
 		pthread_mutex_lock(&ssh_mutex);
 		if (FlushData(ssh_session) == CRYPT_ERROR_COMPLETE) {
 			pthread_mutex_unlock(&ssh_mutex);
-			ssh_complete = true;
+			conn_api.terminate = true;
 			break;
 		}
 		if (ssh_channel != -1) {
@@ -215,7 +214,7 @@ ssh_input_thread(void *args)
 		}
 		pthread_mutex_unlock(&ssh_mutex);
 		if (both_gone) {
-			ssh_complete = true;
+			conn_api.terminate = true;
 			break;
 		}
 		if (sftp_do_finish) {
@@ -228,7 +227,7 @@ ssh_input_thread(void *args)
 		pthread_mutex_lock(&ssh_mutex);
 		if (FlushData(ssh_session) == CRYPT_ERROR_COMPLETE) {
 			pthread_mutex_unlock(&ssh_mutex);
-			ssh_complete = true;
+			conn_api.terminate = true;
 			break;
 		}
 
@@ -247,7 +246,7 @@ ssh_input_thread(void *args)
 		}
 		if (ssh_channel == -1 && sftp_channel == -1) {
 			pthread_mutex_unlock(&ssh_mutex);
-			ssh_complete = true;
+			conn_api.terminate = true;
 			break;
 		}
 
@@ -316,7 +315,7 @@ ssh_input_thread(void *args)
 				pthread_mutex_unlock(&ssh_mutex);
 				if (rd > 0) {
 					buffered = 0;
-					while (buffered < rd && ssh_active && !ssh_complete && !conn_api.terminate) {
+					while (buffered < rd && ssh_active && !conn_api.terminate) {
 						pthread_mutex_lock(&(conn_inbuf.mutex));
 						buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100);
 						buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
@@ -344,7 +343,7 @@ ssh_output_thread(void *args)
 	SetThreadName("SSH Output");
 	conn_api.output_thread_running = 1;
 	// coverity[thread1_checks_field:SUPPRESS]
-	while (ssh_active && !conn_api.terminate && !channel_gone && !ssh_complete) {
+	while (ssh_active && !conn_api.terminate && !channel_gone) {
 		pthread_mutex_lock(&(conn_outbuf.mutex));
 		wr = conn_buf_wait_bytes(&conn_outbuf, 1, 100);
 		if (wr) {
@@ -352,12 +351,12 @@ ssh_output_thread(void *args)
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
 			sent = 0;
 			pthread_mutex_lock(&ssh_tx_mutex);
-			while (sent < wr && ssh_active && !conn_api.terminate && !channel_gone && !ssh_complete) {
+			while (sent < wr && ssh_active && !conn_api.terminate && !channel_gone) {
 				ret = 0;
 				pthread_mutex_lock(&ssh_mutex);
 				if (ssh_channel == -1) {
 					pthread_mutex_unlock(&ssh_mutex);
-					ssh_complete = true;
+					conn_api.terminate = true;
 					channel_gone = true;
 					break;
 				}
@@ -370,8 +369,8 @@ ssh_output_thread(void *args)
 				}
 				if (cryptStatusError(status)) {
 					pthread_mutex_unlock(&ssh_mutex);
-					if (!ssh_complete) {
-						ssh_complete = true;
+					if (!conn_api.terminate) {
+						conn_api.terminate = true;
 						if ((status != CRYPT_ERROR_COMPLETE) && (status != CRYPT_ERROR_NOTFOUND)) /* connection closed */
 							cryptlib_error_message(status, "sending data");
 					}
@@ -399,7 +398,7 @@ sftp_send(uint8_t *buf, size_t sz, void *cb_data)
 	if (sz == 0)
 		return true;
 	pthread_mutex_lock(&ssh_tx_mutex);
-	while (ssh_active && sent < sz && !ssh_complete) {
+	while (ssh_active && sent < sz && !conn_api.terminate) {
 		int status;
 		int ret = 0;
 		pthread_mutex_lock(&ssh_mutex);
@@ -414,7 +413,7 @@ sftp_send(uint8_t *buf, size_t sz, void *cb_data)
 		pthread_mutex_unlock(&ssh_mutex);
 		if (cryptStatusError(status)) {
 			if (status != CRYPT_ERROR_COMPLETE && status != CRYPT_ERROR_NOTFOUND) { /* connection closed */
-				if (!ssh_complete)
+				if (!conn_api.terminate)
 					cryptlib_error_message(status, "sending sftp data");
 			}
 			break;
@@ -472,7 +471,7 @@ key_not_present(sftp_filehandle_t f, const char *priv)
 	sftp_str_t r = NULL;
 	bool skipread = false;
 
-	while (ssh_active && !ssh_complete) {
+	while (ssh_active && !conn_api.terminate) {
 		if (skipread) {
 			old_bufpos = 0;
 			skipread = false;
@@ -545,7 +544,7 @@ add_public_key(void *vpriv)
 			}
 		}
 		pthread_mutex_unlock(&ssh_mutex);
-		if (ssh_complete || !ssh_active)
+		if (conn_api.terminate || !ssh_active)
 			break;
 		SLEEP(10);
 	};
@@ -633,7 +632,7 @@ add_public_key(void *vpriv)
 		 * To avoid that, we'll sleep for a second to allow
 		 * the remote to close the channel if it wants to.
 		 */
-		for (unsigned sleep_count = 0; sleep_count < 100 && conn_api.terminate == 0 && ssh_active && !ssh_complete; sleep_count++) {
+		for (unsigned sleep_count = 0; sleep_count < 100 && !conn_api.terminate && ssh_active; sleep_count++) {
 			SLEEP(10);
 		}
 		pthread_mutex_lock(&ssh_tx_mutex);
@@ -687,7 +686,7 @@ error_popup(struct bbslist *bbs, const char *blurb, int status)
 {
 	if (!bbs->hidepopups)
 		cryptlib_error_message(status, blurb);
-	conn_api.terminate = 1;
+	conn_api.terminate = true;
 	if (!bbs->hidepopups)
 		uifc.pop(NULL);
 }
@@ -784,7 +783,6 @@ ssh_connect(struct bbslist *bbs)
 		return -1;
 	}
 	ssh_active = true;
-	ssh_complete = false;
 
 	/* we need to disable Nagle on the socket. */
 	if (setsockopt(ssh_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&off, sizeof(off)))
@@ -1040,8 +1038,7 @@ ssh_close(void)
 {
 	char garbage[1024];
 
-	conn_api.terminate = 1;
-	ssh_complete = true;
+	conn_api.terminate = true;
 	if (ssh_active) {
 		cryptSetAttribute(ssh_session, CRYPT_OPTION_NET_READTIMEOUT, 1);
 		cryptSetAttribute(ssh_session, CRYPT_OPTION_NET_WRITETIMEOUT, 1);
diff --git a/src/syncterm/telnets.c b/src/syncterm/telnets.c
index 8472b3622413f637bd38dd60aa8ec85af6d9c889..f54b9237c58fff401f9f642f7c687d7b8dd66a65 100644
--- a/src/syncterm/telnets.c
+++ b/src/syncterm/telnets.c
@@ -1,12 +1,5 @@
 /* Copyright (C), 2007 by Stephen Hurd */
 
-#ifndef _MSC_VER
-#if defined(__STDC_NO_ATOMICS__)
-#error Support for stdatomic.h is required.
-#endif
-#endif
-
-#include <stdatomic.h>
 #include <stdlib.h>
 
 #include "bbslist.h"
@@ -25,7 +18,6 @@
 
 static SOCKET telnets_sock;
 static CRYPT_SESSION telnets_session;
-static atomic_bool telnets_active = false;
 static pthread_mutex_t telnets_mutex;
 
 static int
@@ -33,7 +25,7 @@ FlushData(CRYPT_SESSION sess)
 {
 	int ret = cryptFlushData(sess);
 	if (ret == CRYPT_ERROR_COMPLETE || ret == CRYPT_ERROR_READ)
-		telnets_active = false;
+		conn_api.terminate = true;
 	return ret;
 }
 
@@ -42,7 +34,7 @@ PopData(CRYPT_HANDLE e, void *buf, int len, int *copied)
 {
 	int ret = cryptPopData(e, buf, len, copied);
 	if (ret == CRYPT_ERROR_COMPLETE || ret == CRYPT_ERROR_READ)
-		telnets_active = false;
+		conn_api.terminate = true;
 	return ret;
 }
 
@@ -51,7 +43,7 @@ PushData(CRYPT_HANDLE e, void *buf, int len, int *copied)
 {
 	int ret = cryptPushData(e, buf, len, copied);
 	if (ret == CRYPT_ERROR_COMPLETE)
-		telnets_active = false;
+		conn_api.terminate = true;
 	return ret;
 }
 
@@ -64,7 +56,7 @@ telnets_input_thread(void *args)
 	size_t buffer;
 	SetThreadName("TelnetS Input");
 	conn_api.input_thread_running = 1;
-	while (telnets_active && !conn_api.terminate) {
+	while (!conn_api.terminate) {
 		if (!socket_readable(telnets_sock, 100))
 			continue;
 		pthread_mutex_lock(&telnets_mutex);
@@ -75,10 +67,10 @@ telnets_input_thread(void *args)
 		if (status == CRYPT_ERROR_TIMEOUT)
 			continue;
 		if (cryptStatusError(status)) {
-			if (telnets_active) {
+			if (!conn_api.terminate) {
 				if ((status != CRYPT_ERROR_COMPLETE) && (status != CRYPT_ERROR_READ)) /* connection closed */
 					cryptlib_error_message(status, "recieving data");
-				telnets_active = false;
+				conn_api.terminate = true;
 			}
 			break;
 		}
@@ -103,23 +95,23 @@ telnets_output_thread(void *args)
 	int    status;
 	SetThreadName("TelnetS Output");
 	conn_api.output_thread_running = 1;
-	while (telnets_active && !conn_api.terminate) {
+	while (!conn_api.terminate) {
 		pthread_mutex_lock(&(conn_outbuf.mutex));
 		wr = conn_buf_wait_bytes(&conn_outbuf, 1, 100);
 		if (wr) {
 			wr = conn_buf_get(&conn_outbuf, conn_api.wr_buf, conn_api.wr_buf_size);
 			pthread_mutex_unlock(&(conn_outbuf.mutex));
 			sent = 0;
-			while (telnets_active && sent < wr) {
+			while ((!conn_api.terminate) && sent < wr) {
 				pthread_mutex_lock(&telnets_mutex);
 				status = PushData(telnets_session, conn_api.wr_buf + sent, wr - sent, &ret);
 				pthread_mutex_unlock(&telnets_mutex);
 				if (cryptStatusError(status)) {
-					if (telnets_active) {
+					if (!conn_api.terminate) {
 						if (status != CRYPT_ERROR_COMPLETE && status != CRYPT_ERROR_READ) { /* connection closed */
 							cryptlib_error_message(status, "sending data");
 						}
-						telnets_active = false;
+						conn_api.terminate = true;
 					}
 					break;
 				}
@@ -147,7 +139,6 @@ telnets_connect(struct bbslist *bbs)
 	if (!bbs->hidepopups)
 		init_uifc(true, true);
 	pthread_mutex_init(&telnets_mutex, NULL);
-	telnets_active = false;
 
 	telnets_sock = conn_socket_connect(bbs);
 	if (telnets_sock == INVALID_SOCKET)
@@ -205,7 +196,6 @@ telnets_connect(struct bbslist *bbs)
 		return -1;
 	}
 
-	telnets_active = true;
 	if (!bbs->hidepopups) {
                 /* Clear ownership */
 		uifc.pop(NULL); // TODO: Why is this called twice?
@@ -219,7 +209,7 @@ telnets_connect(struct bbslist *bbs)
 		conn_api.terminate = 1;
 		if (!bbs->hidepopups)
 			uifc.pop(NULL);
-		telnets_active = false;
+		conn_api.terminate = true;
 		return -1;
 	}
 	if (!bbs->hidepopups)
@@ -249,7 +239,6 @@ telnets_close(void)
 	char garbage[1024];
 	conn_api.terminate = 1;
 	cryptSetAttribute(telnets_session, CRYPT_SESSINFO_ACTIVE, 0);
-	telnets_active = false;
 	while (conn_api.input_thread_running == 1 || conn_api.output_thread_running == 1) {
 		conn_recv_upto(garbage, sizeof(garbage), 0);
 		SLEEP(1);