diff --git a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
index 6e2b756f70c07128b52cc46dae52c216da0ebb32..37251ceac528125687a8101521c5de3951facc81 100644
--- a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
+++ b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
@@ -135,11 +135,30 @@ void ACAVEOverlayController::PostInitializeComponents()
 void ACAVEOverlayController::CycleDoorType()
 {
 	Door_Current_Mode = static_cast<EDoor_Mode>((Door_Current_Mode + 1) % DOOR_NUM_MODES);
-	SetDoorMode(Door_Current_Mode);
+
+	IDisplayClusterClusterManager* const Manager = IDisplayCluster::Get().GetClusterMgr();
+	if (Manager)
+	{
+		FDisplayClusterClusterEvent cluster_event;
+		cluster_event.Name = "CAVEOverlay Change Door to " + Door_Mode_Names[Door_Current_Mode];
+		cluster_event.Type = "DoorChange";
+		cluster_event.Category = "CAVEOverlay";
+		cluster_event.Parameters.Add("NewDoorState", FString::FromInt(Door_Current_Mode));
+		Manager->EmitClusterEvent(cluster_event, true);
+	}
+}
+
+void ACAVEOverlayController::HandleClusterEvent(const FDisplayClusterClusterEvent& Event)
+{
+	if (Event.Category.Equals("CAVEOverlay") && Event.Type.Equals("DoorChange") && Event.Parameters.Contains("NewDoorState"))
+	{
+		SetDoorMode(static_cast<EDoor_Mode>(FCString::Atoi(*Event.Parameters["NewDoorState"])));
+	}
 }
 
-void ACAVEOverlayController::SetDoorMode(EDoor_Mode M)
+void ACAVEOverlayController::SetDoorMode(EDoor_Mode NewMode)
 {
+	Door_Current_Mode = NewMode;
 	switch (Door_Current_Mode)
 	{
 	case EDoor_Mode::DOOR_DEBUG:
@@ -182,16 +201,22 @@ void ACAVEOverlayController::BeginPlay()
 	Super::BeginPlay();
 
 	//Read situation
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster) {
+	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
+	{
 		auto ClusterConfigCustom = IDisplayCluster::Get().GetConfigMgr()->GetConfigCustom();
 		bCAVE_Mode = ClusterConfigCustom.Args.Contains("Hardware_Platform") && ClusterConfigCustom.Args.Find("Hardware_Platform")->Equals("aixcave", ESearchCase::IgnoreCase);
 	}
-	
+
 	if (!bCAVE_Mode) return; // Not our business
 
 	//Input config
-	InputComponent->BindAction("Action4", EInputEvent::IE_Pressed, this, &ACAVEOverlayController::CycleDoorType);
 	InputComponent->BindKey(EKeys::F10, EInputEvent::IE_Pressed, this, &ACAVEOverlayController::CycleDoorType);
+	IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
+	if (ClusterManager && !ClusterEventListenerDelegate.IsBound())
+	{
+		ClusterEventListenerDelegate = FOnClusterEventListener::CreateUObject(this, &ACAVEOverlayController::HandleClusterEvent);
+		ClusterManager->AddClusterEventListener(ClusterEventListenerDelegate);
+	}
 
 	//Determine the screen-type for later usage
 	if (IDisplayCluster::Get().GetClusterMgr()->GetNodeId().Equals(Screen_Main, ESearchCase::IgnoreCase))
@@ -226,6 +251,17 @@ void ACAVEOverlayController::BeginPlay()
 	}
 }
 
