diff --git a/Config/Android_LenovoA3.ini b/Config/Android_LenovoA3.ini
new file mode 100644
index 0000000000000000000000000000000000000000..5a89df14efa92527a2a2874edcd6b6452b0a3982
--- /dev/null
+++ b/Config/Android_LenovoA3.ini
@@ -0,0 +1,112 @@
+[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
+PackageName=com.cyberarch.samples.ue
+StoreVersion=1
+StoreVersionOffsetArm64=0
+StoreVersionOffsetX8664=0
+ApplicationDisplayName=CyberArchWarehouse
+VersionDisplayName=0.12.1
+MinSDKVersion=29
+TargetSDKVersion=29
+InstallLocation=InternalOnly
+bEnableLint=False
+bPackageDataInsideApk=True
+bCreateAllPlatformsInstall=False
+bDisableVerifyOBBOnStartUp=True
+bForceSmallOBBFiles=False
+bAllowLargeOBBFiles=False
+bAllowPatchOBBFile=False
+bAllowOverflowOBBFiles=False
+bUseExternalFilesDir=False
+bPublicLogFiles=True
+Orientation=Landscape
+MaxAspectRatio=10.000000
+bUseDisplayCutout=False
+bRestoreNotificationsOnReboot=False
+bFullScreen=True
+bEnableNewKeyboard=True
+DepthBufferPreference=Default
+bValidateTextureFormats=True
+bForceCompressNativeLibs=False
+bEnableAdvancedBinaryCompression=False
+bEnableBundle=False
+bEnableUniversalAPK=True
+bBundleABISplit=True
+bBundleLanguageSplit=True
+bBundleDensitySplit=True
+ExtraManifestNodeTags=
+ExtraManifestNodeTags=xmlns:tools="http://schemas.android.com/tools"
+ExtraApplicationNodeTags=
+ExtraApplicationSettings=<activity android:name="com.qualcomm.snapdragon.spaces.unrealcustomlauncher.SpacesLauncher" tools:node="merge">\n<intent-filter>\n<category android:name="android.intent.category.LAUNCHER" />\n</intent-filter>\n</activity>
+ExtraActivitySettings=
+ExtraPermissions=android.permission.READ_EXTERNAL_STORAGE
+ExtraPermissions=android.permission.WRITE_EXTERNAL_STORAGE
+ExtraPermissions=android.permission.SET_DEBUG_APP
+bAndroidVoiceEnabled=False
+bRemoveOSIG=False
+KeyStore=
+KeyAlias=
+KeyStorePassword=
+KeyPassword=
+bBuildForArm64=True
+bBuildForX8664=False
+bBuildForES31=False
+bSupportsVulkan=True
+bSupportsVulkanSM5=False
+DebugVulkanLayerDirectory=(Path="")
+bAndroidOpenGLSupportsBackbufferSampling=False
+bDetectVulkanByDefault=True
+bBuildWithHiddenSymbolVisibility=False
+bDisableStackProtector=False
+bDisableLibCppSharedDependencyValidation=False
+bSaveSymbols=False
+bStripShaderReflection=True
+bEnableGooglePlaySupport=False
+bUseGetAccounts=False
+GamesAppID=
+bEnableSnapshots=False
+bSupportAdMob=True
+AdMobAdUnitID=
+GooglePlayLicenseKey=
+GCMClientSenderID=
+bShowLaunchImage=False
+bAllowIMU=False
+bAllowControllers=True
+bBlockAndroidKeysOnControllers=False
+bControllersBlockDeviceFeedback=False
+AndroidAudio=Default
+AudioSampleRate=44100
+AudioCallbackBufferFrameSize=1024
+AudioNumBuffersToEnqueue=4
+AudioMaxChannels=0
+AudioNumSourceWorkers=0
+SpatializationPlugin=
+SourceDataOverridePlugin=
+ReverbPlugin=
+OcclusionPlugin=
+CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
+CacheSizeKB=0
+MaxChunkSizeOverrideKB=0
+bResampleForDevice=False
+SoundCueCookQualityIndex=-1
+MaxSampleRate=0.000000
+HighSampleRate=0.000000
+MedSampleRate=0.000000
+LowSampleRate=0.000000
+MinSampleRate=0.000000
+CompressionQualityModifier=0.000000
+AutoStreamingThreshold=0.000000
+AndroidGraphicsDebugger=None
+MaliGraphicsDebuggerPath=(Path="")
+bEnableMaliPerfCounters=False
+bMultiTargetFormat_ETC2=True
+bMultiTargetFormat_DXT=True
+bMultiTargetFormat_ASTC=True
+TextureFormatPriority_ETC2=0.200000
+TextureFormatPriority_DXT=0.600000
+TextureFormatPriority_ASTC=0.900000
+SDKAPILevelOverride=
+NDKAPILevelOverride=
+BuildToolsOverride=
+bStreamLandscapeMeshLODs=False
+bEnableDomStorage=False
+
diff --git a/Config/Android_Quest.ini b/Config/Android_Quest.ini
new file mode 100644
index 0000000000000000000000000000000000000000..39bb4eac880468af3c0352eb02443031e95cd4aa
--- /dev/null
+++ b/Config/Android_Quest.ini
@@ -0,0 +1,108 @@
+[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
+PackageName=com.FalconViz.ArHBIM
+StoreVersion=1
+StoreVersionOffsetArm64=0
+StoreVersionOffsetX8664=0
+ApplicationDisplayName=
+VersionDisplayName=1.0
+MinSDKVersion=29
+TargetSDKVersion=29
+InstallLocation=InternalOnly
+bEnableLint=False
+bPackageDataInsideApk=True
+bCreateAllPlatformsInstall=False
+bDisableVerifyOBBOnStartUp=False
+bForceSmallOBBFiles=False
+bAllowLargeOBBFiles=False
+bAllowPatchOBBFile=False
+bAllowOverflowOBBFiles=False
+bUseExternalFilesDir=False
+bPublicLogFiles=True
+Orientation=SensorLandscape
+MaxAspectRatio=2.100000
+bUseDisplayCutout=False
+bRestoreNotificationsOnReboot=False
+bFullScreen=True
+bEnableNewKeyboard=True
+DepthBufferPreference=Default
+bValidateTextureFormats=True
+bForceCompressNativeLibs=False
+bEnableAdvancedBinaryCompression=False
+bEnableBundle=False
+bEnableUniversalAPK=True
+bBundleABISplit=True
+bBundleLanguageSplit=True
+bBundleDensitySplit=True
+ExtraApplicationSettings=
+ExtraActivitySettings=
+bAndroidVoiceEnabled=False
+PackageForOculusMobile=Quest2
+PackageForOculusMobile=Quest
+bRemoveOSIG=False
+KeyStore=
+KeyAlias=
+KeyStorePassword=
+KeyPassword=
+bBuildForArm64=True
+bBuildForX8664=False
+bBuildForES31=True
+bSupportsVulkan=True
+bSupportsVulkanSM5=False
+DebugVulkanLayerDirectory=(Path="")
+bAndroidOpenGLSupportsBackbufferSampling=False
+bDetectVulkanByDefault=True
+bBuildWithHiddenSymbolVisibility=False
+bDisableStackProtector=False
+bDisableLibCppSharedDependencyValidation=False
+bSaveSymbols=False
+bStripShaderReflection=True
+bEnableGooglePlaySupport=False
+bUseGetAccounts=False
+GamesAppID=
+bEnableSnapshots=False
+bSupportAdMob=True
+AdMobAdUnitID=
+GooglePlayLicenseKey=
+GCMClientSenderID=
+bShowLaunchImage=True
+bAllowIMU=False
+bAllowControllers=True
+bBlockAndroidKeysOnControllers=False
+bControllersBlockDeviceFeedback=False
+AndroidAudio=Default
+AudioSampleRate=44100
+AudioCallbackBufferFrameSize=1024
+AudioNumBuffersToEnqueue=4
+AudioMaxChannels=0
+AudioNumSourceWorkers=0
+SpatializationPlugin=
+SourceDataOverridePlugin=
+ReverbPlugin=
+OcclusionPlugin=
+CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
+CacheSizeKB=65536
+MaxChunkSizeOverrideKB=0
+bResampleForDevice=False
+SoundCueCookQualityIndex=-1
+MaxSampleRate=48000.000000
+HighSampleRate=32000.000000
+MedSampleRate=24000.000000
+LowSampleRate=12000.000000
+MinSampleRate=8000.000000
+CompressionQualityModifier=1.000000
+AutoStreamingThreshold=0.000000
+AndroidGraphicsDebugger=None
+MaliGraphicsDebuggerPath=(Path="")
+bEnableMaliPerfCounters=False
+bMultiTargetFormat_ETC2=True
+bMultiTargetFormat_DXT=True
+bMultiTargetFormat_ASTC=True
+TextureFormatPriority_ETC2=0.200000
+TextureFormatPriority_DXT=0.600000
+TextureFormatPriority_ASTC=0.900000
+SDKAPILevelOverride=
+NDKAPILevelOverride=
+BuildToolsOverride=
+bStreamLandscapeMeshLODs=False
+bEnableDomStorage=False
+
diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini
index 11e3847239c2d46ce7f3f9cfba7850e72e340beb..d8b600a50f4ce4acd9e04d075d4af5288dbc6fd1 100644
--- a/Config/DefaultEngine.ini
+++ b/Config/DefaultEngine.ini
@@ -1,5 +1,5 @@
 [/Script/EngineSettings.GameMapsSettings]
-GameDefaultMap=/CyberArchWarehouse/SpatialAnchorsSample/Maps/SA_Showcase.SA_Showcase
+GameDefaultMap=/CyberArchWarehouse/xrPerson/Maps/EmptyStart.EmptyStart
 EditorStartupMap=/CyberArchWarehouse/xrPerson/Maps/EmptyStart.EmptyStart
 GlobalDefaultGameMode=/CyberArchWarehouse/xrPerson/Blueprints/BP_FirstPersonGameMode.BP_FirstPersonGameMode_C
 
@@ -175,6 +175,8 @@ CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
 [/Script/Engine.Engine]
 +ActiveGameNameRedirects=(OldGameName="TP_BlankBP",NewGameName="/Script/CyberProject")
 +ActiveGameNameRedirects=(OldGameName="/Script/TP_BlankBP",NewGameName="/Script/CyberProject")
+NearClipPlane=0.100000
+LocalPlayerClassName=/Script/OffAxisProjection.OffAxisLocalPlayer
 
 [/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
 bEnablePlugin=True
@@ -198,29 +200,27 @@ bAnchorSupportEnabled=True
 bSupportExperimentalFeatures=True
 
 [/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
-PackageName=com.FalconViz.ArHBIM
+PackageName=com.cyberarch.samples.ue
 StoreVersion=1
-StoreVersionOffsetArmV7=0
 StoreVersionOffsetArm64=0
 StoreVersionOffsetX8664=0
-ApplicationDisplayName=
-VersionDisplayName=1.0
+ApplicationDisplayName=CyberArchWarehouse
+VersionDisplayName=0.12.1
 MinSDKVersion=29
 TargetSDKVersion=29
 InstallLocation=InternalOnly
-bEnableGradle=True
 bEnableLint=False
 bPackageDataInsideApk=True
 bCreateAllPlatformsInstall=False
-bDisableVerifyOBBOnStartUp=False
+bDisableVerifyOBBOnStartUp=True
 bForceSmallOBBFiles=False
 bAllowLargeOBBFiles=False
 bAllowPatchOBBFile=False
 bAllowOverflowOBBFiles=False
 bUseExternalFilesDir=False
 bPublicLogFiles=True
-Orientation=SensorLandscape
-MaxAspectRatio=2.100000
+Orientation=Landscape
+MaxAspectRatio=10.000000
 bUseDisplayCutout=False
 bRestoreNotificationsOnReboot=False
 bFullScreen=True
@@ -234,8 +234,14 @@ bEnableUniversalAPK=True
 bBundleABISplit=True
 bBundleLanguageSplit=True
 bBundleDensitySplit=True
-ExtraApplicationSettings=
++ExtraManifestNodeTags=
++ExtraManifestNodeTags=xmlns:tools="http://schemas.android.com/tools"
++ExtraApplicationNodeTags=
+ExtraApplicationSettings=<activity android:name="com.qualcomm.snapdragon.spaces.unrealcustomlauncher.SpacesLauncher" tools:node="merge">\n<intent-filter>\n<category android:name="android.intent.category.LAUNCHER" />\n</intent-filter>\n</activity>
 ExtraActivitySettings=
++ExtraPermissions=android.permission.READ_EXTERNAL_STORAGE
++ExtraPermissions=android.permission.WRITE_EXTERNAL_STORAGE
++ExtraPermissions=android.permission.SET_DEBUG_APP
 bAndroidVoiceEnabled=False
 +PackageForOculusMobile=Quest2
 +PackageForOculusMobile=Quest
@@ -246,15 +252,17 @@ KeyStorePassword=
 KeyPassword=
 bBuildForArm64=True
 bBuildForX8664=False
-bBuildForES31=True
+bBuildForES31=False
 bSupportsVulkan=True
 bSupportsVulkanSM5=False
 DebugVulkanLayerDirectory=(Path="")
 bAndroidOpenGLSupportsBackbufferSampling=False
 bDetectVulkanByDefault=True
 bBuildWithHiddenSymbolVisibility=False
+bDisableStackProtector=False
+bDisableLibCppSharedDependencyValidation=False
 bSaveSymbols=False
-bForceLDLinker=False
+bStripShaderReflection=True
 bEnableGooglePlaySupport=False
 bUseGetAccounts=False
 GamesAppID=
@@ -263,7 +271,7 @@ bSupportAdMob=True
 AdMobAdUnitID=
 GooglePlayLicenseKey=
 GCMClientSenderID=
-bShowLaunchImage=True
+bShowLaunchImage=False
 bAllowIMU=False
 bAllowControllers=True
 bBlockAndroidKeysOnControllers=False
@@ -275,19 +283,20 @@ AudioNumBuffersToEnqueue=4
 AudioMaxChannels=0
 AudioNumSourceWorkers=0
 SpatializationPlugin=
+SourceDataOverridePlugin=
 ReverbPlugin=
 OcclusionPlugin=
 CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
-CacheSizeKB=65536
+CacheSizeKB=0
 MaxChunkSizeOverrideKB=0
 bResampleForDevice=False
 SoundCueCookQualityIndex=-1
-MaxSampleRate=48000.000000
-HighSampleRate=32000.000000
-MedSampleRate=24000.000000
-LowSampleRate=12000.000000
-MinSampleRate=8000.000000
-CompressionQualityModifier=1.000000
+MaxSampleRate=0.000000
+HighSampleRate=0.000000
+MedSampleRate=0.000000
+LowSampleRate=0.000000
+MinSampleRate=0.000000
+CompressionQualityModifier=0.000000
 AutoStreamingThreshold=0.000000
 AndroidGraphicsDebugger=None
 MaliGraphicsDebuggerPath=(Path="")
diff --git a/CyberProject.uproject b/CyberProject.uproject
index 9c6fa35e9425aba8016029615693f7a6bae0f198..4eb1d59668e96ea0d63ac95ff04668101d4f5130 100644
--- a/CyberProject.uproject
+++ b/CyberProject.uproject
@@ -153,6 +153,10 @@
 				"Mac",
 				"Linux"
 			]
+		},
+		{
+			"Name": "freetrack",
+			"Enabled": true
 		}
 	]
 }
