diff --git a/Content/MoCapMap.umap b/Content/MoCapMap.umap
index dab84892480c779ea07231c57dc0acd2b7bcc808..14a7dbb360357d4db9cfa0446809f68e5432f3d5 100644
--- a/Content/MoCapMap.umap
+++ b/Content/MoCapMap.umap
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:4b9087088e29bf1943a925f5ba241b0551795079c0b28ec3327ebefaf1902100
-size 88539
+oid sha256:e411c0cd1771015cf525991322daa708792baa510251ad631d8241e420363934
+size 88754
diff --git a/Content/SaveSequenceRig.uasset b/Content/SaveSequenceRig.uasset
index fbdc77bf4fe6a574a6db615214796e60d14783a6..cc62a6754b96431b828120ab7bee100223780218 100644
--- a/Content/SaveSequenceRig.uasset
+++ b/Content/SaveSequenceRig.uasset
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:5ac6d20858a789b86ebb648cd252b56127fa3ffd700170f9e052c8c82abd2365
-size 5134196
+oid sha256:4e140be55357a682f3c7ac027bc8bfa52cdc6458d4442d75231e022321eb320c
+size 5131100
diff --git a/Source/MoCapPlugin/Private/MCController.cpp b/Source/MoCapPlugin/Private/MCController.cpp
index 5530f3e22493d0cfc9a6d97d01ffccce76193073..05e84680da1f697b66505700e6e1b9ecd480c4c9 100644
--- a/Source/MoCapPlugin/Private/MCController.cpp
+++ b/Source/MoCapPlugin/Private/MCController.cpp
@@ -380,13 +380,6 @@ bool AMCController::PreprocessRecording(float StartHaltingPoint, float EndHaltin
 		return false;
 	}
 
-	//found no end -> add one
-	/*if (!AnimSaveState.AnimData.Last().IsEnd) {
-		AnimSaveState.AnimData.Push(FProcessedAnimData());
-		AnimSaveState.AnimData.Last().Timestamp = LastStamp + FTimespan::FromMilliseconds(10);
-		AnimSaveState.AnimData.Last().IsEnd = true;
-	}*/
-
 	//----process the anim data----
 
 	//---Sensor turned off -> interpolate
@@ -577,10 +570,70 @@ bool AMCController::PreprocessRecording(float StartHaltingPoint, float EndHaltin
 		}
 	}
 
+	//---Controlling Chest Position---
+	if (ChestControlFactor > 0.f) {
+
+		FVector AvgChestPos;
+		FVector AvgHipPos;
+		FVector MoveChest;
+		for (int i = 0; i < AnimSaveState.AnimData.Num(); i++) {
+
+			FProcessedAnimData& AnimData = AnimSaveState.AnimData[i];
+
+			if (AnimData.IsMarker || AnimData.IsEnd) {
+				//average chest position
+				AvgChestPos = FVector::ZeroVector;
+				int Num = 0;
+				for (int j = i + 1; j < AnimSaveState.AnimData.Num(); j++) {
+					if (AnimSaveState.AnimData[j].IsMarker || AnimSaveState.AnimData[j].IsEnd) {
+						break;
+					}
+					Num++;
+				}
+				for (int j = i + 1; j <= i + Num; j++) {
+					AvgChestPos += AnimSaveState.AnimData[j].SensorData.GetEntry(EBodyPart::UpperBody)->Pos / (float)Num;
+				}
+				//average hip position
+				AvgHipPos = FVector::ZeroVector;
+				for (int j = i + 1; j <= i + Num; j++) {
+					AvgHipPos += AnimSaveState.AnimData[j].SensorData.GetEntry(EBodyPart::LowerBody)->Pos / (float)Num;
+				}
+				MoveChest = ChestControlFactor * (AvgHipPos + ChestControlCenter - AvgChestPos);
+				MoveChest.X = 0.f;
+				MoveChest.Z = 0.f;
+				continue;
+			}
+
+			FSensorData& SensorData = AnimData.SensorData;
+
+			//move chest
+			FSensorDataEntry* ChestEntry = SensorData.GetEntry(EBodyPart::UpperBody);
+			ChestEntry->Pos += MoveChest;
+			if (ChestKeepLength) {
+				FSensorDataEntry* HipEntry = SensorData.GetEntry(EBodyPart::LowerBody);
+				FVector OldPos = ChestEntry->Pos;
+				ChestEntry->Pos = HipEntry->Pos + (AvgHipPos - AvgChestPos).Size() * (ChestEntry->Pos - HipEntry->Pos).Normalize();
+				MoveChest += ChestEntry->Pos - OldPos;
+			}
+
+			//move upper body parts to fit chest
+			for (int j = 0; j < EBodyPart::LAST; j++) {
+
+				EBodyPart Type = EBodyPart(j);
+				if (Type == EBodyPart::UpperBody || Type == EBodyPart::LowerBody || Type == EBodyPart::FootL || Type == EBodyPart::FootR) {
+					continue;
+				}
+
+				FSensorDataEntry* Entry = SensorData.GetEntry(Type);
+				Entry->Pos += MoveChest;
+
+			}
+
+		}
+	}
+
 	//---return to default pose at start and end---
-	
 	FSensorData DefaultPose;
-	//float DefaultPoseTakingTime = 0.3f;
 	if (ReturnToDefaultPose) {
 
 		//Take default pose from time or file
diff --git a/Source/MoCapPlugin/Public/MCController.h b/Source/MoCapPlugin/Public/MCController.h
index e800cae7e6ebcc0b3fe3facac26194adaaa6d26a..2dfdd3ec79802a03fa8e397bf7d53dcc6889cc87 100644
--- a/Source/MoCapPlugin/Public/MCController.h
+++ b/Source/MoCapPlugin/Public/MCController.h
@@ -203,6 +203,15 @@ public:
 	UPROPERTY(EditAnywhere, meta = (DisplayName = "Default Pose Time To Interpolate To It", Category = "MotionCapture Anim"))
 	float DefaultPoseTakingTime = 0.6f;
 
+	UPROPERTY(EditAnywhere, meta = (DisplayName = "Chest Control Center", Category = "MotionCapture Anim"))
+	FVector ChestControlCenter;
+
+	UPROPERTY(EditAnywhere, meta = (DisplayName = "Chest Control Factor", Category = "MotionCapture Anim"))
+	float ChestControlFactor = 0.0;
+
+	//UPROPERTY(EditAnywhere, meta = (DisplayName = "Chest Control Keep Length", Category = "MotionCapture Anim"))
+	bool ChestKeepLength = false;
+
 	UPROPERTY(EditAnywhere, meta = (DisplayName = "Hip Reducing Center", Category = "MotionCapture Anim"))
 	FVector HipReducingCenter;