diff --git a/.gitignore b/.gitignore
index 93b3b7161..86b86de8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,8 @@
 # executables
 *.exe*
 *.zip
-src/cdogs-sdl
-src/cdogs-sdl-editor
+cdogs-sdl
+cdogs-sdl-editor
 cdogs-sdl.opk
 # tests
 *_test
@@ -18,6 +18,7 @@ RemoteSystemsTempFiles/
 CPack*
 _CPack_Packages/
 CTestTestfile.cmake
+DartConfiguration.tcl
 Testing/
 install_manifest_Runtime.txt
 *.deb
@@ -36,8 +37,9 @@ build/windows/cdogs.rc
 
 # Linux
 bin/
-/share/
+share/
 include/
+!src/cdogs/enet/include/
 
 # Visual Studio
 enc_temp_folder/
@@ -108,7 +110,5 @@ tmp
 *~*.cdogscpn
 Thumbs.db
 .config/
-src/cdogs/include/
-src/cdogs/share/
 *.blend1
 emscripten/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3d4587081..189a75b22 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,21 +4,21 @@ cmake_policy(SET CMP0072 NEW)
 set(CMAKE_OSX_DEPLOYMENT_TARGET 10.13)
 project(cdogs-sdl C)
 
-SET(VERSION_MAJOR "1")
-SET(VERSION_MINOR "5")
-SET(VERSION_PATCH "0")
-SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
+set(VERSION_MAJOR "1")
+set(VERSION_MINOR "5")
+set(VERSION_PATCH "0")
+set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
 
 # Optionally configure CI files since they are excluded in source archives
 if(EXISTS ${CMAKE_SOURCE_DIR}/.github/workflows/cmake.yml.cmake)
