diff --git a/src/r_draw.c b/src/r_draw.c
index 4710a93c2f3290c9611f9f55238faf4c10c35ad0..4bf50cf286f7fad423133ac5f806ef09db74647e 100644
--- a/src/r_draw.c
+++ b/src/r_draw.c
@@ -125,7 +125,7 @@ INT32 R_SkinTranslationToCacheIndex(INT32 translation)
 	}
 }
 
-static INT32 CacheIndexToSkin(INT32 index)
+INT32 R_CacheIndexToSkinTranslation(INT32 index)
 {
 	switch (index)
 	{
@@ -140,6 +140,19 @@ static INT32 CacheIndexToSkin(INT32 index)
 	}
 }
 
+boolean R_IsSkinTranslationRemappable(INT32 translation)
+{
+	switch (translation)
+	{
+		case TC_METALSONIC:
+		case TC_ALLWHITE:
+		case TC_DASHMODE:
+			return false;
+		default:
+			return true;
+	}
+}
+
 CV_PossibleValue_t Color_cons_t[MAXSKINCOLORS+1];
 
 /** \brief Initializes the translucency tables used by the Software renderer.
@@ -567,7 +580,7 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags
 					colorcache_t *cache = translationtablecache[i][color];
 					if (cache)
 					{
-						R_GenerateTranslationColormap(cache->colors, CacheIndexToSkin(i), color, starttranscolor);
+						R_GenerateTranslationColormap(cache->colors, R_CacheIndexToSkinTranslation(i), color, starttranscolor);
 						R_UpdateTranslationRemaps(color, i);
 					}
 				}
diff --git a/src/r_draw.h b/src/r_draw.h
index d5c5b4e25d36ba375d365a2d13f0ba5fab19e3f3..bfcf09fab070d046cdf48ac6e8d8fbb9df2f0b2a 100644
--- a/src/r_draw.h
+++ b/src/r_draw.h
@@ -90,6 +90,8 @@ enum
 };
 
 INT32 R_SkinTranslationToCacheIndex(INT32 translation);
+INT32 R_CacheIndexToSkinTranslation(INT32 index);
+boolean R_IsSkinTranslationRemappable(INT32 translation);
 
 // Amount of colors in the palette
 #define NUM_PALETTE_ENTRIES 256
diff --git a/src/r_translation.c b/src/r_translation.c
index 41087e272502b0809a287d0ec1a75d618281bb91..9fa76272a4d7fe32be6a4be8e8b4a0e92205852a 100644
--- a/src/r_translation.c
+++ b/src/r_translation.c
@@ -1146,7 +1146,9 @@ UINT8 *R_GetTranslationRemap(int id, skincolornum_t skincolor, INT32 skinnum)
 
 static void R_UpdateTranslation(remaptable_t *tr, skincolornum_t skincolor, INT32 cache_index)
 {
-	if (!tr->num_sources || !tr->skincolor_remaps || !tr->skincolor_remaps[cache_index])
+	if (skincolor == SKINCOLOR_NONE
+	|| !R_IsSkinTranslationRemappable(R_CacheIndexToSkinTranslation(cache_index))
+	|| !tr->num_sources || !tr->skincolor_remaps || !tr->skincolor_remaps[cache_index])
 		return;
 
 	colorcache_t *cache = tr->skincolor_remaps[cache_index][skincolor - 1];