diff --git a/Content/Blueprints/OptiXVRPawnStandaloneBP.uasset b/Content/Blueprints/OptiXVRPawnStandaloneBP.uasset
index 36bc9229c9a4658af64c2590b1abb276505a6368..12db22255292780000c3e46138b4197f6a08265c 100644
Binary files a/Content/Blueprints/OptiXVRPawnStandaloneBP.uasset and b/Content/Blueprints/OptiXVRPawnStandaloneBP.uasset differ
diff --git a/Content/UI/ThumbstickMode.uasset b/Content/UI/ThumbstickMode.uasset
index 00e8f66d364755ce02dfac63e5fce600dee332f2..e140c88573714e70c5a69a3813ba5a115e43ce5b 100644
Binary files a/Content/UI/ThumbstickMode.uasset and b/Content/UI/ThumbstickMode.uasset differ
diff --git a/Content/UI/Translator/PositionCounter.uasset b/Content/UI/Translator/PositionCounter.uasset
index bf647f5736feec2a317a69af1e0171c500721156..74c0eff5190021be8876809da5a93520c10f3497 100644
Binary files a/Content/UI/Translator/PositionCounter.uasset and b/Content/UI/Translator/PositionCounter.uasset differ
diff --git a/Source/OptiX/Private/OptiXVRPawn.cpp b/Source/OptiX/Private/OptiXVRPawn.cpp
index 61386d0519e58cd1ded4fc68d7986c6fa40d74f2..372df9f72e2af545ce5b24bc2a24b2af0f16ad96 100644
--- a/Source/OptiX/Private/OptiXVRPawn.cpp
+++ b/Source/OptiX/Private/OptiXVRPawn.cpp
@@ -71,7 +71,18 @@ void AOptiXVRPawn::UpdateTranslation(UPrimitiveComponent* Interaction)
 
 	TArray<USceneComponent*> Parents;
 	GrabbedLever->GetParentComponents(Parents);
-	Parents[0]->SetRelativeScale3D(FVector(ScaleX / 39.0, 1, 1));
+
+	if (ScaleX < 0)
+	{
+		GrabbedLever->SetWorldScale3D(FVector(-0.6, -0.6, -0.6));
+	}
+	else
+	{
+		GrabbedLever->SetWorldScale3D(FVector(0.6, 0.6, 0.6));
+	}
+
+	Parents[0]->SetWorldScale3D(FVector(ScaleX / 39.0, 0.6, 0.6));
+
 
 	FVector NewDist = GetDistanceVector(Interaction);
 	GrabDistanceX = NewDist.X;
diff --git a/Source/OptiX/Private/SelectableActorBase.cpp b/Source/OptiX/Private/SelectableActorBase.cpp
index 29bf7a23abcde7cabf37840cc1d239e9b0d9b4f7..53ef56dbc8fbc441d6f3e7c80dc6c9c0f6afcf01 100644
--- a/Source/OptiX/Private/SelectableActorBase.cpp
+++ b/Source/OptiX/Private/SelectableActorBase.cpp
@@ -26,12 +26,14 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	Gizmo = CreateDefaultSubobject<USceneComponent>(TEXT("Gizmo"));
 	Gizmo->SetupAttachment(GetStaticMeshComponent());
 	Gizmo->SetHiddenInGame(true);
+	//Gizmo->SetAbsolute(false, true, true);
 
 	SupportWidget = CreateDefaultSubobject<UWidgetComponent>(TEXT("SupportWidget"));
+	SupportWidget->SetAbsolute(false, true, true);
+
 	SupportWidget->SetupAttachment(Gizmo);
 	static ConstructorHelpers::FClassFinder<UUserWidget> SupportWidgetClass(TEXT("/OptiX/UI/SupportSwapWidget2"));
 	SupportWidget->SetWidgetClass(SupportWidgetClass.Class);
-	SupportWidget->SetAbsolute(false, true, false);
 	SupportWidget->SetWorldScale3D(FVector(0.05, 0.05, 0.05));
 	SupportWidget->SetDrawSize(FVector2D(800, 2300));
 	SupportWidget->SetGenerateOverlapEvents(false);
@@ -45,11 +47,11 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	TranslationSupport->SetupAttachment(Gizmo);
 
 	TranslateX = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("TranslateX"));