-	CONFIGURE_FILE(
+	configure_file(
 		${CMAKE_SOURCE_DIR}/.github/workflows/cmake.yml.cmake
 		${CMAKE_SOURCE_DIR}/.github/workflows/cmake.yml
 		@ONLY
 	)
 endif()
 if(EXISTS ${CMAKE_SOURCE_DIR}/appveyor.yml.cmake)
-	CONFIGURE_FILE(
+	configure_file(
 		${CMAKE_SOURCE_DIR}/appveyor.yml.cmake
 		${CMAKE_SOURCE_DIR}/appveyor.yml
 		@ONLY
@@ -26,8 +26,8 @@ if(EXISTS ${CMAKE_SOURCE_DIR}/appveyor.yml.cmake)
 endif()
 
 # this must be 4 numbers
-SET(VERSION_RC "${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},0")
-SET(WEBSITE "http://cxong.github.io/cdogs-sdl/")
+set(VERSION_RC "${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},0")
+set(WEBSITE "http://cxong.github.io/cdogs-sdl/")
 
 option(DEBUG "Enable debug build" OFF)
 option(DEBUG_PROFILE "Enable debug profile build" OFF)
@@ -50,10 +50,10 @@ endif()
 if(WIN32)
 	set(CMAKE_RC_COMPILER_INIT windres)
 	enable_language(RC)
-	SET(CMAKE_RC_COMPILE_OBJECT
+	set(CMAKE_RC_COMPILE_OBJECT
 		"<CMAKE_RC_COMPILER> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
 endif()
-SET(LINKDIR /usr/games)
+set(LINKDIR /usr/games)
 
 if(DEBUG)
 	set(CMAKE_BUILD_TYPE "Debug")
@@ -74,22 +74,22 @@ if(BUILD_EDITOR)
 	find_package(OpenGL REQUIRED)
 endif()
 
-SET(ENet_LIBRARY enet)
-IF(WIN32)
-    SET(WINDOWS_ENET_DEPENDENCIES "ws2_32;winmm")
-    SET(ENet_LIBRARIES ${ENet_LIBRARY} ${WINDOWS_ENET_DEPENDENCIES})
-ELSE()
-    SET(ENet_LIBRARIES ${ENet_LIBRARY})
-ENDIF()
+set(ENet_LIBRARY enet)
+if(WIN32)
+    set(WINDOWS_ENET_DEPENDENCIES "ws2_32;winmm")
+    set(ENet_LIBRARIES ${ENet_LIBRARY} ${WINDOWS_ENET_DEPENDENCIES})
+else()
+    set(ENet_LIBRARIES ${ENet_LIBRARY})
+endif()
 
-IF(NOT USE_SHARED_ENET)
-    INCLUDE_DIRECTORIES(src/cdogs/enet/include)
-ENDIF()
+if(NOT USE_SHARED_ENET)
+    include_directories(src/cdogs/enet/include)
+endif()
 
 if(MSVC)
 	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MP -W4 -WX -wd\"4090\" -wd\"4996\" -wd\"4204\"")
 	if(DEBUG)
-		ADD_DEFINITIONS(-ZI)
+		add_definitions(-ZI)
 	endif()
 else()
 	add_definitions(
@@ -97,12 +97,12 @@ else()
 		-Wall -W
 		-Wstrict-prototypes -Wpointer-arith -Wcast-qual)
 	if(DEBUG)
-		ADD_DEFINITIONS(-g)
+		add_definitions(-g)
 		if(DEBUG_PROFILE AND CMAKE_COMPILER_IS_GNUCC)
-			ADD_DEFINITIONS(-p)
+			add_definitions(-p)
 		endif()
 	else()
-		ADD_DEFINITIONS(-O2)
+		add_definitions(-O2)
 	endif()
 	if(GCW0)
 		add_definitions(-D__GCWZERO__)
@@ -147,22 +147,22 @@ if(WIN32)
 	set(CDOGS_CFG_DIR "C-Dogs SDL/")
 else()
 	set(CDOGS_CFG_DIR ".config/cdogs-sdl/")
-ENDIF()
-SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ".")
-IF(UNIX AND NOT APPLE)
-	CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/build/linux/cdogs-sdl.cmake ${CMAKE_SOURCE_DIR}/build/linux/cdogs-sdl)
-	SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/build/linux/cdogs-sdl PROPERTIES GENERATED TRUE)
-ENDIF()
-IF(WIN32)
-	CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/build/windows/cdogs.rc.cmake ${CMAKE_SOURCE_DIR}/build/windows/cdogs.rc)
-	SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/build/windows/cdogs.rc PROPERTIES GENERATED TRUE)
-ENDIF()
-CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/src/cdogs/sys_config.h.cmake ${CMAKE_SOURCE_DIR}/src/cdogs/sys_config.h)
-SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/src/cdogs/sys_config.h PROPERTIES GENERATED TRUE)
+endif()
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ".")
+if(UNIX AND NOT APPLE)
+	configure_file(${CMAKE_SOURCE_DIR}/build/linux/cdogs-sdl.cmake ${CMAKE_SOURCE_DIR}/build/linux/cdogs-sdl)
+	set_source_files_properties(${CMAKE_SOURCE_DIR}/build/linux/cdogs-sdl PROPERTIES GENERATED TRUE)
+endif()
+if(WIN32)
+	configure_file(${CMAKE_SOURCE_DIR}/build/windows/cdogs.rc.cmake ${CMAKE_SOURCE_DIR}/build/windows/cdogs.rc)
+	set_source_files_properties(${CMAKE_SOURCE_DIR}/build/windows/cdogs.rc PROPERTIES GENERATED TRUE)
+endif()
+configure_file(${CMAKE_SOURCE_DIR}/src/cdogs/sys_config.h.cmake ${CMAKE_SOURCE_DIR}/src/cdogs/sys_config.h)
+set_source_files_properties(${CMAKE_SOURCE_DIR}/src/cdogs/sys_config.h PROPERTIES GENERATED TRUE)
 include_directories(src src/cdogs)
 
 # Tests
-enable_testing()
+include(CTest)
 
 add_subdirectory(src)
 
@@ -214,7 +214,7 @@ if(BUILD_EDITOR)
 	    DESTINATION ${CDOGS_BIN_DIR})
 endif()
 
