diff --git a/Quake/gl_model.c b/Quake/gl_model.c
index 94f0023..fdb8c4c 100644
--- a/Quake/gl_model.c
+++ b/Quake/gl_model.c
@@ -37,6 +37,8 @@ qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash);
 cvar_t	external_ents = {"external_ents", "1", CVAR_ARCHIVE};
 cvar_t	external_vis = {"external_vis", "1", CVAR_ARCHIVE};
 
+extern cvar_t	r_externaltexture_fix; //mk
+
 static byte	*mod_novis;
 static int	mod_novis_capacity;
 
@@ -534,6 +536,13 @@ void Mod_LoadTextures (lump_t *l)
 		{
 			if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp
 			{
+				if (r_externaltexture_fix.value) { //mk
+					if (strstr(tx->name,"sky4")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==13039)
+							q_strlcpy(tx->name, "sky1",  sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+				}
 				if (loadmodel->bspversion == BSPVERSION_QUAKE64)
 					Sky_LoadTextureQ64 (tx);
 				else
@@ -588,6 +597,50 @@ void Mod_LoadTextures (lump_t *l)
 				//external textures -- first look in "textures/mapname/" then look in "textures/"
 				mark = Hunk_LowMark ();
 				COM_StripExtension (loadmodel->name + 5, mapname, sizeof(mapname));
+
+				if (r_externaltexture_fix.value) { //mk
+					if (strstr(tx->name,"plat_top1")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==24428)
+							q_strlcpy(tx->name, "plat_top1_cable", sizeof(tx->name));
+						else
+							q_strlcpy(tx->name, "plat_top1_bolt", sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+					if (strstr(tx->name,"metal5_2")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==49173)
+							q_strlcpy(tx->name, "metal5_2_x", sizeof(tx->name));
+						else
+							q_strlcpy(tx->name, "metal5_2_arc", sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+					if (strstr(tx->name,"metal5_4")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==20977)
+							q_strlcpy(tx->name, "metal5_4_double", sizeof(tx->name));
+						else
+							q_strlcpy(tx->name, "metal5_4_arc", sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+					if (strstr(tx->name,"metal5_8")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==48444)
+							q_strlcpy(tx->name, "metal5_8_rune", sizeof(tx->name));
+						else
+							q_strlcpy(tx->name, "metal5_8_back", sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+					if (strstr(tx->name,"metal5_8")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==48444)
+							q_strlcpy(tx->name, "metal5_8_rune", sizeof(tx->name));
+						else
+							q_strlcpy(tx->name, "metal5_8_back", sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+					if (strstr(tx->name,"window03")) {
+						if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==63697) // e4m2 variant
+							q_strlcpy(tx->name, "window03_e4m2", sizeof(tx->name));
+						Con_Printf("  using %s\n", tx->name);
+					}
+				}
+
 				q_snprintf (filename, sizeof(filename), "textures/%s/%s", mapname, tx->name);
 				data = Image_LoadImage (filename, &fwidth, &fheight);
 				if (!data)
diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c
index a41d8b1..b0020c5 100644
--- a/Quake/gl_rmain.c
+++ b/Quake/gl_rmain.c
@@ -102,6 +102,8 @@ cvar_t	r_noshadow_list = {"r_noshadow_list", "progs/flame2.mdl,progs/flame.mdl,p
 extern cvar_t	r_vfog;
 //johnfitz
 
+cvar_t	r_externaltexture_fix = {"r_externaltexture_fix", "0", CVAR_ARCHIVE}; //mk
+
 cvar_t	gl_zfix = {"gl_zfix", "0", CVAR_NONE}; // QuakeSpasm z-fighting fix
 
 cvar_t	r_lavaalpha = {"r_lavaalpha","0",CVAR_NONE};
diff --git a/Quake/gl_rmisc.c b/Quake/gl_rmisc.c
index dfdb84d..9c441bd 100644
--- a/Quake/gl_rmisc.c
+++ b/Quake/gl_rmisc.c
@@ -47,6 +47,7 @@ extern cvar_t r_nolerp_list;
 extern cvar_t r_noshadow_list;
 //johnfitz
 extern cvar_t gl_zfix; // QuakeSpasm z-fighting fix
+extern cvar_t r_externaltexture_fix; //mk
 
 extern gltexture_t *playertextures[MAX_SCOREBOARD]; //johnfitz
 
@@ -218,6 +219,7 @@ void R_Init (void)
 	Cvar_RegisterVariable (&r_noshadow_list);
 	Cvar_SetCallback (&r_noshadow_list, R_Model_ExtraFlags_List_f);
 	//johnfitz
+	Cvar_RegisterVariable (&r_externaltexture_fix); //mk
 
 	Cvar_RegisterVariable (&gl_zfix); // QuakeSpasm z-fighting fix
 	Cvar_RegisterVariable (&r_lavaalpha);