+	TranslateX->SetAbsolute(false, true, true);
 	TranslateX->SetupAttachment(TranslationSupport);
 	static ConstructorHelpers::FObjectFinder<UStaticMesh> TranslateXMesh(TEXT("StaticMesh'/OptiX/UI/Translator/Arrowbody.Arrowbody'"));
 	TranslateX->SetStaticMesh(TranslateXMesh.Object);
-	TranslateX->SetAbsolute(false, true, false);
-	TranslateX->SetWorldScale3D(FVector(0.8f, 0.8f, 0.8f));
+	TranslateX->SetWorldScale3D(FVector(0.6f, 0.6f, 0.6f));
 	TranslateX->SetGenerateOverlapEvents(false);
 	TranslateX->SetHiddenInGame(true);
 
@@ -58,15 +60,15 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	TranslateX->SetCanEverAffectNavigation(false);
 
 	ArrowX = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ArrowX"));
+	ArrowX->SetAbsolute(false, false, true);
+	ArrowX->SetWorldScale3D(FVector(0.6f, 0.6f, 0.6f));
 	ArrowX->SetupAttachment(TranslateX);
 	static ConstructorHelpers::FObjectFinder<UStaticMesh> TranslateArrow(TEXT("StaticMesh'/OptiX/UI/Translator/Arrowhead.Arrowhead'"));
 	ArrowX->SetStaticMesh(TranslateArrow.Object);
 	//ArrowX->SetAbsolute(false, true, false);
-	//ArrowX->SetWorldScale3D(FVector(0.8f, 0.8f, 0.8f));
 	ArrowX->SetRelativeLocation(FVector(39, 0, 0));
 	ArrowX->SetGenerateOverlapEvents(false);
 	ArrowX->SetHiddenInGame(true);
-	ArrowX->SetAbsolute(false, false, true);
 
 	ArrowX->CastShadow = 0;
 	ArrowX->bVisibleInReflectionCaptures = false;
@@ -87,9 +89,10 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	// todo
 
 	TranslateY = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("TranslateY"));
+	TranslateY->SetAbsolute(false, true, true);
+
 	TranslateY->SetupAttachment(TranslationSupport);
 	TranslateY->SetStaticMesh(TranslateXMesh.Object);
-	TranslateY->SetAbsolute(false, true, false);
 	TranslateY->SetWorldScale3D(FVector(0.6f, 0.6f, 0.6f));
 	TranslateY->SetGenerateOverlapEvents(false);
 	TranslateY->SetHiddenInGame(true);
@@ -100,6 +103,8 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	TranslateY->SetCanEverAffectNavigation(false);
 
 	ArrowY = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ArrowY"));
+	ArrowY->SetAbsolute(false, false, true);
+
 	ArrowY->SetupAttachment(TranslateY);
 	ArrowY->SetStaticMesh(TranslateArrow.Object);
 	//ArrowY->SetAbsolute(false, true, false);
@@ -107,7 +112,6 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	ArrowY->SetRelativeLocation(FVector(39, 0, 0));
 	ArrowY->SetGenerateOverlapEvents(false);
 	ArrowY->SetHiddenInGame(true);
-	ArrowY->SetAbsolute(false, false, true);
 
 	ArrowY->CastShadow = 0;
 	ArrowY->bVisibleInReflectionCaptures = false;
@@ -125,9 +129,9 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	//TranslateWidgetY->SetTwoSided(true);
 
 	TranslateZ = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("TranslateZ"));
+	TranslateZ->SetAbsolute(false, true, true);
 	TranslateZ->SetupAttachment(TranslationSupport);
 	TranslateZ->SetStaticMesh(TranslateXMesh.Object);
-	TranslateZ->SetAbsolute(false, true, false);
 	TranslateZ->SetWorldScale3D(FVector(0.6f, 0.6f, 0.6f));
 	TranslateZ->SetGenerateOverlapEvents(false);
 	TranslateZ->SetHiddenInGame(true);
@@ -136,7 +140,9 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	TranslateZ->CastShadow = 0;
 	TranslateZ->bVisibleInReflectionCaptures = false;
 
+
 	ArrowZ = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ArrowZ"));
+	ArrowZ->SetAbsolute(false, false, true);
 	ArrowZ->SetupAttachment(TranslateZ);
 	ArrowZ->SetStaticMesh(TranslateArrow.Object);
 	//ArrowZ->SetAbsolute(false, true, false);
