diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c
index 1bb4de180eb6521cb1cb428d9c6b090f6d7f21ef..55029828035e99ddb69c22e9c657dc9ccffbb9e3 100644
--- a/src/lua_hudlib.c
+++ b/src/lua_hudlib.c
@@ -467,7 +467,23 @@ static int libd_patchExists(lua_State *L)
 
 static int libd_cachePatch(lua_State *L)
 {
-	LUA_PushUserdata(L, W_CachePatchLongName(luaL_checkstring(L, 1), PU_PATCH), META_PATCH);
+	const char *name = luaL_checkstring(L, 1);
+	patch_t *patch = W_CachePatchLongName(name, PU_PATCH);
+
+#ifdef ROTSPRITE
+	if (lua_isnumber(L, 2))
+	{
+		angle_t rollangle = luaL_checkangle(L, 2);
+		INT32 rot = R_GetRollAngle(rollangle);
+		if (rot) {
+			patch_t *rotpatch = Patch_GetRotated(patch, rot, false);
+			LUA_PushUserdata(L, rotpatch, META_PATCH);
+			return 1;
+		}
+	}
+#endif
+	
+	LUA_PushUserdata(L, patch, META_PATCH);
 	return 1;
 }
 
diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c
index 989665d74179854fcfac552814132671c3d00ed2..7c4f6257eeb029ccb3a0fa30b9a44222fe1a7958 100644
--- a/src/r_patchrotation.c
+++ b/src/r_patchrotation.c
@@ -54,12 +54,26 @@ INT32 R_GetRollAngle(angle_t rollangle)
 patch_t *Patch_GetRotated(patch_t *patch, INT32 angle, boolean flip)
 {
 	rotsprite_t *rotsprite = patch->rotated;
-	if (rotsprite == NULL || angle < 1 || angle >= ROTANGLES)
+	if (angle < 1 || angle >= ROTANGLES)
 		return NULL;
 
+	if (rotsprite == NULL)
+	{
+		rotsprite = RotatedPatch_Create(ROTANGLES);
+		patch->rotated = rotsprite;
+	}
+
 	if (flip)
 		angle += rotsprite->angles;
 
+	if (rotsprite->patches[angle] == NULL)
+	{
+		INT32 xpivot = 0, ypivot = 0;
+		xpivot = patch->leftoffset;
+		ypivot = patch->topoffset;
+		RotatedPatch_DoRotation(rotsprite, patch, angle, xpivot, ypivot, flip);
+	}
+
 	return rotsprite->patches[angle];
 }