diff --git a/src/core/Game.cpp b/src/core/Game.cpp
index 7700d321..6573ac22 100644
--- a/src/core/Game.cpp
+++ b/src/core/Game.cpp
@@ -89,6 +89,7 @@
 #include "Occlusion.h"
 #include "debugmenu.h"
 #include "Ropes.h"
+#include "WindModifiers.h"
 
 eLevelName CGame::currLevel;
 int32 CGame::currArea;
@@ -693,6 +694,7 @@ void CGame::Process(void)
 	if (!CCutsceneMgr::IsCutsceneProcessing() && !CTimer::GetIsCodePaused())
 		FrontEndMenuManager.Process();
 	CStreaming::Update();
+	CWindModifiers::Number = 0;
 	if (!CTimer::GetIsPaused())
 	{
 		CTheZones::Update();
diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp
index 53c2b2c2..f6624c1f 100644
--- a/src/peds/Ped.cpp
+++ b/src/peds/Ped.cpp
@@ -63,6 +63,7 @@
 #include "Debug.h"
 #include "GameLogic.h"
 #include "Bike.h"
+#include "WindModifiers.h"
 
 #define CAN_SEE_ENTITY_ANGLE_THRESHOLD	DEGTORAD(60.0f)
 
@@ -16414,6 +16415,77 @@ CPed::PreRender(void)
 	}
 #endif
 
+	bool bIsWindModifierTurnedOn = false;
+	float fAnyDirectionShift = 1.0f;
+	if (IsPlayer() && CWindModifiers::FindWindModifier(GetPosition(), &fAnyDirectionShift, &fAnyDirectionShift)
+		&& !CCullZones::PlayerNoRain() && GetPedState() != PED_DRIVING)
+		bIsWindModifierTurnedOn = true;
+
+	bool bIsPlayerDrivingBikeOrOpenTopCar = false;
+	if (GetPedState() == PED_DRIVING && m_pMyVehicle) {
+		if (m_pMyVehicle->m_vehType == VEHICLE_TYPE_BIKE
+			|| (m_pMyVehicle->m_vehType == VEHICLE_TYPE_CAR && m_pMyVehicle->IsOpenTopCar()))
+			bIsPlayerDrivingBikeOrOpenTopCar = true;
+	}
+
+	if (bIsWindModifierTurnedOn || bIsPlayerDrivingBikeOrOpenTopCar) {
+		float fWindMult = 0.0f;
+		if (bIsPlayerDrivingBikeOrOpenTopCar) {
+			fWindMult = DotProduct(m_pMyVehicle->m_vecMoveSpeed, GetForward());
+			if (fWindMult > 0.4f) {
+				float volume = (fWindMult - 0.4f) / 0.6f;
+				DMAudio.PlayOneShot(m_audioEntityId, SOUND_SET_202, volume); //TODO(MIAMI): revise when audio is done
+			}
+		}
+
+		if (bIsWindModifierTurnedOn) 
+			fWindMult = Min(fWindMult, Abs(fAnyDirectionShift - 1.0f));
+
+		RpHAnimHierarchy* hier = GetAnimHierarchyFromSkinClump(GetClump());
+		int32 idx;
+		RwV3d scale;
+		float fScaleOffset;
+
+		fScaleOffset = fWindMult * 0.2f;
+		scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+		scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+		scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+
+		idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_NECK));
+		RwMatrix* neck = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
+		RwMatrixScale(neck, &scale, rwCOMBINEPRECONCAT);
+
+		fScaleOffset = fWindMult * 0.1f;
+		scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+		scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+		scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+
+		idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_CLAVICLEL));
+		RwMatrix* clavicleL = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
+		RwMatrixScale(clavicleL, &scale, rwCOMBINEPRECONCAT);
+		
+		idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_CLAVICLER));
+		RwMatrix* clavicleR = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
+		RwMatrixScale(clavicleR, &scale, rwCOMBINEPRECONCAT);
+
+		idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_MID));
+		RwMatrix* mid = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
+		RwMatrixScale(mid, &scale, rwCOMBINEPRECONCAT);
+
+		fScaleOffset = fWindMult * 0.2f;
+		scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+		scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+		scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
+
+		idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_UPPERARML));
+		RwMatrix* upperArmL = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
+		RwMatrixScale(upperArmL, &scale, rwCOMBINEPRECONCAT);
+
+		idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_UPPERARMR));
+		RwMatrix* upperArmR = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
+		RwMatrixScale(upperArmR, &scale, rwCOMBINEPRECONCAT);
+	}
+
 	if (bBodyPartJustCameOff && bIsPedDieAnimPlaying && m_bodyPartBleeding != -1 && (CTimer::GetFrameCounter() & 7) > 3) {
 		CVector bloodDir(0.0f, 0.0f, 0.0f);
 		CVector bloodPos(0.0f, 0.0f, 0.0f);
diff --git a/src/render/WindModifiers.cpp b/src/render/WindModifiers.cpp
index 49e7c96a..2061df6a 100644
--- a/src/render/WindModifiers.cpp
+++ b/src/render/WindModifiers.cpp
@@ -1,13 +1,51 @@
 #include "common.h"
 #include "WindModifiers.h"
+#include "Camera.h"
+#include "General.h"
+
+#define MAX_HEIGHT_DIST 40.0f
+#define MIN_FADE_DIST 20.0f
+#define MAX_FADE_DIST 50.0f
+
+CWindModifiers Array[16];
+int32 CWindModifiers::Number;
 
 void
-CWindModifiers::RegisterOne(CVector pos, int32 unk)
+CWindModifiers::RegisterOne(CVector pos, int32 type = 1)
 {
+	if (CWindModifiers::Number < 16 && (pos - TheCamera.GetPosition()).Magnitude() < 100.0f) {
+		Array[Number].m_pos = pos;
+		Array[Number].m_type = type;
+		Number++;
+	}
 }
 
-int32
+bool
 CWindModifiers::FindWindModifier(CVector pos, float *x, float *y)
 {
-	return 0;
+	bool bWasWindModifierFound = false;
+	CVector2D dir;
+	for (int i = 0; i < Number; i++) {
+		if (Array[i].m_type == 1) {
+			float zDist = Abs(15.0f + pos.z - Array[i].m_pos.z);
+
+			if (zDist < MAX_HEIGHT_DIST) {
+				float dist = (pos - Array[i].m_pos).Magnitude();
+				if (dist < MAX_FADE_DIST) {
+					float distFade = dist < MIN_FADE_DIST ? 1.0f : 1.0f - (dist - MIN_FADE_DIST) / (MAX_FADE_DIST - MIN_FADE_DIST);
+					float heightFade = 1.0f - zDist / MAX_HEIGHT_DIST;
+					dir = (pos - Array[i].m_pos) * heightFade / dist;
+					bWasWindModifierFound = true;
+				}
+			}
+		}
+	}
+
+	if (bWasWindModifierFound) {
+		float directionMult = ((CGeneral::GetRandomNumber() & 0x1F) - 16) * 0.0035f + 1.0f;
+		*x += dir.x * directionMult;
+		*y += dir.y * directionMult;
+	}
+
+	return bWasWindModifierFound;
 }
diff --git a/src/render/WindModifiers.h b/src/render/WindModifiers.h
index c42e185d..7c2e57bd 100644
--- a/src/render/WindModifiers.h
+++ b/src/render/WindModifiers.h
@@ -2,7 +2,10 @@
 
 class CWindModifiers
 {
+	CVector m_pos;
+	int32 m_type;
 public:
-	static void RegisterOne(CVector pos, int32 unk);
-	static int32 FindWindModifier(CVector pos, float *x, float *y);
+	static int32 Number;
+	static void RegisterOne(CVector pos, int32 windSourceType);
+	static bool FindWindModifier(CVector pos, float *x, float *y);
 };