diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp
index 01a28193..cccf9cc4 100644
--- a/src/control/Pickups.cpp
+++ b/src/control/Pickups.cpp
@@ -49,6 +49,16 @@ uint16 AmmoForWeapon[20] = { 0, 1, 45, 125, 25, 150, 300, 25, 5, 250, 5, 5, 0, 5
 uint16 AmmoForWeapon_OnStreet[WEAPONTYPE_TOTALWEAPONS] = {
 	0,
 	1,
+	1,
+	1,
+	1,
+	1,
+	1,
+	1,
+	1,
+	1,
+	1,
+	1,
 	4,
 	4,
 	4,
@@ -70,16 +80,20 @@ uint16 AmmoForWeapon_OnStreet[WEAPONTYPE_TOTALWEAPONS] = {
 uint16 CostOfWeapon[20] = { 0, 10, 250, 800, 1500, 3000, 5000, 10000, 25000, 25000, 2000, 2000, 0, 50000, 0, 3000, 0, 0, 0, 0 };
 
 // TODO(Miami): Those are all placeholders!!
-uint8 aWeaponReds[] = { 0, 255, 0, 128, 255, 255, 0, 255, 0, 128, 128, 255,
+uint8 aWeaponReds[] = { 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+255, 0, 128, 255, 255, 0, 255, 0, 128, 128, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 255, 128, 0, 255, 0 };
-uint8 aWeaponGreens[] = { 0, 0, 255, 128, 255, 0, 255, 128, 255, 0, 255, 255,
+uint8 aWeaponGreens[] = { 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+0, 255, 128, 255, 0, 255, 128, 255, 0, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 0, 255, 0, 255, 0 };
-uint8 aWeaponBlues[] = { 0, 0, 0, 255, 0, 255, 255, 0, 128, 255, 0, 255,
+uint8 aWeaponBlues[] = { 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+0, 0, 255, 0, 255, 255, 0, 128, 255, 0, 255,
 255, 255, 255, 255, 255, 255, 255, 255,
 0, 128, 255, 0, 0 };
-float aWeaponScale[] = { 1.0f, 1.0f, 2.0f, 1.5f, 1.0f, 1.0f, 1.5f, 1.0f, 2.0f, 1.0f, 2.0f, 2.5f,
+float aWeaponScale[] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+2.0f, 1.5f, 1.0f, 1.0f, 1.5f, 1.0f, 2.0f, 1.0f, 2.0f, 2.5f, 1.0f,
 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
 1.0f, 1.0f, 1.0f, 1.0f };
 
diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index 4112acf4..0129b155 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -10334,8 +10334,20 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
 {
 	switch (command) {
 	case COMMAND_SET_CHAR_CAN_BE_DAMAGED_BY_MEMBERS_OF_GANG:
+	{
+		CollectParameters(&m_nIp, 3);
+		CPed *pTarget = CPools::GetPedPool()->GetAt(ScriptParams[0]);
+		uint8 flag = 1 << (uint8)ScriptParams[1];
+		if (ScriptParams[2])
+			pTarget->m_gangFlags |= flag;
+		else
+			pTarget->m_gangFlags &= ~flag;
+
+		return 0;
+	}
 	case COMMAND_LOAD_AND_LAUNCH_MISSION_EXCLUSIVE:
 	case COMMAND_IS_MISSION_AUDIO_PLAYING:
+		assert(0);
 	case COMMAND_CREATE_LOCKED_PROPERTY_PICKUP:
 	{
 		CollectParameters(&m_nIp, 3);
diff --git a/src/core/EventList.h b/src/core/EventList.h
index 8840afc4..f2c3d7a8 100644
--- a/src/core/EventList.h
+++ b/src/core/EventList.h
@@ -22,10 +22,12 @@ enum eEventType
 	EVENT_PED_SET_ON_FIRE,
 	EVENT_COP_SET_ON_FIRE,
 	EVENT_CAR_SET_ON_FIRE,
-	EVENT_ASSAULT_NASTYWEAPON, // not sure
+	EVENT_ASSAULT_NASTYWEAPON,
+	EVENT_ASSAULT_NASTYWEAPON_POLICE,
 	EVENT_ICECREAM,
 	EVENT_ATM,
-	EVENT_SHOPSTALL, // used on graffitis
+	EVENT_SHOPSTALL,
+	EVENT_SHOPWINDOW,
 	EVENT_LAST_EVENT
 };
 
diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp
index 09d5cc72..0ce8b50e 100644
--- a/src/core/Streaming.cpp
+++ b/src/core/Streaming.cpp
@@ -1337,8 +1337,7 @@ CStreaming::LoadInitialPeds(void)
 void
 CStreaming::LoadInitialWeapons(void)
 {
-	// TODO(Miami): Enable when weapons have been ported
-	//CStreaming::RequestModel(MI_NIGHTSTICK, STREAMFLAGS_DONT_REMOVE);
+	CStreaming::RequestModel(MI_NIGHTSTICK, STREAMFLAGS_DONT_REMOVE);
 	CStreaming::RequestModel(MI_MISSILE, STREAMFLAGS_DONT_REMOVE);
 }
 
diff --git a/src/entities/Physical.h b/src/entities/Physical.h
index ce02e463..b6e28275 100644
--- a/src/entities/Physical.h
+++ b/src/entities/Physical.h
@@ -46,7 +46,7 @@ public:
 	float m_fDistanceTravelled;
 
 	// damaged piece
-	float m_fDamageImpulse;
+	float m_fDamageImpulse; // fCollisionPower
 	CEntity *m_pDamageEntity;
 	CVector m_vecDamageNormal;
 	int16 m_nDamagePieceType;
diff --git a/src/modelinfo/ModelIndices.h b/src/modelinfo/ModelIndices.h
index 25ba0b7b..d9ffda4a 100644
--- a/src/modelinfo/ModelIndices.h
+++ b/src/modelinfo/ModelIndices.h
@@ -406,6 +406,7 @@ enum
 	MI_TRAIN = -1,
 	MI_DODO = -2,
 
+	MI_NIGHTSTICK = 262,
 	MI_BASEBALL_BAT = 264,
 	MI_GRENADE = 270,
 	MI_MOLOTOV = 272,
diff --git a/src/peds/CopPed.cpp b/src/peds/CopPed.cpp
index 578f2454..b84dcf14 100644
--- a/src/peds/CopPed.cpp
+++ b/src/peds/CopPed.cpp
@@ -23,7 +23,7 @@ CCopPed::CCopPed(eCopType copType, int32 modifier) : CPed(PEDTYPE_COP)
 	switch (copType) {
 	case COP_STREET:
 		SetModelIndex(MI_COP);
-		// GiveWeapon(WEAPONTYPE_NIGHTSTICK, 1000, true); // TODO(Miami)
+		GiveWeapon(WEAPONTYPE_NIGHTSTICK, 1000, true);
 		GiveDelayedWeapon(WEAPONTYPE_COLT45, 1000);
 		m_currentWeapon = WEAPONTYPE_UNARMED;
 		m_fArmour = 0.0f;
diff --git a/src/peds/Gangs.cpp b/src/peds/Gangs.cpp
index 301eb3be..2d6d1137 100644
--- a/src/peds/Gangs.cpp
+++ b/src/peds/Gangs.cpp
@@ -36,7 +36,7 @@ void CGangs::Initialise(void)
 	SetGangVehicleModel(GANG_BIKER, MI_ANGEL);
 	SetGangVehicleModel(GANG_PLAYER, -1);
 	SetGangVehicleModel(GANG_GOLFER, MI_CADDY);
-	//SetGangWeapons(GANG_GOLFER, WEAPONTYPE_GOLFCLUB, WEAPONTYPE_GOLFCLUB); // TODO(MIAMI)
+	SetGangWeapons(GANG_GOLFER, WEAPONTYPE_GOLFCLUB, WEAPONTYPE_GOLFCLUB);
 #ifdef FIX_BUGS
 	for (int i = 0; i < NUM_GANGS; i++)
 		SetGangPedModelOverride(i, -1);
diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp
index f7140b2b..12870236 100644
--- a/src/peds/Ped.cpp
+++ b/src/peds/Ped.cpp
@@ -116,32 +116,8 @@ uint16 nPlayerInComboMove;
 
 RpClump *flyingClumpTemp;
 
-// This is beta fistfite.dat array. Not used anymore since they're being fetched from fistfite.dat.
 FightMove tFightMoves[NUM_FIGHTMOVES] = {
-	{NUM_ANIMS, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_PUNCH_R, 0.2f, 8.0f / 30.0f, 0.0f, 0.3f, HITLEVEL_HIGH, 1, 0},
-	{ANIM_FIGHT_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_FIGHT_SH_F, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_FIGHT_KNEE, 4.0f / 30.0f, 0.2f, 0.0f, 0.6f, HITLEVEL_LOW, 2, 0},
-	{ANIM_FIGHT_HEAD, 4.0f / 30.0f, 0.2f, 0.0f, 0.7f, HITLEVEL_HIGH, 3, 0},
-	{ANIM_FIGHT_PUNCH, 4.0f / 30.0f, 7.0f / 30.0f, 10.0f / 30.0f, 0.4f, HITLEVEL_HIGH, 1, 0},
-	{ANIM_FIGHT_LHOOK, 8.0f / 30.0f, 10.0f / 30.0f, 0.0f, 0.4f, HITLEVEL_HIGH, 3, 0},
-	{ANIM_FIGHT_KICK, 8.0f / 30.0f, 10.0f / 30.0f, 0.0f, 0.5, HITLEVEL_MEDIUM, 2, 0},
-	{ANIM_FIGHT_LONGKICK, 8.0f / 30.0f, 10.0f / 30.0f, 0.0f, 0.5, HITLEVEL_MEDIUM, 4, 0},
-	{ANIM_FIGHT_ROUNDHOUSE, 8.0f / 30.0f, 10.0f / 30.0f, 0.0f, 0.6f, HITLEVEL_MEDIUM, 4, 0},
-	{ANIM_FIGHT_BODYBLOW, 5.0f / 30.0f, 7.0f / 30.0f, 0.0f, 0.35f, HITLEVEL_LOW, 2, 0},
-	{ANIM_KICK_FLOOR, 10.0f / 30.0f, 14.0f / 30.0f, 0.0f, 0.4f, HITLEVEL_GROUND, 1, 0},
-	{ANIM_HIT_FRONT, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_BACK, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_RIGHT, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_LEFT, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_BODYBLOW, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_CHEST, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_WALK, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_FLOOR_HIT, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_HIT_BEHIND, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
-	{ANIM_FIGHT2_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, HITLEVEL_NULL, 0, 0},
+	// TODO(Miami)
 };
 
 uint16 CPed::nThreatReactionRangeMultiplier = 1;
@@ -620,6 +596,8 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
 	m_ped_flagI80 = false;
 #endif
 
+	m_gangFlags = 0xFF;
+
 	bReachedAttractorHeadingTarget = false;
 	bTurnedAroundOnAttractor = false;
 	bCarPassenger = false;
@@ -666,9 +644,16 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
 	GiveWeapon(WEAPONTYPE_UNARMED, 0, true);
 	m_wepAccuracy = 60;
 	m_lastWepDam = -1;
+	m_lastDamEntity = nil;
+	m_attachedTo = nil;
+	m_attachWepAmmo = 0;
 	m_collPoly.valid = false;
 	m_fCollisionSpeed = 0.0f;
 	m_wepModelID = -1;
+	uint16 random = CGeneral::GetRandomNumber();
+	m_nPedMoney = random % 25;
+	if (m_nPedMoney == 23)
+		m_nPedMoney = 400;
 #ifdef PED_SKIN
 	m_pWeaponModel = nil;
 #endif
@@ -1183,7 +1168,7 @@ CPed::FinishedReloadCB(CAnimBlendAssociation *reloadAssoc, void *arg)
 	if (ped->bIsDucking && ped->bCrouchWhenShooting) {
 		CAnimBlendAssociation *crouchFireAssoc = nil;
 		if (!!weapon->m_bCrouchFire) {
-			crouchFireAssoc = RpAnimBlendClumpGetAssociation(ped->GetClump(), ANIM_WEAPON_CROUCHFIRE);
+			crouchFireAssoc = RpAnimBlendClumpGetAssociation(ped->GetClump(), GetCrouchFireAnim(weapon));
 		}
 		if (!!weapon->m_bReload && reloadAssoc) {
 			if (reloadAssoc->animId == GetCrouchReloadAnim(weapon) && !crouchFireAssoc) {
@@ -1222,7 +1207,7 @@ CPed::FinishedAttackCB(CAnimBlendAssociation *attackAssoc, void *arg)
 				reloadAnimAssoc = RpAnimBlendClumpGetAssociation(ped->GetClump(), GetCrouchReloadAnim(currentWeapon));
 			}
 			if (currentWeapon->m_bCrouchFire && attackAssoc) {
-				if (attackAssoc->animId == ANIM_WEAPON_CROUCHFIRE && !reloadAnimAssoc) {
+				if (attackAssoc->animId == GetCrouchFireAnim(currentWeapon) && !reloadAnimAssoc) {
 					newAnim = CAnimManager::BlendAnimation(ped->GetClump(), ASSOCGRP_STD, ANIM_WEAPON_CROUCH, 8.0f);
 					newAnim->SetCurrentTime(newAnim->hierarchy->totalLength);
 					newAnim->flags &= ~ASSOC_RUNNING;
@@ -1248,7 +1233,7 @@ CPed::FinishedAttackCB(CAnimBlendAssociation *attackAssoc, void *arg)
 			reloadAnimAssoc = RpAnimBlendClumpGetAssociation(ped->GetClump(), GetCrouchReloadAnim(currentWeapon));
 		}
 		if (currentWeapon->m_bCrouchFire && attackAssoc) {
-			if (attackAssoc->animId == ANIM_WEAPON_CROUCHFIRE && !reloadAnimAssoc) {
+			if (attackAssoc->animId == GetCrouchFireAnim(currentWeapon) && !reloadAnimAssoc) {
 				newAnim = CAnimManager::BlendAnimation(ped->GetClump(), ASSOCGRP_STD, ANIM_WEAPON_CROUCH, 8.0f);
 				newAnim->SetCurrentTime(newAnim->hierarchy->totalLength);
 				newAnim->flags &= ~ASSOC_RUNNING;
@@ -1276,15 +1261,6 @@ CPed::FinishedAttackCB(CAnimBlendAssociation *attackAssoc, void *arg)
 			newAnim->SetFinishCallback(FinishedAttackCB, ped);
 		}
 	} else {
-		// TODO(Miami): Remove this block when fighting has been ported
-		if (attackAssoc && attackAssoc->animId == ANIM_FIGHT_PPUNCH && currentWeapon->m_AnimToPlay == ASSOCGRP_STD)
-		{
-			attackAssoc->blendDelta = -8.0f;
-			attackAssoc->flags |= ASSOC_DELETEFADEDOUT;
-			ped->ClearAttack();
-			return;
-		}
-
 		if (attackAssoc && attackAssoc->animId == ANIM_MELEE_ATTACK && currentWeapon->m_AnimToPlay == ASSOCGRP_UNARMED)
 		{
 			attackAssoc->blendDelta = -8.0f;
@@ -1343,7 +1319,7 @@ CPed::Attack(void)
 
 	if (bIsDucking) {
 		if (!!ourWeapon->m_bCrouchFire && bCrouchWhenShooting) {
-			weaponAnimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHFIRE);
+			weaponAnimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(ourWeapon));
 			if (weaponAnimAssoc) {
 				animLoopStart = ourWeapon->m_fAnim2LoopStart;
 				animLoopEnd = ourWeapon->m_fAnim2LoopEnd;
@@ -1396,7 +1372,6 @@ CPed::Attack(void)
 					meleeAttackStarted = true;
 
 				switch ( ourWeapon->m_AnimToPlay ) {
-					case ASSOCGRP_STD: // TODO(Miami): Remove that when weapons ported
 					case ASSOCGRP_UNARMED:
 					case ASSOCGRP_SCREWDRIVER:
 					case ASSOCGRP_KNIFE:
@@ -1437,7 +1412,7 @@ CPed::Attack(void)
 			if (attackShouldContinue) {
 				if (ourWeaponFire != WEAPON_FIRE_PROJECTILE || !IsPlayer() || ((CPlayerPed*)this)->m_bHaveTargetSelected) {
 					if (bCrouchWhenShooting && bIsDucking && !!ourWeapon->m_bCrouchFire) {
-						weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ourWeapon->m_AnimToPlay, ANIM_WEAPON_CROUCHFIRE, 8.0f);
+						weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ourWeapon->m_AnimToPlay, GetCrouchFireAnim(ourWeapon), 8.0f);
 
 					} else if(!!ourWeapon->m_bUse2nd && CGeneral::GetRandomNumber() & 1){
 						weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ourWeapon->m_AnimToPlay, ANIM_WEAPON_FIRE_2ND, 8.0f);
@@ -1499,9 +1474,7 @@ CPed::Attack(void)
 		if (ourWeapon->m_eWeaponFire == WEAPON_FIRE_MELEE) {
 			firePos = GetMatrix() * firePos;
 		} else {
-			// TODO(Miami): Remove ANIM_KICK_FLOOR when fighting is done
-			TransformToNode(firePos, (weaponAnimAssoc->animId == ANIM_KICK_FLOOR ||
-				weaponAnimAssoc->animId == ANIM_MELEE_ATTACK_2ND && ourWeapon->m_AnimToPlay == ASSOCGRP_UNARMED) ? PED_FOOTR : PED_HANDR);
+			TransformToNode(firePos, (weaponAnimAssoc->animId == ANIM_MELEE_ATTACK_2ND && ourWeapon->m_AnimToPlay == ASSOCGRP_UNARMED) ? PED_FOOTR : PED_HANDR);
 		}
 			
 		GetWeapon()->Fire(this, &firePos);
@@ -1521,10 +1494,8 @@ CPed::Attack(void)
 				damagerType = m_pDamageEntity->GetType();
 			}
 			switch (ourWeapon->m_AnimToPlay) {
-				case ASSOCGRP_STD: // TODO(Miami): Remove after fighting done
 				case ASSOCGRP_UNARMED:
-					if (weaponAnimAssoc->animId == ANIM_FIGHT_PPUNCH || //  TODO(Miami): Remove after fighting done
-						weaponAnimAssoc->animId == ANIM_MELEE_ATTACK || weaponAnimAssoc->animId == ANIM_MELEE_ATTACK_START) {
+					if (weaponAnimAssoc->animId == ANIM_MELEE_ATTACK || weaponAnimAssoc->animId == ANIM_MELEE_ATTACK_START) {
 #ifdef AUDIO_NOT_READY
 						DMAudio.PlayOneShot(m_audioEntityId, SOUND_FIGHT_PUNCH_39, 0.0f);
 #else
@@ -1783,15 +1754,19 @@ CPed::SetCurrentWeapon(int slot)
 	}
 }
 
-// --MIAMI: TODO when weapons got converted
+// --MIAMI: Done
 // Only used while deciding which gun ped should switch to, if no ammo left.
 bool
 CPed::SelectGunIfArmed(void)
 {
-	for (int i = 0; i < m_maxWeaponTypeAllowed; i++) {
+	for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) {
 		if (GetWeapon(i).m_nAmmoTotal > 0) {
 			eWeaponType weaponType = GetWeapon(i).m_eWeaponType;
-			if (weaponType >= WEAPONTYPE_COLT45 && weaponType != WEAPONTYPE_M16 && weaponType <= WEAPONTYPE_FLAMETHROWER) {
+
+			// First condition checks for Pistol, Python and Shotguns
+			if ((weaponType >= WEAPONTYPE_COLT45 && weaponType < WEAPONTYPE_TEC9) ||
+				weaponType == WEAPONTYPE_UZI || weaponType == WEAPONTYPE_M16 || weaponType == WEAPONTYPE_MP5 ||
+				weaponType == WEAPONTYPE_ROCKETLAUNCHER || weaponType == WEAPONTYPE_FLAMETHROWER || weaponType == WEAPONTYPE_SNIPERRIFLE) {
 				SetCurrentWeapon(i);
 				return true;
 			}
@@ -1801,39 +1776,54 @@ CPed::SelectGunIfArmed(void)
 	return false;
 }
 
+// --MIAMI: Done
 void
 CPed::Duck(void)
 {
 	if (CTimer::GetTimeInMilliseconds() > m_duckTimer)
 		ClearDuck();
+	else if (bIsDucking && bCrouchWhenShooting) {
+		CWeaponInfo *weapon = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType);
+		CAnimBlendAssociation *attackAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCH);
+		if (!attackAssoc) {
+			if(!!weapon->m_bCrouchFire)
+				attackAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(weapon));
+		}
+		if (!attackAssoc) {
+			if(!!weapon->m_bReload)
+				attackAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchReloadAnim(weapon));
+		}
+		if (!attackAssoc) {
+			bIsDucking = false;
+		}
+	}
 }
 
+// --MIAMI: Done
 void
-CPed::ClearDuck(void)
+CPed::ClearDuck(bool clearTimer)
 {
 	CAnimBlendAssociation *animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DUCK_DOWN);
 	if (!animAssoc) {
 		animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DUCK_LOW);
-
-		if (!animAssoc) {
-			bIsDucking = false;
-			return;
-		}
 	}
 
-	if (!bCrouchWhenShooting)
-		return;
+	if (!animAssoc) {
+		animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCH);
+	}
 
-	if (m_nPedState != PED_ATTACK && m_nPedState != PED_AIM_GUN)
-		return;
+	if (animAssoc) {
+		animAssoc->flags |= ASSOC_DELETEFADEDOUT;
+		animAssoc->blendDelta = -4.0f;
+	}
+	bIsDucking = false;
 
-	animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_RBLOCK_CSHOOT);
-	if (!animAssoc || animAssoc->blendDelta < 0.0f) {
-		CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_RBLOCK_CSHOOT, 4.0f);
+	if (clearTimer) {
+		m_duckTimer = 0;
 	}
 }
 
-// --MIAMI: Done except commented thing
+// --MIAMI: Done
 void
 CPed::ClearPointGunAt(void)
 {
@@ -1854,7 +1844,7 @@ CPed::ClearPointGunAt(void)
 	animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE);
 	if (!animAssoc || animAssoc->blendDelta < 0.0f) {
 		if (!!weaponInfo->m_bCrouchFire) {
-			animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHFIRE);
+			animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(weaponInfo));
 		}
 	}
 	if (animAssoc) {
@@ -2693,7 +2683,7 @@ CPed::SetModelIndex(uint32 mi)
 	m_animGroup = (AssocGroupId) modelInfo->m_animGroup;
 	CAnimManager::AddAnimation(GetClump(), m_animGroup, ANIM_IDLE_STANCE);
 
-	// TODO(Miami): This is something inlined for sure
+	// TODO(Miami): This is inlined CanUseTorsoWhenLooking
 	bool canUseMyBody = false;
 	if (m_nPedState != PED_DRIVING && m_nPedState != PED_DRAG_FROM_CAR && !bIsDucking) {
 		if (m_animGroup != ASSOCGRP_SEXYWOMAN && m_animGroup != ASSOCGRP_WOMAN)
@@ -2717,7 +2707,13 @@ CPed::SetModelIndex(uint32 mi)
 void
 CPed::RemoveLighting(bool reset)
 {
-	CRenderer::RemoveVehiclePedLights(this, reset);
+	if (!bRenderScorched) {
+		CRenderer::RemoveVehiclePedLights(this, reset);
+		if (reset)
+			ReSetAmbientAndDirectionalColours();
+	}
+	SetAmbientColours();
+	DeActivateDirectional();
 }
 
 bool
@@ -2782,14 +2778,15 @@ CPed::WorkOutHeadingForMovingFirstPerson(float offset)
 		angle = CGeneral::GetRadianAngleBetweenPoints(0.0f, 0.0f, -leftRight, upDown);
 	} else {
 		if (leftRight < 0.0f)
-			angle = 0.5f * PI;
+			angle = HALFPI;
 		else if (leftRight > 0.0f)
-			angle = -0.5f * PI;
+			angle = -HALFPI;
 	}
 
 	return CGeneral::LimitRadianAngle(offset + angle);
 }
 
+// --MIAMI: Done
 void
 CPed::CalculateNewVelocity(void)
 {
@@ -2804,9 +2801,6 @@ CPed::CalculateNewVelocity(void)
 			limitedRotDest -= 2 * PI;
 		}
 
-		if (IsPlayer() && m_nPedState == PED_ATTACK)
-			headAmount /= 4.0f;
-
 		float neededTurn = limitedRotDest - m_fRotationCur;
 		if (neededTurn <= headAmount) {
 			if (neededTurn > (-headAmount))
@@ -2830,8 +2824,12 @@ CPed::CalculateNewVelocity(void)
 	}
 
 	if ((!TheCamera.Cams[TheCamera.ActiveCam].GetWeaponFirstPersonOn() && !TheCamera.Cams[0].Using3rdPersonMouseCam())
-		|| FindPlayerPed() != this || !CanStrafeOrMouseControl())
+		|| FindPlayerPed() != this || !CanStrafeOrMouseControl()) {
+
+		if (FindPlayerPed() == this)
+			FindPlayerPed()->m_fWalkAngle = 0.0f;
 		return;
+	}
 
 	float walkAngle = WorkOutHeadingForMovingFirstPerson(m_fRotationCur);
 	float pedSpeed = m_moved.Magnitude();
@@ -2851,16 +2849,13 @@ CPed::CalculateNewVelocity(void)
 
 	CAnimBlendAssociation *idleAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_IDLE_STANCE);
 	CAnimBlendAssociation *fightAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_FIGHT_IDLE);
-#ifdef VC_PED_PORTS
 	if(!fightAssoc)
 		fightAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_IDLE_TIRED);
 
-	// There is one more anim in VC.
+	if(!fightAssoc)
+		fightAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHRELOAD);
 
 	if ((!idleAssoc || idleAssoc->blendAmount < 0.5f) && !fightAssoc && !bIsDucking) {
-#else
-	if ((!idleAssoc || idleAssoc->blendAmount < 0.5f) && !fightAssoc) {
-#endif
 		LimbOrientation newUpperLegs;
 		newUpperLegs.yaw = localWalkAngle;
 
@@ -3944,7 +3939,7 @@ CPed::ClearAttackByRemovingAnim(void)
 
 	if (!weaponAssoc) {
 		if (!!weapon->m_bCrouchFire)
-			weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHFIRE);
+			weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(weapon));
 	}
 	if (!weaponAssoc) {
 		if(!!weapon->m_bFinish3rd)
@@ -4916,7 +4911,7 @@ CPed::SetPointGunAt(CEntity *to)
 
 	if (bCrouchWhenShooting && bIsDucking) {
 		if (!!curWeapon->m_bCrouchFire) {
-			aimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHFIRE);
+			aimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(curWeapon));
 		}
 	} else {
 		aimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE);
@@ -4925,7 +4920,7 @@ CPed::SetPointGunAt(CEntity *to)
 	if (!aimAssoc || aimAssoc->blendDelta < 0.0f) {
 		if (bCrouchWhenShooting && bIsDucking) {
 			if (!!curWeapon->m_bCrouchFire) {
-				aimAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_WEAPON_CROUCHFIRE, 4.0f);
+				aimAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, GetCrouchFireAnim(curWeapon), 4.0f);
 			}
 		} else {
 			aimAssoc = CAnimManager::AddAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_WEAPON_FIRE);
@@ -5197,7 +5192,7 @@ CPed::SetAttack(CEntity *victim)
 	}
 
 	// TODO(Miami): Brass knuckles
-	if (GetWeapon()->m_eWeaponType == WEAPONTYPE_UNARMED || curWeapon->m_bFightMode /* || GetWeapon()->m_eWeaponType == WEAPONTYPE_BRASSKNUCKLES */) {
+	if (GetWeapon()->m_eWeaponType == WEAPONTYPE_UNARMED || curWeapon->m_bFightMode || GetWeapon()->m_eWeaponType == WEAPONTYPE_BRASSKNUCKLE) {
 		if (IsPlayer() ||
 			(m_nPedState != PED_FIGHT && m_nMoveState != PEDMOVE_NONE && m_nMoveState != PEDMOVE_STILL
 				&& !(m_pedStats->m_flags & STAT_SHOPPING_BAGS) && curWeapon->m_bPartialAttack)) {
@@ -5209,10 +5204,7 @@ CPed::SetAttack(CEntity *victim)
 				m_nPedState = PED_ATTACK;
 				bIsAttacking = false;
 
-				// TODO(Miami): Revert when fighting got ported
-				animAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay,
-					GetWeapon()->m_eWeaponType == WEAPONTYPE_UNARMED ? ANIM_FIGHT_PPUNCH : ANIM_MELEE_ATTACK_START, 8.0f);
-				// CAnimBlendAssociation *animAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_MELEE_ATTACK_START, 8.0f);
+				CAnimBlendAssociation *animAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_MELEE_ATTACK_START, 8.0f);
 				animAssoc->SetRun();
 				if (animAssoc->currentTime == animAssoc->hierarchy->totalLength)
 					animAssoc->SetCurrentTime(0.0f);
@@ -5316,13 +5308,13 @@ CPed::SetAttack(CEntity *victim)
 			m_nPedState = PED_ATTACK;
 			SetMoveState(PEDMOVE_NONE);
 			if (bCrouchWhenShooting && bIsDucking && !!curWeapon->m_bCrouchFire) {
-				CAnimBlendAssociation* curMoveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHFIRE);
+				CAnimBlendAssociation* curMoveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(curWeapon));
 				if (curMoveAssoc) {
-					if (strcmp(CAnimManager::GetAnimAssociation(curWeapon->m_AnimToPlay, ANIM_WEAPON_CROUCHFIRE)->hierarchy->name, curMoveAssoc->hierarchy->name) != 0) {
+					if (strcmp(CAnimManager::GetAnimAssociation(curWeapon->m_AnimToPlay, GetCrouchFireAnim(curWeapon))->hierarchy->name, curMoveAssoc->hierarchy->name) != 0) {
 						delete curMoveAssoc;
 					}
 				}
-				animAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, ANIM_WEAPON_CROUCHFIRE, 8.0f);
+				animAssoc = CAnimManager::BlendAnimation(GetClump(), curWeapon->m_AnimToPlay, GetCrouchFireAnim(curWeapon), 8.0f);
 			} else {
 				float animDelta = 8.0f;
 				if (curWeapon->m_eWeaponFire == WEAPON_FIRE_MELEE)
@@ -5442,10 +5434,11 @@ CPed::StartFightAttack(uint8 buttonPressure)
 		nPlayerInComboMove = 0;
 }
 
+// --MIAMI: Done
 void
 CPed::LoadFightData(void)
 {
-	float startFireTime, endFireTime, comboFollowOnTime, strikeRadius;
+	float startFireTime, endFireTime, comboFollowOnTime, strikeRadius, extendReachMultiplier;
 	int damage, flags;
 	char line[256], moveName[32], animName[32], hitLevel;
 	int moveId = 0;
@@ -5474,12 +5467,13 @@ CPed::LoadFightData(void)
 
 		sscanf(
 			&line[lp],
-			"%s %f %f %f %f %c %s %d %d",
+			"%s %f %f %f %f %f %c %s %d %d",
 			moveName,
 			&startFireTime,
 			&endFireTime,
 			&comboFollowOnTime,
 			&strikeRadius,
+			&extendReachMultiplier,
 			&hitLevel,
 			animName,
 			&damage,
@@ -5492,6 +5486,7 @@ CPed::LoadFightData(void)
 		tFightMoves[moveId].endFireTime = endFireTime / 30.0f;
 		tFightMoves[moveId].comboFollowOnTime = comboFollowOnTime / 30.0f;
 		tFightMoves[moveId].strikeRadius = strikeRadius;
+		tFightMoves[moveId].extendReachMultiplier = extendReachMultiplier;
 		tFightMoves[moveId].damage = damage;
 		tFightMoves[moveId].flags = flags;
 
@@ -5515,11 +5510,14 @@ CPed::LoadFightData(void)
 				break;
 		}
 
-		if (strncmp(animName, "null", 4) != 0) {
-			animAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, animName);
-			tFightMoves[moveId].animId = (AnimationId)animAssoc->animId;
-		} else {
-			tFightMoves[moveId].animId = ANIM_WALK;
+		if (strncmp(animName, "default", 8) != 0) {
+			if (strncmp(animName, "null", 5) != 0) {
+				animAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, animName);
+				tFightMoves[moveId].animId = (AnimationId)animAssoc->animId;
+			}
+			else {
+				tFightMoves[moveId].animId = ANIM_WALK;
+			}
 		}
 		moveId++;
 	}
@@ -5612,6 +5610,7 @@ CPed::FightStrike(CVector &touchedNodePos)
 			damageMult *= m_pedStats->m_attackStrength;
 		}
 
+		/*
 		// Change direction if we used kick.
 		if (m_lastFightMove == FIGHTMOVE_KICK) {
 			if (CGeneral::GetRandomNumber() & 1) {
@@ -5619,7 +5618,7 @@ CPed::FightStrike(CVector &touchedNodePos)
 				if (direction > 3)
 					direction -= 4;
 			}
-		}
+		} */
 		nearPed->ReactToAttack(this);
 
 		// Mostly unused. if > 5, ANIM_HIT_WALK will be run, that's it.
@@ -6359,6 +6358,7 @@ CPed::CollideWithPed(CPed *collideWith)
 	}
 }
 
+// --MIAMI: Done except commented thing
 void
 CPed::CreateDeadPedMoney(void)
 {
@@ -6366,29 +6366,31 @@ CPed::CreateDeadPedMoney(void)
 		return;
 
 	int skin = GetModelIndex();
+
+	// TODO(Miami): New flag
 	if ((skin >= MI_COP && skin <= MI_FIREMAN) || CharCreatedBy == MISSION_CHAR || bInVehicle)
 		return;
 
-	int money = CGeneral::GetRandomNumber() % 60;
+	int money = m_nPedMoney;
 	if (money < 10)
 		return;
 
-	if (money == 43)
-		money = 700;
+	CVector pickupPos = GetPosition();
+	bool found;
 
-	int pickupCount = money / 40 + 1;
+	int pickupCount = Min(money / 20 + 1, 7);
 	int moneyPerPickup = money / pickupCount;
 
 	for(int i = 0; i < pickupCount; i++) {
 		// (CGeneral::GetRandomNumber() % 256) * PI / 128 gives a float up to something TWOPI-ish.
-		float pickupX = 1.5f * Sin((CGeneral::GetRandomNumber() % 256) * PI / 128) + GetPosition().x;
-		float pickupY = 1.5f * Cos((CGeneral::GetRandomNumber() % 256) * PI / 128) + GetPosition().y;
-		bool found = false;
-		float groundZ = CWorld::FindGroundZFor3DCoord(pickupX, pickupY, GetPosition().z, &found) + 0.5f;
+		pickupPos.x += 1.5f * Sin((CGeneral::GetRandomNumber() % 256) * PI / 128);
+		pickupPos.y += 1.5f * Cos((CGeneral::GetRandomNumber() % 256) * PI / 128);
+		pickupPos.z = CWorld::FindGroundZFor3DCoord(pickupPos.x, pickupPos.y, pickupPos.z, &found) + 0.5f;
 		if (found) {
-			CPickups::GenerateNewOne(CVector(pickupX, pickupY, groundZ), MI_MONEY, PICKUP_MONEY, moneyPerPickup + (CGeneral::GetRandomNumber() & 7));
+			CPickups::GenerateNewOne(CVector(pickupPos.x, pickupPos.y, pickupPos.z), MI_MONEY, PICKUP_MONEY, moneyPerPickup + (CGeneral::GetRandomNumber() & 3));
 		}
 	}
+	m_nPedMoney = 0;
 }
 
 void
@@ -6559,13 +6561,6 @@ CPed::RemoveWeaponAnims(int unused, float animDelta)
 	CAnimBlendAssociation *weaponAssoc;
 	//CWeaponInfo::GetWeaponInfo(unused);
 
-	// TODO(Miami): Remove when fighting got ported
-	weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_FIGHT_PPUNCH);
-	if (weaponAssoc) {
-		weaponAssoc->blendDelta = animDelta;
-		weaponAssoc->flags |= ASSOC_DELETEFADEDOUT;
-	}
-
 	weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE);
 	if (weaponAssoc) {
 		weaponAssoc->blendDelta = animDelta;
@@ -6726,6 +6721,7 @@ CPed::DoesLOSBulletHitPed(CColPoint &colPoint)
 	return retVal;
 }
 
+// TODO(Miami): Ducking doesn't work, fix this
 bool
 CPed::DuckAndCover(void)
 {
@@ -6743,9 +6739,11 @@ CPed::DuckAndCover(void)
 				SetAimFlag(m_pedInObjective);
 
 		} else {
-			bCrouchWhenShooting = false;
 			bKindaStayInSamePlace = false;
-			bIsDucking = false;
+			if (bIsDucking)
+				ClearDuck(true);
+
+			bCrouchWhenShooting = false;
 			bDuckAndCover = false;
 			m_headingRate = 10.0f;
 			m_duckAndCoverTimer = CTimer::GetTimeInMilliseconds() + CGeneral::GetRandomNumberInRange(20000,30000);
@@ -6758,8 +6756,11 @@ CPed::DuckAndCover(void)
 	bool justDucked = false;
 	CVehicle *foundVeh = nil;
 	float maxDist = 225.0f;
-	bIsDucking = false;
+	if (bIsDucking)
+		ClearDuck(true);
+
 	bCrouchWhenShooting = false;
+
 	if (CTimer::GetTimeInMilliseconds() > m_leaveCarTimer) {
 		CVector pos = GetPosition();
 		int16 lastVehicle;
@@ -7148,13 +7149,9 @@ CPed::Fight(void)
 				case FIGHTMOVE_KNEE:
 					TransformToNode(touchingNodePos, PED_LOWERLEGR);
 					break;
-				case FIGHTMOVE_HEADBUTT:
-					TransformToNode(touchingNodePos, PED_HEAD);
-					break;
 				case FIGHTMOVE_PUNCHJAB:
 					TransformToNode(touchingNodePos, PED_HANDL);
 					break;
-				case FIGHTMOVE_KICK:
 				case FIGHTMOVE_LONGKICK:
 				case FIGHTMOVE_ROUNDHOUSE:
 				case FIGHTMOVE_GROUNDKICK:
@@ -7215,12 +7212,12 @@ CPed::Fight(void)
 			canRoundhouse = false;
 			punchOnly = false;
 			canKick = true;
-			nextFightMove = (m_fightButtonPressure > 190 ? FIGHTMOVE_HEADBUTT : FIGHTMOVE_KNEE);
+			nextFightMove = (m_fightButtonPressure > 190 ? FIGHTMOVE_BODYBLOW : FIGHTMOVE_KNEE);
 			hasShoppingBags = false;
 			canKneeHead = true;
 			nPlayerInComboMove = 0;
 		} else {
-			nextFightMove = (m_fightButtonPressure > 120 ? FIGHTMOVE_HEADBUTT : FIGHTMOVE_KNEE);
+			nextFightMove = (m_fightButtonPressure > 120 ? FIGHTMOVE_BODYBLOW : FIGHTMOVE_KNEE);
 			uint16 pedFeatures = m_pedStats->m_flags;
 			punchOnly = pedFeatures & STAT_PUNCH_ONLY;
 			canRoundhouse = pedFeatures & STAT_CAN_ROUNDHOUSE;
@@ -7259,7 +7256,7 @@ CPed::Fight(void)
 								&& neededTurn < DEGTORAD(35.0f)
 								&& (canKick || hasShoppingBags)) {
 
-								nextFightMove = FIGHTMOVE_KICK;
+								nextFightMove = FIGHTMOVE_LONGKICK;
 								if (hasShoppingBags) {
 									nextFightMove = FIGHTMOVE_ROUNDHOUSE;
 								} else if (canRoundhouse && CGeneral::GetRandomNumber() & 1) {
@@ -7352,7 +7349,7 @@ CPed::Fight(void)
 						if (fightingPedDist >= 1.3f) {
 
 							if (fightingPedDist < 1.7f && canKick) {
-								nextFightMove = FIGHTMOVE_KICK;
+								nextFightMove = FIGHTMOVE_LONGKICK;
 								if (canRoundhouse && CGeneral::GetRandomNumber() & 1)
 									nextFightMove = FIGHTMOVE_ROUNDHOUSE;
 
@@ -9329,7 +9326,7 @@ CPed::KillPedWithCar(CVehicle *car, float impulse)
 void
 CPed::Look(void)
 {
-	// UNUSED: This is a perfectly empty function.
+	TurnBody();
 }
 
 bool
@@ -11270,6 +11267,7 @@ CPed::SetInTheAir(void)
 void
 CPed::RestoreHeadPosition(void)
 {
+	// TODO(Miami): This is inlined CanUseTorsoWhenLooking
 	bool canUseMyBody = false;
 	if (m_nPedState != PED_DRIVING && m_nPedState != PED_DRAG_FROM_CAR && !bIsDucking) {
 		if (m_animGroup != ASSOCGRP_SEXYWOMAN && m_animGroup != ASSOCGRP_WOMAN)
@@ -11299,7 +11297,7 @@ CPed::PointGunAt(void)
 	CAnimBlendAssociation *weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_FIRE);
 	if (!weaponAssoc || weaponAssoc->blendDelta < 0.0f) {
 		if (!!weaponInfo->m_bCrouchFire) {
-			weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_CROUCHFIRE);
+			weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), GetCrouchFireAnim(weaponInfo));
 			animLoopStart = weaponInfo->m_fAnim2LoopStart;
 		}
 	}
@@ -15627,19 +15625,22 @@ CPed::SetEnterTrain(CVehicle *train, uint32 unused)
 }
 #endif
 
+// --MIAMI: Done, but what is this parameter for?
 void
-CPed::SetDuck(uint32 time)
+CPed::SetDuck(uint32 time, bool sth)
 {
-	if (bIsDucking || CTimer::GetTimeInMilliseconds() <= m_duckTimer)
-		return;
-
-	if (bCrouchWhenShooting && (m_nPedState == PED_ATTACK || m_nPedState == PED_AIM_GUN)) {
-		CAnimBlendAssociation *duckAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DUCK_LOW);
-		if (!duckAssoc || duckAssoc->blendDelta < 0.0f) {
-			CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_DUCK_LOW, 4.0f);
-			bIsDucking = true;
+	if (bIsDucking || CTimer::GetTimeInMilliseconds() <= m_duckTimer && !sth) {
+		if (sth && CTimer::GetTimeInMilliseconds() + time > m_duckTimer)
 			m_duckTimer = CTimer::GetTimeInMilliseconds() + time;
-		}
+		return;
+	}
+
+	CAnimBlendAssociation *duckAssoc;
+	if (bCrouchWhenShooting) {
+		duckAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_WEAPON_CROUCH, 4.0f);
+		duckAssoc->flags &= ~ASSOC_FADEOUTWHENDONE;
+		bIsDucking = true;
+		m_duckTimer = CTimer::GetTimeInMilliseconds() + time;
 	} else {
 		CAnimBlendAssociation *duckAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_DUCK_DOWN);
 		if (!duckAssoc || duckAssoc->blendDelta < 0.0f) {
@@ -18563,7 +18564,7 @@ CPed::ClearFollowPath()
 	m_nCurPathNode = 0;
 }
 
-// --MIAMI: Done
+// --MIAMI: Done except bikes
 void
 CPed::AddInCarAnims(CVehicle* car, bool isDriver)
 {
@@ -18603,6 +18604,12 @@ CPed::AddInCarAnims(CVehicle* car, bool isDriver)
 	StopNonPartialAnims();
 }
 
+bool
+CPed::CanBeDamagedByThisGangMember(CPed* who)
+{
+	return m_gangFlags & (1 << (uint8)(who->m_nPedType - PEDTYPE_GANG1));
+}
+
 bool
 IsPedPointerValid_NotInWorld(CPed* pPed)
 {
@@ -18626,4 +18633,4 @@ IsPedPointerValid(CPed* pPed)
 	if (pPed->bInVehicle && pPed->m_pMyVehicle)
 		return IsEntityPointerValid(pPed->m_pMyVehicle);
 	return pPed->m_entryInfoList.first || pPed == FindPlayerPed();
-}
+}
\ No newline at end of file
diff --git a/src/peds/Ped.h b/src/peds/Ped.h
index c01e3630..f5e6d95a 100644
--- a/src/peds/Ped.h
+++ b/src/peds/Ped.h
@@ -79,11 +79,11 @@ struct FightMove
 	float endFireTime;
 	float comboFollowOnTime;
 	float strikeRadius;
+	float extendReachMultiplier;
 	uint8 hitLevel; // FightMoveHitLevel
 	uint8 damage;
 	uint8 flags;
 };
-VALIDATE_SIZE(FightMove, 0x18);
 
 // TODO: This is eFightState on mobile.
 enum PedFightMoves
@@ -94,13 +94,21 @@ enum PedFightMoves
 	FIGHTMOVE_IDLE,
 	FIGHTMOVE_SHUFFLE_F,
 	FIGHTMOVE_KNEE,
-	FIGHTMOVE_HEADBUTT,
-	FIGHTMOVE_PUNCHJAB,
 	FIGHTMOVE_PUNCHHOOK,
-	FIGHTMOVE_KICK,
+	FIGHTMOVE_PUNCHJAB,
+	FIGHTMOVE_PUNCH,
+	FIGHTMOVE_BODYBLOW = FIGHTMOVE_PUNCH,
 	FIGHTMOVE_LONGKICK,
 	FIGHTMOVE_ROUNDHOUSE,
-	FIGHTMOVE_BODYBLOW,
+	// Directionals
+	FIGHTMOVE_FWDLEFT,
+	FIGHTMOVE_FWDRIGHT,
+	FIGHTMOVE_BACKKICK,
+	FIGHTMOVE_BACKFLIP,
+	FIGHTMOVE_BACKLEFT,
+	FIGHTMOVE_BACKRIGHT,
+	FIGHTMOVE_RIGHTSWEEP,
+	// Special
 	FIGHTMOVE_GROUNDKICK,
 	// Opponent
 	FIGHTMOVE_HITFRONT,
@@ -113,6 +121,9 @@ enum PedFightMoves
 	FIGHTMOVE_HITBIGSTEP,
 	FIGHTMOVE_HITONFLOOR,
 	FIGHTMOVE_HITBEHIND,
+	FIGHTMOVE_MELEE1,
+	FIGHTMOVE_MELEE2,
+	FIGHTMOVE_MELEE3,
 	FIGHTMOVE_IDLE2NORM,
 	NUM_FIGHTMOVES
 };
@@ -466,6 +477,7 @@ public:
 	uint32 m_ped_flagI40 : 1; // bMakePedsRunToPhonesToReportCrimes makes use of this as runover by car indicator
 	uint32 m_ped_flagI80 : 1; // KANGAROO_CHEAT define makes use of this as cheat toggle 
 
+	uint8 m_gangFlags;
 	uint8 CharCreatedBy;
 	eObjective m_objective;
 	eObjective m_prevObjective;
@@ -588,7 +600,7 @@ public:
 	int8 m_bodyPartBleeding;		// PedNode, but -1 if there isn't
 	CPed *m_nearPeds[10];
 	uint16 m_numNearPeds;
-	uint16 m_pedMoney;
+	uint16 m_nPedMoney;
  	int8 m_lastWepDam;
 	CEntity *m_lastDamEntity;
 	CEntity *m_attachedTo;
@@ -651,7 +663,7 @@ public:
 	void SetCurrentWeapon(eWeaponType weaponType);
 	void SetCurrentWeapon(int weapon);
 	void Duck(void);
-	void ClearDuck(void);
+	void ClearDuck(bool = false);
 	void ClearPointGunAt(void);
 	void BeingDraggedFromCar(void);
 	void RestartNonPartialAnims(void);
@@ -679,7 +691,7 @@ public:
 	void ClearChat(void);
 	void InformMyGangOfAttack(CEntity*);
 	void ReactToAttack(CEntity*);
-	void SetDuck(uint32);
+	void SetDuck(uint32, bool = false);
 	void RegisterThreatWithGangPeds(CEntity*);
 	bool TurnBody(void);
 	void Chat(void);
@@ -810,6 +822,7 @@ public:
 	void GiveDelayedWeapon(eWeaponType weapon, uint32 ammo);
 	void RequestDelayedWeapon();
 	void AddInCarAnims(CVehicle* car, bool isDriver);
+	bool CanBeDamagedByThisGangMember(CPed*);
 
 	// Static methods
 	static CVector GetLocalPositionToOpenCarDoor(CVehicle *veh, uint32 component, float offset);
@@ -915,7 +928,7 @@ public:
 	bool Dead(void) { return m_nPedState == PED_DEAD; }
 	bool Dying(void) { return m_nPedState == PED_DIE; }
 	bool DyingOrDead(void) { return m_nPedState == PED_DIE || m_nPedState == PED_DEAD; }
-	bool OnGround(void) { return m_nPedState == PED_FALL || m_nPedState == PED_DIE || m_nPedState == PED_DEAD || m_nWaitState == WAITSTATE_SUN_BATHE_IDLE; }
+	bool OnGround(void) { return m_nPedState == PED_FALL || m_nPedState == PED_DIE || m_nPedState == PED_DEAD; }
 	
 	bool Driving(void) { return m_nPedState == PED_DRIVING; }
 	bool InVehicle(void) { return bInVehicle && m_pMyVehicle; } // True when ped is sitting/standing in vehicle, not in enter/exit state.
@@ -933,10 +946,6 @@ public:
 
 	// My names. Inlined in VC
 	AnimationId GetFireAnimNotDucking(CWeaponInfo* weapon) {
-		// TODO(Miami): Revert that when weapons got ported
-		if (weapon->m_AnimToPlay == ASSOCGRP_STD)
-			return ANIM_FIGHT_PPUNCH;
-
 		if (m_nPedType == PEDTYPE_COP && !!weapon->m_bCop3rd)
 			return ANIM_WEAPON_FIRE_3RD;
 		else
@@ -944,14 +953,10 @@ public:
 	}
 
 	static AnimationId GetFireAnimGround(CWeaponInfo* weapon, bool kickFloorIfNone = true) {
-		// TODO(Miami): Revert that when weapons got ported
-		if (weapon->m_AnimToPlay == ASSOCGRP_STD)
-			return ANIM_KICK_FLOOR;
-
 		if (!!weapon->m_bGround2nd)
 			return ANIM_WEAPON_CROUCHFIRE;
 		else if (!!weapon->m_bGround3rd)
-			return ANIM_WEAPON_SPECIAL;
+			return ANIM_WEAPON_FIRE_3RD;
 		else if (kickFloorIfNone)
 			return ANIM_KICK_FLOOR;
 		else
@@ -959,10 +964,6 @@ public:
 	}
 
 	static AnimationId GetPrimaryFireAnim(CWeaponInfo* weapon) {
-		// TODO(Miami): Revert that when weapons got ported
-		if (weapon->m_AnimToPlay == ASSOCGRP_STD)
-			return ANIM_FIGHT_PPUNCH;
-
 		if (weapon->m_bAnimDetonate)
 			return ANIM_BOMBER;
 		else
@@ -976,6 +977,13 @@ public:
 			return (AnimationId)0;
 	}
 
+	static AnimationId GetCrouchFireAnim(CWeaponInfo* weapon) {
+		if (!!weapon->m_bCrouchFire)
+			return ANIM_WEAPON_CROUCHFIRE;
+		else
+			return (AnimationId)0;
+	}
+
 	static AnimationId GetReloadAnim(CWeaponInfo* weapon) {
 		if (!!weapon->m_bReload)
 			return ANIM_WEAPON_RELOAD;
diff --git a/src/peds/PedAttactor.cpp b/src/peds/PedAttactor.cpp
index 0df59b1c..782d2770 100644
--- a/src/peds/PedAttactor.cpp
+++ b/src/peds/PedAttactor.cpp
@@ -12,7 +12,7 @@ const int gcMaxSizeOfPizzaQueue = 5;
 const int gcMaxSizeOfShelterQueue = 5;
 const int gcMaxSizeOfIceCreamQueue = 1;
 
-//--MIAMI: file done, except TODO(MIAMI)
+//--MIAMI: file done
 
 std::vector<CVector> CPedShelterAttractor::ms_displacements;
 
@@ -167,19 +167,15 @@ CPedAttractor::CPedAttractor(C2dEffect* pEffect, const CMatrix& matrix, int32 ma
 
 void CPedPizzaAttractor::UpdatePedStateOnDeparture(CPed* pPed) const
 {
-	/* TODO(MIAMI): uncomment
 	if (pPed->m_nPedMoney > 10)
 		pPed->m_nPedMoney -= 10;
 	else
 		pPed->m_nPedMoney = 0;
-	*/
 }
 
 void CPedAtmAttractor::UpdatePedStateOnDeparture(CPed* pPed) const
 {
-	/* TODO(MIAMI): uncomment
 	pPed->m_nPedMoney += 20 * CGeneral::GetRandomNumberInRange(1, 51);
-	*/
 };
 
 float CPedAttractor::ComputeDeltaHeading() const
diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp
index 69a6d211..9f972882 100644
--- a/src/peds/PlayerPed.cpp
+++ b/src/peds/PlayerPed.cpp
@@ -1088,6 +1088,7 @@ CPlayerPed::ProcessAnimGroups(void)
 	}
 }
 
+// TODO(Miami): Hella TODO
 void
 CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
 {
@@ -1099,8 +1100,9 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
 	}
 	if (!m_pFire) {
 		if (GetWeapon()->m_eWeaponType == WEAPONTYPE_ROCKETLAUNCHER ||
-			GetWeapon()->m_eWeaponType == WEAPONTYPE_SNIPERRIFLE || GetWeapon()->m_eWeaponType == WEAPONTYPE_M16) {
-			if (padUsed->TargetJustDown()) {
+			GetWeapon()->m_eWeaponType == WEAPONTYPE_SNIPERRIFLE || GetWeapon()->m_eWeaponType == WEAPONTYPE_M16 ||
+			GetWeapon()->m_eWeaponType == WEAPONTYPE_AK47) {
+			if (padUsed->TargetJustDown() || TheCamera.m_bJustJumpedOutOf1stPersonBecauseOfTarget) {
 				SetStoredState();
 				m_nPedState = PED_SNIPER_MODE;
 #ifdef FREE_CAM
@@ -1134,7 +1136,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
 				else
 #endif
 					SetAttack(m_pPointGunAt);
-			} else if (m_currentWeapon != WEAPONTYPE_UNARMED) {
+			} else {
 				if (m_nPedState == PED_ATTACK) {
 					if (padUsed->WeaponJustDown()) {
 						m_bHaveTargetSelected = true;
@@ -1145,12 +1147,19 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
 					m_fAttackButtonCounter = 0.0f;
 					m_bHaveTargetSelected = false;
 				}
-				SetAttack(nil);
-			} else if (padUsed->WeaponJustDown()) {
-				if (m_fMoveSpeed < 1.0f)
-					StartFightAttack(padUsed->GetWeapon());
-				else
-					SetAttack(nil);
+				if (GetWeapon()->m_eWeaponType != WEAPONTYPE_UNARMED && GetWeapon()->m_eWeaponType != WEAPONTYPE_BRASSKNUCKLE &&
+					!weaponInfo->m_bFightMode) {
+
+					if (GetWeapon()->m_eWeaponType != WEAPONTYPE_DETONATOR && GetWeapon()->m_eWeaponType != WEAPONTYPE_DETONATOR_GRENADE ||
+						padUsed->WeaponJustDown())
+
+						SetAttack(nil);
+				} else if (padUsed->WeaponJustDown()) {
+					if (m_fMoveSpeed < 1.0f || m_nPedState == PED_FIGHT)
+						StartFightAttack(padUsed->GetWeapon());
+					else
+						SetAttack(nil);
+				}
 			}
 		}
 	} else {
@@ -1185,7 +1194,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
 #endif
 				} else {
 					m_fRotationDest = limitedCam;
-					m_headingRate = 50.0f;
+					m_headingRate = 12.5f;
 
 					// Anim. fix for shotgun, ak47 and m16 (we must finish rot. it quickly)
 					if (weaponInfo->m_bCanAim && padUsed->WeaponJustDown()) {
diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp
index 44bedab9..338c47f0 100644
--- a/src/peds/Population.cpp
+++ b/src/peds/Population.cpp
@@ -461,17 +461,16 @@ CPopulation::AddPed(ePedType pedType, uint32 miOrCopType, CVector const &coors,
 			if (ms_bGivePedsWeapons) {
 				eWeaponType weapon;
 
-				// TODO(Miami): Look here when weapons have been ported
 				switch (CGeneral::GetRandomNumber() & 3) {
 					case 0:
 						weapon = WEAPONTYPE_COLT45;
 						break;
 					case 1:
-						//weapon = WEAPONTYPE_NIGHTSTICK;
-						//break;
+						weapon = WEAPONTYPE_NIGHTSTICK;
+						break;
 					case 2:
-						//weapon = WEAPONTYPE_GOLFCLUB;
-						//break;
+						weapon = WEAPONTYPE_GOLFCLUB;
+						break;
 					case 3:
 						weapon = WEAPONTYPE_TEC9;
 						break;
@@ -1093,8 +1092,7 @@ CPopulation::AddDeadPedInFrontOfCar(const CVector& pos, CVehicle* pCulprit)
 		return nil;
 	CPed* pPed = CPopulation::AddPed(PEDTYPE_CIVMALE, MI_MALE01, pos); // TODO(MIAMI): 4th parameter
 	pPed->SetDie(ANIM_KO_SHOT_FRONT1, 4.0f, 0.0f);
-	//TODO(MIAMI): uncomment
-	//pPed->m_nPedMoney = 0;
+	pPed->m_nPedMoney = 0;
 	pPed->bDeadPedInFrontOfCar = true;
 	pPed->m_vehicleInAccident = pCulprit;
 	pCulprit->RegisterReference((CEntity**)&pPed->m_vehicleInAccident);
@@ -1108,7 +1106,7 @@ CPopulation::AddDeadPedInFrontOfCar(const CVector& pos, CVehicle* pCulprit)
 			}
 		}
 	}
-	CColPoint colpts[32];
+	CColPoint colpts[MAX_COLLISION_POINTS];
 	if (CCollision::ProcessColModels(pCulprit->GetMatrix(), *pCulprit->GetColModel(), pPed->GetMatrix(), *pPed->GetColModel(), colpts, nil, nil)) {
 		CWorld::Remove(pPed);
 		delete pPed;
diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp
index 6a0b7eea..7289d70c 100644
--- a/src/render/Hud.cpp
+++ b/src/render/Hud.cpp
@@ -88,6 +88,21 @@ float CHud::PagerXOffset;
 int16 CHud::PagerTimer;
 int16 CHud::PagerOn;
 
+uint32 CHud::m_WantedFadeTimer;
+uint32 CHud::m_WantedState;
+uint32 CHud::m_WantedTimer;
+uint32 CHud::m_EnergyLostFadeTimer;
+uint32 CHud::m_EnergyLostState;
+uint32 CHud::m_EnergyLostTimer;
+uint32 CHud::m_DisplayScoreFadeTimer;
+uint32 CHud::m_DisplayScoreState;
+uint32 CHud::m_DisplayScoreTimer;
+uint32 CHud::m_WeaponFadeTimer;
+uint32 CHud::m_WeaponState;
+uint32 CHud::m_WeaponTimer;
+
+uint32 CHud::m_LastDisplayScore;
+
 CSprite2d CHud::Sprites[NUM_HUD_SPRITES];
 
 struct
@@ -125,6 +140,10 @@ RwTexture *gpRocketSightTex;
 
 void CHud::Draw()
 {
+	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
+	RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSCLAMP);
+	RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
+
 	// disable hud via second controller
 	if (CPad::GetPad(1)->GetStartJustDown())
 		m_Wants_To_Draw_Hud = !m_Wants_To_Draw_Hud;
@@ -136,22 +155,29 @@ void CHud::Draw()
 		bool DrawCrossHair = 0;
 		bool DrawCrossHairPC = 0;
 
-		int32 WeaponType = FindPlayerPed()->m_weapons[FindPlayerPed()->m_currentWeapon].m_eWeaponType;
+		CPlayerPed *playerPed = FindPlayerPed();
+		eWeaponType WeaponType = playerPed->GetWeapon()->m_eWeaponType;
 		int32 Mode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
 
-		if (Mode == CCam::MODE_SNIPER || Mode == CCam::MODE_ROCKETLAUNCHER || Mode == CCam::MODE_M16_1STPERSON || Mode == CCam::MODE_HELICANNON_1STPERSON)
-			DrawCrossHair = 1;
-		if (Mode == CCam::MODE_M16_1STPERSON_RUNABOUT || Mode == CCam::MODE_ROCKETLAUNCHER_RUNABOUT || Mode == CCam::MODE_SNIPER_RUNABOUT)
-			DrawCrossHairPC = 1;
+		// TODO(Miami): New cam mode
+		if ((Mode == CCam::MODE_SNIPER || Mode == CCam::MODE_ROCKETLAUNCHER || Mode == CCam::MODE_M16_1STPERSON || Mode == CCam::MODE_HELICANNON_1STPERSON/* || Mode == 46*/)
+			&& playerPed && !playerPed->GetWeapon()->IsTypeMelee())
+			DrawCrossHair = true;
 
-		/*
-			Draw Crosshairs
-		*/
-		if (TheCamera.Cams[TheCamera.ActiveCam].Using3rdPersonMouseCam() &&
-		    (!CPad::GetPad(0)->GetLookBehindForPed() || TheCamera.m_bPlayerIsInGarage) || Mode == CCam::MODE_1STPERSON_RUNABOUT) {
-			if (FindPlayerPed() && !FindPlayerPed()->EnteringCar()) {
-				if ((WeaponType >= WEAPONTYPE_COLT45 && WeaponType <= WEAPONTYPE_M16) || WeaponType == WEAPONTYPE_FLAMETHROWER)
-					DrawCrossHairPC = 1;
+		if (Mode == CCam::MODE_M16_1STPERSON_RUNABOUT || Mode == CCam::MODE_ROCKETLAUNCHER_RUNABOUT || Mode == CCam::MODE_SNIPER_RUNABOUT)
+			DrawCrossHairPC = true;
+		if (TheCamera.Cams[TheCamera.ActiveCam].Using3rdPersonMouseCam() && (!CPad::GetPad(0)->GetLookBehindForPed() || TheCamera.m_bPlayerIsInGarage)
+			|| Mode == CCam::MODE_1STPERSON_RUNABOUT) {
+			if (playerPed) {
+				if (playerPed->m_nPedState != PED_ENTER_CAR && playerPed->m_nPedState != PED_CARJACK) {
+
+					// TODO(Miami): Uncomment
+					if (WeaponType >= WEAPONTYPE_COLT45 && WeaponType <= WEAPONTYPE_AK47
+						/*|| WeaponType == WEAPONTYPE_M60 || || WeaponType == WEAPONTYPE_MINIGUN */
+						|| WeaponType == WEAPONTYPE_FLAMETHROWER) {
+						DrawCrossHairPC = 1;
+					}
+				}
 			}
 		}
 
@@ -171,7 +197,8 @@ void CHud::Draw()
 #ifdef ASPECT_RATIO_SCALE
 				f3rdY -= SCREEN_SCALE_Y(2.0f);
 #endif
-				if (FindPlayerPed() && WeaponType == WEAPONTYPE_M16) {
+				// TODO(Miami): M60
+				if (playerPed && (WeaponType == WEAPONTYPE_M16 || WeaponType == WEAPONTYPE_AK47/* || WeaponType == WEAPONTYPE_M60*/)) {
 					rect.left = f3rdX - SCREEN_SCALE_X(32.0f * 0.6f);
 					rect.top = f3rdY - SCREEN_SCALE_Y(32.0f  * 0.6f);
 					rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.6f);
@@ -187,8 +214,7 @@ void CHud::Draw()
 
 					Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
 				}
-			}
-			else {
+			} else {
 				if (Mode == CCam::MODE_M16_1STPERSON ||
 				    Mode == CCam::MODE_M16_1STPERSON_RUNABOUT ||
 				    Mode == CCam::MODE_HELICANNON_1STPERSON) {
@@ -215,8 +241,11 @@ void CHud::Draw()
 					RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpRocketSightTex));
 
 					CSprite::RenderOneXLUSprite(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, 1.0f, SCREEN_SCALE_X(40.0f), SCREEN_SCALE_Y(40.0f), (100.0f * fMultBright), (200.0f * fMultBright), (100.0f * fMultBright), 255, 1.0f, 255);
+					RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
 				}
 				else {
+
+					// TODO(Miami)
 					// Sniper
 					rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(210.0f);
 					rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f);
@@ -243,9 +272,9 @@ void CHud::Draw()
 					Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
 				}
 			}
-			RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
 			RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
 			RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
+			RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
 		}
 		else {
 			SpriteBrightness = 0;
@@ -254,34 +283,48 @@ void CHud::Draw()
 		/*
 			DrawMoneyCounter
 		*/
+
 		wchar sPrint[16];
 		wchar sPrintIcon[16];
 		char sTemp[16];
+		float alpha;
 
-		sprintf(sTemp, "$%08d", CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
-		AsciiToUnicode(sTemp, sPrint);
+		if (m_LastDisplayScore == CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney) {
+			alpha = CHud::DrawFadeState(HUD_SCORE_FADING, 0);
+		} else {
+			alpha = CHud::DrawFadeState(HUD_SCORE_FADING, 1);
+			m_LastDisplayScore = CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney;
+		}
+		if (m_DisplayScoreState != FADED_OUT) {
+			sprintf(sTemp, "$%08d", CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
+			AsciiToUnicode(sTemp, sPrint);
 
-		CFont::SetPropOff();
-		CFont::SetBackgroundOff();
-		CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
-		CFont::SetCentreOff();
-		CFont::SetRightJustifyOn();
-		CFont::SetRightJustifyWrap(0.0f);
-		CFont::SetBackGroundOnlyTextOff();
-		CFont::SetFontStyle(FONT_HEADING);
-		CFont::SetPropOff();
-		CFont::SetColor(CRGBA(0, 0, 0, 255));
+			CFont::SetPropOff();
+			CFont::SetBackgroundOff();
+			CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
+			CFont::SetCentreOff();
+			CFont::SetRightJustifyOn();
+			CFont::SetRightJustifyWrap(0.0f);
+			CFont::SetBackGroundOnlyTextOff();
+			CFont::SetFontStyle(FONT_HEADING);
+			CFont::SetPropOff();
+			CFont::SetDropShadowPosition(2);
+			CFont::SetDropColor(CRGBA(0, 0, 0, alpha));
+			MONEY_COLOR.a = alpha;
+			CFont::SetColor(MONEY_COLOR);
 
-		CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f - 2.0f), SCREEN_SCALE_Y(43.0f + 2.0f), sPrint);
-
-		CFont::SetColor(MONEY_COLOR);
-		CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f), SCREEN_SCALE_Y(43.0f), sPrint);
+			// TODO(Miami): m_nHudMode
+			//if (CMenuManager.m_nHudMode)
+			{
+				CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f), SCREEN_SCALE_Y(43.0f), sPrint);
+			}
+		}
 
 		/*
 			DrawAmmo
 		*/
 		CWeaponInfo *weaponInfo = CWeaponInfo::GetWeaponInfo((eWeaponType)WeaponType);
-		CWeapon *weapon = FindPlayerPed()->GetWeapon();
+		CWeapon *weapon = playerPed->GetWeapon();
 		uint32 AmmoAmount = weaponInfo->m_nAmountofAmmunition;
 		uint32 AmmoInClip = weapon->m_nAmmoInClip;
 		uint32 TotalAmmo = weapon->m_nAmmoTotal;
@@ -347,14 +390,15 @@ void CHud::Draw()
 		}
 
 		CFont::SetBackgroundOff();
-		CFont::SetScale(SCREEN_SCALE_X(0.4f), SCREEN_SCALE_Y(0.6f));
+		CFont::SetScale(SCREEN_SCALE_X(0.5f), SCREEN_SCALE_Y(0.8f));
 		CFont::SetJustifyOff();
 		CFont::SetCentreOn();
 		CFont::SetCentreSize(SCREEN_SCALE_X(640.0f));
 		CFont::SetPropOn();
+		CFont::SetDropShadowPosition(0);
 		CFont::SetFontStyle(FONT_BANK);
 
-		if (!CDarkel::FrenzyOnGoing() && weaponInfo->m_nWeaponSlot > 1 && weapon->m_eWeaponType != WEAPONTYPE_DETONATOR) {
+		if (Min(9999, TotalAmmo - AmmoInClip) != 9999 && !CDarkel::FrenzyOnGoing() && weaponInfo->m_nWeaponSlot > 1 && weapon->m_eWeaponType != WEAPONTYPE_DETONATOR) {
 			CFont::SetDropShadowPosition(2);
 			CFont::SetDropColor(CRGBA(0, 0, 0, 255));
 			CFont::SetColor(AMMO_COLOR);
@@ -366,7 +410,7 @@ void CHud::Draw()
 			DrawHealth
 		*/
 		CFont::SetBackgroundOff();
-		CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
+		CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 		CFont::SetJustifyOff();
 		CFont::SetCentreOff();
 		CFont::SetRightJustifyWrap(0.0f);
@@ -376,16 +420,16 @@ void CHud::Draw()
 
 		if (m_ItemToFlash == ITEM_HEALTH && CTimer::GetFrameCounter() & 8
 			|| m_ItemToFlash != ITEM_HEALTH
-			|| FindPlayerPed()->m_fHealth < 10
+			|| playerPed->m_fHealth < 10
 			&& CTimer::GetFrameCounter() & 8) {
-			if (FindPlayerPed()->m_fHealth >= 10
-				|| FindPlayerPed()->m_fHealth < 10 && CTimer::GetFrameCounter() & 8) {
+			if (playerPed->m_fHealth >= 10
+				|| playerPed->m_fHealth < 10 && CTimer::GetFrameCounter() & 8) {
 
 				AsciiToUnicode("{", sPrintIcon);
 #ifdef FIX_BUGS
-				sprintf(sTemp, "%03d", int32(FindPlayerPed()->m_fHealth + 0.5f));
+				sprintf(sTemp, "%03d", int32(playerPed->m_fHealth + 0.5f));
 #else
-				sprintf(sTemp, "%03d", (int32)FindPlayerPed()->m_fHealth);
+				sprintf(sTemp, "%03d", (int32)playerPed->m_fHealth);
 #endif
 				AsciiToUnicode(sTemp, sPrint);
 
@@ -409,13 +453,13 @@ void CHud::Draw()
 			DrawArmour
 		*/
 		if (m_ItemToFlash == ITEM_ARMOUR && CTimer::GetFrameCounter() & 8 || m_ItemToFlash != ITEM_ARMOUR) {
-			CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
-			if (FindPlayerPed()->m_fArmour > 1.0f) {
+			CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
+			if (playerPed->m_fArmour > 1.0f) {
 				AsciiToUnicode("[", sPrintIcon);
 #ifdef FIX_BUGS
-				sprintf(sTemp, "%03d", int32(FindPlayerPed()->m_fArmour + 0.5f));
+				sprintf(sTemp, "%03d", int32(playerPed->m_fArmour + 0.5f));
 #else
-				sprintf(sTemp, "%03d", (int32)FindPlayerPed()->m_fArmour);
+				sprintf(sTemp, "%03d", (int32)playerPed->m_fArmour);
 #endif
 				AsciiToUnicode(sTemp, sPrint);
 
@@ -440,30 +484,33 @@ void CHud::Draw()
 			DrawWantedLevel
 		*/
 		CFont::SetBackgroundOff();
-		CFont::SetScale(SCREEN_SCALE_X(0.7f), SCREEN_SCALE_Y(1.25f));
+		CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 		CFont::SetJustifyOff();
 		CFont::SetCentreOff();
 		CFont::SetRightJustifyOn();
 		CFont::SetPropOn();
 		CFont::SetFontStyle(FONT_HEADING);
+		CFont::SetDropShadowPosition(2); // TODO(Miami): Remove that, VC keeps that open above
 
 		AsciiToUnicode("]", sPrintIcon);
 
 		for (int i = 0; i < 6; i++) {
-			CFont::SetColor(CRGBA(0, 0, 0, 255));
-			CFont::PrintString(2.0f + SCREEN_SCALE_FROM_RIGHT(110.0f - 2.0f + 23.0f * i), SCREEN_SCALE_Y(87.0f + 2.0f), sPrintIcon);
-			if (FindPlayerPed()->m_pWanted->m_nWantedLevel > i
-				&& (CTimer::GetTimeInMilliseconds() > FindPlayerPed()->m_pWanted->m_nLastWantedLevelChange
+			if (playerPed->m_pWanted->m_nWantedLevel > i
+				&& (CTimer::GetTimeInMilliseconds() > playerPed->m_pWanted->m_nLastWantedLevelChange
 					+ 2000 || CTimer::GetFrameCounter() & 4)) {
 
 				CFont::SetColor(WANTED_COLOR);
 				CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f + 23.0f * i), SCREEN_SCALE_Y(87.0f), sPrintIcon);
-			}else{
+
+			// TODO(Miami): There is one more condition in here
+			}else if (playerPed->m_pWanted->m_nWantedLevel <= i) {
 				CFont::SetColor(NOTWANTED_COLOR);
 				CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(110.0f + 23.0f * i), SCREEN_SCALE_Y(87.0f), sPrintIcon);
 			}
 		}
 
+		CFont::SetDropShadowPosition(0); // TODO(Miami): Remove that, VC keeps that open
+
 		/*
 			DrawZoneName
 		*/
@@ -675,7 +722,7 @@ void CHud::Draw()
 		CFont::SetJustifyOff();
 		CFont::SetCentreOff();
 		CFont::SetBackgroundOff();
-		CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
+		CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 		CFont::SetBackGroundOnlyTextOff();
 		CFont::SetPropOff();
 		CFont::SetFontStyle(FONT_HEADING);
@@ -724,7 +771,7 @@ void CHud::Draw()
 					AsciiToUnicode(CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerBuffer, sTimer);
 					CFont::SetPropOn();
 					CFont::SetBackgroundOff();
-					CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
+					CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 					CFont::SetRightJustifyOn();
 					CFont::SetRightJustifyWrap(0.0f);
 					CFont::SetFontStyle(FONT_LOCALE(FONT_HEADING));
@@ -732,7 +779,7 @@ void CHud::Draw()
 					CFont::SetBackGroundOnlyTextOn();
 					CFont::SetColor(CRGBA(0, 0, 0, 255));
 					CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(TIMER_RIGHT_OFFSET) + SCREEN_SCALE_X(2.0f), SCREEN_SCALE_Y(110.0f) + SCREEN_SCALE_Y(2.0f), sTimer);
-					CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
+					CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 					CFont::SetColor(TIMER_COLOR);
 					CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(TIMER_RIGHT_OFFSET), SCREEN_SCALE_Y(110.0f), sTimer);
 
@@ -764,7 +811,7 @@ void CHud::Draw()
 						CFont::SetPropOn();
 
 						CFont::SetBackgroundOff();
-						CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
+						CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 						CFont::SetCentreOff();
 						CFont::SetRightJustifyOn();
 						CFont::SetRightJustifyWrap(0.0f);
@@ -790,7 +837,7 @@ void CHud::Draw()
 
 					if (CUserDisplay::OnscnTimer.m_sEntries[0].m_aCounterText[0]) {
 						CFont::SetPropOn();
-						CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
+						CFont::SetScale(SCREEN_SCALE_X(HUD_TEXT_SCALE_X), SCREEN_SCALE_Y(HUD_TEXT_SCALE_Y));
 						CFont::SetColor(CRGBA(0, 0, 0, 255));
 						CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(TIMER_RIGHT_OFFSET) - SCREEN_SCALE_X(61.0f) + SCREEN_SCALE_Y(2.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(2.0f), TheText.Get(CUserDisplay::OnscnTimer.m_sEntries[0].m_aCounterText));
 
@@ -1456,6 +1503,21 @@ void CHud::Initialise()
 	PagerSoundPlayed = 0;
 	PagerXOffset = 150.0f;
 
+	m_WantedFadeTimer = 0;
+	m_WantedState = FADE_DISABLED;
+	m_WantedTimer = 0;
+	m_EnergyLostFadeTimer = 0;
+	m_EnergyLostState = FADE_DISABLED;
+	m_EnergyLostTimer = 0;
+	m_DisplayScoreFadeTimer = 0;
+	m_DisplayScoreState = FADE_DISABLED;
+	m_DisplayScoreTimer = 0;
+	m_WeaponFadeTimer = 0;
+	m_WeaponState = FADE_DISABLED;
+	m_WeaponTimer = 0;
+
+	m_LastDisplayScore = CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney;
+
 	CTxdStore::PopCurrentTxd();
 }
 
@@ -1479,6 +1541,21 @@ void CHud::ReInitialise() {
 	PagerTimer = 0;
 	PagerSoundPlayed = 0;
 	PagerXOffset = 150.0f;
+
+	m_WantedFadeTimer = 0;
+	m_WantedState = FADE_DISABLED;
+	m_WantedTimer = 0;
+	m_EnergyLostFadeTimer = 0;
+	m_EnergyLostState = FADE_DISABLED;
+	m_EnergyLostTimer = 0;
+	m_DisplayScoreFadeTimer = 0;
+	m_DisplayScoreState = FADE_DISABLED;
+	m_DisplayScoreTimer = 0;
+	m_WeaponFadeTimer = 0;
+	m_WeaponState = FADE_DISABLED;
+	m_WeaponTimer = 0;
+
+	m_LastDisplayScore = CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney;
 }
 
 wchar LastBigMessage[6][128];
@@ -1575,3 +1652,106 @@ void CHud::Shutdown()
 	int HudTXD = CTxdStore::FindTxdSlot("hud");
 	CTxdStore::RemoveTxdSlot(HudTXD);
 }
+
+float CHud::DrawFadeState(DRAW_FADE_STATE fadingElement, int forceFadingIn)
+{
+	float alpha = 255.0f;
+	uint32 operation, timer;
+	int32 fadeTimer;
+
+	switch (fadingElement) {
+		case HUD_WANTED_FADING:
+			fadeTimer = m_WantedFadeTimer;
+			operation = m_WantedState;
+			timer = m_WantedTimer;
+			break;
+		case HUD_ENERGY_FADING:
+			fadeTimer = m_EnergyLostFadeTimer;
+			operation = m_EnergyLostState;
+			timer = m_EnergyLostTimer;
+			break;
+		case HUD_SCORE_FADING:
+			fadeTimer = m_DisplayScoreFadeTimer;
+			operation = m_DisplayScoreState;
+			timer = m_DisplayScoreTimer;
+			break;
+		case HUD_WEAPON_FADING:
+			fadeTimer = m_WeaponFadeTimer;
+			operation = m_WeaponState;
+			timer = m_WeaponTimer;
+			break;
+		default:
+			break;
+	}
+	if (forceFadingIn) {
+		switch (operation) {
+			case FADED_OUT:
+				fadeTimer = 0;
+			case START_FADE_OUT:
+			case FADING_OUT:
+				timer = 5;
+				operation = FADING_IN;
+				break;
+			default:
+				break;
+		}
+	}
+	if (operation != FADED_OUT && operation != FADE_DISABLED) {
+		switch (operation) {
+			case START_FADE_OUT:
+				fadeTimer = 1000;
+				alpha = 255.0f;
+				if (timer > 10000) {
+					fadeTimer = 3000;
+					operation = FADING_OUT;
+				}
+				break;
+			case FADING_IN:
+				fadeTimer += CTimer::GetTimeStepInMilliseconds();
+				if (fadeTimer > 1000.0f) {
+					operation = START_FADE_OUT;
+					fadeTimer = 1000;
+				}
+				alpha = fadeTimer / 1000.0f * 255.0f;
+				break;
+			case FADING_OUT:
+				fadeTimer -= CTimer::GetTimeStepInMilliseconds();
+				if (fadeTimer < 0.0f) {
+					fadeTimer = 0;
+					operation = FADED_OUT;
+				}
+				alpha = fadeTimer / 1000.0f * 255.0f;
+				break;
+			default:
+				break;
+		}
+		timer += CTimer::GetTimeStepInMilliseconds();
+	}
+
+	switch (fadingElement) {
+		case HUD_WANTED_FADING:
+			m_WantedFadeTimer = fadeTimer;
+			m_WantedState = operation;
+			m_WantedTimer = timer;
+			break;
+		case HUD_ENERGY_FADING:
+			m_EnergyLostFadeTimer = fadeTimer;
+			m_EnergyLostState = operation;
+			m_EnergyLostTimer = timer;
+			break;
+		case HUD_SCORE_FADING:
+			m_DisplayScoreFadeTimer = fadeTimer;
+			m_DisplayScoreState = operation;
+			m_DisplayScoreTimer = timer;
+			break;
+		case HUD_WEAPON_FADING:
+			m_WeaponFadeTimer = fadeTimer;
+			m_WeaponState = operation;
+			m_WeaponTimer = timer;
+			break;
+		default:
+			break;
+	}
+
+	return clamp(alpha, 0.0f, 255.0f);
+}
diff --git a/src/render/Hud.h b/src/render/Hud.h
index 701e47e2..bae19ee4 100644
--- a/src/render/Hud.h
+++ b/src/render/Hud.h
@@ -9,6 +9,25 @@ enum eItems
 	ITEM_RADAR = 8
 };
 
+// Thanks for vague name, R*
+enum DRAW_FADE_STATE
+{
+	HUD_WANTED_FADING = 0,
+	HUD_ENERGY_FADING,
+	HUD_SCORE_FADING,
+	HUD_WEAPON_FADING,
+};
+
+// My name
+enum eFadeOperation
+{
+	FADED_OUT = 0,
+	START_FADE_OUT,
+	FADING_IN,
+	FADING_OUT,
+	FADE_DISABLED = 5,
+};
+
 enum eSprites 
 {
 	HUD_FIST,
@@ -32,6 +51,10 @@ enum eSprites
 	NUM_HUD_SPRITES,
 };
 
+// TODO(Miami): Make those 0.7f - 1.25f once fonts have been ported
+#define HUD_TEXT_SCALE_X 0.8f
+#define HUD_TEXT_SCALE_Y 1.35f
+
 class CHud
 {
 public:
@@ -82,6 +105,21 @@ public:
 	static int16 PagerTimer;
 	static int16 PagerOn;
 
+	static uint32 m_WantedFadeTimer;
+	static uint32 m_WantedState;
+	static uint32 m_WantedTimer;
+	static uint32 m_EnergyLostFadeTimer;
+	static uint32 m_EnergyLostState;
+	static uint32 m_EnergyLostTimer;
+	static uint32 m_DisplayScoreFadeTimer;
+	static uint32 m_DisplayScoreState;
+	static uint32 m_DisplayScoreTimer;
+	static uint32 m_WeaponFadeTimer;
+	static uint32 m_WeaponState;
+	static uint32 m_WeaponTimer;
+
+	static uint32 m_LastDisplayScore;
+
 public:
 	static void Draw();
 	static void DrawAfterFade();
@@ -95,4 +133,5 @@ public:
 	static void SetVehicleName(wchar *name);
 	static void SetZoneName(wchar *name);
 	static void Shutdown();
+	static float DrawFadeState(DRAW_FADE_STATE, int);
 };
diff --git a/src/vehicles/Vehicle.h b/src/vehicles/Vehicle.h
index cce07410..0b7d3cba 100644
--- a/src/vehicles/Vehicle.h
+++ b/src/vehicles/Vehicle.h
@@ -213,6 +213,7 @@ public:
 	float m_fMapObjectHeightBehind;	// rear Z?
 	eCarLock m_nDoorLock;
 	int8 m_nLastWeaponDamage; // see eWeaponType, -1 if no damage
+	CEntity *m_pLastDamageEntity;
 	int8 m_nRadioStation;
 	uint8 m_bRainAudioCounter;
 	uint8 m_bRainSamplesCounter;
diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp
index 1f901f88..4c1f1c52 100644
--- a/src/weapons/Weapon.cpp
+++ b/src/weapons/Weapon.cpp
@@ -36,7 +36,17 @@
 uint16 gReloadSampleTime[WEAPONTYPE_LAST_WEAPONTYPE] =
 {
 	0,			// UNARMED
-	0,			// BASEBALLBAT
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
 	0,			// GRENADE
 	0,			// DETONATEGRENADE
 	0,			// MOLOTOV
@@ -156,6 +166,7 @@ CWeapon::Fire(CEntity *shooter, CVector *fireSource)
 		return false;
 
 	bool fired;
+	bool addFireRateAsDelay = true;
 
 	if ( GetInfo()->m_eWeaponFire != WEAPON_FIRE_MELEE )
 	{
@@ -166,6 +177,7 @@ CWeapon::Fire(CEntity *shooter, CVector *fireSource)
 		{
 			case WEAPONTYPE_SHOTGUN:
 			{
+				addFireRateAsDelay = true;
 				fired = FireShotgun(shooter, source);
 
 				break;
@@ -181,13 +193,13 @@ CWeapon::Fire(CEntity *shooter, CVector *fireSource)
 			case WEAPONTYPE_HELICANNON:
 			{
 				if ((TheCamera.PlayerWeaponMode.Mode == CCam::MODE_HELICANNON_1STPERSON || TheCamera.PlayerWeaponMode.Mode == CCam::MODE_M16_1STPERSON)
-					&& shooter == FindPlayerPed())
-				{
+					&& shooter == FindPlayerPed()) {
+					addFireRateAsDelay = false;
 					fired = FireM16_1stPerson(shooter);
-				}
-				else
+				} else {
+					addFireRateAsDelay = true;
 					fired = FireInstantHit(shooter, source);
-
+				}
 				break;
 			}
 
@@ -267,54 +279,58 @@ CWeapon::Fire(CEntity *shooter, CVector *fireSource)
 			}
 		}
 
-		if ( fired )
+		if (fired)
 		{
 			bool isPlayer = false;
 
-			if ( shooter->IsPed() )
+			if (shooter->IsPed())
 			{
-				CPed *shooterPed = (CPed*)shooter;
+				CPed* shooterPed = (CPed*)shooter;
 
 				shooterPed->bIsShooting = true;
 
-				if ( shooterPed->IsPlayer() )
+				if (shooterPed->IsPlayer())
 					isPlayer = true;
 
 				DMAudio.PlayOneShot(shooterPed->m_audioEntityId, SOUND_WEAPON_SHOT_FIRED, 0.0f);
 			}
 
-			if ( m_nAmmoInClip > 0 )
+			if (m_nAmmoInClip > 0)
 				m_nAmmoInClip--;
 
-			if ( m_nAmmoTotal > 0 && (m_nAmmoTotal < 25000 || isPlayer) && (!isPlayer || CStats::GetPercentageProgress() < 100.0f || m_eWeaponType == WEAPONTYPE_DETONATOR))
+			if (m_nAmmoTotal > 0 && (m_nAmmoTotal < 25000 || isPlayer) && (!isPlayer || CStats::GetPercentageProgress() < 100.0f || m_eWeaponType == WEAPONTYPE_DETONATOR))
 				m_nAmmoTotal--;
 
-			if ( m_eWeaponState == WEAPONSTATE_READY && m_eWeaponType == WEAPONTYPE_FLAMETHROWER )
+			if (m_eWeaponState == WEAPONSTATE_READY && m_eWeaponType == WEAPONTYPE_FLAMETHROWER)
 				DMAudio.PlayOneShot(((CPhysical*)shooter)->m_audioEntityId, SOUND_WEAPON_FLAMETHROWER_FIRE, 0.0f);
 
 			m_eWeaponState = WEAPONSTATE_FIRING;
-		}
 
-		if ( m_nAmmoInClip == 0 )
-		{
-			if ( m_nAmmoTotal == 0 )
-				return true;
-
-			m_eWeaponState = WEAPONSTATE_RELOADING;
-			m_nTimer = CTimer::GetTimeInMilliseconds() + GetInfo()->m_nReload;
-
-			if ( shooter == FindPlayerPed() )
+			if (m_nAmmoInClip == 0)
 			{
-				if ( CWorld::Players[CWorld::PlayerInFocus].m_bFastReload )
-					m_nTimer = CTimer::GetTimeInMilliseconds() + GetInfo()->m_nReload / 4;
+				if (m_nAmmoTotal == 0)
+					return true;
+
+				m_eWeaponState = WEAPONSTATE_RELOADING;
+				m_nTimer = CTimer::GetTimeInMilliseconds() + GetInfo()->m_nReload;
+
+				if (shooter == FindPlayerPed())
+				{
+					if (CWorld::Players[CWorld::PlayerInFocus].m_bFastReload)
+						m_nTimer = CTimer::GetTimeInMilliseconds() + GetInfo()->m_nReload / 4;
+				}
+
+				return true;
 			}
 
-			return true;
-		}
+			if (addFireRateAsDelay)
+				m_nTimer = CTimer::GetTimeInMilliseconds() + GetInfo()->m_nFiringRate;
+			else
+				m_nTimer = CTimer::GetTimeInMilliseconds();
 
-		m_nTimer = CTimer::GetTimeInMilliseconds() + 1000;
-		if ( shooter == FindPlayerPed() )
-			CStats::RoundsFiredByPlayer++;
+			if (shooter == FindPlayerPed())
+				CStats::RoundsFiredByPlayer++;
+		}
 	}
 	else
 	{
@@ -322,9 +338,15 @@ CWeapon::Fire(CEntity *shooter, CVector *fireSource)
 		{
 			m_nTimer = CTimer::GetTimeInMilliseconds() + GetInfo()->m_nReload;
 			m_eWeaponState = WEAPONSTATE_FIRING;
+#ifndef AUDIO_NOT_READY
+			if (shooter->IsPed() && m_eWeaponType != WEAPONTYPE_CHAINSAW)
+			{
+				DMAudio.PlayOneShot(((CPed*)shooter)->m_audioEntityId, 188, m_eWeaponType << 8);
+			}
+#endif
 		}
 
-		FireMelee(shooter, *source);
+		fired = FireMelee(shooter, *source);
 	}
 
 	if ( m_eWeaponType == WEAPONTYPE_UNARMED || m_eWeaponType == WEAPONTYPE_BASEBALLBAT )
@@ -372,7 +394,7 @@ CWeapon::FireFromCar(CVehicle *shooter, bool left)
 	return true;
 }
 
-// --MIAMI: Just a few lines is done
+// --MIAMI: Done, except commented things
 bool
 CWeapon::FireMelee(CEntity *shooter, CVector &fireSource)
 {
@@ -386,18 +408,31 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource)
 
 	CPed *shooterPed = (CPed*)shooter;
 
+	if (shooterPed == FindPlayerPed()) {
+		if (m_eWeaponType == WEAPONTYPE_GOLFCLUB || m_eWeaponType == WEAPONTYPE_NIGHTSTICK ||
+			(m_eWeaponType >= WEAPONTYPE_BASEBALLBAT && m_eWeaponType <= WEAPONTYPE_CHAINSAW)) {
+			
+			// TODO(Miami): BreakGlassPhysically
+			if (m_eWeaponType == WEAPONTYPE_CHAINSAW) {
+				CEventList::RegisterEvent(EVENT_GUNSHOT, EVENT_ENTITY_PED, FindPlayerPed(), FindPlayerPed(), 1000);
+			}
+		}
+	}
+
+	int damageEntityRegistered = 0;
+
 	for ( int32 i = 0; i < shooterPed->m_numNearPeds; i++ )
 	{
 		CPed *victimPed = shooterPed->m_nearPeds[i];
 		ASSERT(victimPed!=nil);
 
 		if ( (victimPed->m_nPedType != shooterPed->m_nPedType || victimPed == shooterPed->m_pSeekTarget)
-				&& victimPed != shooterPed->m_leader || !(CGeneral::GetRandomNumber() & 31) )
+				&& victimPed != shooterPed->m_leader || !(CGeneral::GetRandomNumber() & 31)
+				&& (!shooterPed->IsGangMember() || victimPed->CanBeDamagedByThisGangMember(shooterPed)) )
 		{
 			bool collided = false;
 
-			// TODO(Miami)
-			if (victimPed->m_nPedState == PED_DRIVING && (m_eWeaponType == WEAPONTYPE_UNARMED /*|| m_eWeaponType == WEAPONTYPE_BRASSKNUCKLES*/
+			if (victimPed->m_nPedState == PED_DRIVING && (m_eWeaponType == WEAPONTYPE_UNARMED || m_eWeaponType == WEAPONTYPE_BRASSKNUCKLE
 				|| info->m_bFightMode))
 				continue;
 
@@ -451,65 +486,115 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource)
 
 							int32 localDir = victimPed->GetLocalDirection(posOffset);
 
-							bool isBat = m_eWeaponType == WEAPONTYPE_BASEBALLBAT;
+							bool isHeavy = m_eWeaponType >= WEAPONTYPE_GOLFCLUB && m_eWeaponType <= WEAPONTYPE_KATANA && m_eWeaponType != WEAPONTYPE_HAMMER;
+
+							if (shooterPed->m_fDamageImpulse == 0.0f) {
+								shooterPed->m_pDamageEntity = victimPed;
+								victimPed->RegisterReference(&shooterPed->m_pDamageEntity);
+							}
+
+							damageEntityRegistered = 3;
+							// TODO(Miami): Bike
 
 							if ( !victimPed->DyingOrDead() )
 								victimPed->ReactToAttack(shooterPed);
 
 							uint8 hitLevel = HITLEVEL_HIGH;
-							if ( isBat && victimPed->OnGround() )
+							if ( isHeavy && (victimPed->OnGround() || victimPed->m_nWaitState == WAITSTATE_SUN_BATHE_IDLE))
 								hitLevel = HITLEVEL_GROUND;
 
 							victimPed->StartFightDefend(localDir, hitLevel, 10);
 
 							if ( !victimPed->DyingOrDead() )
 							{
-								if ( shooterPed->IsPlayer() && isBat && anim2Playing )
+								if ( shooterPed->IsPlayer() && isHeavy && anim2Playing )
 									victimPed->InflictDamage(shooterPed, m_eWeaponType, 100.0f, PEDPIECE_TORSO, localDir);
 								else if ( shooterPed->IsPlayer() && ((CPlayerPed*)shooterPed)->m_bAdrenalineActive )
 									victimPed->InflictDamage(shooterPed, m_eWeaponType, 3.5f*info->m_nDamage, PEDPIECE_TORSO, localDir);
 								else
 								{
-									if ( victimPed->IsPlayer() && isBat ) // wtf, it's not fair
+									if ( victimPed->IsPlayer() && isHeavy ) // wtf, it's not fair
 										victimPed->InflictDamage(shooterPed, m_eWeaponType, 2.0f*info->m_nDamage, PEDPIECE_TORSO, localDir);
 									else
 										victimPed->InflictDamage(shooterPed, m_eWeaponType,      info->m_nDamage, PEDPIECE_TORSO, localDir);
 								}
 							}
 
-							if ( CGame::nastyGame )
+							if ( CGame::nastyGame && victimPed->GetIsOnScreen() )
 							{
-								if ( victimPed->GetIsOnScreen() )
+								CVector dir = collisionDist * RecipSqrt(1.0f, 10.0f*collisionDist.MagnitudeSqr());
+
+								CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
+								CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
+								CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
+
+								if ( isHeavy )
 								{
-									CVector dir = collisionDist * RecipSqrt(1.0f, 10.0f*collisionDist.MagnitudeSqr());
-
-									CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
-									CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
+									dir.x += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
+									dir.y += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
 									CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
 
-									if ( isBat )
+									dir.x += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
+									dir.y += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
+									CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
+								}
+
+								if (m_eWeaponType == WEAPONTYPE_CHAINSAW)
+								{
+									if (victimPed->m_nPedState != PED_DEAD && !((CTimer::GetFrameCounter() + 17) & 1)
+										|| victimPed->m_nPedState == PED_DEAD && !((CTimer::GetFrameCounter() + 17) & 3))
 									{
-										dir.x += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
-										dir.y += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
-										CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
-
-										dir.x += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
-										dir.y += CGeneral::GetRandomNumberInRange(-0.05f, 0.05f);
-										CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, dir);
+										CParticle::AddParticle(PARTICLE_TEST, bloodPos, CVector(0.0f, 0.0f, 0.0f), nil, 0.2f);
 									}
+									CVector newDir(dir);
+									newDir.z += 0.2f;
+									CParticle::AddParticle(PARTICLE_BLOOD_SMALL, bloodPos, newDir);
+									CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, newDir);
+									newDir.z = dir.z + 0.1f;
+									CParticle::AddParticle(PARTICLE_BLOOD, bloodPos, newDir);
+									newDir.x = 0.0f;
+									newDir.y = 0.0f;
+									newDir.z = 0.01f;
+									CParticle::AddParticle(PARTICLE_DEBRIS2, bloodPos, newDir);
+
+									// TODO(Miami): New particle
+									/*
+									v116.z = 0.0;
+									v116.x = CGeneral::GetRandomNumberInRange(-0.15f, 0.15f);
+									v116.y = CGeneral::GetRandomNumberInRange(0.1f, 0.35f);
+									v115.x = CGeneral::GetRandomNumberInRange(SCREEN_STRETCH_X(50.0f), SCREEN_STRETCH_FROM_RIGHT(50.0f));
+									v115.z = 1.0;
+									v115.y = CGeneral::GetRandomNumberInRange(SCREEN_STRETCH_Y(50.0f), SCREEN_STRETCH_FROM_BOTTOM(50.0f));
+									CParticle::AddParticle(41, v115, v116, nil, CGeneral::GetRandomNumberInRange(0.1f, 0.15f),
+										CRGBA(0, 0, 0, 0), 0, 0, CGeneral::GetRandomNumber() & 1, 0);
+
+									*/
+								}
+								if (info->m_AnimToPlay == ASSOCGRP_KNIFE)
+								{
+									dir.x += 0.1f * shooterPed->GetUp().x + 0.05f * shooterPed->GetRight().x;
+									dir.y += 0.1f * shooterPed->GetUp().y + 0.05f * shooterPed->GetRight().y;
+									dir.z += 0.1f * shooterPed->GetUp().z + 0.05f * shooterPed->GetRight().z;
+									CParticle::AddParticle(PARTICLE_BLOOD_SPURT, bloodPos, dir);
+									CParticle::AddParticle(PARTICLE_BLOOD_SPURT, bloodPos, dir);
+									CParticle::AddParticle(PARTICLE_BLOOD_SPURT, bloodPos, dir);
 								}
 							}
 
 							if ( !victimPed->OnGround() )
 							{
 								if ( victimPed->m_fHealth > 0.0f
-									&& (victimPed->m_fHealth < 20.0f && victimPedHealth > 20.0f || isBat && !victimPed->IsPlayer()) )
+									&& (victimPed->m_fHealth < 30.0f && victimPedHealth > 20.0f ||
+										(isHeavy || m_eWeaponType == WEAPONTYPE_BRASSKNUCKLE) && !victimPed->IsPlayer()) )
 								{
 									posOffset.Normalise();
 									victimPed->bIsStanding = false;
-									victimPed->ApplyMoveForce(posOffset.x*-5.0f, posOffset.y*-5.0f, 3.0f);
+									if(m_eWeaponType == WEAPONTYPE_CHAINSAW)
+										victimPed->ApplyMoveForce(posOffset.x*-2.0f, posOffset.y*-2.0f, 2.0f);
+									else
+										victimPed->ApplyMoveForce(posOffset.x*-5.0f, posOffset.y*-5.0f, 3.0f);
 
-									if ( isBat && victimPed->IsPlayer() )
+									if ( isHeavy && victimPed->IsPlayer() )
 										victimPed->SetFall(3000, AnimationId(ANIM_KO_SKID_FRONT + localDir), false);
 									else
 										victimPed->SetFall(1500, AnimationId(ANIM_KO_SKID_FRONT + localDir), false);
@@ -522,21 +607,152 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource)
 							{
 								posOffset.Normalise();
 								victimPed->bIsStanding = false;
-								victimPed->ApplyMoveForce(posOffset.x*-5.0f, posOffset.y*-5.0f, 3.0f);
+								if(m_eWeaponType == WEAPONTYPE_CHAINSAW)
+									victimPed->ApplyMoveForce(posOffset.x*-1.0f, posOffset.y*-1.0f, 1.0f);
+								else
+									victimPed->ApplyMoveForce(posOffset.x*-5.0f, posOffset.y*-5.0f, 3.0f);
 							}
 
 							m_eWeaponState = WEAPONSTATE_MELEE_MADECONTACT;
 
-							if ( victimPed->m_nPedType == PEDTYPE_COP )
-								CEventList::RegisterEvent(EVENT_ASSAULT_POLICE, EVENT_ENTITY_PED, victimPed, shooterPed, 2000);
-							else
-								CEventList::RegisterEvent(EVENT_ASSAULT,        EVENT_ENTITY_PED, victimPed, shooterPed, 2000);
+							if (m_eWeaponType != WEAPONTYPE_KNIFE && m_eWeaponType != WEAPONTYPE_MACHETE
+								&& m_eWeaponType != WEAPONTYPE_KATANA && m_eWeaponType != WEAPONTYPE_CHAINSAW) {
+
+								if (victimPed->m_nPedType == PEDTYPE_COP)
+									CEventList::RegisterEvent(EVENT_ASSAULT_POLICE, EVENT_ENTITY_PED, victimPed, shooterPed, 2000);
+								else
+									CEventList::RegisterEvent(EVENT_ASSAULT, EVENT_ENTITY_PED, victimPed, shooterPed, 2000);
+							} else {
+								if (victimPed->m_nPedType == PEDTYPE_COP)
+									CEventList::RegisterEvent(EVENT_ASSAULT_NASTYWEAPON_POLICE, EVENT_ENTITY_PED, victimPed, shooterPed, 2000);
+								else
+									CEventList::RegisterEvent(EVENT_ASSAULT_NASTYWEAPON, EVENT_ENTITY_PED, victimPed, shooterPed, 2000);
+							}
 						}
 					}
 				}
 			}
 		}
 	}
+	CVehicle *nearVeh = (CVehicle*)CWorld::TestSphereAgainstWorld(fireSource, info->m_fRadius, nil, false, true, false, false, false, false);
+	if (nearVeh && nearVeh->IsCar())
+	{
+		CAutomobile *nearCar = (CAutomobile*)nearVeh;
+		m_eWeaponState = WEAPONSTATE_MELEE_MADECONTACT;
+		if (shooterPed == FindPlayerPed())
+		{
+			if (nearCar->IsLawEnforcementVehicle())
+			{
+				FindPlayerPed()->SetWantedLevelNoDrop(1);
+			}
+			CEventList::RegisterEvent(EVENT_ASSAULT, EVENT_ENTITY_VEHICLE, nearCar, shooterPed, 2000);
+		}
+		float oldHealth = nearCar->m_fHealth;
+		if (m_eWeaponType == WEAPONTYPE_CHAINSAW)
+		{
+			for(int i=0; i<4; i++) {
+				CParticle::AddParticle(PARTICLE_SPARK_SMALL, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.3f));
+				CParticle::AddParticle(PARTICLE_SPARK, gaTempSphereColPoints[0].point, gaTempSphereColPoints[0].normal * 0.1f);
+			}
+		}
+		if (m_eWeaponType == WEAPONTYPE_CHAINSAW)
+		{
+			nearCar->VehicleDamage(info->m_nDamage * (0.00075f * nearCar->pHandling->fMass), gaTempSphereColPoints[0].pieceB);
+
+			// TODO(Miami): Particle not in III
+			// CParticle::AddParticle(81, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0);
+		}
+		else
+		{
+			nearCar->VehicleDamage(info->m_nDamage* (0.00075f * nearCar->pHandling->fMass), gaTempSphereColPoints[0].pieceB);
+		}
+		if (nearCar->m_fHealth < oldHealth)
+		{
+			nearCar->m_nLastWeaponDamage = m_eWeaponType;
+			nearCar->m_pLastDamageEntity = shooterPed;
+		}
+		if (shooterPed->m_fDamageImpulse == 0.0f)
+		{
+			shooterPed->m_pDamageEntity = nearCar;
+			nearCar->RegisterReference(&shooterPed->m_pDamageEntity);
+		}
+		damageEntityRegistered = 2;
+		if (FindPlayerPed()->GetWeapon() == this && nearCar->VehicleCreatedBy != MISSION_VEHICLE)
+		{
+			if (nearCar->AutoPilot.m_nDrivingStyle != DRIVINGSTYLE_PLOUGH_THROUGH
+				&& (CGeneral::GetRandomTrueFalse() || nearCar->AutoPilot.m_nCarMission != MISSION_CRUISE))
+			{
+				int leaveCarDelay = 200;
+				CPed *driver = nearCar->pDriver;
+				if (driver && driver->CharCreatedBy != MISSION_CHAR)
+				{
+					if (driver->m_pedStats->m_temper <= driver->m_pedStats->m_fear)
+					{
+						driver->SetObjective(OBJECTIVE_FLEE_TILL_SAFE);
+					}
+					else
+					{
+						driver->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, FindPlayerPed());
+						driver->m_objectiveTimer = CTimer::GetTimeInMilliseconds() + 10000;
+						driver->m_prevObjective = OBJECTIVE_KILL_CHAR_ON_FOOT;
+					}
+					driver->m_leaveCarTimer = CTimer::GetTimeInMilliseconds() + 200;
+					leaveCarDelay = 400;
+				}
+				for (int j = 0; j < nearCar->m_nNumPassengers; ++j)
+				{
+					CPed *passenger = nearCar->pPassengers[j];
+					if (passenger && passenger->CharCreatedBy != MISSION_CHAR)
+					{
+						nearCar->pPassengers[j]->SetObjective(OBJECTIVE_FLEE_TILL_SAFE);
+						passenger->m_leaveCarTimer = CTimer::GetTimeInMilliseconds() + leaveCarDelay;
+						leaveCarDelay += 200;
+					}
+				}
+			}
+			else
+			{
+				CPed *driver = nearCar->pDriver;
+				if (driver)
+				{
+					if (driver->m_objective != OBJECTIVE_LEAVE_VEHICLE && driver->m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT &&
+						driver->m_objective != OBJECTIVE_FLEE_TILL_SAFE)
+					{
+						if (nearCar->AutoPilot.m_nDrivingStyle != DRIVINGSTYLE_PLOUGH_THROUGH)
+							nearCar->AutoPilot.m_nCruiseSpeed = nearCar->AutoPilot.m_nCruiseSpeed * 1.5f;
+
+						nearCar->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_PLOUGH_THROUGH;
+					}
+				}
+			}
+		}
+	}
+	if (m_eWeaponType == WEAPONTYPE_CHAINSAW)
+	{
+		CEntity *nearStatic = (CObject*)CWorld::TestSphereAgainstWorld(fireSource, info->m_fRadius, nil, true, false, false, true, false, false);
+		if (nearStatic)
+		{
+			for(int i=0; i < 4; i++) {
+				CParticle::AddParticle(PARTICLE_SPARK_SMALL, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.3f), 0, 0.0f, 0, 0, 0, 0);
+				CParticle::AddParticle(PARTICLE_SPARK, gaTempSphereColPoints[0].point, 0.1f * gaTempSphereColPoints[0].normal, 0, 0.0f, 0, 0, 0, 0);
+			}
+
+			// TODO(Miami): Particle not in III
+			//CParticle::AddParticle(81, gaTempSphereColPoints[0].point, CVector(0.0f, 0.0f, 0.0f), 0, 0.0f, 0, 0, 0, 0);
+			
+			if (!damageEntityRegistered)
+			{
+				m_eWeaponState = WEAPONSTATE_MELEE_MADECONTACT;
+				if (shooterPed->m_fDamageImpulse == 0.0f)
+				{
+					shooterPed->m_pDamageEntity = nearStatic;
+					nearStatic->RegisterReference(&shooterPed->m_pDamageEntity);
+				}
+			}
+			if (nearStatic->IsObject() && ((CObject*)nearStatic)->m_nCollisionDamageEffect >= DAMAGE_EFFECT_SMASH_COMPLETELY)
+				((CObject*)nearStatic)->ObjectDamage(200.0f);
+		}
+	}
 
 	return true;
 }
@@ -2239,13 +2455,17 @@ FireOneInstantHitRound(CVector *source, CVector *target, int32 damage)
 bool
 CWeapon::IsTypeMelee(void)
 {
-	return m_eWeaponType == WEAPONTYPE_UNARMED || m_eWeaponType == WEAPONTYPE_BASEBALLBAT;
+	return CWeaponInfo::GetWeaponInfo(m_eWeaponType)->m_eWeaponFire == WEAPON_FIRE_MELEE;
 }
 
 bool
 CWeapon::IsType2Handed(void)
 {
-	return m_eWeaponType >= WEAPONTYPE_SHOTGUN && m_eWeaponType <= WEAPONTYPE_FLAMETHROWER && m_eWeaponType != WEAPONTYPE_ROCKETLAUNCHER;
+	// TODO(Miami): Uncomment
+	return m_eWeaponType == WEAPONTYPE_FLAMETHROWER || m_eWeaponType == WEAPONTYPE_HELICANNON || /* m_eWeaponType == WEAPONTYPE_M60 */
+		m_eWeaponType == WEAPONTYPE_M16 ||
+		(m_eWeaponType >= WEAPONTYPE_SHOTGUN && m_eWeaponType < WEAPONTYPE_TEC9) || // Shotguns
+		m_eWeaponType == WEAPONTYPE_AK47 || m_eWeaponType == WEAPONTYPE_SNIPERRIFLE /*|| m_eWeaponType == WEAPONTYPE_LASERSCOPE*/;
 }
 
 void
diff --git a/src/weapons/WeaponInfo.cpp b/src/weapons/WeaponInfo.cpp
index 420171f2..d5e759b9 100644
--- a/src/weapons/WeaponInfo.cpp
+++ b/src/weapons/WeaponInfo.cpp
@@ -11,7 +11,7 @@
 
 // Yeah...
 int32 CWeaponInfo::ms_aMaxAmmoForWeapon[WEAPONTYPE_TOTALWEAPONS] = {
-	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 };
 
 CWeaponInfo CWeaponInfo::ms_apWeaponInfos[WEAPONTYPE_TOTALWEAPONS];
@@ -19,7 +19,17 @@ CWeaponInfo CWeaponInfo::ms_apWeaponInfos[WEAPONTYPE_TOTALWEAPONS];
 // --MIAMI: Todo
 static char ms_aWeaponNames[][32] = {
 	"Unarmed",
+	"BrassKnuckle",
+	"ScrewDriver",
+	"GolfClub",
+	"NightStick",
+	"Knife",
 	"BaseballBat",
+	"Hammer",
+	"Cleaver",
+	"Machete",
+	"Katana",
+	"Chainsaw",
 	"Grenade",
 	"DetonateGrenade",
 	"Molotov",
@@ -61,8 +71,7 @@ CWeaponInfo::Initialise(void)
 		ms_apWeaponInfos[i].m_fLifespan = 0.0f;
 		ms_apWeaponInfos[i].m_fSpread = 0.0f;
 		ms_apWeaponInfos[i].m_vecFireOffset = CVector(0.0f, 0.0f, 0.0f);
-		// TODO(Miami): ASSOCGRP_UNARMED
-		ms_apWeaponInfos[i].m_AnimToPlay = ASSOCGRP_STD;
+		ms_apWeaponInfos[i].m_AnimToPlay = ASSOCGRP_UNARMED;
 		ms_apWeaponInfos[i].m_fAnimLoopStart = 0.0f;
 		ms_apWeaponInfos[i].m_fAnimLoopEnd = 0.0f;
 		ms_apWeaponInfos[i].m_fAnimFrameFire = 0.0f;
diff --git a/src/weapons/WeaponType.h b/src/weapons/WeaponType.h
index 8c1f598d..6516828a 100644
--- a/src/weapons/WeaponType.h
+++ b/src/weapons/WeaponType.h
@@ -4,7 +4,17 @@
 enum eWeaponType
 {
 	WEAPONTYPE_UNARMED,
+	WEAPONTYPE_BRASSKNUCKLE,
+	WEAPONTYPE_SCREWDRIVER,
+	WEAPONTYPE_GOLFCLUB,
+	WEAPONTYPE_NIGHTSTICK,
+	WEAPONTYPE_KNIFE,
 	WEAPONTYPE_BASEBALLBAT,
+	WEAPONTYPE_HAMMER,
+	WEAPONTYPE_CLEAVER,
+	WEAPONTYPE_MACHETE,
+	WEAPONTYPE_KATANA,
+	WEAPONTYPE_CHAINSAW,
 	WEAPONTYPE_GRENADE,
 	WEAPONTYPE_DETONATOR_GRENADE,
 	WEAPONTYPE_MOLOTOV,