diff --git a/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp b/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp
index f5ff0c74e48c461c15daf77da5b69c9154dc6e83..c9c719b38331a72d7f8f1bcadd57b4f2dc95c924 100644
--- a/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp
+++ b/Source/DisplayClusterExtensions/Private/VirtualRealityPawn.cpp
@@ -1,6 +1,8 @@
 #include "VirtualRealityPawn.h"
 
+#include "Camera/CameraComponent.h"
 #include "Cluster/IDisplayClusterClusterManager.h"
+#include "Engine/Engine.h"
 #include "Engine/World.h"
 #include "Game/IDisplayClusterGameManager.h"
 #include "GameFramework/InputSettings.h"
@@ -8,11 +10,7 @@
 #include "Kismet/GameplayStatics.h"
 #include "DisplayClusterSettings.h"
 #include "IDisplayCluster.h"
-
-#include "IDisplayClusterConfigManager.h"
-#include "IXRTrackingSystem.h"
-#include "Engine/Engine.h"
-#include "Camera/CameraComponent.h"
+#include "VirtualRealityUtilities.h"
 
 AVirtualRealityPawn::AVirtualRealityPawn(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
 {
@@ -51,7 +49,7 @@ AVirtualRealityPawn::AVirtualRealityPawn(const FObjectInitializer& ObjectInitial
 void AVirtualRealityPawn::OnForward_Implementation(float Value)
 {
 	// Check if this function triggers correctly on ROLV.
-	if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || IsDesktopMode() || IsHeadMountedMode()))
+	if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || UVirtualRealityUtilities::IsDesktopMode() || UVirtualRealityUtilities::IsHeadMountedMode()))
 	{
 		AddMovementInput(RightHand->GetForwardVector(), Value);
 	}
@@ -59,7 +57,7 @@ void AVirtualRealityPawn::OnForward_Implementation(float Value)
 
 void AVirtualRealityPawn::OnRight_Implementation(float Value)
 {
-	if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || IsDesktopMode() || IsHeadMountedMode()))
+	if (RightHand && (NavigationMode == EVRNavigationModes::nav_mode_fly || UVirtualRealityUtilities::IsDesktopMode() || UVirtualRealityUtilities::IsHeadMountedMode()))
 	{
 		AddMovementInput(RightHand->GetRightVector(), Value);
 	}
@@ -85,7 +83,7 @@ void AVirtualRealityPawn::OnTurnRate_Implementation(float Rate)
 
 void AVirtualRealityPawn::OnLookUpRate_Implementation(float Rate)
 {
-	if (IsRoomMountedMode())
+	if (UVirtualRealityUtilities::IsRoomMountedMode())
 	{
 		// User-centered projection causes simulation sickness on look up interaction hence not implemented.
 	}
@@ -103,31 +101,6 @@ void AVirtualRealityPawn::OnAction_Implementation(bool Pressed, int32 Index)
 {
 }
 
-bool AVirtualRealityPawn::IsDesktopMode()
-{
-	return !IsRoomMountedMode() && !IsHeadMountedMode();
-}
-
-bool AVirtualRealityPawn::IsRoomMountedMode()
-{
-	return IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster;
-}
-
-bool AVirtualRealityPawn::IsHeadMountedMode()
-{
-	return GEngine->XRSystem.IsValid() && GEngine->XRSystem->IsHeadTrackingAllowed();
-}
-
-FString AVirtualRealityPawn::GetNodeName()
-{
-	return IsRoomMountedMode() ? IDisplayCluster::Get().GetClusterMgr()->GetNodeId() : FString(TEXT("Localhost"));
-}
-
-float AVirtualRealityPawn::GetEyeDistance()
-{
-	return IDisplayCluster::Get().GetConfigMgr()->GetConfigStereo().EyeDist;
-}
-
 float AVirtualRealityPawn::GetBaseTurnRate() const
 {
 	return BaseTurnRate;
@@ -203,19 +176,14 @@ USceneComponent* AVirtualRealityPawn::GetShutterGlassesComponent()
 	return ShutterGlasses;
 }
 
-UDisplayClusterSceneComponent* AVirtualRealityPawn::GetClusterComponent(const FString& Name)
-{
-	return IDisplayCluster::Get().GetGameMgr()->GetNodeById(Name);
-}
-
 void AVirtualRealityPawn::ClusterExecute(const FString& Command)
 {
-	FDisplayClusterClusterEvent event;
-	event.Name = "NDisplayCMD: " + Command;
-	event.Type = "NDisplayCMD";
-	event.Category = "VRPawn";
-	event.Parameters.Add("Command", Command);
-	IDisplayCluster::Get().GetClusterMgr()->EmitClusterEvent(event, false);
+  FDisplayClusterClusterEvent event;
+  event.Name = "NDisplayCMD: " + Command;
+  event.Type = "NDisplayCMD";
+  event.Category = "VRPawn";
+  event.Parameters.Add("Command", Command);
+  IDisplayCluster::Get().GetClusterMgr()->EmitClusterEvent(event, false);
 }
 
 void AVirtualRealityPawn::HandleClusterEvent(const FDisplayClusterClusterEvent& Event)
@@ -243,14 +211,14 @@ void AVirtualRealityPawn::BeginPlay()
 		BaseTurnRate = Settings->RotationSpeed;
 	}
 
