diff --git a/Content/MoCapMap.umap b/Content/MoCapMap.umap
index fa980d12c8ca88674f142a6b60b51c15e1d576a6..80948ac3806f02060b776ea40b45621104e6ac1d 100644
--- a/Content/MoCapMap.umap
+++ b/Content/MoCapMap.umap
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:c991a894a005d173fbb1cae58880ae8ba8db5eb42cb65fad7bb81bca9cd119a4
-size 35283
+oid sha256:ad2b88803d2034732601fe2e6868c8f8599ecb347bf41b58e7a86ce6dbd739a4
+size 35369
diff --git a/Content/SaveSequenceRig.uasset b/Content/SaveSequenceRig.uasset
index 542c1c49342220fceeb4665c404f7e1787d561e5..f4f8ac454bc254e0e239bbc86f176ff176fa91f4 100644
--- a/Content/SaveSequenceRig.uasset
+++ b/Content/SaveSequenceRig.uasset
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:3d4d1fcbf2205b1f12b9963bfd74175a6abc8de389cf2085455519671f9d70de
-size 4922933
+oid sha256:f9dbb0d293961c9daa5bd3a30d51d058e9590892fd0b1f60b4ecae1f23492c69
+size 4927211
diff --git a/Source/MoCapPlugin/Private/MCController.cpp b/Source/MoCapPlugin/Private/MCController.cpp
index 1ff679fa2aae5f70b15fb50f4c3baa69af11010c..0992e414e6ce5cc809d041a4e1e49bfc16e5a6d8 100644
--- a/Source/MoCapPlugin/Private/MCController.cpp
+++ b/Source/MoCapPlugin/Private/MCController.cpp
@@ -338,19 +338,6 @@ void AMCController::PreprocessRecording() {
 
 	}
 
-	//----pull down hip amount----
-
-	float PullDownHip = 0;
-	{
-		FVector OffsetPos = AnimSaveState.AnimData[0].SensorData.LowerBody.Pos;
-		float diff = OffsetPos.Z;
-		FQuat OffsetRot = AnimSaveState.AnimData[0].SensorData.LowerBody.Rot;
-		OffsetRot = OffsetRot * FQuat(FVector(0, 0, 1), FMath::DegreesToRadians(180));
-		AnimSaveState.Pawn->OffsetSensorData(EBodyPart::LowerBody, OffsetPos, OffsetRot); 
-		diff = OffsetPos.Z - diff;
-		PullDownHip = diff;
-	}
-
 	//----process the anim data----
 
 	//---Sensor turned off -> interpolate
@@ -437,100 +424,8 @@ void AMCController::PreprocessRecording() {
 
 	}
 
-	//---other processing---
-	for (int i = 0; i < AnimSaveState.AnimData.Num(); i++) {
-
-		FProcessedAnimData& AnimData = AnimSaveState.AnimData[i];
-
-		if (AnimData.IsMarker || AnimData.IsEnd) {
-			continue;
-		}
-
-		//process sensor data
-		FSensorData& SensorData = AnimData.SensorData;
-		for (int j = 0; j < EBodyPart::LAST; j++) {
-
-			EBodyPart Type = EBodyPart(j);
-			FSensorDataEntry* Entry = SensorData.GetEntry(Type);
-
-			//pull down hip
-			if (Type == EBodyPart::LowerBody) {
-				FQuat Swing, Twist;
-				Entry->Rot.ToSwingTwist(FVector(0, 0, 1), Swing, Twist);
-				float angle = FMath::RadiansToDegrees(Swing.GetAngle());
-				if (angle > 180) {
-					angle -= 360;
-				}
-				//Entry.Pos.Z += PullDownHip * FMath::Abs(angle / 180.f);
-			}
-
-			//analyse z pos of feet
-			if (Type == EBodyPart::LowerLegL) {
-
-				int window = 5;
-				bool isMin = true;
-				for (int w = 1; w <= window; w++) {
-					if (i + w < AnimSaveState.AnimData.Num()) {
-						FVector Pos = AnimSaveState.AnimData[i + w].SensorData.LowerLegL.Pos;
-						if (Entry->Pos.Z <= Pos.Z) {
-							isMin = false;
-							break;
-						}
-					}
-					if (i - w >= 0) {
-						FVector Pos = AnimSaveState.AnimData[i - w].SensorData.LowerLegL.Pos;
-						if (Entry->Pos.Z <= Pos.Z) {
-							isMin = false;
-							break;
-						}
-					}
-				}
-
-				if (isMin) {
-					AnimSaveState.LowestPoints.Push(Entry->Pos.Z);
-				}
-
-				//offset
-
-				FVector OffsetPos = Entry->Pos;
-				FQuat OffsetRot = Entry->Rot;
-				AnimSaveState.Pawn->OffsetSensorData(Type, OffsetPos, OffsetRot);
-
-				isMin = true;
-				for (int w = 1; w <= window; w++) {
-					if (i + w < AnimSaveState.AnimData.Num()) {
-						FVector Pos = AnimSaveState.AnimData[i + w].SensorData.LowerLegL.Pos;
-						if (OffsetPos.Z <= Pos.Z) {
-							isMin = false;
-							break;
-						}
-					}
-					if (i - w >= 0) {
-						FVector Pos = AnimSaveState.AnimData[i - w].SensorData.LowerLegL.Pos;
-						if (OffsetPos.Z <= Pos.Z) {
-							isMin = false;
-							break;
-						}
-					}
-				}
-
-				if (isMin) {
-					AnimSaveState.LowestPointsOffset.Push(OffsetPos.Z);
-				}
-
-			}
-
-		}
-
-		//process finger data
-		if (bFingerTrackingEnabled) {
-
-		}
-
-	}
-
 	//---Smoothing of legs---
