diff --git a/Source/nDisplayExtensions/nDisplayExtensions.Build.cs b/Source/DisplayClusterExtensions/DisplayClusterExtensions.Build.cs
similarity index 79%
rename from Source/nDisplayExtensions/nDisplayExtensions.Build.cs
rename to Source/DisplayClusterExtensions/DisplayClusterExtensions.Build.cs
index 22f9d9dcf3e85da6b4565f32f5543364fc735762..6b3217d6f6fc3cfb2d7e8b3ca0b81f3b493b7b78 100644
--- a/Source/nDisplayExtensions/nDisplayExtensions.Build.cs
+++ b/Source/DisplayClusterExtensions/DisplayClusterExtensions.Build.cs
@@ -1,8 +1,8 @@
 using UnrealBuildTool;
 
-public class nDisplayExtensions : ModuleRules
+public class DisplayClusterExtensions : ModuleRules
 {
-  public nDisplayExtensions(ReadOnlyTargetRules Target) : base(Target)
+  public DisplayClusterExtensions(ReadOnlyTargetRules Target) : base(Target)
   {
     PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
 
@@ -28,6 +28,7 @@ public class nDisplayExtensions : ModuleRules
         "Core",
         "CoreUObject",
         "DisplayCluster",
+        "DisplayClusterInput",
         "Engine",
         "InputCore"
       }
diff --git a/Source/DisplayClusterExtensions/Private/DisplayClusterExtensions.cpp b/Source/DisplayClusterExtensions/Private/DisplayClusterExtensions.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c715f682a56cb1a01f8c9230313022bb93567144
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Private/DisplayClusterExtensions.cpp
@@ -0,0 +1,16 @@
+#include "DisplayClusterExtensions.h"
+
+#define LOCTEXT_NAMESPACE "FnDisplayExtensionsModule"
+
+void FDisplayClusterExtensionsModule::StartupModule ()
+{
+
+}
+void FDisplayClusterExtensionsModule::ShutdownModule()
+{
+
+}
+
+#undef LOCTEXT_NAMESPACE
+
+IMPLEMENT_MODULE(FDisplayClusterExtensionsModule, DisplayClusterExtensions)
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Private/DisplayClusterGameModeCAVE.cpp b/Source/DisplayClusterExtensions/Private/DisplayClusterGameModeCAVE.cpp
similarity index 100%
rename from Source/nDisplayExtensions/Private/DisplayClusterGameModeCAVE.cpp
rename to Source/DisplayClusterExtensions/Private/DisplayClusterGameModeCAVE.cpp
diff --git a/Source/DisplayClusterExtensions/Private/DisplayClusterPawnCAVE.cpp b/Source/DisplayClusterExtensions/Private/DisplayClusterPawnCAVE.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5855da424d51b3c12c40d013042cb450eff123e0
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Private/DisplayClusterPawnCAVE.cpp
@@ -0,0 +1,142 @@
+#include "DisplayClusterPawnCAVE.h"
+
+#include "Cluster/IDisplayClusterClusterManager.h"
+#include "Engine/World.h"
+#include "Game/IDisplayClusterGameManager.h"
+#include "GameFramework/WorldSettings.h"
+#include "Input/IDisplayClusterInputManager.h"
+#include "Kismet/GameplayStatics.h"
+#include "DisplayClusterSettings.h"
+#include "IDisplayCluster.h"
+
+ADisplayClusterPawnCAVE::ADisplayClusterPawnCAVE(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
+{
+	MovementComponent                        = CreateDefaultSubobject<UFloatingPawnMovement>     (TEXT("MovementComponent0"));
+	MovementComponent->UpdatedComponent      = RootComponent;
+
+	RotatingComponent                        = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent0"));
+	RotatingComponent->UpdatedComponent      = RootComponent;
+	RotatingComponent->bRotationInLocalSpace = false;
+	RotatingComponent->PivotTranslation      = FVector::ZeroVector;
+	RotatingComponent->RotationRate          = FRotator::ZeroRotator;
+}
+
+void                    ADisplayClusterPawnCAVE::OnForward_Implementation   (float Value) 
+{
+  if (Flystick)
+  {
+    if (IDisplayCluster::Get().GetClusterMgr()->IsMaster()) 
+      AddMovementInput(Flystick->GetForwardVector(), Value);
+  }
+  else
+  {
+    AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetForwardVector(), Value);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnRight_Implementation     (float Value)
+{ 
+  if (Flystick)
+  {
+    if (IDisplayCluster::Get().GetClusterMgr()->IsMaster())
+      AddMovementInput(Flystick->GetRightVector(), Value);
+  }
+  else
+  {
+    AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetRightVector(), Value);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnTurnRate_Implementation  (float Rate )
+{
+  if (Flystick)
+  {
+    if (!RotatingComponent->UpdatedComponent || !IDisplayCluster::Get().GetGameMgr() || !IDisplayCluster::Get().GetGameMgr()->GetActiveCamera()) return;
+
+    const FVector CameraLocation = IDisplayCluster::Get().GetGameMgr()->GetActiveCamera()->GetComponentLocation();
+    RotatingComponent->PivotTranslation = RotatingComponent->UpdatedComponent->GetComponentTransform().InverseTransformPositionNoScale(CameraLocation);
+    RotatingComponent->RotationRate     = FRotator(RotatingComponent->RotationRate.Pitch, Rate * BaseTurnRate, 0.0f);
+  }
+  else
+  {
+    AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnLookUpRate_Implementation(float Rate )
+{ 
+  if (Flystick)
+  {
+    // User-centered projection causes motion sickness on look up interaction hence not implemented.
+  }
+  else
+  {
+    AddControllerPitchInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
+  }
+}
+void                    ADisplayClusterPawnCAVE::OnFire_Implementation      ()
+{ 
+
+}
+void                    ADisplayClusterPawnCAVE::OnAction_Implementation    (int32 Index)
+{ 
+
+}
+
+void                    ADisplayClusterPawnCAVE::BeginPlay                  ()
+{
+  Super::BeginPlay();
+  
+	if (!IDisplayCluster::Get().IsModuleInitialized() || !IDisplayCluster::Get().IsAvailable()) return;
+
+  auto IsCluster = (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster);
+  bUseControllerRotationYaw   = !IsCluster;
+  bUseControllerRotationPitch = !IsCluster;
+  bUseControllerRotationRoll  = !IsCluster;
+
+  TArray<AActor*> SettingsActors;
+  UGameplayStatics::GetAllActorsOfClass(GetWorld(), ADisplayClusterSettings::StaticClass(), SettingsActors);
+  if (SettingsActors.Num() == 0) return;
+
+  ADisplayClusterSettings* Settings = Cast<ADisplayClusterSettings>(SettingsActors[0]);
+  MovementComponent->MaxSpeed       = Settings->MovementMaxSpeed    ;
+  MovementComponent->Acceleration   = Settings->MovementAcceleration;
+  MovementComponent->Deceleration   = Settings->MovementDeceleration;
+  MovementComponent->TurningBoost   = Settings->MovementTurningBoost;
+  BaseTurnRate                      = Settings->RotationSpeed       ;
+}
+void                    ADisplayClusterPawnCAVE::Tick                       (float DeltaSeconds)
+{
+	Super::Tick(DeltaSeconds);
+
+  // Is this really necessary?
+	const float Mult = GetWorld()->GetWorldSettings()->WorldToMeters / 100.f;
+	SetActorScale3D(FVector(Mult, Mult, Mult));
+
+  if (!Flystick) 
+    Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById(TEXT("flystick")); // There MUST be an scene node called flystick in the config.
+}
+void                    ADisplayClusterPawnCAVE::BeginDestroy               ()
+{
+  Super::BeginDestroy();
+}
+
+void                    ADisplayClusterPawnCAVE::SetupPlayerInputComponent  (UInputComponent* PlayerInputComponent)
+{
+  check(PlayerInputComponent);
+  Super::SetupPlayerInputComponent(PlayerInputComponent);
+  if (PlayerInputComponent)
+  {
+    PlayerInputComponent->BindAxis                   ("MoveForward"             , this, &ADisplayClusterPawnCAVE::OnForward   );
+    PlayerInputComponent->BindAxis                   ("MoveRight"               , this, &ADisplayClusterPawnCAVE::OnRight     );
+    PlayerInputComponent->BindAxis                   ("TurnRate"                , this, &ADisplayClusterPawnCAVE::OnTurnRate  );
+    PlayerInputComponent->BindAxis                   ("LookUpRate"              , this, &ADisplayClusterPawnCAVE::OnLookUpRate);
+    PlayerInputComponent->BindAction                 ("Fire"       , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnFire      );
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action1"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 1);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action2"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 2);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action3"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 3);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action4"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 4);
+    PlayerInputComponent->BindAction<FButtonDelegate>("Action5"    , IE_Pressed , this, &ADisplayClusterPawnCAVE::OnAction , 5);
+  }
+}
+UPawnMovementComponent* ADisplayClusterPawnCAVE::GetMovementComponent       () const
+{
+  return MovementComponent;
+}
diff --git a/Source/nDisplayExtensions/Public/nDisplayExtensions.h b/Source/DisplayClusterExtensions/Public/DisplayClusterExtensions.h
similarity index 67%
rename from Source/nDisplayExtensions/Public/nDisplayExtensions.h
rename to Source/DisplayClusterExtensions/Public/DisplayClusterExtensions.h
index 275de5791b5de51cbd5d31f76abeb60f0e953b2a..37d22333b3a096af9f8dd93956bd0e51de38f3c5 100644
--- a/Source/nDisplayExtensions/Public/nDisplayExtensions.h
+++ b/Source/DisplayClusterExtensions/Public/DisplayClusterExtensions.h
@@ -3,7 +3,7 @@
 #include "CoreMinimal.h"
 #include "Modules/ModuleManager.h"
 
-class NDISPLAYEXTENSIONS_API FnDisplayExtensionsModule : public IModuleInterface
+class FDisplayClusterExtensionsModule : public IModuleInterface
 {
 public:
   virtual void StartupModule () override;
diff --git a/Source/nDisplayExtensions/Public/DisplayClusterGameModeCAVE.h b/Source/DisplayClusterExtensions/Public/DisplayClusterGameModeCAVE.h
similarity index 67%
rename from Source/nDisplayExtensions/Public/DisplayClusterGameModeCAVE.h
rename to Source/DisplayClusterExtensions/Public/DisplayClusterGameModeCAVE.h
index 34d1ed7fbd5eeb78a93e41f2ac7418e51cd7064a..395eba444e2f43b96535d93805cad88ee2e413f3 100644
--- a/Source/nDisplayExtensions/Public/DisplayClusterGameModeCAVE.h
+++ b/Source/DisplayClusterExtensions/Public/DisplayClusterGameModeCAVE.h
@@ -6,7 +6,7 @@
 #include "DisplayClusterGameModeCAVE.generated.h"
 
 UCLASS()
-class NDISPLAYEXTENSIONS_API ADisplayClusterGameModeCAVE : public ADisplayClusterGameMode
+class DISPLAYCLUSTEREXTENSIONS_API ADisplayClusterGameModeCAVE : public ADisplayClusterGameMode
 {
 	GENERATED_BODY()
 	
diff --git a/Source/DisplayClusterExtensions/Public/DisplayClusterPawnCAVE.h b/Source/DisplayClusterExtensions/Public/DisplayClusterPawnCAVE.h
new file mode 100644
index 0000000000000000000000000000000000000000..09ec2f3f376c95ffce7750f5f76c3044bb765852
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Public/DisplayClusterPawnCAVE.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "GameFramework/FloatingPawnMovement.h"
+#include "GameFramework/PawnMovementComponent.h"
+#include "GameFramework/RotatingMovementComponent.h"
+#include "CoreMinimal.h"
+#include "DisplayClusterPawn.h"
+#include "DisplayClusterSceneComponent.h"
+
+#include "DisplayClusterPawnCAVE.generated.h"
+
+UCLASS()
+class DISPLAYCLUSTEREXTENSIONS_API ADisplayClusterPawnCAVE : public ADisplayClusterPawn
+{
+  GENERATED_UCLASS_BODY()
+
+public:
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnForward   (float Value);
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnRight     (float Value);
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnTurnRate  (float Rate );
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnLookUpRate(float Rate );
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnFire      ();
+  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnAction    (int32 Index);
+
+  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float                          BaseTurnRate = 45.0f  ;
+  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") UDisplayClusterSceneComponent* Flystick     = nullptr;
+
+protected:
+  DECLARE_DELEGATE_OneParam(FButtonDelegate, int32);
+
+  virtual void                    BeginPlay                ()                                            override;
+  virtual void                    Tick                     (float            DeltaSeconds        )       override;
+  virtual void                    BeginDestroy             ()                                            override;
+  virtual void                    SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)       override;
+  virtual UPawnMovementComponent* GetMovementComponent     ()                                      const override;
+  
+  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UFloatingPawnMovement*      MovementComponent = nullptr;
+  UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent = nullptr;
+};
diff --git a/Source/nDisplayExtensions/Private/DisplayClusterPawnBase.cpp b/Source/nDisplayExtensions/Private/DisplayClusterPawnBase.cpp
deleted file mode 100644
index 9411bc4ca3488a86177f330c661e20617ccb5b66..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Private/DisplayClusterPawnBase.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-#include "DisplayClusterPawnBase.h"
-
-#include "Engine/World.h"
-#include "Game/IDisplayClusterGameManager.h"
-#include "GameFramework/WorldSettings.h"
-#include "DisplayClusterSceneComponentSyncParent.h"
-#include "DisplayClusterSettings.h"
-#include "DisplayClusterGameMode.h"
-#include "IDisplayCluster.h"
-#include "Kismet/GameplayStatics.h"
-
-ADisplayClusterPawnBase::ADisplayClusterPawnBase(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
-{
-	MovementComponent                         = CreateDefaultSubobject<UFloatingPawnMovement>     (TEXT("MovementComponent0"));
-	MovementComponent->UpdatedComponent       = RootComponent;
-
-	RotatingComponent                         = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent0"));
-	RotatingComponent->UpdatedComponent       = RootComponent;
-	RotatingComponent->bRotationInLocalSpace  = true;
-	RotatingComponent->PivotTranslation       = FVector::ZeroVector;
-	RotatingComponent->RotationRate           = FRotator::ZeroRotator;
-
-	RotatingComponent2                        = CreateDefaultSubobject<URotatingMovementComponent>(TEXT("RotatingComponent1"));
-	RotatingComponent2->UpdatedComponent      = RootComponent;
-	RotatingComponent2->bRotationInLocalSpace = false;
-	RotatingComponent2->PivotTranslation      = FVector::ZeroVector;
-	RotatingComponent2->RotationRate          = FRotator::ZeroRotator;
-
-	BaseTurnRate   = 45.f;
-	BaseLookUpRate = 45.f;
-}
-
-void ADisplayClusterPawnBase::MoveForward (float Value)
-{
-  if (Value == 0.f) return;
-	AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetForwardVector(), Value);
-}
-void ADisplayClusterPawnBase::MoveRight   (float Value)
-{
-  if (Value == 0.f) return;
-  AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetRightVector  (), Value);
-}
-void ADisplayClusterPawnBase::MoveUp      (float Value)
-{
-  if (Value == 0.f) return;
-  AddMovementInput((TranslationDirection ? TranslationDirection : RootComponent)->GetUpVector     (), Value);
-}
-void ADisplayClusterPawnBase::TurnAtRate  (float Rate )
-{
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
-	{
-    if (!RotatingComponent->UpdatedComponent) return;
-		auto Manager = IDisplayCluster::Get().GetGameMgr();
-    if (!Manager) return;
-    auto Camera = Manager->GetActiveCamera();
-    if (!Camera ) return;
-
-		const FTransform TransformToRotate  = RotatingComponent->UpdatedComponent->GetComponentTransform();
-		const FVector    RotateAroundPivot  = TransformToRotate.InverseTransformPositionNoScale(Camera->GetComponentLocation());
-		RotatingComponent->PivotTranslation = RotateAroundPivot;
-		RotatingComponent->RotationRate     = FRotator(RotatingComponent->RotationRate.Pitch, Rate * BaseTurnRate, 0.f);
-	}
-  else if (Rate != 0.f)
-		AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
-}
-void ADisplayClusterPawnBase::TurnAtRate2 (float Rate )
-{
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
-	{
-    if (!RotatingComponent2->UpdatedComponent) return;
-    auto Manager = IDisplayCluster::Get().GetGameMgr();
-    if (!Manager) return;
-    auto Camera  = Manager->GetActiveCamera();
-    if (!Camera ) return;
-
-		const FTransform TransformToRotate   = RotatingComponent2->UpdatedComponent->GetComponentTransform();
-		const FVector    RotateAroundPivot   = TransformToRotate.InverseTransformPositionNoScale(Camera->GetComponentLocation());
-		RotatingComponent2->PivotTranslation = RotateAroundPivot;
-		RotatingComponent2->RotationRate     = FRotator(RotatingComponent2->RotationRate.Pitch, Rate * BaseTurnRate, 0.f);
-	}
-	else if (Rate != 0.f)
-		AddControllerYawInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
-}
-void ADisplayClusterPawnBase::LookUpAtRate(float Rate )
-{
-	if (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster)
-	{
-		//@note: usually CAVE-like systems don't use roll and pitch rotation since it can cause dizziness.
-#if 0
-		//@todo: rotate around active camera
-    auto Manager = IDisplayCluster::Get().GetGameMgr();
-    if (!Manager) return;
-    auto Camera = Manager->GetActiveCamera();
-    if (!Camera ) return;
-
-		RotatingComponent->bRotationInLocalSpace = true;
-		RotatingComponent->PivotTranslation      = FVector::ZeroVector;
-		
-#endif
-	}
-	else if (Rate != 0.f)
-	{
-		AddControllerPitchInput(BaseTurnRate * Rate * GetWorld()->GetDeltaSeconds() * CustomTimeDilation);
-	}
-}
-
-void                    ADisplayClusterPawnBase::BeginPlay           ()
-{
-	Super::BeginPlay();
-
-	if (!IDisplayCluster::Get().IsModuleInitialized() || !IDisplayCluster::Get().IsAvailable()) return;
-
-	auto IsCluster = (IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster);
-	bUseControllerRotationYaw   = !IsCluster;
-	bUseControllerRotationPitch = !IsCluster;
-	bUseControllerRotationRoll  = !IsCluster;
-
-  TArray<AActor*> SettingsActors;
-  UGameplayStatics::GetAllActorsOfClass(GetWorld(), ADisplayClusterSettings::StaticClass(), SettingsActors);
-  if (SettingsActors.Num() == 0) return;
-
-  ADisplayClusterSettings* Settings = Cast<ADisplayClusterSettings>(SettingsActors[0]);
-  MovementComponent->MaxSpeed     = Settings->MovementMaxSpeed;
-  MovementComponent->Acceleration = Settings->MovementAcceleration;
-  MovementComponent->Deceleration = Settings->MovementDeceleration;
-  MovementComponent->TurningBoost = Settings->MovementTurningBoost;
-  BaseTurnRate                    = Settings->RotationSpeed;
-  BaseLookUpRate                  = Settings->RotationSpeed;
-}
-void                    ADisplayClusterPawnBase::Tick                (float DeltaSeconds)
-{
-	Super::Tick(DeltaSeconds);
-	const float Mult = GetWorld()->GetWorldSettings()->WorldToMeters / 100.f;
-	SetActorScale3D(FVector(Mult, Mult, Mult));
-}
-void                    ADisplayClusterPawnBase::BeginDestroy()
-{
-  Super::BeginDestroy();
-}
-UPawnMovementComponent* ADisplayClusterPawnBase::GetMovementComponent() const
-{
-  return MovementComponent;
-}
-
-void ADisplayClusterPawnBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
-{
-	check(PlayerInputComponent);
-	Super::SetupPlayerInputComponent(PlayerInputComponent);
-	if (PlayerInputComponent)
-	{
-    PlayerInputComponent->BindAxis("MoveForward", this, &ADisplayClusterPawnBase::MoveForward );
-    PlayerInputComponent->BindAxis("MoveRight"  , this, &ADisplayClusterPawnBase::MoveRight   );
-    PlayerInputComponent->BindAxis("MoveUp"     , this, &ADisplayClusterPawnBase::MoveUp      );
-    PlayerInputComponent->BindAxis("TurnRate"   , this, &ADisplayClusterPawnBase::TurnAtRate2 );
-    PlayerInputComponent->BindAxis("LookUpRate" , this, &ADisplayClusterPawnBase::LookUpAtRate);
-	}
-}
diff --git a/Source/nDisplayExtensions/Private/DisplayClusterPawnCAVE.cpp b/Source/nDisplayExtensions/Private/DisplayClusterPawnCAVE.cpp
deleted file mode 100644
index 3a4cccd86a4a25cfbd572474457744cc8d09b406..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Private/DisplayClusterPawnCAVE.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#include "DisplayClusterPawnCAVE.h"
-
-#include "Cluster/IDisplayClusterClusterManager.h"
-#include "Game/IDisplayClusterGameManager.h"
-#include "Input/IDisplayClusterInputManager.h"
-#include "IDisplayCluster.h"
-
-void ADisplayClusterPawnCAVE::OnAxisEvent_Implementation   (FVector2D Value       )
-{
-  if (!IDisplayCluster::Get().GetClusterMgr()->IsMaster()) return;
-  AddMovementInput(Flystick->GetRightVector  (), Value[0]);
-  AddMovementInput(Flystick->GetForwardVector(), Value[1]);
-}
-void ADisplayClusterPawnCAVE::OnTriggerEvent_Implementation(bool      Pressed     ) 
-{
-
-}
-void ADisplayClusterPawnCAVE::OnButtonEvent_Implementation (bool      Pressed     , int32 Index) 
-{
-
-}
-
-void ADisplayClusterPawnCAVE::BeginPlay                    ()
-{
-  Super::BeginPlay();
-}
-void ADisplayClusterPawnCAVE::Tick                         (float     DeltaSeconds)
-{
-  // Due to these declarations, this class is bound to aixcave.cfg.
-  static const auto flystick_name = FString(TEXT("flystick"      ));
-  static const auto axis_name     = FString(TEXT("dtrack_axis"   ));
-  static const auto buttons_name  = FString(TEXT("dtrack_buttons"));
-
-	Super::Tick(DeltaSeconds);
-
-  if (!Flystick) Flystick = IDisplayCluster::Get().GetGameMgr()->GetNodeById(flystick_name);
-  if (!Flystick) return;
-
-  FVector2D Axes;
-  IDisplayCluster::Get().GetInputMgr()->GetAxis(axis_name, 0, Axes[0]);
-  IDisplayCluster::Get().GetInputMgr()->GetAxis(axis_name, 1, Axes[1]);
-  if (Axes[0] != 0.0f || Axes[1] != 0.0f) OnAxisEvent_Implementation(Axes);
-
-  bool TriggerPressed = false, TriggerReleased = false;
-  IDisplayCluster::Get().GetInputMgr()->WasButtonPressed (buttons_name, 0, TriggerPressed );
-  IDisplayCluster::Get().GetInputMgr()->WasButtonReleased(buttons_name, 0, TriggerReleased);
-  if (TriggerPressed ) OnTriggerEvent_Implementation(true );
-  if (TriggerReleased) OnTriggerEvent_Implementation(false);
-  
-  for (auto i = 1; i < 6; ++i)
-  {
-    bool ButtonPressed = false, ButtonReleased = false;
-    IDisplayCluster::Get().GetInputMgr()->WasButtonPressed (buttons_name, i, ButtonPressed );
-    IDisplayCluster::Get().GetInputMgr()->WasButtonReleased(buttons_name, i, ButtonReleased);
-    if (ButtonPressed ) OnButtonEvent_Implementation(true , i);
-    if (ButtonReleased) OnButtonEvent_Implementation(false, i);
-  }
-}
-void ADisplayClusterPawnCAVE::BeginDestroy                 ()
-{
-  Super::BeginDestroy();
-}
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Private/nDisplayExtensions.cpp b/Source/nDisplayExtensions/Private/nDisplayExtensions.cpp
deleted file mode 100644
index aa70c4ae1fbf68dbd65102a8437bb21bd3557df6..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Private/nDisplayExtensions.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "nDisplayExtensions.h"
-
-#define LOCTEXT_NAMESPACE "FnDisplayExtensionsModule"
-
-void FnDisplayExtensionsModule::StartupModule ()
-{
-
-}
-void FnDisplayExtensionsModule::ShutdownModule()
-{
-
-}
-
-#undef LOCTEXT_NAMESPACE
-
-IMPLEMENT_MODULE(FnDisplayExtensionsModule, nDisplayExtensions)
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Public/DisplayClusterPawnBase.h b/Source/nDisplayExtensions/Public/DisplayClusterPawnBase.h
deleted file mode 100644
index 68fc6820092d956e1a2699cee56d8225d2ecc305..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Public/DisplayClusterPawnBase.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#pragma once
-
-#include "Components/InputComponent.h"
-#include "GameFramework/FloatingPawnMovement.h"
-#include "GameFramework/PawnMovementComponent.h"
-#include "GameFramework/RotatingMovementComponent.h"
-#include "CoreMinimal.h"
-#include "DisplayClusterPawn.h"
-
-#include "DisplayClusterPawnBase.generated.h"
-
-UCLASS()
-class NDISPLAYEXTENSIONS_API ADisplayClusterPawnBase : public ADisplayClusterPawn
-{
-  GENERATED_UCLASS_BODY()
-
-public:
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveForward (float Value);
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveRight   (float Value);
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void MoveUp      (float Value);
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void TurnAtRate  (float Rate );
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void TurnAtRate2 (float Rate );
-  UFUNCTION(BlueprintCallable, Category = "Pawn") virtual void LookUpAtRate(float Rate );
-
-  virtual void                    BeginPlay           ()                         override;
-  virtual void                    Tick                (float DeltaSeconds)       override;
-  virtual void                    BeginDestroy        ()                         override;
-  virtual UPawnMovementComponent* GetMovementComponent()                   const override;
-
-  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseTurnRate  ;
-  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float BaseLookUpRate;
-
-protected:
-  virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
-
-  UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) UFloatingPawnMovement*      MovementComponent ;
-  UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent ;
-  UPROPERTY(Category = Pawn, VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) URotatingMovementComponent* RotatingComponent2;
-};
\ No newline at end of file
diff --git a/Source/nDisplayExtensions/Public/DisplayClusterPawnCAVE.h b/Source/nDisplayExtensions/Public/DisplayClusterPawnCAVE.h
deleted file mode 100644
index fbb47da0f1a8dd850370a4fc6e69aed106cdfdc1..0000000000000000000000000000000000000000
--- a/Source/nDisplayExtensions/Public/DisplayClusterPawnCAVE.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#pragma once
-
-#include "CoreMinimal.h"
-#include "DisplayClusterPawnBase.h"
-#include "DisplayClusterSceneComponent.h"
-
-#include "DisplayClusterPawnCAVE.generated.h"
-
-UCLASS()
-class NDISPLAYEXTENSIONS_API ADisplayClusterPawnCAVE : public ADisplayClusterPawnBase
-{
-  GENERATED_BODY()
-
-public:
-  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Input") void OnAxisEvent   (FVector2D Value  );
-  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Input") void OnButtonEvent (bool      Pressed, int32 Index);
-  UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Input") void OnTriggerEvent(bool      Pressed);
-  
-protected:
-  virtual void BeginPlay   ()                   override;
-  virtual void Tick        (float DeltaSeconds) override;
-  virtual void BeginDestroy()                   override;
-
-  UDisplayClusterSceneComponent* Flystick = nullptr;
-};
diff --git a/nDisplayExtensions.uplugin b/nDisplayExtensions.uplugin
index 31dbd3836665bce4091212b10f9e0d711e258bc8..b7529ae0b42fa4bfd40e543d3c9f90d879645a8f 100644
--- a/nDisplayExtensions.uplugin
+++ b/nDisplayExtensions.uplugin
@@ -13,9 +13,10 @@
   "CanContainContent": true,
   "IsBetaVersion": false,
   "Installed": false,
+  "EnabledByDefault": true,
   "Modules": [
     {
-      "Name": "nDisplayExtensions",
+      "Name": "DisplayClusterExtensions",
       "Type": "Developer",
       "LoadingPhase": "Default"
     }
@@ -24,6 +25,10 @@
     {
       "Name": "nDisplay",
       "Enabled": true
+    },
+    {
+      "Name": "nDisplayInput",
+      "Enabled": true
     }
   ]
 }
\ No newline at end of file