diff --git a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
index 6e2b756f70c07128b52cc46dae52c216da0ebb32..9301e07ffeda2d5434853a42fdf52fd8c9c5d2f6 100644
--- a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
+++ b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
@@ -111,6 +111,22 @@ ACAVEOverlayController::ACAVEOverlayController()
 	Sign_Positive_Y->SetRelativeScale3D(FVector(0.5f));
 	Sign_Negative_X->SetRelativeScale3D(FVector(0.5f));
 	Sign_Positive_X->SetRelativeScale3D(FVector(0.5f));
+
+	IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
+	if (ClusterManager && !ClusterEventListenerDelegate.IsBound())
+	{
+		ClusterEventListenerDelegate = FOnClusterEventListener::CreateUObject(this, &ACAVEOverlayController::HandleClusterEvent);
+		ClusterManager->AddClusterEventListener(ClusterEventListenerDelegate);
+	}
+}
+
+ACAVEOverlayController::~ACAVEOverlayController()
+{
+	IDisplayClusterClusterManager* ClusterManager = IDisplayCluster::Get().GetClusterMgr();
+	if (ClusterManager && ClusterEventListenerDelegate.IsBound())
+	{
+		ClusterManager->RemoveClusterEventListener(ClusterEventListenerDelegate);
+	}
 }
 
 void ACAVEOverlayController::PostInitializeComponents()
@@ -135,7 +151,25 @@ 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)
@@ -182,15 +216,15 @@ 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);
 
 	//Determine the screen-type for later usage
@@ -242,13 +276,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 +287,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 +299,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 +310,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..6daa7e9183abe3cb111e0d9c78f9b9218e9f8651 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);
@@ -22,6 +24,7 @@ class CAVEOVERLAY_API ACAVEOverlayController : public AActor
 	GENERATED_BODY()
 public:
 	ACAVEOverlayController();
+	~ACAVEOverlayController();
 protected:
 	// Called when the game starts or when spawned
 	virtual void BeginPlay() override;
@@ -68,8 +71,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: