diff --git a/src/conio/CMakeLists.txt b/src/conio/CMakeLists.txt
index e3fcefcdc12ea75fd2f951ee317d47a878dda47a..f34bcda15f7a684380d0255359dd526c7825b7fc 100644
--- a/src/conio/CMakeLists.txt
+++ b/src/conio/CMakeLists.txt
@@ -2,8 +2,17 @@ project (ConIOLib C)
 
 cmake_minimum_required(VERSION 3.11)
 
+set(WITHOUT_GDI OFF CACHE BOOL "Disable GDI video support")
+set(WITHOUT_SDL OFF CACHE BOOL "Disable SDL video support")
+set(WITHOUT_X11 OFF CACHE BOOL "Disable X11 video support")
+set(WITHOUT_XRANDR OFF CACHE BOOL "Disable X11 video support")
+set(WITHOUT_XRENDER OFF CACHE BOOL "Disable X11 video support")
+set(WITHOUT_XINERAMA OFF CACHE BOOL "Disable X11 video support")
+
 INCLUDE (CheckFunctionExists)
-find_package(X11)
+if(NOT WITHOUT_X11)
+	find_package(X11)
+endif()
 # So on BSD, this causes the find to fail.  However, it's required for Linux
 # This is because on BSD, ncursesw.h does not exist, but libraries use
 # ncurses.h
@@ -12,12 +21,23 @@ find_package(Threads REQUIRED)
 if(NOT WIN32)
 	find_package(Curses)
 	find_package(PkgConfig)
-	pkg_check_modules(SDL2 sdl2)
-	pkg_check_modules(XRENDER xrender)
-	pkg_check_modules(XINERAMA xinerama)
-	pkg_check_modules(XRANDR xrandr)
+	if(NOT WITHOUT_SDL)
+		pkg_check_modules(SDL2 sdl2)
+	endif()
+	if(NOT WITHOUT_X11)
+		if(NOT WITHOUT_XRENDER)
+			pkg_check_modules(XRENDER xrender)
+		endif()
+		if(NOT WITHOUT_XINERAMA)
+			pkg_check_modules(XINERAMA xinerama)
+		endif()
+		if(NOT WITHOUT_XRANDR)
+			pkg_check_modules(XRANDR xrandr)
+		endif()
+	endif()
 endif()
 
+# TODO: Don't require allfonts.c when building without bitmap support
 set(SOURCE
 	allfonts.c
 	ansi_cio.c
@@ -28,7 +48,6 @@ set(SOURCE
 	syncicon64.c
 	utf8_codepages.c
 	vidmodes.c
-	xbr.c
 )
 
 set(HEADER
@@ -41,7 +60,10 @@ set(HEADER
 )
 
 if(WIN32)
-	list(APPEND SOURCE win32cio.c ciolib.rc)
+	if(NOT WITHOUT_GDI)
+		list(APPEND SOURCE win32cio.c)
+	endif()
+	list(APPEND SOURCE ciolib.rc)
 endif()
 
 if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
@@ -58,25 +80,29 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
 	endif()
 endif()
 
-if(X11_FOUND)
-	list(APPEND SOURCE x_events.c x_cio.c)
-	set(NEED_BITMAP TRUE)
-	set(NEED_DLOPEN TRUE)
-	set(NEED_SCALE TRUE)
+if(NOT WITHOUT_X1!)
+	if(X11_FOUND)
+		list(APPEND SOURCE x_events.c x_cio.c)
+		set(NEED_BITMAP TRUE)
+		set(NEED_DLOPEN TRUE)
+		set(NEED_SCALE TRUE)
+	endif()
 endif()
 
-if(SDL2_INCLUDE_DIRS)
-	list(APPEND SOURCE sdl_con.c)
-	list(APPEND SOURCE sdlfuncs.c)
-	set(NEED_SCALE TRUE)
-	if(WIN32)
-		list(APPEND SOURCE SDL_win32_main.c)
-	endif()
-	if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-		list(APPEND SOURCE SDLMain.m)
+if(NOT WITHOUT_SDL)
+	if(SDL2_FOUND)
+		list(APPEND SOURCE sdl_con.c)
+		list(APPEND SOURCE sdlfuncs.c)
+		set(NEED_SCALE TRUE)
+		if(WIN32)
+			list(APPEND SOURCE SDL_win32_main.c)
+		endif()
+		if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+			list(APPEND SOURCE SDLMain.m)
+		endif()
+		set(NEED_BITMAP TRUE)
+		set(NEED_DLOPEN TRUE)
 	endif()
-	set(NEED_BITMAP TRUE)
-	set(NEED_DLOPEN TRUE)
 endif()
 
 if(NEED_BITMAP)
@@ -84,7 +110,7 @@ if(NEED_BITMAP)
 endif()
 
 if(NEED_SCALE)
-	list(APPEND SOURCE scale.c)
+	list(APPEND SOURCE scale.c xbr.c)
 endif()
 
 add_library(ciolib OBJECT ${SOURCE})
@@ -96,28 +122,48 @@ if(CURSES_FOUND)
 	endif()
 endif()
 
-if(X11_FOUND)
-	target_include_directories(ciolib PRIVATE ${X11_INCLUDE_DIR})
-	if(XRENDER_FOUND)
-		target_compile_definitions(ciolib PUBLIC WITH_XRENDER)
-	endif()
-	if(XINERAMA_FOUND)
-		target_compile_definitions(ciolib PUBLIC WITH_XINERAMA)
-	endif()
-	if(XRANDR_FOUND)
-		target_compile_definitions(ciolib PUBLIC WITH_XRANDR)
-	endif()
-else()
+if(WITHOUT_X11)
 	target_compile_definitions(ciolib PRIVATE NO_X)
+	target_compile_definitions(ciolib PUBLIC DISABLE_X11=1)
+else()
+	if(X11_FOUND)
+		target_include_directories(ciolib PRIVATE ${X11_INCLUDE_DIR})
+		if(NOT WITHOUT_XRENDER)
+			if(XRENDER_FOUND)
+				target_compile_definitions(ciolib PUBLIC WITH_XRENDER)
+			endif()
+		endif()
+		if(NOT WITHOUT_XINERAMA)
+			if(XINERAMA_FOUND)
+				target_compile_definitions(ciolib PUBLIC WITH_XINERAMA)
+			endif()
+		endif()
+		if(NOT WITHOUT_XRANDR)
+			if(XRANDR_FOUND)
+				target_compile_definitions(ciolib PUBLIC WITH_XRANDR)
+			endif()
+		endif()
+	else()
+		target_compile_definitions(ciolib PRIVATE NO_X)
+		target_compile_definitions(ciolib PUBLIC DISABLE_X11=1)
+		message(WARNING "libx11 not found, X11 support disabled")
+		set(WITHOUT_X11 ON CACHE BOOL "Disable X11 video support")
+	endif()
 endif()
 
-if(SDL2_INCLUDE_DIRS)
-	target_include_directories(ciolib PUBLIC ${SDL2_INCLUDE_DIRS})
-	set(WITH_SDL TRUE PARENT_SCOPE)
-	target_compile_definitions(ciolib PUBLIC WITH_SDL)
+if(NOT WITHOUT_SDL)
+	if(SDL2_FOUND)
+		target_include_directories(ciolib PUBLIC ${SDL2_INCLUDE_DIRS})
+		set(WITH_SDL TRUE PARENT_SCOPE)
+		target_compile_definitions(ciolib PUBLIC WITH_SDL)
+	endif()
 endif()
 
-if(NOT WIN32)
+if(WIN32)
+	if(NOT WITHOUT_GDI)
+		target_compile_definitions(ciolib PUBLIC WITH_GDI)
+	endif()
+else()
 	target_link_libraries(ciolib pthread)
 endif()
 
diff --git a/src/syncterm/CMakeLists.txt b/src/syncterm/CMakeLists.txt
index 17711321e2c834ca4c65dc9e08777ad587406c52..59c461c9f72aaccc3acdf1c1e8377ca6573e03ed 100644
--- a/src/syncterm/CMakeLists.txt
+++ b/src/syncterm/CMakeLists.txt
@@ -1,6 +1,9 @@
 cmake_minimum_required(VERSION 3.5)
 project (SyncTERM C)
 
+set(WITHOUT_CRYPTLIB OFF CACHE BOOL "Disable cryptlib (ssh and telnet over TLS")
+set(WITHOUT_OOII OFF CACHE BOOL "Disable Operation Overkill ][ Terminal")
+
 # CPack stuff...
 set(CPACK_PACKAGE_NAME SyncTERM)
 set(CPACK_PACKAGE_VENDOR Deuce)
@@ -30,17 +33,10 @@ set(SOURCE
 	fonts.c
 	menu.c
 	modem.c
-	ooii.c
-	ooii_bmenus.c
-	ooii_cmenus.c
-	ooii_logons.c
-	ooii_sounds.c
 	ripper.c
 	rlogin.c
-	ssh.c
 	syncterm.c
 	telnet_io.c
-	telnets.c
 	term.c
 	uifcinit.c
 	window.c
@@ -54,7 +50,8 @@ if(NOT WIN32)
 		NAMES gmake make
 	)
 	if(${3RDP_GNU_MAKE} STREQUAL "3RDP_GNU_MAKE-NOTFOUND")
-		set(WITHOUT_CRYPTLIB 1)
+		set(WITHOUT_CRYPTLIB ON CACHE BOOL "Disable cryptlib (ssh and telnet over TLS" FORCE)
+		message(WARNING "GNU Make not found, cannot build cryptlib")
 	else()
 		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
 			set(BUILD_TYPE_FLAG DEBUG=1)
@@ -79,13 +76,26 @@ if(NOT WIN32)
 	endif()
 endif()
 
+if(NOT WITHOUT_OOII)
+	list(APPEND SOURCE ooii.c ooii_bmenus.c ooii_cmenus.c ooii_logons.c ooii_sounds.c)
+endif()
+
+if(NOT WITHOUT_CRYPTLIB)
+	list(APPEND SOURCE ssh.c telnets.c)
+	if(WIN32)
+		find_library(3RDP_CRYPTLIB_LIB cl32 PATHS ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/win32.release/cryptlib/bin NO_DEFAULT_PATH)
+	endif()
+endif()
+
 add_executable(syncterm ${SOURCE})
 require_libs(syncterm ciolib comio encode hash sftp uifc xpdev)
+if(WITHOUT_OOII)
+	target_compile_definitions(syncterm PRIVATE WITHOUT_OOII=1)
+endif()
 if(WITHOUT_CRYPTLIB)
 	target_compile_definitions(syncterm PRIVATE WITHOUT_CRYPTLIB)
 else()
 	if(WIN32)
-		find_library(3RDP_CRYPTLIB_LIB cl32 PATHS ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/win32.release/cryptlib/bin NO_DEFAULT_PATH)
 		target_include_directories(syncterm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/win32.release/cryptlib/include)
 		target_link_libraries(syncterm ${3RDP_CRYPTLIB_LIB})
 	else()
diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c
index 7f5ce49b79b5cf5e6cf3160bc2daeec1a028ac83..8cb94997cb9ccaac1fc503ab62bee5ee02d47320 100644
--- a/src/syncterm/bbslist.c
+++ b/src/syncterm/bbslist.c
@@ -3388,8 +3388,7 @@ show_bbslist(char *current, int connected)
 						    "    %s SDL\n"
 						    "    %s ALSA\n"
 						    "    %s PortAudio\n"
-						    "    %s PulseAudio\n"
-						    "    %s PC Speaker\n",
+						    "    %s PulseAudio\n",
 #ifdef WITHOUT_CRYPTLIB
 						    "[ ]",
 #else
@@ -3451,13 +3450,6 @@ show_bbslist(char *current, int connected)
 						    "[ ]",
 #endif
 #ifdef WITH_PULSEAUDIO
-						    "[`\xFB`]",
-#else
-						    "[ ]",
-#endif
-#if (defined(__FreeBSD__) && defined(HAS_MACHINE_SPEAKER_H)) || ((defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H))
-						    "[`\xFB`]"
-#elif !defined(__GNU__) && !defined(__QNX__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(__CYGWIN__) && !defined(__HAIKU__) && !defined(__EMSCRIPTEN__)
 						    "[`\xFB`]"
 #else
 						    "[ ]"
diff --git a/src/xpdev/CMakeLists.txt b/src/xpdev/CMakeLists.txt
index c1aca0bc167b9b8d9a91be256eec17d88848aba5..8e6aac0359a64a6216abf613cf69edebdcea1366 100644
--- a/src/xpdev/CMakeLists.txt
+++ b/src/xpdev/CMakeLists.txt
@@ -2,15 +2,26 @@ project (XPDev C)
 
 cmake_minimum_required(VERSION 3.11)
 
+set(WITHOUT_OSS OFF CACHE BOOL "Disable OSS Audio")
+set(WITHOUT_SDL_AUDIO OFF CACHE BOOL "Disable SDL Audio")
+set(WITHOUT_ALSA OFF CACHE BOOL "Disable ALSA Audio")
+set(WITHOUT_PORTAUDIO OFF CACHE BOOL "Disable PortAudio Audio")
+set(WITHOUT_PULSEAUDIO OFF CACHE BOOL "Disable PulseAudio Audio")
+
 INCLUDE (CheckIncludeFiles)
 INCLUDE (CheckFunctionExists)
 find_package(Threads)
-find_package(X11)
 if(NOT WIN32)
 	find_package(PkgConfig)
-	pkg_check_modules(SDL2 sdl2)
-	pkg_check_modules(PULSEAUDIO libpulse-simple)
-	pkg_check_modules(ALSA alsa)
+	if(NOT WITHOUT_SDL_AUDIO)
+		pkg_check_modules(SDL2 sdl2)
+	endif()
+	if(NOT WITHOUT_PULSEAUDIO)
+		pkg_check_modules(PULSEAUDIO libpulse-simple)
+	endif()
+	if(NOT WITHOUT_ALSA)
+		pkg_check_modules(ALSA alsa)
+	endif()
 endif()
 
 set(SOURCE
@@ -78,16 +89,18 @@ set(HEADER
 
 if(NOT WIN32)
 	list(APPEND SOURCE xpevent.c)
-    list(APPEND SOURCE xpsem.c)
+	list(APPEND SOURCE xpsem.c)
 endif()
 
-if(SDL2_INCLUDE_DIRS)
-	list(APPEND SOURCE sdlfuncs.c)
-	if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-		list(APPEND SOURCE SDLMain.m)
-	endif()
-	if(WIN32)
-		list(APPEND SOURCE SDL_win32_main.c)
+if(NOT WITHOUT_SDL_AUDIO)
+	if(SDL2_INCLUDE_DIRS)
+		list(APPEND SOURCE sdlfuncs.c)
+		if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+			list(APPEND SOURCE SDLMain.m)
+		endif()
+		if(WIN32)
+			list(APPEND SOURCE SDL_win32_main.c)
+		endif()
 	endif()
 endif()
 
@@ -106,28 +119,32 @@ if(HAS_STDINT_H)
     target_compile_definitions(xpdev PUBLIC HAS_STDINT_H)
 endif()
 
-CHECK_INCLUDE_FILES(sys/soundcard.h HAS_SYS_SOUNDCARD_H) 
-CHECK_INCLUDE_FILES(soundcard.h HAS_SOUNDCARD_H) 
-CHECK_INCLUDE_FILES(linux/inttypes.h HAS_LINUX_SOUNDCARD_H) 
-if(HAS_SYS_SOUNDCARD_H)
-    target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=1)
-elseif(HAS_SOUNDCARD_H)
-    target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=2)
-elseif(HAS_LINUX_SOUNDCARD_H)
-    target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=3)
+if(NOT WITHOUT_OSS)
+	CHECK_INCLUDE_FILES(sys/soundcard.h HAS_SYS_SOUNDCARD_H) 
+	CHECK_INCLUDE_FILES(soundcard.h HAS_SOUNDCARD_H) 
+	CHECK_INCLUDE_FILES(linux/soundcard.h HAS_LINUX_SOUNDCARD_H) 
+	if(HAS_SYS_SOUNDCARD_H)
+		target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=1)
+	elseif(HAS_SOUNDCARD_H)
+		target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=2)
+	elseif(HAS_LINUX_SOUNDCARD_H)
+		target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=3)
+	else()
+		target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=0)
+	endif()
 endif()
 
 CHECK_INCLUDE_FILES(dev/speaker/speaker.h HAS_DEV_SPEAKER_SPEAKER_H)
 if(HAS_DEV_SPEAKER_SPEAKER_H)
 	target_compile_definitions(xpdev PRIVATE HAS_DEV_SPEAKER_SPEAKER_H)
 endif()
-CHECK_INCLUDE_FILES(dev/machine/speaker.h HAS_DEV_MACHINE_SPEAKER_H)
-if(HAS_DEV_MACHINE_SPEAKER_H)
-	target_compile_definitions(xpdev PRIVATE HAS_DEV_MACHINE_SPEAKER_H)
+CHECK_INCLUDE_FILES(dev/machine/speaker.h HAS_MACHINE_SPEAKER_H)
+if(HAS_MACHINE_SPEAKER_H)
+	target_compile_definitions(xpdev PRIVATE HAS_MACHINE_SPEAKER_H)
 endif()
-CHECK_INCLUDE_FILES(dev/speaker/spkr.h HAS_DEV_MACHINE_SPKR_H)
-if(HAS_DEV_MACHINE_SPKR_H)
-	target_compile_definitions(xpdev PRIVATE HAS_DEV_MACHINE_SPKR_H)
+CHECK_INCLUDE_FILES(dev/speaker/spkr.h HAS_MACHINE_SPKR_H)
+if(HAS_MACHINE_SPKR_H)
+	target_compile_definitions(xpdev PRIVATE HAS_MACHINE_SPKR_H)
 endif()
 
 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
@@ -140,9 +157,15 @@ if(WIN32)
 elseif(CMAKE_SYSTEM_NAME STREQUAL "Haiku")
 	target_link_libraries(xpdev network m)
 elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