@@ -144,7 +150,6 @@ ASelectableActorBase::ASelectableActorBase(const FObjectInitializer& ObjectIniti
 	ArrowZ->SetRelativeLocation(FVector(39, 0, 0));
 	ArrowZ->SetGenerateOverlapEvents(false);
 	ArrowZ->SetHiddenInGame(true);
-	ArrowZ->SetAbsolute(false, false, true);
 	ArrowZ->SetCanEverAffectNavigation(false);
 	ArrowZ->CastShadow = 0;
 	ArrowZ->bVisibleInReflectionCaptures = false;
@@ -476,6 +481,14 @@ void ASelectableActorBase::DeleteActor()
 
 void ASelectableActorBase::SetRodPosition(FVector TablePosition)
 {
+
+	// Flip socket?
+	if (Socket->GetComponentLocation().Z > GetActorLocation().Z)
+	{
+		Socket->SetRelativeLocation(-1 * Socket->RelativeLocation);
+	}
+
+
 	FVector TableZero = TablePosition + FVector(0, 0, 95); // Table Height	
 
 	// Far away from the table or below table, make it go straight down
@@ -499,8 +512,16 @@ void ASelectableActorBase::SetRodPosition(FVector TablePosition)
 }
 
 // TODO Material highlighting - swap material slots?
-void ASelectableActorBase::OnOverlapBegin(UPrimitiveComponent * OverlapComponent, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
+void ASelectableActorBase::OnOverlapBegin_Implementation(UPrimitiveComponent * OverlapComponent, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
 {
+
+	AOptiXVRPawn* OverlappingPawn = Cast<AOptiXVRPawn>(OtherActor);
+
+	if (OverlappingPawn != nullptr)
+	{
+		OverlappingPawn->OnOverlapBeginWithLever(OverlapComponent);
+	}
+
 	//int32 N = OverlapComponent->GetNumMaterials();
 	//for (int32 i = 0; i < N; i++)
 	//{
@@ -508,8 +529,16 @@ void ASelectableActorBase::OnOverlapBegin(UPrimitiveComponent * OverlapComponent
 	//}
 }
 
-void ASelectableActorBase::OnOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
+void ASelectableActorBase::OnOverlapEnd_Implementation(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
 {
+
+	AOptiXVRPawn* OverlappingPawn = Cast<AOptiXVRPawn>(OtherActor);
+
+	if (OverlappingPawn != nullptr)
+	{
+		OverlappingPawn->OnOverlapEndWithLever(OverlappedComp);
+	}
+
 	//int32 N = OverlappedComp->GetNumMaterials();
 	//for (int32 i = 0; i < N; i++)
 	//{
diff --git a/Source/OptiX/Public/OptiXVRPawn.h b/Source/OptiX/Public/OptiXVRPawn.h
index 0278cb9f6e14e19e6c22715be87b36ded1d9c85a..afc8760b91c9e34a6a6b1a65947f6f9de85c3bf2 100644
--- a/Source/OptiX/Public/OptiXVRPawn.h
+++ b/Source/OptiX/Public/OptiXVRPawn.h
@@ -52,6 +52,12 @@ public:
 	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, /*meta = (BlueprintProtected)*/ Category = "OptiXActor")
 	void UIEventDelete();
 
+	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, /*meta = (BlueprintProtected)*/ Category = "OptiXActor")
+	void OnOverlapBeginWithLever(UPrimitiveComponent* Lever);
+
+	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, /*meta = (BlueprintProtected)*/ Category = "OptiXActor")
+	void OnOverlapEndWithLever(UPrimitiveComponent* Lever);
+
 public:
 
 	UPROPERTY(BlueprintReadWrite, EditAnywhere)
diff --git a/Source/OptiX/Public/SelectableActorBase.h b/Source/OptiX/Public/SelectableActorBase.h
index 682cd71eb4b9d2195cf98219fad58bbd21059442..068d93a2ab701d56fce54fe9d74b7523d1f05bb0 100644
--- a/Source/OptiX/Public/SelectableActorBase.h
+++ b/Source/OptiX/Public/SelectableActorBase.h
@@ -57,10 +57,10 @@ public:
 	UFUNCTION(BlueprintCallable, /*meta = (BlueprintProtected)*/ Category = "OptiXActor")
 	void SetRodPosition(FVector TablePosition);
 
-	UFUNCTION()
+	UFUNCTION(BlueprintNativeEvent)
 	void OnOverlapBegin(class UPrimitiveComponent* OverlapComponent, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);
 	
-	UFUNCTION()
+	UFUNCTION(BlueprintNativeEvent)
 	void OnOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);