-	if (IsRoomMountedMode())
+	if (UVirtualRealityUtilities::IsRoomMountedMode())
 	{
 		UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("TurnRate", EKeys::MouseX));
 		UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("LookUpRate", EKeys::MouseY));
 
 		InitRoomMountedComponentReferences();
 	}
-	else if (IsHeadMountedMode())
+	else if (UVirtualRealityUtilities::IsHeadMountedMode())
 	{
 		UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("TurnRate", EKeys::MouseX));
 		UInputSettings::GetInputSettings()->RemoveAxisMapping(FInputAxisKeyMapping("LookUpRate", EKeys::MouseY));
@@ -334,20 +302,20 @@ UPawnMovementComponent* AVirtualRealityPawn::GetMovementComponent() const
 
 void AVirtualRealityPawn::InitRoomMountedComponentReferences()
 {
-	if (!IsRoomMountedMode()) return;
+	if (!UVirtualRealityUtilities::IsRoomMountedMode()) return;
 
 	//check whether the nodes already exist (otherwise GetClusterComponent() returns nullptr and prints a warning) and assign them
-	if (!TrackingOrigin) TrackingOrigin = GetClusterComponent("cave_origin");
-	if (!TrackingOrigin) TrackingOrigin = GetClusterComponent("rolv_origin");
-	if (!CaveCenter) CaveCenter = GetClusterComponent("cave_center");
+	if (!TrackingOrigin) TrackingOrigin = UVirtualRealityUtilities::GetClusterComponent("cave_origin");
+	if (!TrackingOrigin) TrackingOrigin = UVirtualRealityUtilities::GetClusterComponent("rolv_origin");
+	if (!CaveCenter) CaveCenter = UVirtualRealityUtilities::GetClusterComponent("cave_center");
 	if (!ShutterGlasses)
 	{
-		ShutterGlasses = GetClusterComponent("shutter_glasses");
+		ShutterGlasses = UVirtualRealityUtilities::GetClusterComponent("shutter_glasses");
 		Head->AttachToComponent(ShutterGlasses, FAttachmentTransformRules::KeepRelativeTransform);
 	}
 	if (!Flystick)
 	{
-		Flystick = GetClusterComponent("flystick");
+		Flystick = UVirtualRealityUtilities::GetClusterComponent("flystick");
 		if (AttachRightHandInCAVE == EAttachementType::AT_FLYSTICK)
 			RightHand->AttachToComponent(Flystick, FAttachmentTransformRules::KeepRelativeTransform);
 		if (AttachLeftHandInCAVE == EAttachementType::AT_FLYSTICK)
@@ -355,46 +323,14 @@ void AVirtualRealityPawn::InitRoomMountedComponentReferences()
 	}
 	if (!LeftHandTarget)
 	{
-		LeftHandTarget = GetClusterComponent("left_hand_target");
+		LeftHandTarget = UVirtualRealityUtilities::GetClusterComponent("left_hand_target");
 		if (AttachLeftHandInCAVE == EAttachementType::AT_HANDTARGET)
 			LeftHand->AttachToComponent(LeftHandTarget, FAttachmentTransformRules::KeepRelativeTransform);
 	}
 	if (!RightHandTarget)
 	{
-		RightHandTarget = GetClusterComponent("right_hand_target");
+		RightHandTarget = UVirtualRealityUtilities::GetClusterComponent("right_hand_target");
 		if (AttachRightHandInCAVE == EAttachementType::AT_HANDTARGET)
 			RightHand->AttachToComponent(RightHandTarget, FAttachmentTransformRules::KeepRelativeTransform);
 	}
 }