-	target_link_libraries(xpdev ossaudio m)
+	target_link_libraries(xpdev m)
+	if(NOT WITHOUT_OSS)
+		target_link_libraries(ossaudio)
+	endif()
 elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
-	target_link_libraries(xpdev ossaudio m)
+	target_link_libraries(xpdev m)
+	if(NOT WITHOUT_OSS)
+		target_link_libraries(ossaudio)
+	endif()
 elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
 	target_link_libraries(xpdev socket m)
 else()
@@ -167,46 +190,52 @@ if(HAS_SRANDOMDEV_FUNC)
 	target_compile_definitions(xpdev PRIVATE HAS_SRANDOMDEV_FUNC)
 endif()
 
-if(SDL2_INCLUDE_DIRS)
-	target_include_directories(xpdev PUBLIC ${SDL2_INCLUDE_DIRS})
-	set(WITH_SDL_AUDIO TRUE PARENT_SCOPE)
-	target_compile_definitions(xpdev PUBLIC WITH_SDL_AUDIO)
-endif()
-
-if(X11_FOUND)
-	target_include_directories(xpdev PRIVATE ${X11_INCLUDE_DIR})
+if(NOT WITHOUT_SDL_AUDIO)
+	if(SDL2_FOUND)
+		target_include_directories(xpdev PUBLIC ${SDL2_INCLUDE_DIRS})
+		set(WITH_SDL_AUDIO TRUE PARENT_SCOPE)
+		target_compile_definitions(xpdev PUBLIC WITH_SDL_AUDIO)
+	endif()
 endif()
 
 if (PKG_CONFIG_FOUND)
