diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c
index 19f8b74c77dc506fb1c091ab24660752d36ebaeb..c56eaf6c5511326db3e673ce1309b474abc6f2ad 100644
--- a/src/lua_hudlib.c
+++ b/src/lua_hudlib.c
@@ -14,6 +14,7 @@
 #include "fastcmp.h"
 #include "r_defs.h"
 #include "r_local.h"
+#include "r_translation.h"
 #include "st_stuff.h" // hudinfo[]
 #include "g_game.h"
 #include "i_video.h" // rendermode
@@ -1125,7 +1126,10 @@ static int libd_getColormap(lua_State *L)
 	INT32 skinnum = TC_DEFAULT;
 	skincolornum_t color = luaL_optinteger(L, 2, 0);
 	UINT8* colormap = NULL;
+	int translation_id = -1;
+
 	HUDONLY
+
 	if (lua_isnoneornil(L, 1))
 		; // defaults to TC_DEFAULT
 	else if (lua_type(L, 1) == LUA_TNUMBER) // skin number
@@ -1144,9 +1148,21 @@ static int libd_getColormap(lua_State *L)
 			skinnum = i;
 	}
 
+	if (!lua_isnoneornil(L, 3))
+	{
+		const char *translation_name = luaL_checkstring(L, 3);
+		translation_id = R_FindCustomTranslation(translation_name);
+		if (translation_id == -1)
+			return luaL_error(L, "invalid translation '%s'.", translation_name);
+	}
+
 	// all was successful above, now we generate the colormap at last!
+	if (translation_id != -1)
+		colormap = R_GetTranslationRemap(translation_id, color, skinnum);
+
+	if (colormap == NULL)
+		colormap = R_GetTranslationColormap(skinnum, color, GTC_CACHE);
 
-	colormap = R_GetTranslationColormap(skinnum, color, GTC_CACHE);
 	LUA_PushUserdata(L, colormap, META_COLORMAP); // push as META_COLORMAP userdata, specifically for patches to use!
 	return 1;
 }
diff --git a/src/lua_infolib.c b/src/lua_infolib.c
index 3facec82b82da21c92d5041aba81fb1f9f543deb..b2730c5931f0c00db2eca2848827526661631084 100644
--- a/src/lua_infolib.c
+++ b/src/lua_infolib.c
@@ -1900,32 +1900,6 @@ static int colorramp_len(lua_State *L)
 	return 1;
 }
 
-//////////////////////
-// TRANSLATION INFO //
-//////////////////////
-
-// Arbitrary translations[] table index -> colormap_t *
-static int lib_getTranslation(lua_State *L)
-{
-	lua_remove(L, 1);
-
-	const char *name = luaL_checkstring(L, 1);
-	remaptable_t *tr = R_GetTranslationByID(R_FindCustomTranslation(name));
-	if (tr)
-		LUA_PushUserdata(L, &tr->remap, META_COLORMAP);
-	else
-		lua_pushnil(L);
-
-	return 1;
-}
-
-// #translations -> R_NumCustomTranslations()
-static int lib_translationslen(lua_State *L)
-{
-	lua_pushinteger(L, R_NumCustomTranslations());
-	return 1;
-}
-
 //////////////////////////////
 //
 // Now push all these functions into the Lua state!
@@ -1958,7 +1932,6 @@ int LUA_InfoLib(lua_State *L)
 	LUA_RegisterGlobalUserdata(L, "spr2defaults", lib_getSpr2default, lib_setSpr2default, lib_spr2namelen);
 	LUA_RegisterGlobalUserdata(L, "states", lib_getState, lib_setState, lib_statelen);
 	LUA_RegisterGlobalUserdata(L, "mobjinfo", lib_getMobjInfo, lib_setMobjInfo, lib_mobjinfolen);
-	LUA_RegisterGlobalUserdata(L, "translations", lib_getTranslation, NULL, lib_translationslen);
 	LUA_RegisterGlobalUserdata(L, "skincolors", lib_getSkinColor, lib_setSkinColor, lib_skincolorslen);
 	LUA_RegisterGlobalUserdata(L, "spriteinfo", lib_getSpriteInfo, lib_setSpriteInfo, lib_spriteinfolen);
 	LUA_RegisterGlobalUserdata(L, "sfxinfo", lib_getSfxInfo, lib_setSfxInfo, lib_sfxlen);