-	int smoothTimes = 5;
+	int smoothTimes = LegSmoothTimes;
 	for (int l = 0; l < smoothTimes; l++) {
 
 		TArray<FProcessedAnimData> OldAnimData = AnimSaveState.AnimData;
@@ -549,7 +444,7 @@ void AMCController::PreprocessRecording() {
 				FQuat RotRes = OldAnimData[i].SensorData.GetEntry(BodyPart)->Rot;
 				int RotNum = 1;
 
-				int window = 3;
+				int window = LegSmoothWindow;
 				int sum = 2 * window + 1;
 
 				FVector LastPos = OldAnimData[i].SensorData.GetEntry(BodyPart)->Pos;
@@ -604,8 +499,6 @@ void AMCController::PreprocessRecording() {
 	
 	if (GestureHoldExcessTime > 0.f) {
 
-		
-
 		for (int i = 1; i < AnimSaveState.AnimData.Num(); i++) {
 
 			FProcessedAnimData& AnimData = AnimSaveState.AnimData[i];
@@ -704,21 +597,11 @@ void AMCController::PreprocessRecording() {
 	//debugging things
 	
 	std::string speed = "";
-	std::string lp = "";
-	std::string lpo = "";
 
 	for (int i = 0; i < GestureSpeed.Num(); i++) {
 		speed += "\n" + std::to_string(GestureSpeed[i]);
 	}
 
-	for (int i = 0; i < AnimSaveState.LowestPoints.Num(); i++) {
-		lp += "\n" + std::to_string(AnimSaveState.LowestPoints[i]);
-	}
-
-	for (int i = 0; i < AnimSaveState.LowestPointsOffset.Num(); i++) {
-		lpo += "\n" + std::to_string(AnimSaveState.LowestPointsOffset[i]);
-	}
-
 }
 
 
diff --git a/Source/MoCapPlugin/Private/MCRigUnits.cpp b/Source/MoCapPlugin/Private/MCRigUnits.cpp
index bfdca9bc79f71466211d8b60e1dc48eb008d3530..5c0391ce17ad190aab4f4e3a9f879f9c394c4538 100644
--- a/Source/MoCapPlugin/Private/MCRigUnits.cpp
+++ b/Source/MoCapPlugin/Private/MCRigUnits.cpp
@@ -276,8 +276,12 @@ FRigUnit_AdditionalOffsets_Execute() {
 
 		for (const auto& Offset : Offsets) {
 			FTransform Transform = Hierarchy->GetGlobalTransform(Offset.name);
-			Transform.SetRotation((Transform.GetRotation().Rotator() + *Offset.rot).Quaternion());
-			Hierarchy->SetGlobalTransform(Offset.name, Transform);
+
+			FQuat NormOffsetRot = (*Offset.rot).Quaternion();
+			NormOffsetRot.Normalize();
+			FTransform OffsetTransform(NormOffsetRot, *Offset.pos);
+			
+			Hierarchy->SetGlobalTransform(Offset.name, OffsetTransform * Transform);
 		}
 
 	}
diff --git a/Source/MoCapPlugin/Public/MCController.h b/Source/MoCapPlugin/Public/MCController.h
index 86d7f646b574a3ce5b0b14e4de9cad2be2e00d82..792b3ec37ed8be667dbd9be1daa0b3563015ca80 100644
--- a/Source/MoCapPlugin/Public/MCController.h
+++ b/Source/MoCapPlugin/Public/MCController.h
@@ -28,9 +28,6 @@ USTRUCT()
 struct FAnimSaveState {
 	GENERATED_BODY()
 
-	TArray<float> LowestPoints;
-	TArray<float> LowestPointsOffset;
-
 	TArray<FString> StringData;
 	TArray<FProcessedAnimData> AnimData;
 	int CurrentEntryIndex;
@@ -142,6 +139,12 @@ public:
 	UPROPERTY(EditAnywhere, meta = (DisplayName = "Gesture Hold Scale Excess Time", Category = "MotionCapture"))
 	float GestureHoldExcessTime = 0.f;
 
+	UPROPERTY(EditAnywhere, meta = (DisplayName = "Nr of Leg Smoothing Iterations", Category = "MotionCapture"))
+	int LegSmoothTimes = 5;
+
+	UPROPERTY(EditAnywhere, meta = (DisplayName = "Leg Smoothing Neighbor Window", Category = "MotionCapture"))
+	int LegSmoothWindow = 3;
+
 	UPROPERTY(EditAnywhere, meta = (DisplayName = "Additional Post Processing Offsets", Category = "MotionCapture"))
 	FAdditionalOffsets AdditionalOffsets;