-
-
-EEyeType AVirtualRealityPawn::GetNodeEyeType()
-{
-	FDisplayClusterConfigClusterNode CurrentNodeConfig;
-	IDisplayCluster::Get().GetConfigMgr()->GetClusterNode(GetNodeName(), CurrentNodeConfig);
-
-	FString s = CurrentNodeConfig.ToString();
-
-	if (s.Contains("mono_eye"))
-	{
-		TArray<FString> stringArray;
-		int32 count = s.ParseIntoArray(stringArray, TEXT(","));
-		for (int x = 0; x < count; x++)
-		{
-			if (!stringArray[x].Contains("mono_eye")) continue;
-			if (stringArray[x].Contains("left"))
-			{
-				return EEyeType::ET_STEREO_LEFT;
-			}
-			if (stringArray[x].Contains("right"))
-			{
-				return EEyeType::ET_STEREO_RIGHT;
-			}
-		}
-	}
-	else
-	{
-		return EEyeType::ET_MONO;
-	}
-	return EEyeType::ET_MONO;
-}
\ No newline at end of file
diff --git a/Source/DisplayClusterExtensions/Private/VirtualRealityUtilities.cpp b/Source/DisplayClusterExtensions/Private/VirtualRealityUtilities.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..30a85dd360f560bdc7772418b0e3a653b2a2dfb8
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Private/VirtualRealityUtilities.cpp
@@ -0,0 +1,66 @@
+#include "VirtualRealityUtilities.h"
+
+#include "Cluster/IDisplayClusterClusterManager.h"
+#include "Engine/Engine.h"
+#include "Game/IDisplayClusterGameManager.h"
+#include "IDisplayCluster.h"
+#include "IDisplayClusterConfigManager.h"
+#include "IXRTrackingSystem.h"
+
+bool UVirtualRealityUtilities::IsDesktopMode()
+{
+	return !IsRoomMountedMode() && !IsHeadMountedMode();
+}
+bool UVirtualRealityUtilities::IsRoomMountedMode()
+{
+	return IDisplayCluster::Get().GetOperationMode() == EDisplayClusterOperationMode::Cluster;
+}
+bool UVirtualRealityUtilities::IsHeadMountedMode()
+{
+	return GEngine->XRSystem.IsValid() && GEngine->XRSystem->IsHeadTrackingAllowed();
+}
+
+FString UVirtualRealityUtilities::GetNodeName()
+{
+	return IsRoomMountedMode() ? IDisplayCluster::Get().GetClusterMgr()->GetNodeId() : FString(TEXT("Localhost"));
+}
+float UVirtualRealityUtilities::GetEyeDistance()
+{
+	return IDisplayCluster::Get().GetConfigMgr()->GetConfigStereo().EyeDist;
+}
+
+EEyeType UVirtualRealityUtilities::GetNodeEyeType()
+{
+	FDisplayClusterConfigClusterNode CurrentNodeConfig;
+	IDisplayCluster::Get().GetConfigMgr()->GetClusterNode(GetNodeName(), CurrentNodeConfig);
+
+	FString s = CurrentNodeConfig.ToString();
+
+	if (s.Contains("mono_eye"))
+	{
+		TArray<FString> stringArray;
+		int32 count = s.ParseIntoArray(stringArray, TEXT(","));
+		for (int x = 0; x < count; x++)
+		{
+			if (!stringArray[x].Contains("mono_eye")) continue;
+			if (stringArray[x].Contains("left"))
+			{
+				return EEyeType::ET_STEREO_LEFT;
+			}
+			if (stringArray[x].Contains("right"))
+			{
+				return EEyeType::ET_STEREO_RIGHT;
+			}
+		}
+	}
+	else
+	{
+		return EEyeType::ET_MONO;
+	}
+	return EEyeType::ET_MONO;
+}
+
+UDisplayClusterSceneComponent* UVirtualRealityUtilities::GetClusterComponent(const FString& Name)
+{
+	return IDisplayCluster::Get().GetGameMgr()->GetNodeById(Name);
+}
diff --git a/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h b/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h
index dc2da91a950fcb9db4ffa20efb1d6fcc9b865e08..d5b3b4c8db035bbd1e0095f25d570de5940d0620 100644
--- a/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h
+++ b/Source/DisplayClusterExtensions/Public/VirtualRealityPawn.h
@@ -1,13 +1,13 @@
 #pragma once
 
-#include "GameFramework/FloatingPawnMovement.h"
-#include "GameFramework/PawnMovementComponent.h"
-#include "GameFramework/RotatingMovementComponent.h"
 #include "CoreMinimal.h"
+#include "Cluster/DisplayClusterClusterEvent.h"
+#include "Cluster/IDisplayClusterClusterManager.h"
 #include "DisplayClusterPawn.h"
 #include "DisplayClusterSceneComponent.h"
-#include "Cluster/IDisplayClusterClusterManager.h"
-#include "Cluster/DisplayClusterClusterEvent.h"
+#include "GameFramework/FloatingPawnMovement.h"
+#include "GameFramework/PawnMovementComponent.h"
+#include "GameFramework/RotatingMovementComponent.h"
 #include "MotionControllerComponent.h"
 #include "VirtualRealityPawn.generated.h"
 
@@ -18,14 +18,6 @@ enum class EVRNavigationModes : uint8
 	nav_mode_fly UMETA(DisplayName = "Navigation Mode Fly")
 };
 
-UENUM(BlueprintType)
-enum class EEyeType : uint8
-{
-	ET_MONO UMETA(DisplayName = "mono"),
-	ET_STEREO_RIGHT UMETA(DisplayName = "stero_right"),
-	ET_STEREO_LEFT UMETA(DisplayName = "stereo_left")
-};
-
 UENUM(BlueprintType)
 enum class EAttachementType : uint8
 {
@@ -47,16 +39,6 @@ public:
 	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, BlueprintCallable, Category = "Pawn") void OnFire(bool Pressed);
 	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Pawn") void OnAction(bool Pressed, int32 Index);
 
-	UFUNCTION(BlueprintPure, Category = "Pawn") static bool IsDesktopMode();
-	UFUNCTION(BlueprintPure, Category = "Pawn") static bool IsRoomMountedMode();
-	UFUNCTION(BlueprintPure, Category = "Pawn") static bool IsHeadMountedMode();
-
-
-	UFUNCTION(BlueprintPure, Category = "Pawn") static FString GetNodeName();
-	UFUNCTION(BlueprintPure, Category = "Pawn") static float GetEyeDistance();
-
-	UFUNCTION(BlueprintPure, Category = "Pawn") static EEyeType GetNodeEyeType();
-
 	UFUNCTION(Category = "Pawn") float GetBaseTurnRate() const;
 	UFUNCTION(Category = "Pawn") void SetBaseTurnRate(float Value);
 	UFUNCTION(Category = "Pawn") UFloatingPawnMovement* GetFloatingPawnMovement();
@@ -79,14 +61,10 @@ private:
 	UFUNCTION(Category = "Pawn") USceneComponent* GetShutterGlassesComponent();
 
 public:
-
-	//Get Compenent of Display Cluster by it's name, which is specified in the nDisplay config
-	UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Pawn") static UDisplayClusterSceneComponent* GetClusterComponent(const FString& Name);
-
 	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") EVRNavigationModes NavigationMode = EVRNavigationModes::nav_mode_fly;
 
-	//Execute specified console command on all nDisplayCluster Nodes
-	UFUNCTION(Exec, BlueprintCallable, Category = "DisplayCluster") static void ClusterExecute(const FString& Command);
+  //Execute specified console command on all nDisplayCluster Nodes
+  UFUNCTION(Exec, BlueprintCallable, Category = "DisplayCluster") static void ClusterExecute(const FString& Command);
 
 private:
 	FOnClusterEventListener ClusterEventListenerDelegate;
@@ -132,7 +110,6 @@ protected:
 	// Holding the Shutter Glasses Component that is attached to this Pawn
 	UPROPERTY() USceneComponent* ShutterGlasses = nullptr;
 
-
 	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") bool ShowHMDControllers = true;
 	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") EAttachementType AttachRightHandInCAVE = EAttachementType::AT_FLYSTICK;
 	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") EAttachementType AttachLeftHandInCAVE = EAttachementType::AT_NONE;
diff --git a/Source/DisplayClusterExtensions/Public/VirtualRealityUtilities.h b/Source/DisplayClusterExtensions/Public/VirtualRealityUtilities.h
new file mode 100644
index 0000000000000000000000000000000000000000..1aef9acc66c039c996c28bb32a1ee830108f2730
--- /dev/null
+++ b/Source/DisplayClusterExtensions/Public/VirtualRealityUtilities.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "DisplayClusterSceneComponent.h"
+#include "Kismet/BlueprintFunctionLibrary.h"
+#include "VirtualRealityUtilities.generated.h"
+
+UENUM(BlueprintType)
+enum class EEyeType : uint8
+{
+	ET_MONO UMETA(DisplayName = "mono"),
+	ET_STEREO_RIGHT UMETA(DisplayName = "stero_right"),
+	ET_STEREO_LEFT UMETA(DisplayName = "stereo_left")
+};
+
+UCLASS()
+class DISPLAYCLUSTEREXTENSIONS_API UVirtualRealityUtilities : public UBlueprintFunctionLibrary
+{
+	GENERATED_BODY()
+
+public:
+	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsDesktopMode();
+	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsRoomMountedMode();
+	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static bool IsHeadMountedMode();
+
+	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static FString GetNodeName();
+	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static float GetEyeDistance();
+
+	UFUNCTION(BlueprintPure, Category = "DisplayCluster") static EEyeType GetNodeEyeType();
+
+	//Get Compenent of Display Cluster by it's name, which is specified in the nDisplay config
+	UFUNCTION(BlueprintPure, BlueprintCallable, Category = "DisplayCluster") static UDisplayClusterSceneComponent* GetClusterComponent(const FString& Name);
+};