diff --git a/CMakeLists.txt b/CMakeLists.txt
index 855393de1fdbe1eb436282d17e96134149b5c00d..abec11087e0ec11f24bb2228730ebd19af2ee2cf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
 # DO NOT CHANGE THIS SRB2 STRING! Some variable names depend on this string.
 # Version change is fine.
 project(SRB2
-	VERSION 2.2.1
+	VERSION 2.2.2
 	LANGUAGES C)
 
 if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
diff --git a/appveyor.yml b/appveyor.yml
index 20b18d7d5ffd61c73817833b6fd41c3f66243aab..a28935f6388649052389adbc70c88d2f853a7e75 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: 2.2.1.{branch}-{build}
+version: 2.2.2.{branch}-{build}
 os: MinGW
 
 environment:
diff --git a/assets/CMakeLists.txt b/assets/CMakeLists.txt
index 0636c1e599e4ca793fa0e253b23e7ec76ae8c802..095349418ed8901e94ddc229b4cf71d11927e07b 100644
--- a/assets/CMakeLists.txt
+++ b/assets/CMakeLists.txt
@@ -19,7 +19,8 @@ set(SRB2_ASSET_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/installer"
 set(SRB2_ASSET_HASHED
 "srb2.pk3;\
 player.dta;\
-zones.pk3"
+zones.pk3;\
+patch.pk3"
 	CACHE STRING "Asset filenames to apply MD5 checks. No spaces between entries!"
 )
 
diff --git a/src/config.h.in b/src/config.h.in
index 498f3086d3279655264160139dde53287356fac3..4926f9a063ca706f36fcfd8398ce80820d312e39 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -27,13 +27,13 @@
 
 /* Manually defined asset hashes for non-CMake builds
  * Last updated 2020 / 02 / 15 - v2.2.1 - main assets
- * Last updated 20?? / ?? / ?? - v2.2.? - patch.pk3
+ * Last updated 2020 / 02 / 22 - v2.2.2 - patch.pk3
  */
 #define ASSET_HASH_SRB2_PK3   "0277c9416756627004e83cbb5b2e3e28"
 #define ASSET_HASH_ZONES_PK3  "f7e88afb6af7996a834c7d663144bead"
 #define ASSET_HASH_PLAYER_DTA "ad49e07b17cc662f1ad70c454910b4ae"
 #ifdef USE_PATCH_DTA
-#define ASSET_HASH_PATCH_PK3  "there is no patch.pk3, only zuul"
+#define ASSET_HASH_PATCH_PK3  "ee54330ecb743314c5f962af4db731ff"
 #endif
 
 #endif
diff --git a/src/d_main.c b/src/d_main.c
index d43d57b0bd086a8188f03f45ae4e541b13b59852..904ab3bf13046f37984752acf4ac34cccc648d8b 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -1215,14 +1215,14 @@ void D_SRB2Main(void)
 	W_InitMultipleFiles(startupwadfiles, mainwads);
 	D_CleanFile();
 
-#ifndef DEVELOP // md5s last updated 16/02/20 (ddmmyy)
+#ifndef DEVELOP // md5s last updated 22/02/20 (ddmmyy)
 
 	// Check MD5s of autoloaded files
 	W_VerifyFileMD5(0, ASSET_HASH_SRB2_PK3); // srb2.pk3
 	W_VerifyFileMD5(1, ASSET_HASH_ZONES_PK3); // zones.pk3
 	W_VerifyFileMD5(2, ASSET_HASH_PLAYER_DTA); // player.dta
 #ifdef USE_PATCH_DTA
-	W_VerifyFileMD5(3, ASSET_HASH_PATCH_DTA); // patch.pk3
+	W_VerifyFileMD5(3, ASSET_HASH_PATCH_PK3); // patch.pk3
 #endif
 	// don't check music.dta because people like to modify it, and it doesn't matter if they do
 	// ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for.
diff --git a/src/doomdef.h b/src/doomdef.h
index 93c7590e24935be89166585cb73a8abe3feba7fa..71c8850192d9a94dc00b4dc640b85bf595946d64 100644
--- a/src/doomdef.h
+++ b/src/doomdef.h
@@ -143,16 +143,16 @@ extern char logfilename[1024];
 // we use comprevision and compbranch instead.
 #else
 #define VERSION    202 // Game version
-#define SUBVERSION 1  // more precise version number
-#define VERSIONSTRING "v2.2.1"
-#define VERSIONSTRINGW L"v2.2.1"
+#define SUBVERSION 2  // more precise version number
+#define VERSIONSTRING "v2.2.2"
+#define VERSIONSTRINGW L"v2.2.2"
 // Hey! If you change this, add 1 to the MODVERSION below!
 // Otherwise we can't force updates!
 #endif
 
 // Does this version require an added patch file?
 // Comment or uncomment this as necessary.
-//#define USE_PATCH_DTA
+#define USE_PATCH_DTA
 
 // Use .kart extension addons
 //#define USE_KART
@@ -210,7 +210,7 @@ extern char logfilename[1024];
 // it's only for detection of the version the player is using so the MS can alert them of an update.
 // Only set it higher, not lower, obviously.
 // Note that we use this to help keep internal testing in check; this is why v2.2.0 is not version "1".
-#define MODVERSION 41
+#define MODVERSION 42
 
 // To version config.cfg, MAJOREXECVERSION is set equal to MODVERSION automatically.
 // Increment MINOREXECVERSION whenever a config change is needed that does not correspond
diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
index 2b03cb8d4607bd96f53b04f8b98e1a227866bd64..b615bc1dfd40daea3db522e7c2fc7520fc03b495 100644
--- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
+++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
@@ -1219,7 +1219,7 @@
 		C01FCF4B08A954540054247B /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CURRENT_PROJECT_VERSION = 2.2.1;
+				CURRENT_PROJECT_VERSION = 2.2.2;
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"$(inherited)",
 					NORMALSRB2,
@@ -1231,7 +1231,7 @@
 		C01FCF4C08A954540054247B /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				CURRENT_PROJECT_VERSION = 2.2.1;
+				CURRENT_PROJECT_VERSION = 2.2.2;
 				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_PREPROCESSOR_DEFINITIONS = (