diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c
index 28d5fed23660e61f1a543e531881af37a5e24172..40737ccc1cedc203673f188ea8a2eb3b41d89c6a 100644
--- a/src/lua_skinlib.c
+++ b/src/lua_skinlib.c
@@ -44,6 +44,10 @@ enum skin {
 	skin_accelstart,
 	skin_acceleration,
 	skin_jumpfactor,
+	skin_radius,
+	skin_height,
+	skin_spinheight,
+	skin_shieldscale,
 	skin_starttranscolor,
 	skin_prefcolor,
 	skin_highresscale,
@@ -74,6 +78,10 @@ static const char *const skin_opt[] = {
 	"accelstart",
 	"acceleration",
 	"jumpfactor",
+	"radius",
+	"height",
+	"spinheight",
+	"shieldscale",
 	"starttranscolor",
 	"prefcolor",
 	"highresscale",
@@ -173,6 +181,18 @@ static int skin_get(lua_State *L)
 	case skin_jumpfactor:
 		lua_pushfixed(L, skin->jumpfactor);
 		break;
+	case skin_radius:
+		lua_pushfixed(L, skin->radius);
+		break;
+	case skin_height:
+		lua_pushfixed(L, skin->height);
+		break;
+	case skin_spinheight:
+		lua_pushfixed(L, skin->spinheight);
+		break;
+	case skin_shieldscale:
+		lua_pushfixed(L, skin->shieldscale);
+		break;
 	case skin_starttranscolor:
 		lua_pushinteger(L, skin->starttranscolor);
 		break;
diff --git a/src/p_local.h b/src/p_local.h
index 57ca425e155b0b40ffc8b344c4c7cbb764fb8e43..7b662ef233ef5bbca8a3247c3bfa1d74acf1a7c8 100644
--- a/src/p_local.h
+++ b/src/p_local.h
@@ -119,6 +119,7 @@ extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed;
 extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate;
 extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate;
 
+fixed_t P_GetPlayerRadius(player_t *player);
 fixed_t P_GetPlayerHeight(player_t *player);
 fixed_t P_GetPlayerSpinHeight(player_t *player);
 INT32 P_GetPlayerControlDirection(player_t *player);
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 653b6967ef41e261a82b7122650bd1e4907a510a..b60a5075c493247575403579a0fa6949a078383b 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -6097,7 +6097,7 @@ static boolean P_ShieldLook(mobj_t *thing, shieldtype_t shield)
 	thing->flags |= MF_NOCLIPHEIGHT;
 	thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP);
 
-	P_SetScale(thing, thing->target->scale);
+	P_SetScale(thing, FixedMul(thing->target->scale, skins[thing->target->player->skin].shieldscale));
 	P_UnsetThingPosition(thing);
 	thing->x = thing->target->x;
 	thing->y = thing->target->y;
diff --git a/src/p_user.c b/src/p_user.c
index b579cbfe5dd18cef0af4c490c624753c2a44629e..c63b5770290b7257e866fd4eb3cdf659edc2bf09 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -1296,6 +1296,17 @@ void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative)
 		mo->momz = value;
 }
 
+//
+// P_GetPlayerRadius
+//
+// Returns the radius
+// of the player.
+//
+fixed_t P_GetPlayerRadius(player_t *player)
+{
+	return FixedMul(skins[player->skin].radius, player->mo->scale);
+}
+
 //
 // P_GetPlayerHeight
 //
@@ -1304,7 +1315,7 @@ void P_SetObjectMomZ(mobj_t *mo, fixed_t value, boolean relative)
 //
 fixed_t P_GetPlayerHeight(player_t *player)
 {
-	return FixedMul(player->mo->info->height, player->mo->scale);
+	return FixedMul(skins[player->skin].height, player->mo->scale);
 }
 
 //
@@ -1315,7 +1326,7 @@ fixed_t P_GetPlayerHeight(player_t *player)
 //
 fixed_t P_GetPlayerSpinHeight(player_t *player)
 {
-	return FixedMul(FixedMul(player->mo->info->height, player->mo->scale),2*FRACUNIT/3);
+	return FixedMul(skins[player->skin].spinheight, player->mo->scale);
 }
 
 //
@@ -6536,8 +6547,8 @@ static void P_MovePlayer(player_t *player)
 		|| ((((player->charflags & SF_NOJUMPSPIN) && (player->pflags & PF_JUMPED) && player->panim == PA_JUMP))
 			&& (P_MobjFlip(player->mo)*player->mo->momz < 0 || player->pflags & PF_THOKKED)))
 		P_SetPlayerMobjState(player->mo, S_PLAY_FALL);