+void ACAVEOverlayController::EndPlay(const EEndPlayReason::Type EndPlayReason)
+{
+	IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
+	if (ClusterManager && ClusterEventListenerDelegate.IsBound())
+	{
+		ClusterManager->RemoveClusterEventListener(ClusterEventListenerDelegate);
+	}
+
+	Super::EndPlay(EndPlayReason);
+}
+
 float ACAVEOverlayController::CalculateOpacityFromPosition(FVector Position)
 {
 	return FMath::Max(
@@ -242,13 +278,8 @@ bool ACAVEOverlayController::PositionInDoorOpening(FVector Position)
 
 void ACAVEOverlayController::RefreshPawnComponents()
 {
-	TArray<UDisplayClusterSceneComponent*> Pawn_Components;
-	Player_Pawn->GetComponents<UDisplayClusterSceneComponent>(Pawn_Components);
-	for (UDisplayClusterSceneComponent* c : Pawn_Components)
-	{
-		if (c->GetName().Equals("cave_origin", ESearchCase::IgnoreCase)) Cave_Origin = c;
-		if (c->GetName().Equals("shutter_glasses", ESearchCase::IgnoreCase)) Shutter_Glasses = c;
-	}
+	Cave_Origin = Player_Pawn->GetCaveOriginComponent();
+	Shutter_Glasses = Player_Pawn->GetShutterGlassesComponent();
 }
 
 // Called every frame
@@ -258,7 +289,11 @@ void ACAVEOverlayController::Tick(float DeltaTime)
 
 	if (!bCAVE_Mode) return; // Not our business
 
-	RefreshPawnComponents();
+	if (!Cave_Origin || !Shutter_Glasses)
+	{
+		RefreshPawnComponents();
+	}
+
 	if (!bAttached && Cave_Origin)
 	{
 		AttachToComponent(Cave_Origin, FAttachmentTransformRules::SnapToTargetNotIncludingScale);
@@ -266,7 +301,8 @@ void ACAVEOverlayController::Tick(float DeltaTime)
 	}
 
 	//FPS Counter
-	if (Overlay) {
+	if (Overlay)
+	{
 		if (Door_Current_Mode == EDoor_Mode::DOOR_DEBUG && ContainsFString(Screens_FPS, IDisplayCluster::Get().GetClusterMgr()->GetNodeId()))
 		{
 			Overlay->FPS->SetText(FText::FromString(FString::Printf(TEXT("FPS: %.1f"), 1.0f / DeltaTime)));
@@ -276,7 +312,7 @@ void ACAVEOverlayController::Tick(float DeltaTime)
 			Overlay->FPS->SetText(FText::FromString(""));
 		}
 	}
-	
+
 	if (!Shutter_Glasses) return; //Display Cluster not initialized
 
 	//Tape Logic
diff --git a/Source/CAVEOverlay/Public/CAVEOverlayController.h b/Source/CAVEOverlay/Public/CAVEOverlayController.h
index 9ea5ba1b1645b75c1924d40b3e2a884ada0e458c..73760b6a4c562522472332438ded6ec9a52585f6 100644
--- a/Source/CAVEOverlay/Public/CAVEOverlayController.h
+++ b/Source/CAVEOverlay/Public/CAVEOverlayController.h
@@ -12,6 +12,8 @@
 #include "Materials/MaterialInstanceDynamic.h"
 #include "DisplayClusterExtensions/Public/VirtualRealityPawn.h"
 #include "DisplayCluster/Public/DisplayClusterSceneComponent.h"
+#include "Cluster/DisplayClusterClusterEvent.h"
+#include "Cluster/IDisplayClusterClusterManager.h"
 #include "CAVEOverlayController.generated.h"
 
 DECLARE_LOG_CATEGORY_EXTERN(LogCAVEOverlay, Log, All);
@@ -20,11 +22,13 @@ UCLASS()
 class CAVEOVERLAY_API ACAVEOverlayController : public AActor
 {
 	GENERATED_BODY()
+	
 public:
 	ACAVEOverlayController();
 protected:
 	// Called when the game starts or when spawned
 	virtual void BeginPlay() override;
+	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
 	virtual void PostInitializeComponents() override;
 
 private:
@@ -68,8 +72,12 @@ private:
 	bool bAttached = false;
 	void RefreshPawnComponents();
 	AVirtualRealityPawn* Player_Pawn;
-	UDisplayClusterSceneComponent* Cave_Origin;
-	UDisplayClusterSceneComponent* Shutter_Glasses;
+	USceneComponent* Cave_Origin;
+	USceneComponent* Shutter_Glasses;
+
+	//Cluster Events
+	FOnClusterEventListener ClusterEventListenerDelegate;
+	void HandleClusterEvent(const FDisplayClusterClusterEvent& Event);
 
 public: