diff --git a/src/deh_soc.c b/src/deh_soc.c
index f7946ccc9c099c07666ce21a83bbd1f7e9221bcd..a00d2aad3ff6ffc6b4fad882b25edfbbba836525 100644
--- a/src/deh_soc.c
+++ b/src/deh_soc.c
@@ -1064,7 +1064,10 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
 					}
 				}
 				else
+				{
+					info->name = spriteinfo[num]->name;
 					M_Memcpy(spriteinfo[num], info, sizeof(spriteinfo_t));
+				}
 			}
 			else
 			{
diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c
index 4e152e3951053362a4d292b0d330486748762d38..4c4bd7362babc30b14cc104d6c2d20e9f5601943 100644
--- a/src/hardware/hw_md2.c
+++ b/src/hardware/hw_md2.c
@@ -1096,7 +1096,7 @@ static boolean HWR_CanInterpolateSprite2(modelspr2frames_t *spr2frame)
 	return spr2frame->interpolate;
 }
 
-static modelspr2frames_t *HWR_GetModelSprite2Frames(md2_t *md2, UINT16 spr2)
+static modelspr2frames_t *HWR_GetModelSprite2Frames(md2_t *md2, UINT32 spr2)
 {
 	if (!md2 || !md2->model)
 		return NULL;
@@ -1121,9 +1121,9 @@ static modelspr2frames_t *HWR_GetModelSprite2Frames(md2_t *md2, UINT16 spr2)
 	return NULL;
 }
 
-static modelspr2frames_t *HWR_GetModelSprite2(md2_t *md2, skin_t *skin, UINT16 spr2, player_t *player)
+static modelspr2frames_t *HWR_GetModelSprite2(md2_t *md2, skin_t *skin, UINT32 spr2, player_t *player)
 {
-	UINT16 super = 0;
+	UINT32 super = 0;
 	UINT8 i = 0;
 
 	if (!md2 || !md2->model || !skin)
diff --git a/src/info.c b/src/info.c
index aab2a7dee65e35b64602ff71c02644135c96da3c..7763a5c9fe1dc0cfa9bb47ffe4f75a4f6cef91d1 100644
--- a/src/info.c
+++ b/src/info.c
@@ -22414,8 +22414,10 @@ UINT32 P_AllocateState(const char *name)
 }
 
 void R_ResizeSprites(void);
+#ifndef NOHW
 extern void HWR_AllocateMD2Model(void);
 extern void HWR_AllocateLSpr(void);
+#endif
 
 UINT32 P_AllocateSpriteinfo(const char *name)
 {
@@ -22424,8 +22426,10 @@ UINT32 P_AllocateSpriteinfo(const char *name)
 	memset(spriteinfo[numspriteinfo-1], 0, sizeof(spriteinfo_t));
 	spriteinfo[numspriteinfo-1]->name = name;
 	R_ResizeSprites();
+#ifndef NOHW
 	HWR_AllocateMD2Model();
 	HWR_AllocateLSpr();
+#endif
 	return numspriteinfo-1;
 }
 
@@ -22488,8 +22492,10 @@ void P_InitializeTables(void)
 		memset(spriteinfo[i], 0, sizeof(spriteinfo_t));
 		spriteinfo[i]->name = sprnames[i];
 	}
+#ifndef NOHW
 	HWR_AllocateMD2Model();
 	HWR_AllocateLSpr();
+#endif
 
 	numplayersprites = sizeof(startplayersprites) / sizeof(startplayersprites[0]);
 	playersprites = Z_Malloc(sizeof(*playersprites) * numplayersprites, PU_STATIC, NULL);
diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index a1e22ea57f85509ba75af6e8ee1d9045d5aae087..f33ad6c0f9ff28a198a191198959f54905e4bf82 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -3138,8 +3138,8 @@ static int lib_pIsStateSprite2Super(lua_State *L)
 // Not a real function. Who cares? I know I don't.
 static int lib_pGetSuperSprite2(lua_State *L)
 {
-	int animID = luaL_checkinteger(L, 1) & SPR2F_MASK;
-	if (animID < 0 || animID >= numplayersprites)
+	UINT32 animID = luaL_checkinteger(L, 1) & SPR2F_MASK;
+	if (animID >= numplayersprites)
 		return luaL_error(L, "sprite2 %d out of range (0 - %d)", animID, numplayersprites-1);
 
 	lua_pushinteger(L, animID | SPR2F_SUPER);
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 2f013a2f30fac7f7d117cb190fcbc5bd1db17e54..3c6615ee1f2a6b7d6a8f668b4c8fab051b31be1d 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -306,9 +306,9 @@ typedef struct mobj_s
 	angle_t old_angle, old_pitch, old_roll; // orientation interpolation
 	angle_t old_angle2, old_pitch2, old_roll2;
 	angle_t spriteroll, old_spriteroll, old_spriteroll2;
-	spritenum_t sprite; // used to find patch_t and flip value
+	UINT32 sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
-	UINT16 sprite2; // player sprites
+	UINT32 sprite2; // player sprites
 	UINT16 anim_duration; // for FF_ANIMATE states
 
 	UINT32 renderflags; // render flags
diff --git a/src/p_saveg.c b/src/p_saveg.c
index 906fc17b964f8b49b3ebd4f8dc6ba767620f4eec..39ceff19eb8b869287072ab46d14c0ae8f13bd68 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -2066,9 +2066,9 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
 	if (diff & MD_TICS)
 		WRITEINT32(save_p, mobj->tics);
 	if (diff & MD_SPRITE) {
-		WRITEUINT16(save_p, mobj->sprite);
+		WRITEUINT32(save_p, mobj->sprite);
 		if (mobj->sprite == SPR_PLAY)
-			WRITEUINT16(save_p, mobj->sprite2);
+			WRITEUINT32(save_p, mobj->sprite2);
 	}
 	if (diff & MD_FRAME)
 	{
@@ -3096,9 +3096,9 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
 	else
 		mobj->tics = mobj->state->tics;
 	if (diff & MD_SPRITE) {
-		mobj->sprite = READUINT16(save_p);
+		mobj->sprite = READUINT32(save_p);
 		if (mobj->sprite == SPR_PLAY)
-			mobj->sprite2 = READUINT16(save_p);
+			mobj->sprite2 = READUINT32(save_p);
 	}
 	else {
 		mobj->sprite = mobj->state->sprite;
diff --git a/src/r_picformats.c b/src/r_picformats.c
index 195fa9c94f834838d8e00ab4939fca7bcfe4e195..ea053d03698a5238052502e3e07ba3b567b3e1ab 100644
--- a/src/r_picformats.c
+++ b/src/r_picformats.c
@@ -1598,9 +1598,9 @@ static void R_ParseSpriteInfo(boolean spr2)
 	}
 	else
 	{
-		for (i = 0; i <= numplayersprites; i++)
+		for (i = 0; (UINT32)i <= numplayersprites; i++)
 		{
-			if (i == numplayersprites)
+			if ((UINT32)i == numplayersprites)
 				I_Error("Error parsing SPRTINFO lump: Unknown sprite2 name \"%s\"", newSpriteName);
 			if (!memcmp(newSpriteName,playersprites[i]->name,4))
 			{
@@ -1679,7 +1679,10 @@ static void R_ParseSpriteInfo(boolean spr2)
 					}
 				}
 				else
+				{
+					info->name = spriteinfo[sprnum]->name;
 					M_Memcpy(spriteinfo[sprnum], info, sizeof(spriteinfo_t));
+				}
 			}
 			else
 			{
diff --git a/src/r_skins.c b/src/r_skins.c
index fc9232db8ac63f9621de81082eb9ad0198a4118f..abb8c58236d6da223beb3a6d597acd3dd5fca284 100644
--- a/src/r_skins.c
+++ b/src/r_skins.c
@@ -609,10 +609,10 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
 
 	skin->sprites = Z_Realloc(skin->sprites, sizeof(*skin->sprites) * numplayersprites, PU_STATIC, NULL);
 	skin->sprinfo = Z_Realloc(skin->sprinfo, sizeof(*skin->sprinfo) * numplayersprites, PU_STATIC, NULL);
-	memset(&skin->sprinfo[skin->numsprites], 0, sizeof(*skin->sprinfo) * (numplayersprites < skin->numsprites));
+	memset(&skin->sprinfo[skin->numsprites], 0, sizeof(*skin->sprinfo) * (numplayersprites - skin->numsprites));
 	skin->super.sprites = Z_Realloc(skin->super.sprites, sizeof(*skin->super.sprites) * numplayersprites, PU_STATIC, NULL);
 	skin->super.sprinfo = Z_Realloc(skin->super.sprinfo, sizeof(*skin->super.sprinfo) * numplayersprites, PU_STATIC, NULL);
-	memset(&skin->super.sprinfo[skin->numsprites], 0, sizeof(*skin->super.sprinfo) * (numplayersprites < skin->numsprites));
+	memset(&skin->super.sprinfo[skin->numsprites], 0, sizeof(*skin->super.sprinfo) * (numplayersprites - skin->numsprites));
 	skin->numsprites = numplayersprites;
 
 	*lump += 1; // start after S_SKIN