diff --git a/src/conio/CMakeLists.txt b/src/conio/CMakeLists.txt
index 86a92cac004216802d06654af2572abacb83b8ba..e3fcefcdc12ea75fd2f951ee317d47a878dda47a 100644
--- a/src/conio/CMakeLists.txt
+++ b/src/conio/CMakeLists.txt
@@ -13,6 +13,9 @@ 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)
 endif()
 
 set(SOURCE
@@ -95,6 +98,15 @@ 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()
 	target_compile_definitions(ciolib PRIVATE NO_X)
 endif()
diff --git a/src/syncterm/CMakeLists.txt b/src/syncterm/CMakeLists.txt
index 62cddfb281d6e8744d8e88ae133518d3561602e0..17711321e2c834ca4c65dc9e08777ad587406c52 100644
--- a/src/syncterm/CMakeLists.txt
+++ b/src/syncterm/CMakeLists.txt
@@ -1,7 +1,6 @@
+cmake_minimum_required(VERSION 3.5)
 project (SyncTERM C)
 
-cmake_minimum_required(VERSION 2.8.11)
-
 # CPack stuff...
 set(CPACK_PACKAGE_NAME SyncTERM)
 set(CPACK_PACKAGE_VENDOR Deuce)
@@ -23,61 +22,82 @@ INCLUDE(CPack)
 INCLUDE (../build/SynchronetMacros.cmake)
 INCLUDE (CheckIncludeFiles)
 
-set(SOURCE
-	uifc32.c
-	uifcx.c
-)
-
 set(SOURCE
 	bbslist.c
-	uifcinit.c
-	../uifc/filepick.c
+	conn.c
+	conn_pty.c
+	conn_telnet.c
 	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
-	conn_telnet.c
-	conn.c
-	../sbbs3/telnet.c
+	telnets.c
 	term.c
+	uifcinit.c
 	window.c
-	menu.c
-	../smblib/crc16.c
-	../smblib/crc32.c
+	../sbbs3/telnet.c
 	../sbbs3/zmodem.c
 	../sbbs3/xmodem.c
-	syncterm.c
-	ooii.c
-	ooii_logons.c
-	ooii_cmenus.c
-	ooii_bmenus.c
-	ooii_sounds.c
-	modem.c
-	conn_pty.c
 )
 
-if(WIN32)
-	list(APPEND CMAKE_REQUIRED_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/win32.release/cryptlib/include)
-endif()
-
-CHECK_INCLUDE_FILES(cryptlib.h HAS_CRYPTLIB_H)
-if(HAS_CRYPTLIB_H)
-	list(APPEND SOURCE ssh.c)
+if(NOT WIN32)
+	find_program(3RDP_GNU_MAKE
+		NAMES gmake make
+	)
+	if(${3RDP_GNU_MAKE} STREQUAL "3RDP_GNU_MAKE-NOTFOUND")
+		set(WITHOUT_CRYPTLIB 1)
+	else()
+		if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
+			set(BUILD_TYPE_FLAG DEBUG=1)
+		else()
+			set(BUILD_TYPE_FLAG RELEASE=1)
+		endif()
+		execute_process(
+			COMMAND ${3RDP_GNU_MAKE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../build --no-print-directory DONT_CLOBBER_CC=please ${BUILD_TYPE_FLAG}
+			OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/paths.txt
+			ERROR_FILE ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/paths.err
+		)
+		file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/paths.txt PATHS)
+		list(GET PATHS 0 LEGACY_LIBDIR)
+		list(GET PATHS 1 LEGACY_OBJDIR)
+		list(GET PATHS 2 LEGACY_MTOBJBDIR)
+		list(GET PATHS 3 LEGACY_EXEDIR)
+		list(GET PATHS 4 LEGACY_3RDPDIR)
+		add_custom_target(cryptlib
+			${3RDP_GNU_MAKE} cryptlib DONT_CLOBBER_CC=please  ${BUILD_TYPE_FLAG}
+			WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/build
+		)
+	endif()
 endif()
 
 add_executable(syncterm ${SOURCE})
-require_libs(syncterm xpdev ciolib uifc comio)
-
-target_include_directories(syncterm PRIVATE ../sbbs3)
-target_include_directories(syncterm PRIVATE ../smblib)
-
-if(NOT HAS_CRYPTLIB_H)
-    target_compile_definitions(syncterm PRIVATE WITHOUT_CRYPTLIB)
+require_libs(syncterm ciolib comio encode hash sftp uifc xpdev)
+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()
+		add_dependencies(syncterm cryptlib)
+		target_include_directories(syncterm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/${LEGACY_3RDPDIR}/cl)
+		target_link_directories(syncterm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/${LEGACY_3RDPDIR}/cl)
+		target_link_libraries(syncterm cl)
 	endif()
 endif()
 
+target_include_directories(syncterm PRIVATE ../sbbs3)
+
 if(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
 	target_link_libraries(syncterm util)
 elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
@@ -91,5 +111,5 @@ endif()
 install(TARGETS syncterm DESTINATION bin)
 if(UNIX)
 	install(FILES syncterm.desktop DESTINATION share/applications)
-        install(FILES syncterm.png DESTINATION share/icons/hicolor/64x64/apps)
+	install(FILES syncterm.png DESTINATION share/icons/hicolor/64x64/apps)
 endif()
diff --git a/src/xpdev/CMakeLists.txt b/src/xpdev/CMakeLists.txt
index db65a0d93bc40bfdfad538168259e471c479c77a..c1aca0bc167b9b8d9a91be256eec17d88848aba5 100644
--- a/src/xpdev/CMakeLists.txt
+++ b/src/xpdev/CMakeLists.txt
@@ -9,6 +9,8 @@ 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)
 endif()
 
 set(SOURCE
@@ -96,17 +98,23 @@ target_link_libraries(xpdev ${CMAKE_DL_LIBS})
 
 CHECK_INCLUDE_FILES(inttypes.h HAS_INTTYPES_H)
 CHECK_INCLUDE_FILES(stdint.h HAS_STDINT_H)
-set(LINK_LIST_THREADSAFE TRUE PARENT_SCOPE)
+target_compile_definitions(xpdev PUBLIC LINK_LIST_THREADSAFE)
+if(HAS_INTTYPES_H)
+    target_compile_definitions(xpdev PUBLIC HAS_INTTYPES_H)
+endif()
+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 PRIVATE SOUNDCARD_H_IN=1)
+    target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=1)
 elseif(HAS_SOUNDCARD_H)
-    target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=2)
+    target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=2)
 elseif(HAS_LINUX_SOUNDCARD_H)
-    target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=3)
+    target_compile_definitions(xpdev PUBLIC SOUNDCARD_H_IN=3)
 endif()
 
 CHECK_INCLUDE_FILES(dev/speaker/speaker.h HAS_DEV_SPEAKER_SPEAKER_H)
@@ -162,6 +170,7 @@ 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)
@@ -184,9 +193,20 @@ endif()
 
 if(PORTAUDIO_FOUND)
 	target_include_directories(xpdev PRIVATE ${PORTAUDIO_INCLUDEDIR})
+	target_compile_definitions(xpdev PUBLIC WITH_PORTAUDIO)
+endif()
+
+if(PULSEAUDIO_FOUND)
+	target_include_directories(xpdev PUBLIC ${PULSEAUDIO_INCLUDE_DIRS})
+	target_compile_definitions(xpdev PUBLIC WITH_PULSEAUDIO)
 endif()
 
-CHECK_INCLUDE_FILES(alsa/asoundlib.h USE_ALSA_SOUND)
-if(USE_ALSA_SOUND)
-    target_compile_definitions(xpdev PRIVATE USE_ALSA_SOUND)
+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()