diff --git a/src/deh_tables.c b/src/deh_tables.c
index dd6d7d69ff722bedd843456a4b5a7963889a1269..73ccc4f96093af6423a7866d65928a9f3df609ec 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -219,6 +219,7 @@ actionpointer_t actionpointers[] =
 	{{A_SetTargetsTarget},       "A_SETTARGETSTARGET"},
 	{{A_SetObjectFlags},         "A_SETOBJECTFLAGS"},
 	{{A_SetObjectFlags2},        "A_SETOBJECTFLAGS2"},
+	{{A_SetBlendMode},           "A_SETBLENDMODE"},
 	{{A_RandomState},            "A_RANDOMSTATE"},
 	{{A_RandomStateRange},       "A_RANDOMSTATERANGE"},
 	{{A_DualAction},             "A_DUALACTION"},
diff --git a/src/info.h b/src/info.h
index 60e9702463fb50db9934d6aea9e6eab28a562983..5aac16e3bb77910b193ceb4a04cb256e05a496aa 100644
--- a/src/info.h
+++ b/src/info.h
@@ -175,6 +175,7 @@ enum actionnum
 	A_SETTARGETSTARGET,
 	A_SETOBJECTFLAGS,
 	A_SETOBJECTFLAGS2,
+	A_SETBLENDMODE,
 	A_RANDOMSTATE,
 	A_RANDOMSTATERANGE,
 	A_DUALACTION,
@@ -441,6 +442,7 @@ void A_ZThrust();
 void A_SetTargetsTarget();
 void A_SetObjectFlags();
 void A_SetObjectFlags2();
+void A_SetBlendMode();
 void A_RandomState();
 void A_RandomStateRange();
 void A_DualAction();
diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c
index 65adceb154cb66424c73b3415253891307a9f706..994f6a789a854508839c4b87c222fe9a0fc68725 100644
--- a/src/lua_mobjlib.c
+++ b/src/lua_mobjlib.c
@@ -12,6 +12,7 @@
 
 #include "doomdef.h"
 #include "fastcmp.h"
+#include "r_data.h"
 #include "r_skins.h"
 #include "p_local.h"
 #include "g_game.h"
@@ -654,8 +655,13 @@ static int mobj_set(lua_State *L)
 		break;
 	}
 	case mobj_blendmode:
-		mo->blendmode = (INT32)luaL_checkinteger(L, 3);
+	{
+		INT32 blendmode = (INT32)luaL_checkinteger(L, 3);
+		if (blendmode < 0 || blendmode > AST_OVERLAY)
+			return luaL_error(L, "mobj.blendmode %d out of range (0 - %d).", blendmode, AST_OVERLAY);
+		mo->blendmode = blendmode;
 		break;
+	}
 	case mobj_bnext:
 		return NOSETPOS;
 	case mobj_bprev:
diff --git a/src/p_enemy.c b/src/p_enemy.c
index 59176d6cc8ba44cc31d710ef6a87da801a1e62d8..19030567b17d33504d7a591f11230c469e070a7b 100644
--- a/src/p_enemy.c
+++ b/src/p_enemy.c
@@ -197,6 +197,7 @@ void A_ZThrust(mobj_t *actor);
 void A_SetTargetsTarget(mobj_t *actor);
 void A_SetObjectFlags(mobj_t *actor);
 void A_SetObjectFlags2(mobj_t *actor);
+void A_SetBlendMode(mobj_t *actor);
 void A_RandomState(mobj_t *actor);
 void A_RandomStateRange(mobj_t *actor);
 void A_DualAction(mobj_t *actor);
@@ -9085,6 +9086,29 @@ void A_SetObjectFlags2(mobj_t *actor)
 		actor->flags2 = locvar1;
 }
 
+// Function: A_SetBlendMode
+//
+// Description: Sets the blend mode of an object
+//
+// var1 = blend mode to set
+// var2 = unused
+//
+void A_SetBlendMode(mobj_t *actor)
+{
+	INT32 locvar1 = var1;
+
+	if (LUA_CallAction(A_SETBLENDMODE, actor))
+		return;
+
+	if (locvar1 < 0 || locvar1 > AST_OVERLAY)
+	{
+		CONS_Debug(DBG_GAMELOGIC, "Blend mode %d out of range!\n", locvar1);
+		return;
+	}
+
+	actor->blendmode = locvar1;
+}
+
 // Function: A_BossJetFume
 //
 // Description: Spawns jet fumes/other attachment miscellany for the boss. To only be used when he is spawned.
diff --git a/src/r_draw.c b/src/r_draw.c
index 9a835ee5840c7e087256109f87ffef9f01bcf22c..00ffe34dcd1c9ec104047263a01e36292a0c615b 100644
--- a/src/r_draw.c
+++ b/src/r_draw.c
@@ -341,7 +341,7 @@ UINT8 *R_GetBlendTable(int style, INT32 alphalevel)
 {
 	size_t offs;
 
-	if (style == AST_COPY || style == AST_OVERLAY)
+	if (style <= AST_COPY || style >= AST_OVERLAY)
 		return NULL;
 
 	offs = (ClipBlendLevel(style, alphalevel) << FF_TRANSSHIFT);