\ No newline at end of file
diff --git a/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/BP_VRPawn.uasset b/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/BP_VRPawn.uasset
index cb11008a6ff0007eeeee5df307b1770c6b9ae31b..db8ca33965acd5d4f46ba26bf47f5289203f3981 100644
--- a/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/BP_VRPawn.uasset
+++ b/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/BP_VRPawn.uasset
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f9d9215ec34ca2a0c19a81a045a53efb8903fcb1bc422797f7d02de211cc2c47
-size 1018565
+oid sha256:5af711184298a3a3db083426073c6bc61f94f2f5da79bd320995273c418a0372
+size 1007405
diff --git a/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/SplineNavigator.uasset b/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/SplineNavigator.uasset
index 0def16b46982a307d091e8a469b991ba2f85a72c..edd4403f305e80ae6baa4f598c05695f8ce24361 100644
--- a/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/SplineNavigator.uasset
+++ b/Plugins/CyberArchWarehouse/Content/xrPerson/Blueprints/SplineNavigator.uasset
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:c11f348418d0cbd4d29477b24a000bb02dd4e6920ada9f6124b1fa20b9805d04
-size 397587
+oid sha256:c3163fe61dafe64876fe20a2a11d742b8ceda1809f9a4c4daa6fdb69514ca34b
+size 385369
diff --git a/Plugins/CyberArchWarehouse/Content/xrPerson/Hands/HandSprayActor.uasset b/Plugins/CyberArchWarehouse/Content/xrPerson/Hands/HandSprayActor.uasset
index 290f1ecc93ff3a1455c56bcc7de1f55ea1225f8d..3d47d6afd4d8e86ce3d7f05ec8acb806a025f225 100644
--- a/Plugins/CyberArchWarehouse/Content/xrPerson/Hands/HandSprayActor.uasset
+++ b/Plugins/CyberArchWarehouse/Content/xrPerson/Hands/HandSprayActor.uasset
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:9859e5ced1e376c66aa60321cb8c2ad24b08f9042a301cbba6d38451af92c2f0
-size 24091
+oid sha256:5c05247e4d897eef43d936829c7630703a0e119b23224044a249d0c99cf823e2
+size 22219
diff --git a/Plugins/CyberArchWarehouse/CyberArchWarehouse.uplugin b/Plugins/CyberArchWarehouse/CyberArchWarehouse.uplugin
index 30c5925dcf22e5fc1f361afa41302378c55f6452..0d8fa17cde04f28793ff31958f8baf4c2e812e84 100644
--- a/Plugins/CyberArchWarehouse/CyberArchWarehouse.uplugin
+++ b/Plugins/CyberArchWarehouse/CyberArchWarehouse.uplugin
@@ -21,7 +21,10 @@
 	"Plugins": [
 		{
 			"Name": "USDImporter",
-			"Enabled": true
+			"Enabled": true,
+			"PlatformAllowList": [
+				"Win64"
+			]
 		}
 	]
 }