-	pkg_check_modules(PORTAUDIO2 portaudio-2.0)
-	if(PORTAUDIO2_FOUND)
-		set(PORTAUDIO_FOUND TRUE)
-		set(PORTAUDIO_LIBS PORTAUDIO2_LIBS)
-		set(PORTAUDIO_CFLAGS PORTAUDIO2_CFLAGS)
-	else()
-		find_path(PORTAUDIO_INCLUDEDIR portaudio.h)
-		if(PORTAUDIO_INCLUDEDIR)
+	if(NOT WITHOUT_PORTAUDIO)
+		pkg_check_modules(PORTAUDIO2 portaudio-2.0)
+		if(PORTAUDIO2_FOUND)
 			set(PORTAUDIO_FOUND TRUE)
+			set(PORTAUDIO_LIBS PORTAUDIO2_LIBS)
+			set(PORTAUDIO_CFLAGS PORTAUDIO2_CFLAGS)
+		else()
+			find_path(PORTAUDIO_INCLUDEDIR portaudio.h)
+			if(PORTAUDIO_INCLUDEDIR)
+				set(PORTAUDIO_FOUND TRUE)
+			endif()
 		endif()
 	endif()
 endif()
 
-if(PORTAUDIO_FOUND)
-	target_include_directories(xpdev PRIVATE ${PORTAUDIO_INCLUDEDIR})
-	target_compile_definitions(xpdev PUBLIC WITH_PORTAUDIO)
+if(NOT WITHOUT_PORTAUDIO)
+	if(PORTAUDIO_FOUND)
+		target_include_directories(xpdev PRIVATE ${PORTAUDIO_INCLUDEDIR})
+		target_compile_definitions(xpdev PUBLIC WITH_PORTAUDIO)
+	endif()
 endif()
 
-if(PULSEAUDIO_FOUND)
-	target_include_directories(xpdev PUBLIC ${PULSEAUDIO_INCLUDE_DIRS})
-	target_compile_definitions(xpdev PUBLIC WITH_PULSEAUDIO)
+if(NOT WITHOUT_PULSEAUDIO)
+	if(PULSEAUDIO_FOUND)
+		target_include_directories(xpdev PUBLIC ${PULSEAUDIO_INCLUDE_DIRS})
+		target_compile_definitions(xpdev PUBLIC WITH_PULSEAUDIO)
+	endif()
 endif()
 
-if(ALSA_FOUND)
-	target_include_directories(xpdev PUBLIC ${ALSA_INCLUDE_DIRS})
-	target_compile_definitions(xpdev PUBLIC USE_ALSA_SOUND)
-else()
-	CHECK_INCLUDE_FILES(alsa/asoundlib.h USE_ALSA_SOUND)
-	if(USE_ALSA_SOUND)
+if(NOT WITHOUT_ALSA)
+	if(ALSA_FOUND)
+		target_include_directories(xpdev PUBLIC ${ALSA_INCLUDE_DIRS})
 		target_compile_definitions(xpdev PUBLIC USE_ALSA_SOUND)
+	else()
+		CHECK_INCLUDE_FILES(alsa/asoundlib.h USE_ALSA_SOUND)
+		if(USE_ALSA_SOUND)
+			target_compile_definitions(xpdev PUBLIC USE_ALSA_SOUND)
+		endif()
 	endif()
 endif()