diff --git a/src/p_mobj.c b/src/p_mobj.c
index 2b16d7cc7..a7623e4d9 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -5013,6 +5013,47 @@ static void P_Boss4Thinker(mobj_t *mobj)
 	A_FaceTarget(mobj);
 }
 
+//
+// AI for the fifth boss.
+//
+static void P_Boss5Thinker(mobj_t *mobj)
+{
+	if (!mobj->health)
+	{
+		if (mobj->state == &states[mobj->info->xdeathstate])
+			mobj->momz -= (2*FRACUNIT)/3;
+		else if (mobj->tracer && P_AproxDistance(mobj->tracer->x - mobj->x, mobj->tracer->y - mobj->y) < 2*mobj->radius)
+			mobj->flags &= ~MF_NOCLIP;
+	}
+	else
+	{
+		if (mobj->flags2 & MF2_FRET && (leveltime & 1)
+		&& mobj->state != &states[S_FANG_PAIN1] && mobj->state != &states[S_FANG_PAIN2])
+			mobj->flags2 |= MF2_DONTDRAW;
+		else
+			mobj->flags2 &= ~MF2_DONTDRAW;
+	}
+
+	if (mobj->state == &states[S_FANG_BOUNCE3]
+	||  mobj->state == &states[S_FANG_BOUNCE4]
+	||  mobj->state == &states[S_FANG_PINCHBOUNCE3]
+	||  mobj->state == &states[S_FANG_PINCHBOUNCE4])
+	{
+		if (P_MobjFlip(mobj)*mobj->momz > 0
+		&& abs(mobj->momx) < FRACUNIT/2 && abs(mobj->momy) < FRACUNIT/2
+		&& !P_IsObjectOnGround(mobj))
+		{
+			mobj_t *prevtarget = mobj->target;
+			P_SetTarget(&mobj->target, NULL);
+			var1 = var2 = 0;
+			A_DoNPCPain(mobj);
+			P_SetTarget(&mobj->target, prevtarget);
+			P_SetMobjState(mobj, S_FANG_WALLHIT);
+			mobj->extravalue2++;
+		}
+	}
+}
+
 //
 // AI for Black Eggman
 // Note: You CANNOT have more than ONE Black Eggman
@@ -7378,6 +7419,9 @@ void P_MobjThinker(mobj_t *mobj)
 			case MT_EGGMOBILE4:
 				P_Boss4Thinker(mobj);
 				break;
+			case MT_FANG:
+				P_Boss5Thinker(mobj);
+				break;
 			case MT_BLACKEGGMAN:
 				P_Boss7Thinker(mobj);
 				break;