-	// If Springing but on the ground, change back!
-	else if (onground && (player->panim == PA_SPRING || player->panim == PA_FALL || player->panim == PA_RIDE) && !player->mo->momz)
+	// If doing an air animation but on the ground, change back!
+	else if (onground && (player->panim == PA_SPRING || player->panim == PA_FALL || player->panim == PA_RIDE || player->panim == PA_JUMP) && !player->mo->momz)
 		P_SetPlayerMobjState(player->mo, S_PLAY_STND);
 
 	// If you are stopped and are still walking, stand still!
@@ -6996,6 +7007,7 @@ static void P_MovePlayer(player_t *player)
 			player->mo->height = P_GetPlayerSpinHeight(player);
 		else
 			player->mo->height = P_GetPlayerHeight(player);
+		player->mo->radius = P_GetPlayerRadius(player);
 
 		if (player->mo->eflags & MFE_VERTICALFLIP && player->mo->height != oldheight) // adjust z height for reverse gravity, similar to how it's done for scaling
 			player->mo->z -= player->mo->height - oldheight;
diff --git a/src/r_things.c b/src/r_things.c
index 9f138fdd304ee22a8e8e330abf2942068cd0f7a6..1a0e6dcfe95b079cc6e38f9a4bd62c352bc7dcfe 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -2300,6 +2300,12 @@ static void Sk_SetDefaultValue(skin_t *skin)
 	skin->mindash = 15<<FRACBITS;
 	skin->maxdash = 90<<FRACBITS;
 
+	skin->radius = mobjinfo[MT_PLAYER].radius;
+	skin->height = mobjinfo[MT_PLAYER].height;
+	skin->spinheight = FixedMul(skin->height, 2*FRACUNIT/3);
+
+	skin->shieldscale = FRACUNIT;
+
 	skin->thokitem = -1;
 	skin->spinitem = -1;
 	skin->revitem = -1;
@@ -2545,7 +2551,7 @@ void R_AddSkins(UINT16 wadnum)
 					value2[stringspace - 1] = '\0';
 					if (R_SkinAvailable(value2) == -1)
 						// I'm lazy so if NEW name is already used I leave the 'skin x'
--						// default skin name set in Sk_SetDefaultValue
+						// default skin name set in Sk_SetDefaultValue
 						STRBUFCPY(skin->name, value2);
 					Z_Free(value2);
 				}
@@ -2620,6 +2626,9 @@ void R_AddSkins(UINT16 wadnum)
 			GETSPEED(mindash)
 			GETSPEED(maxdash)
 			GETSPEED(actionspd)
+			GETSPEED(radius)
+			GETSPEED(height)
+			GETSPEED(spinheight)
 #undef GETSPEED
 
 #define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value);
@@ -2652,10 +2661,13 @@ void R_AddSkins(UINT16 wadnum)
 
 			else if (!stricmp(stoken, "prefcolor"))
 				skin->prefcolor = R_GetColorByName(value);
-			else if (!stricmp(stoken, "jumpfactor"))
-				skin->jumpfactor = FLOAT_TO_FIXED(atof(value));
-			else if (!stricmp(stoken, "highresscale"))
-				skin->highresscale = FLOAT_TO_FIXED(atof(value));
+
+#define GETFLOAT(field) else if (!stricmp(stoken, #field)) skin->field = FLOAT_TO_FIXED(atof(value));
+			GETFLOAT(jumpfactor)
+			GETFLOAT(highresscale)
+			GETFLOAT(shieldscale)
+#undef GETFLOAT
+
 			else // let's check if it's a sound, otherwise error out
 			{
 				boolean found = false;
diff --git a/src/r_things.h b/src/r_things.h
index 23842094ef13a880b0c2b107c77e3419c6ee8034..cdd22ba66da4d9dc42137af900b34913a87bf307 100644
--- a/src/r_things.h
+++ b/src/r_things.h
@@ -93,6 +93,12 @@ typedef struct
 
 	fixed_t jumpfactor; // multiple of standard jump height
 
+	fixed_t radius; // Bounding box changes.
+	fixed_t height;
+	fixed_t spinheight;
+
+	fixed_t shieldscale; // no change to bounding box, but helps set the shield's sprite size
+
 	// Definable color translation table
 	UINT8 starttranscolor;
 	UINT8 prefcolor;