\ No newline at end of file
diff --git a/Plugins/CyberArchWarehouse/Source/CyberArchWarehouse/CyberArchWarehouse.Build.cs b/Plugins/CyberArchWarehouse/Source/CyberArchWarehouse/CyberArchWarehouse.Build.cs
index 0ba98c91ed757f247725dc2ed78b6d3646642fb6..bb9b93303add1b45336d9880961abb752700d829 100644
--- a/Plugins/CyberArchWarehouse/Source/CyberArchWarehouse/CyberArchWarehouse.Build.cs
+++ b/Plugins/CyberArchWarehouse/Source/CyberArchWarehouse/CyberArchWarehouse.Build.cs
@@ -22,15 +22,6 @@ public class CyberArchWarehouse : ModuleRules
                 "UMG",
                 "Slate",
                 "SlateCore",
-                "USDStage",
-                "UnrealUSDWrapper",
-                "USDUtilities",
-                "USDClasses",
-                "USDStageEditor",
-                "USDStageImporter",
-                "USDExporter",
-                "USDSchemas",
-                "USDTests",
                 "ProceduralMeshComponent"
             }
         );
@@ -41,7 +32,19 @@ public class CyberArchWarehouse : ModuleRules
         {
             //RuntimeDependencies.Add("C:/Program Files/Epic Games/UE_5.1/Engine/Plugins/Importers/USDImporter/Binaries/Win64/UnrealEditor-UnrealUSDWrapper.dll");
             //RuntimeDependencies.Add("C:/Program Files/Epic Games/UE_5.1/Engine/Plugins/Importers/USDImporter/Binaries/Win64/UnrealEditor - USDStage.dll");
-
+        PublicDependencyModuleNames.AddRange(
+        new string[] {
+                "USDStage",
+                "UnrealUSDWrapper",
+                "USDUtilities",
+                "USDClasses",
+                "USDStageEditor",
+                "USDStageImporter",
+                "USDExporter",
+                "USDSchemas",
+                "USDTests"
+            }
+        );
         }
     }
 
diff --git a/Plugins/Freetrack/Resources/Icon128.png b/Plugins/Freetrack/Resources/Icon128.png
new file mode 100644
index 0000000000000000000000000000000000000000..d39bc4abb1bf82a043289cce0dd3fff77a78f29a
Binary files /dev/null and b/Plugins/Freetrack/Resources/Icon128.png differ
diff --git a/Plugins/Freetrack/Source/freetrack/Private/freetrackBPLibrary.cpp b/Plugins/Freetrack/Source/freetrack/Private/freetrackBPLibrary.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d206b0e08b90680a5d8acee784bb34bc27d9d555
--- /dev/null
+++ b/Plugins/Freetrack/Source/freetrack/Private/freetrackBPLibrary.cpp
@@ -0,0 +1,39 @@
+#include "freetrackBPLibrary.h"
+
+void* UfreetrackBPLibrary::DLLHandle;
+FreeTrackData UfreetrackBPLibrary::data;
+FreeTrackData* UfreetrackBPLibrary::pData;
+
+typedef char*(*_FTProvider)(void);
+typedef bool(*_FTGetData)(FreeTrackData * data);
+
+UfreetrackBPLibrary::UfreetrackBPLibrary(const FObjectInitializer& ObjectInitializer) 
+: Super(ObjectInitializer)
+{
+	FString filePath;
+	#if PLATFORM_64BITS
+		filePath = FPaths::Combine(*FPaths::ProjectPluginsDir(), TEXT("freetrack/"), TEXT("FreeTrackClient64.dll"));
+	#else
+		filePath = FPaths::Combine(*FPaths::GamePluginsDir(), TEXT("freetrack/"), TEXT("FreeTrackClient.dll"));
+	#endif
+	
+	if(!FPaths::FileExists(filePath))
+	{
+		UE_LOG(LogTemp, Fatal, TEXT("%s not found"), *filePath);
+	}else{
+		UE_LOG(LogTemp, Log, TEXT("loading freetrack"));
+		DLLHandle = FPlatformProcess::GetDllHandle(*filePath);
+		pData = &data;
+	};
+}
+
+
+void UfreetrackBPLibrary::getFreetrackData(const float TranslationSensitivity, const float RotationSensitivity, FVector& translation, FRotator& rotation, bool& enabled){
+
+	_FTGetData FTGetData = NULL;
+	FString procName = "FTGetData";
+	FTGetData = (_FTGetData)FPlatformProcess::GetDllExport(DLLHandle, *procName); // Export the DLL function.
+	enabled=FTGetData(pData);
+	translation = FVector(-data.z*TranslationSensitivity, -data.x*TranslationSensitivity, data.y*TranslationSensitivity);
+	rotation = FRotator(-data.pitch*RotationSensitivity, -data.yaw * RotationSensitivity, -data.roll * RotationSensitivity);
+};
\ No newline at end of file
diff --git a/Plugins/Freetrack/Source/freetrack/Private/freetrackP.cpp b/Plugins/Freetrack/Source/freetrack/Private/freetrackP.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..534f23368793ea1fc5a3a7e8d3fa19d5cbaf5f86
--- /dev/null
+++ b/Plugins/Freetrack/Source/freetrack/Private/freetrackP.cpp
@@ -0,0 +1,19 @@
+// Some copyright should be here...
+#include "freetrack.h"
+
+#define LOCTEXT_NAMESPACE "FfreetrackModule"
+
+void FfreetrackModule::StartupModule()
+{
+	// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
+}
+
+void FfreetrackModule::ShutdownModule()
+{
+	// This function may be called during shutdown to clean up your module.  For modules that support dynamic reloading,
+	// we call this function before unloading the module.
+}
+
+#undef LOCTEXT_NAMESPACE
+	
+IMPLEMENT_MODULE(FfreetrackModule, freetrack)
\ No newline at end of file
diff --git a/Plugins/Freetrack/Source/freetrack/Public/freetrack.h b/Plugins/Freetrack/Source/freetrack/Public/freetrack.h
new file mode 100644
index 0000000000000000000000000000000000000000..8f6fd0ae692bc70d89abee6f69e14c8b6575c848
--- /dev/null
+++ b/Plugins/Freetrack/Source/freetrack/Public/freetrack.h
@@ -0,0 +1,16 @@
+// Some copyright should be here...
+
+#pragma once
+
+#include "Modules/ModuleManager.h"
+
+
+
+class FfreetrackModule : public IModuleInterface
+{
+public:
+
+	/** IModuleInterface implementation */
+	virtual void StartupModule() override;
+	virtual void ShutdownModule() override;
+};
\ No newline at end of file
diff --git a/Plugins/Freetrack/Source/freetrack/Public/freetrackBPLibrary.h b/Plugins/Freetrack/Source/freetrack/Public/freetrackBPLibrary.h
new file mode 100644
index 0000000000000000000000000000000000000000..ad78aa2c0345ee10e58f87b60337c4369d73fd4e
--- /dev/null
+++ b/Plugins/Freetrack/Source/freetrack/Public/freetrackBPLibrary.h
@@ -0,0 +1,64 @@
+#pragma once
+#include "Engine.h"
+#include "freetrackBPLibrary.generated.h"
+
+/* 
+*	Function library class.
+*	Each function in it is expected to be static and represents blueprint node that can be called in any blueprint.
+*
+*	When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable.
+*	BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins.
+*	BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins.
+*	DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu.
+*				Its lets you name the node using characters not allowed in C++ function names.
+*	CompactNodeTitle - the word(s) that appear on the node.
+*	Keywords -	the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. 
+*				Good example is "Print String" node which you can find also by using keyword "log".
+*	Category -	the category your node will be under in the Blueprint drop-down menu.
+*
+*	For more info on custom blueprint nodes visit documentation:
+*	https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation
+*/
+
+typedef struct
+{
+	unsigned long int dataID;
+	long int camWidth;
+	long int camHeight;
+
+	float yaw;
+	float pitch;
+	float roll;
+	float x;
+	float y;
+	float z;
+
+	float rawyaw;
+	float rawpitch;
+	float rawroll;
+	float rawx;
+	float rawy;
+	float rawz;
+
+	float x1;
+	float y1;
+	float x2;
+	float y2;
+	float x3;
+	float y3;
+	float x4;
+	float y4;
+}FreeTrackData;
+
+UCLASS()
+class UfreetrackBPLibrary : public UBlueprintFunctionLibrary
+{
+	GENERATED_UCLASS_BODY()
+
+	static void* DLLHandle;
+	static FreeTrackData data;
+	static FreeTrackData *pData;
+
+	UFUNCTION(BlueprintCallable, meta = (DisplayName = "get Freetrack Data", Keywords = "freetrack get data"), Category = "freetrack")
+		static void getFreetrackData(const float TranslationSensitivity, const float RotationSensitivity, FVector& translation, FRotator& rotation, bool& enabled);
+};
\ No newline at end of file
diff --git a/Plugins/Freetrack/Source/freetrack/freetrack.Build.cs b/Plugins/Freetrack/Source/freetrack/freetrack.Build.cs
new file mode 100644
index 0000000000000000000000000000000000000000..694b79983810a0583a4501b7fa522d80b31587e6
--- /dev/null
+++ b/Plugins/Freetrack/Source/freetrack/freetrack.Build.cs
@@ -0,0 +1,57 @@
+// Some copyright should be here...
+
+using UnrealBuildTool;
+
+public class freetrack : ModuleRules
+{
+	public freetrack(ReadOnlyTargetRules Target) : base(Target)
+	{
+
+        PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
+
+        PublicIncludePaths.AddRange(
+			new string[] {
+				"freetrack/Public"
+				
+				// ... add public include paths required here ...
+			}
+			);
+				
+		
+		PrivateIncludePaths.AddRange(
+			new string[] {
+				"freetrack/Private",
+				
+				// ... add other private include paths required here ...
+			}
+			);
+			
+		
+		PublicDependencyModuleNames.AddRange(
+			new string[]
+			{
+				"Core",
+				
+				// ... add other public dependencies that you statically link with here ...
+			}
+			);
+			
+		
+		PrivateDependencyModuleNames.AddRange(
+			new string[]
+			{
+				"CoreUObject", "Engine", "Slate", "SlateCore"
+				// ... add private dependencies that you statically link with here ...	
+			}
+			);
+		
+		
+		DynamicallyLoadedModuleNames.AddRange(
+			new string[]
+			{
+				
+				// ... add any modules that your module loads dynamically here ...
+			}
+			);
+	}
+}
diff --git a/Plugins/Freetrack/freetrack.uplugin b/Plugins/Freetrack/freetrack.uplugin
new file mode 100644
index 0000000000000000000000000000000000000000..9ce5c121a95e5f3cdb1404b742801e49fd114581
--- /dev/null
+++ b/Plugins/Freetrack/freetrack.uplugin
@@ -0,0 +1,27 @@
+{
+	"FileVersion": 3,
+	"Version": 1,
+	"VersionName": "1.0",
+	"FriendlyName": "Freetrack",
+	"Description": "",
+	"Category": "Input Devices",
+	"CreatedBy": "worstplayer",
+	"CreatedByURL": "",
+	"DocsURL": "",
+	"MarketplaceURL": "",
+	"SupportURL": "",
+	"EngineVersion": "5.1.0",
+	"CanContainContent": true,
+	"IsBetaVersion": true,
+	"Installed": true,
+	"Modules": [
+		{
+			"Name": "freetrack",
+			"Type": "Runtime",
+			"LoadingPhase": "Default",
+			"PlatformAllowList": [
+				"Win64"
+			]
+		}
+	]
+}
\ No newline at end of file
diff --git a/Plugins/Freetrack/freetrackclient64.dll b/Plugins/Freetrack/freetrackclient64.dll
new file mode 100644
index 0000000000000000000000000000000000000000..e1074592661e622c459df3ef985a4d592a232da5
Binary files /dev/null and b/Plugins/Freetrack/freetrackclient64.dll differ
diff --git a/Plugins/OffAxisProjection b/Plugins/OffAxisProjection
new file mode 160000
index 0000000000000000000000000000000000000000..f6a13407cb0a0c39bb488286d3ace9ed2e3119bc
--- /dev/null
+++ b/Plugins/OffAxisProjection
@@ -0,0 +1 @@
+Subproject commit f6a13407cb0a0c39bb488286d3ace9ed2e3119bc