diff --git a/src/hardware/hw_data.h b/src/hardware/hw_data.h
index f525e041f2a50a4f97c713061497412748a377bb..ef57426a4b66b484d3285a2a39f92dd7be14a474 100644
--- a/src/hardware/hw_data.h
+++ b/src/hardware/hw_data.h
@@ -48,7 +48,6 @@ struct GLMipmap_s
 
 	struct GLMipmap_s    *nextcolormap;
 	const UINT8          *colormap;
-	INT32                tcindex;
 
 	// opengl
 	struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c
index 7c49beb528ba6f0e1ddf8c3c398646cb586d453b..5c3cd40a6c02cedacfa55988b94675654a9dd558 100644
--- a/src/hardware/hw_md2.c
+++ b/src/hardware/hw_md2.c
@@ -1048,24 +1048,32 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
 	// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
 	GLMipmap_t *grmip, *newmip;
 
-	if ((colormap == colormaps || colormap == NULL) && (skinnum > TC_DEFAULT))
+	if (colormap == colormaps || colormap == NULL)
 	{
 		// Don't do any blending
 		HWD.pfnSetTexture(gpatch->mipmap);
 		return;
 	}
 
+	if ((blendgpatch && blendgpatch->mipmap->grInfo.format)
+		&& (gpatch->width != blendgpatch->width || gpatch->height != blendgpatch->height))
+	{
+		// Blend image exists, but it's bad.
+		HWD.pfnSetTexture(gpatch->mipmap);
+		return;
+	}
+
 	// search for the mipmap
 	// skip the first (no colormap translated)
 	for (grmip = gpatch->mipmap; grmip->nextcolormap; )
 	{
 		grmip = grmip->nextcolormap;
-		if (grmip->colormap == colormap || (skinnum < TC_DEFAULT && grmip->tcindex == skinnum))
+		if (grmip->colormap == colormap)
 		{
 			if (grmip->downloaded && grmip->grInfo.data)
 			{
 				HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
-				Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE);
+				Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE_UNLOCKED);
 				return;
 			}
 		}
@@ -1074,29 +1082,20 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
 	// If here, the blended texture has not been created
 	// So we create it
 
-	if ((blendgpatch && blendgpatch->mipmap->grInfo.format)
-		&& (gpatch->width != blendgpatch->width || gpatch->height != blendgpatch->height))
-	{
-		// Blend image exists, but it's bad.
-		HWD.pfnSetTexture(gpatch->mipmap);
-		return;
-	}
-
 	//BP: WARNING: don't free it manually without clearing the cache of harware renderer
 	//              (it have a liste of mipmap)
 	//    this malloc is cleared in HWR_FreeTextureCache
 	//    (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
 	newmip = calloc(1, sizeof (*newmip));
 	if (newmip == NULL)
-		I_Error("%s: Out of memory", "HWR_GetMappedPatch");
+		I_Error("%s: Out of memory", "HWR_GetBlendedTexture");
 	grmip->nextcolormap = newmip;
 	newmip->colormap = colormap;
-	newmip->tcindex = skinnum;
 
 	HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
 
 	HWD.pfnSetTexture(newmip);
-	Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE);
+	Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE_UNLOCKED);
 }
 
 #define NORMALFOG 0x00000000
@@ -1326,7 +1325,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
 
 		if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
 		{
-			INT32 skinnum = INT32_MAX;
+			INT32 skinnum = TC_DEFAULT;
 
 			if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
 			{
@@ -1357,15 +1356,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
 			}
 
 			// Translation or skin number found
-			if (skinnum != INT32_MAX)
-			{
-				HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
-			}
-			else
-			{
-				// Sorry nothing
-				HWD.pfnSetTexture(gpatch->mipmap);
-			}
+			HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
 		}
 		else
 		{
diff --git a/src/p_setup.c b/src/p_setup.c
index e1bfff98ad260f05fc4188b355627a1b4b14abd3..dcc28bae1b8391fc40a4201c78b435f048ad6829 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -3699,10 +3699,15 @@ void HWR_SetupLevel(void)
 	// Meaning, they had memory allocated and marked with the PU_LEVEL tag.
 	// Level textures are only reloaded after R_LoadTextures, which is
 	// when the texture list is loaded.
+
+	// Sal: Unfortunately, NOT freeing them causes the dreaded Color Bug.
+	HWR_FreeMipmapCache();
+
 #ifdef ALAM_LIGHTING
 	// BP: reset light between levels (we draw preview frame lights on current frame)
 	HWR_ResetLights();
 #endif
+
 	// Correct missing sidedefs & deep water trick
 	HWR_CorrectSWTricks();
 	HWR_CreatePlanePolygons((INT32)numnodes - 1);
diff --git a/src/w_wad.c b/src/w_wad.c
index d618b0c693ea8c77933ddfcf6df6052c52629c35..95531dda389b9fa9ab4f1a2b790c29f544030611 100644
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -1481,7 +1481,7 @@ void W_FlushCachedPatches(void)
 		Z_FreeTag(PU_HWRPATCHINFO);
 		Z_FreeTag(PU_HWRMODELTEXTURE);
 		Z_FreeTag(PU_HWRCACHE);
-		Z_FreeTags(PU_HWRCACHE_UNLOCKED, PU_HWRPATCHINFO_UNLOCKED);
+		Z_FreeTags(PU_HWRCACHE_UNLOCKED, PU_HWRMODELTEXTURE_UNLOCKED);
 	}
 	needpatchflush = false;
 }
diff --git a/src/z_zone.c b/src/z_zone.c
index e0e37312a6e613dae1b4c55cf6690edbc6719586..e06f7bf1a7f9074fb02bfa9a845bd941033198b2 100644
--- a/src/z_zone.c
+++ b/src/z_zone.c
@@ -519,6 +519,7 @@ void Z_FlushCachedPatches(void)
 	Z_FreeTag(PU_HWRCACHE);
 	Z_FreeTag(PU_HWRCACHE_UNLOCKED);
 	Z_FreeTag(PU_HWRPATCHINFO_UNLOCKED);
+	Z_FreeTag(PU_HWRMODELTEXTURE_UNLOCKED);
 }
 
 // happens before a renderer switch
@@ -815,6 +816,7 @@ static void Command_Memfree_f(void)
 		CONS_Printf(M_GetText("Mipmap patches    : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPATCHCOLMIPMAP)>>10));
 		CONS_Printf(M_GetText("HW Texture cache  : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
 		CONS_Printf(M_GetText("Plane polygons    : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
+		CONS_Printf(M_GetText("HW model textures : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRMODELTEXTURE)>>10));
 		CONS_Printf(M_GetText("HW Texture used   : %7d KB\n"), HWR_GetTextureUsed()>>10);
 	}
 #endif
diff --git a/src/z_zone.h b/src/z_zone.h
index 9e5f74343aa0b009956ad13af57fa8e01be089a0..250885e10e5214fc6819fde4aa3408db5ce2d58d 100644
--- a/src/z_zone.h
+++ b/src/z_zone.h
@@ -64,6 +64,7 @@ enum
 									// 'second-level' cache for graphics
                                     // stored in hardware format and downloaded as needed
 	PU_HWRPATCHINFO_UNLOCKED = 103, // 'unlocked' PU_HWRPATCHINFO memory
+	PU_HWRMODELTEXTURE_UNLOCKED = 104, // 'unlocked' PU_HWRMODELTEXTURE memory
 };
 
 //