-INSTALL(DIRECTORY
+install(DIRECTORY
 	${CMAKE_SOURCE_DIR}/data
 	${CMAKE_SOURCE_DIR}/missions
 	${CMAKE_SOURCE_DIR}/dogfights
@@ -226,52 +226,52 @@ INSTALL(DIRECTORY
 if(NOT DEFINED CDOGS_DOC_DIR)
 	set(CDOGS_DOC_DIR "${DATA_INSTALL_DIR}/doc")
 endif()
-INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/doc/
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/doc/
 	DESTINATION ${CDOGS_DOC_DIR}
 	)
 
-INSTALL(FILES
+install(FILES
 	${CMAKE_SOURCE_DIR}/README.md
 	DESTINATION ${DATA_INSTALL_DIR})
-IF(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU)
-	INSTALL(FILES ${CMAKE_SOURCE_DIR}/build/linux/io.github.cxong.cdogs-sdl.desktop DESTINATION ${INSTALL_PREFIX}/share/applications)
-	INSTALL(FILES ${CMAKE_SOURCE_DIR}/build/linux/io.github.cxong.cdogs-sdl.appdata.xml DESTINATION ${INSTALL_PREFIX}/share/metainfo)
+if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU)
+	install(FILES ${CMAKE_SOURCE_DIR}/build/linux/io.github.cxong.cdogs-sdl.desktop DESTINATION ${INSTALL_PREFIX}/share/applications)
+	install(FILES ${CMAKE_SOURCE_DIR}/build/linux/io.github.cxong.cdogs-sdl.appdata.xml DESTINATION ${INSTALL_PREFIX}/share/metainfo)
 	foreach(RES 16 22 32 48 128)
-		INSTALL(FILES ${CMAKE_SOURCE_DIR}/build/linux/cdogs-icon.${RES}.png
+		install(FILES ${CMAKE_SOURCE_DIR}/build/linux/cdogs-icon.${RES}.png
 			DESTINATION ${INSTALL_PREFIX}/share/icons/hicolor/${RES}x${RES}/apps
 			RENAME io.github.cxong.cdogs-sdl.png)
-	endforeach(RES)
+	endforeach()
 elseif(WIN32)
 	# Package for Windows
-	FILE(GLOB DLLS "${CMAKE_SOURCE_DIR}/dll/*.dll")
-	FOREACH(DLL ${DLLS})
-		INSTALL(FILES "${DLL}" DESTINATION ${INSTALL_PREFIX}/bin)
-	ENDFOREACH()
+	file(GLOB DLLS "${CMAKE_SOURCE_DIR}/dll/*.dll")
+	foreach(DLL ${DLLS})
+		install(FILES "${DLL}" DESTINATION ${INSTALL_PREFIX}/bin)
+	endforeach()
 	install(DIRECTORY ${CMAKE_SOURCE_DIR}/build/licenses DESTINATION ${INSTALL_PREFIX})
 elseif(APPLE)
 	set(CMAKE_INSTALL_PREFIX "/Applications/cdogs-sdl")
 endif()
 
 # Packaging
-SET(CPACK_PACKAGE_NAME "C-Dogs.SDL")
-SET(CPACK_PACKAGE_VENDOR "C-Dogs SDL Team")
-SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C-Dogs SDL: Action/Arcade Game")
-SET(CPACK_PACKAGE_VERSION ${VERSION})
-SET(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
-SET(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
-SET(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
-SET(CPACK_PACKAGE_EXECUTABLES "cdogs-sdl;C-Dogs SDL;cdogs-sdl-editor;Campaign Editor")
+set(CPACK_PACKAGE_NAME "C-Dogs.SDL")
+set(CPACK_PACKAGE_VENDOR "C-Dogs SDL Team")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C-Dogs SDL: Action/Arcade Game")
+set(CPACK_PACKAGE_VERSION ${VERSION})
+set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
+set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
+set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
+set(CPACK_PACKAGE_EXECUTABLES "cdogs-sdl;C-Dogs SDL;cdogs-sdl-editor;Campaign Editor")
 if(WIN32)
-	SET(CPACK_GENERATOR NSIS ZIP)
-	SET(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
-	SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/doc/COPYING.GPL)
+	set(CPACK_GENERATOR NSIS ZIP)
+	set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
+	set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/doc/COPYING.GPL)
 	set(CPACK_PACKAGE_INSTALL_DIRECTORY "C-Dogs SDL")
-	SET(CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}/build/windows/cdogs-icon.ico)
+	set(CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}/build/windows/cdogs-icon.ico)
 	set(CPACK_NSIS_CREATE_ICONS "SetOutPath '\$INSTDIR\\\\bin'
 	CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\C-Dogs SDL.lnk' '\$INSTDIR\\\\bin\\\\cdogs-sdl.exe'
 	CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Campaign Editor.lnk' '\$INSTDIR\\\\bin\\\\cdogs-sdl-editor.exe'")
-	SET(CPACK_NSIS_MUI_FINISHPAGE_RUN cdogs-sdl.exe)
-	SET(CPACK_NSIS_URL_INFO_ABOUT ${WEBSITE})
+	set(CPACK_NSIS_MUI_FINISHPAGE_RUN cdogs-sdl.exe)
+	set(CPACK_NSIS_URL_INFO_ABOUT ${WEBSITE})
 elseif(APPLE)
 	set(CPACK_GENERATOR "DragNDrop")
 	set(CPACK_DMG_FORMAT "UDBZ")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b0d3e98f6..f69d5c0cc 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -12,7 +12,9 @@ if(BUILD_EDITOR)
 endif()
 add_subdirectory(json)
 add_subdirectory(proto)
-add_subdirectory(tests)
+if(BUILD_TESTING)
+	add_subdirectory(tests)
+endif()
 
 set(CDOGS_SDL_SOURCES
 	ammo_menu.c
diff --git a/src/cdogs/CMakeLists.txt b/src/cdogs/CMakeLists.txt
index 25eb7fb5e..5c0ee84a0 100644
--- a/src/cdogs/CMakeLists.txt
+++ b/src/cdogs/CMakeLists.txt
@@ -227,9 +227,9 @@ set(CDOGS_HEADERS
 	XGetopt.h
 	yajl_utils.h)
 
-IF(NOT USE_SHARED_ENET)
-    ADD_SUBDIRECTORY(enet)
-ENDIF()
+if(NOT USE_SHARED_ENET)
+    add_subdirectory(enet)
+endif()
 
 add_subdirectory(c_hashmap)
 add_subdirectory(cwolfmap)
diff --git a/src/cdogs/yajl/CMakeLists.txt b/src/cdogs/yajl/CMakeLists.txt
index 2db2f6624..97af2fd18 100644
--- a/src/cdogs/yajl/CMakeLists.txt
+++ b/src/cdogs/yajl/CMakeLists.txt
@@ -12,69 +12,69 @@
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-SET (YAJL_MAJOR 2)
-SET (YAJL_MINOR 1)
-SET (YAJL_MICRO 1)
+set (YAJL_MAJOR 2)
+set (YAJL_MINOR 1)
+set (YAJL_MICRO 1)
 
-SET (SRCS yajl.c yajl_lex.c yajl_parser.c yajl_buf.c
+set (SRCS yajl.c yajl_lex.c yajl_parser.c yajl_buf.c
           yajl_encode.c yajl_gen.c yajl_alloc.c
           yajl_tree.c yajl_version.c
 )
-SET (HDRS yajl_parser.h yajl_lex.h yajl_buf.h yajl_encode.h yajl_alloc.h)
-SET (PUB_HDRS api/yajl_parse.h api/yajl_gen.h api/yajl_common.h api/yajl_tree.h)
+set (HDRS yajl_parser.h yajl_lex.h yajl_buf.h yajl_encode.h yajl_alloc.h)
+set (PUB_HDRS api/yajl_parse.h api/yajl_gen.h api/yajl_common.h api/yajl_tree.h)
 
 # useful when fixing lexer bugs.
-#ADD_DEFINITIONS(-DYAJL_LEXER_DEBUG)
+#add_definitions(-DYAJL_LEXER_DEBUG)
 
 # Ensure defined when building YAJL (as opposed to using it from
 # another project).  Used to ensure correct function export when
 # building win32 DLL.
-ADD_DEFINITIONS(-DYAJL_BUILD)
+add_definitions(-DYAJL_BUILD)
 
 # set up some paths
-SET (libDir ${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/lib)
-SET (incDir ${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/include/yajl)
-SET (shareDir ${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/share/pkgconfig)
+set (libDir ${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/lib)
+set (incDir ${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/include/yajl)
+set (shareDir ${CMAKE_CURRENT_BINARY_DIR}/../${YAJL_DIST_NAME}/share/pkgconfig)
 
 # set the output path for libraries
-SET(LIBRARY_OUTPUT_PATH ${libDir})
+set(LIBRARY_OUTPUT_PATH ${libDir})
 
-ADD_LIBRARY(yajl_s STATIC ${SRCS} ${HDRS} ${PUB_HDRS})
+add_library(yajl_s STATIC ${SRCS} ${HDRS} ${PUB_HDRS})
 
-ADD_LIBRARY(yajl SHARED ${SRCS} ${HDRS} ${PUB_HDRS})
+add_library(yajl SHARED ${SRCS} ${HDRS} ${PUB_HDRS})
 
 #### setup shared library version number
-SET_TARGET_PROPERTIES(yajl PROPERTIES
+set_target_properties(yajl PROPERTIES
                       DEFINE_SYMBOL YAJL_SHARED
                       SOVERSION ${YAJL_MAJOR}
                       VERSION ${YAJL_MAJOR}.${YAJL_MINOR}.${YAJL_MICRO})
 
 #### ensure a .dylib has correct absolute installation paths upon installation
-IF(APPLE)
-  SET_TARGET_PROPERTIES(yajl PROPERTIES
+if(APPLE)
+  set_target_properties(yajl PROPERTIES
                         INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib")
-ENDIF(APPLE)
+endif()
 
 #### build up an sdk as a post build step
 
 # create some directories
-FILE(MAKE_DIRECTORY ${libDir})
-FILE(MAKE_DIRECTORY ${incDir})
+file(MAKE_DIRECTORY ${libDir})
+file(MAKE_DIRECTORY ${incDir})
 
 # generate build-time source
-SET(dollar $)
-CONFIGURE_FILE(api/yajl_version.h.cmake ${incDir}/yajl_version.h)
-CONFIGURE_FILE(yajl.pc.cmake ${shareDir}/yajl.pc)
+set(dollar $)
+configure_file(api/yajl_version.h.cmake ${incDir}/yajl_version.h)
+configure_file(yajl.pc.cmake ${shareDir}/yajl.pc)
 
 # copy public headers to output directory
-FOREACH (header ${PUB_HDRS})
-  SET (header ${CMAKE_CURRENT_SOURCE_DIR}/${header})
+foreach (header ${PUB_HDRS})
+  set (header ${CMAKE_CURRENT_SOURCE_DIR}/${header})
 
-  EXEC_PROGRAM(${CMAKE_COMMAND} ARGS -E copy_if_different ${header} ${incDir})
+  exec_program(${CMAKE_COMMAND} ARGS -E copy_if_different ${header} ${incDir})
 
-  ADD_CUSTOM_COMMAND(TARGET yajl_s POST_BUILD
+  add_custom_command(TARGET yajl_s POST_BUILD
       COMMAND ${CMAKE_COMMAND} -E copy_if_different ${header} ${incDir})
-ENDFOREACH (header ${PUB_HDRS})
+endforeach ()
 
-INCLUDE_DIRECTORIES(${incDir}/..)
+include_directories(${incDir}/..)
 
diff --git a/src/proto/nanopb/CMakeLists.txt b/src/proto/nanopb/CMakeLists.txt
index d672896b0..e7a168ce8 100644
--- a/src/proto/nanopb/CMakeLists.txt
+++ b/src/proto/nanopb/CMakeLists.txt
@@ -30,8 +30,8 @@ if(MSVC AND nanopb_MSVC_STATIC_RUNTIME)
             CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
         if(${flag_var} MATCHES "/MD")
             string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
-        endif(${flag_var} MATCHES "/MD")
-    endforeach(flag_var)
+        endif()
+    endforeach()
 endif()
 
 if(NOT DEFINED CMAKE_INSTALL_CMAKEDIR)