OpenVR SDK 2.15.6

IVRSystem:
* ComputeDistortionSet added for batch queries and inverses.
* GetEyeTrackedFoveationCenter and GetEyeTrackedFoveationCenterForProjection added for access eye tracking data for foveation (for supported drivers).

IVRInput:
* GetEyeTrackingDataRelativeToNow and GetEyeTrackingDataForNextFrame provide eye tracking data for input (for supported drivers).

IVROverlay:
* Overlays created with this SDK will have translucent grey backsides by default (for consistency with the rest of the dashboard), and will require the use of VROverlayFlags_NoBackside to only draw the fronts.

IVRCompositor:
* Added ability to pass motion vectors to SteamVR (use VRTextureWithMotion_t with Submit_TextureWithMotion).

IVRIPCResourceManagerClient:
* NewSharedVulkanImage added unAdditionalVkCreateFlags and unAdditionalVkUsageFlags.

IVRApplications:
* Added RegisterSubprocess as an alternative to LaunchInternalProcess to support external launching.

New:
* VREvent_OverlayNameChanged

Deprecated:
* Prop_PreviousUniverseId_Uint64

[git-p4: depot-paths = "//vr/steamvr/sdk_release/": change = 10561095]
diff --git a/bin/androidarm64/libopenvr_api.so b/bin/androidarm64/libopenvr_api.so
index 104fd37..ff71df7 100644
--- a/bin/androidarm64/libopenvr_api.so
+++ b/bin/androidarm64/libopenvr_api.so
Binary files differ
diff --git a/bin/linux32/libopenvr_api.so b/bin/linux32/libopenvr_api.so
index b04a4c2..8af2f11 100755
--- a/bin/linux32/libopenvr_api.so
+++ b/bin/linux32/libopenvr_api.so
Binary files differ
diff --git a/bin/linux32/libopenvr_api.so.dbg b/bin/linux32/libopenvr_api.so.dbg
index 56debc9..fb3d7cb 100755
--- a/bin/linux32/libopenvr_api.so.dbg
+++ b/bin/linux32/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/linux64/libopenvr_api.so b/bin/linux64/libopenvr_api.so
index 198da62..614970f 100755
--- a/bin/linux64/libopenvr_api.so
+++ b/bin/linux64/libopenvr_api.so
Binary files differ
diff --git a/bin/linux64/libopenvr_api.so.dbg b/bin/linux64/libopenvr_api.so.dbg
index 350f2f9..2490cbd 100755
--- a/bin/linux64/libopenvr_api.so.dbg
+++ b/bin/linux64/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api.so b/bin/linuxarm64/libopenvr_api.so
index 74b9301..109815e 100644
--- a/bin/linuxarm64/libopenvr_api.so
+++ b/bin/linuxarm64/libopenvr_api.so
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api.so.dbg b/bin/linuxarm64/libopenvr_api.so.dbg
index ebf869f..91a0104 100644
--- a/bin/linuxarm64/libopenvr_api.so.dbg
+++ b/bin/linuxarm64/libopenvr_api.so.dbg
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api_unity.so b/bin/linuxarm64/libopenvr_api_unity.so
index d62754c..9ba50fa 100644
--- a/bin/linuxarm64/libopenvr_api_unity.so
+++ b/bin/linuxarm64/libopenvr_api_unity.so
Binary files differ
diff --git a/bin/linuxarm64/libopenvr_api_unity.so.dbg b/bin/linuxarm64/libopenvr_api_unity.so.dbg
index 90cfd40..b924fde 100644
--- a/bin/linuxarm64/libopenvr_api_unity.so.dbg
+++ b/bin/linuxarm64/libopenvr_api_unity.so.dbg
Binary files differ
diff --git a/bin/win32/openvr_api.dll b/bin/win32/openvr_api.dll
index b17a514..5e2468e 100644
--- a/bin/win32/openvr_api.dll
+++ b/bin/win32/openvr_api.dll
Binary files differ
diff --git a/bin/win32/openvr_api.dll.sig b/bin/win32/openvr_api.dll.sig
index b6b10c0..776423c 100644
--- a/bin/win32/openvr_api.dll.sig
+++ b/bin/win32/openvr_api.dll.sig
Binary files differ
diff --git a/bin/win32/openvr_api.pdb b/bin/win32/openvr_api.pdb
index eff94a2..4d16416 100644
--- a/bin/win32/openvr_api.pdb
+++ b/bin/win32/openvr_api.pdb
Binary files differ
diff --git a/bin/win64/openvr_api.dll b/bin/win64/openvr_api.dll
index ab53dc6..83b2019 100644
--- a/bin/win64/openvr_api.dll
+++ b/bin/win64/openvr_api.dll
Binary files differ
diff --git a/bin/win64/openvr_api.dll.sig b/bin/win64/openvr_api.dll.sig
index 651ebfe..8beca16 100644
--- a/bin/win64/openvr_api.dll.sig
+++ b/bin/win64/openvr_api.dll.sig
Binary files differ
diff --git a/bin/win64/openvr_api.pdb b/bin/win64/openvr_api.pdb
index e576a0c..d5506b2 100644
--- a/bin/win64/openvr_api.pdb
+++ b/bin/win64/openvr_api.pdb
Binary files differ
diff --git a/codegen/openvr_interop.cs.py b/codegen/openvr_interop.cs.py
index 8731158..07585c2 100755
--- a/codegen/openvr_interop.cs.py
+++ b/codegen/openvr_interop.cs.py
@@ -251,6 +251,7 @@
 			m_pVROverlay = null;
 			m_pVROverlayView = null;
 			m_pVRRenderModels = null;
+			m_pVRResources = null;
 			m_pVRExtendedDisplay = null;
 			m_pVRSettings = null;
 			m_pVRApplications = null;
@@ -376,6 +377,19 @@
 			return m_pVRRenderModels;
 		}
 
+		public CVRResources VRResources()
+		{
+			CheckClear();
+			if (m_pVRResources == null)
+			{
+				var eError = EVRInitError.None;
+				var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRResources_Version, ref eError);
+				if (pInterface != IntPtr.Zero && eError == EVRInitError.None)
+					m_pVRResources = new CVRResources(pInterface);
+			}
+			return m_pVRResources;
+		}
+
 		public CVRExtendedDisplay VRExtendedDisplay()
 		{
 			CheckClear();
@@ -514,6 +528,7 @@
 		private CVROverlay m_pVROverlay;
 		private CVROverlayView m_pVROverlayView;
 		private CVRRenderModels m_pVRRenderModels;
+		private CVRResources m_pVRResources;
 		private CVRExtendedDisplay m_pVRExtendedDisplay;
 		private CVRSettings m_pVRSettings;
 		private CVRApplications m_pVRApplications;
@@ -545,6 +560,7 @@
 	public static CVROverlay Overlay { get { return OpenVRInternal_ModuleContext.VROverlay(); } }
 	public static CVROverlayView OverlayView { get { return OpenVRInternal_ModuleContext.VROverlayView(); } }
 	public static CVRRenderModels RenderModels { get { return OpenVRInternal_ModuleContext.VRRenderModels(); } }
+	public static CVRResources Resources { get { return OpenVRInternal_ModuleContext.VRResources(); } }
 	public static CVRExtendedDisplay ExtendedDisplay { get { return OpenVRInternal_ModuleContext.VRExtendedDisplay(); } }
 	public static CVRSettings Settings { get { return OpenVRInternal_ModuleContext.VRSettings(); } }
 	public static CVRApplications Applications { get { return OpenVRInternal_ModuleContext.VRApplications(); } }
@@ -560,6 +576,8 @@
 	/** Finds the active installation of vrclient.dll and initializes it */
 	public static CVRSystem Init(ref EVRInitError peError, EVRApplicationType eApplicationType = EVRApplicationType.VRApplication_Scene, string pchStartupInfo= "")
 	{
+		CVRSystem pSystem = null;
+
 		try 
 		{
 			VRToken = InitInternal2(ref peError, eApplicationType, pchStartupInfo);
@@ -571,18 +589,24 @@
 
 		OpenVRInternal_ModuleContext.Clear();
 
-		if (peError != EVRInitError.None)
-			return null;
-
-		bool bInterfaceValid = IsInterfaceVersionValid(IVRSystem_Version);
-		if (!bInterfaceValid)
+		if (peError == EVRInitError.None && !IsInterfaceVersionValid(IVRSystem_Version))
 		{
-			ShutdownInternal();
 			peError = EVRInitError.Init_InterfaceNotFound;
-			return null;
 		}
 
-		return OpenVR.System;
+		if (peError == EVRInitError.None)
+		{
+			pSystem = OpenVR.System;
+			peError = pSystem.SetSDKVersion(k_nSteamVRVersionMajor, k_nSteamVRVersionMinor, k_nSteamVRVersionBuild);
+		}
+
+		if (peError != EVRInitError.None)
+		{
+			pSystem = null;
+			ShutdownInternal();
+		}
+
+		return pSystem;
 	}
 
 	/** unloads vrclient.dll. Any interface pointers from the interface are
diff --git a/headers/openvr.h b/headers/openvr.h
index efa452a..7b25ab4 100644
--- a/headers/openvr.h
+++ b/headers/openvr.h
@@ -16,8 +16,8 @@
 namespace vr
 {
 	static const uint32_t k_nSteamVRVersionMajor = 2;
-	static const uint32_t k_nSteamVRVersionMinor = 12;
-	static const uint32_t k_nSteamVRVersionBuild = 14;
+	static const uint32_t k_nSteamVRVersionMinor = 15;
+	static const uint32_t k_nSteamVRVersionBuild = 6;
 } // namespace vr
 
 // public_vrtypes.h
@@ -193,6 +193,17 @@
 	VRTextureDepthInfo_t depth;
 };
 
+struct VRTextureMotionInfo_t
+{
+	void *handle; // See ETextureType definition above
+	HmdMatrix44_t mDeltaPose; // Incremental application-applied transform, if any, since the previous frame that affects the view.
+};
+
+struct VRTextureWithMotion_t : VRTextureWithPoseAndDepth_t
+{
+	VRTextureMotionInfo_t motion;
+};
+
 // 64-bit types that are part of public structures
 // that are replicated in shared memory.
 #if defined(__linux__) || defined(__APPLE__)
@@ -209,7 +220,7 @@
 {
 	uint32_t unOffset;
 	uint32_t unStride;
-	int32_t nFd;
+	int32_t nFd; // This is not consumed, it is dup'ed.
 };
 
 struct DmabufAttributes_t
@@ -476,6 +487,8 @@
 	Prop_AllowLightSourceFrequency_Bool			= 1056, // Shows the Anti-Flicker option in camera settings.
 	Prop_SteamRemoteClientID_Uint64				= 1057, // For vrlink
 	Prop_Reserved_1058							= 1058,
+	Prop_Reserved_1059							= 1059,
+	Prop_Reserved_1060							= 1060,
 
 	// Properties that are unique to TrackedDeviceClass_HMD
 	Prop_ReportsTimeSinceVSync_Bool				= 2000,
@@ -483,7 +496,7 @@
 	Prop_DisplayFrequency_Float					= 2002,
 	Prop_UserIpdMeters_Float					= 2003,
 	Prop_CurrentUniverseId_Uint64				= 2004,
-	Prop_PreviousUniverseId_Uint64				= 2005,
+	Prop_PreviousUniverseId_Uint64_deprecated	= Prop_Invalid,
 	Prop_DisplayFirmwareVersion_Uint64			= 2006,
 	Prop_IsOnDesktop_Bool						= 2007,
 	Prop_DisplayMCType_Int32					= 2008,
@@ -778,11 +791,15 @@
 	// If the texture is an EGL texture and not an glX/wGL texture (Linux only, currently)
 	Submit_IsEgl = 0x100,
 
+	// Set to indicate that pTexture is a pointer to a VRTextureWithMotion_t.
+	Submit_TextureWithMotion = 0x200 | Submit_TextureWithPose | Submit_TextureWithDepth,
+
 	// Do not use
 	Submit_Reserved2 = 0x08000,
 	Submit_Reserved3 = 0x10000,
 	Submit_Reserved4 = 0x20000,
 	Submit_Reserved5 = 0x40000,
+	Submit_Reserved6 = 0x80000,
 };
 
 /** Data required for passing Vulkan textures to IVRCompositor::Submit.
@@ -930,8 +947,8 @@
 	VREvent_ScreenshotProgressToDashboard	= 524, // Sent by compositor to the dashboard that a completed screenshot was submitted
 
 	VREvent_PrimaryDashboardDeviceChanged	= 525,
-	VREvent_RoomViewShown					= 526, // Sent by compositor whenever room-view is enabled
-	VREvent_RoomViewHidden					= 527, // Sent by compositor whenever room-view is disabled
+	VREvent_RoomViewShown					= 526, // Sent by compositor whenever room-view is enabled (for scene apps only - not for construct or transient bounds)
+	VREvent_RoomViewHidden					= 527, // Sent by compositor whenever room-view is disabled (for scene apps only - not for construct or transient bounds)
 	VREvent_ShowUI							= 528, // data is showUi
 	VREvent_ShowDevTools					= 529, // data is showDevTools
 	VREvent_DesktopViewUpdating				= 530,
@@ -939,13 +956,14 @@
 
 	VREvent_StartDashboard					= 532,
 	VREvent_ElevatePrism					= 533,
-	VREvent_OverlayClosed					= 534,
+	VREvent_OverlayClosed					= 534, // The overlay's close button is pressed.
 	VREvent_DashboardThumbChanged			= 535, // Sent when a dashboard thumbnail image changes
 	VREvent_DesktopMightBeVisible			= 536, // Sent when any known desktop related overlay is visible
 	VREvent_DesktopMightBeHidden			= 537, // Sent when all known desktop related overlays are hidden
 	VREvent_MutualSteamCapabilitiesChanged	= 538, // Sent when the set of capabilities common between both Steam and SteamVR have changed.
 	VREvent_OverlayCreated					= 539, // An OpenVR overlay of any sort was created. Data is overlay.
 	VREvent_OverlayDestroyed				= 540, // An OpenVR overlay of any sort was destroyed. Data is overlay.
+	VREvent_OverlayNameChanged				= 544, // An OpenVR overlay's name changed. Data is overlay.
 
 	VREvent_TrackingRecordingStarted		= 541,
 	VREvent_TrackingRecordingStopped		= 542,
@@ -982,6 +1000,9 @@
 	VREvent_Reserved_0809  					= 809,
 	VREvent_Reserved_0810  					= 810,
 	VREvent_Reserved_0811  					= 811,
+	VREvent_Reserved_0812  					= 812,
+	VREvent_Reserved_0813  					= 813,
+	VREvent_Reserved_0814  					= 814,
 
 	VREvent_AudioSettingsHaveChanged		= 820,
 
@@ -1008,6 +1029,7 @@
 	VREvent_WindowsMRSectionSettingChanged			= 870,
 	VREvent_OtherSectionSettingChanged				= 871,
 	VREvent_AnyDriverSettingsChanged				= 872,
+	VREvent_Reserved_0873							= 873,
 
 	VREvent_StatusUpdate					= 900,
 
@@ -1259,7 +1281,7 @@
 
 struct VREvent_Chaperone_t
 {
-	uint64_t m_nPreviousUniverse;
+	uint64_t m_nPreviousUniverse_deprecated;
 	uint64_t m_nCurrentUniverse;
 };
 
@@ -1843,6 +1865,8 @@
 	VRInitError_Init_VRDashboardTokenFailure		= 165,
 	VRInitError_Init_VRDashboardEnvironmentFailure	= 166,
 	VRInitError_Init_VRDashboardPathFailure			= 167,
+	VRInitError_Init_InstallationTooOld				= 168,
+	VRInitError_Init_ClientVersionAlreadyProvided	= 169,
 
 	VRInitError_Driver_Failed						= 200,
 	VRInitError_Driver_Unknown						= 201,
@@ -1997,6 +2021,12 @@
 	VRInitError_VendorSpecific_OculusRuntimeBadInstall				= 1114,
 	VRInitError_VendorSpecific_HmdFound_UnexpectedConfiguration_1	= 1115,
 
+	VRInitError_VendorSpecific_Oasis_UnlockRequired					= 1150,
+
+	VRInitError_VendorSpecific_VRLink_OutdatedDriverMESA			= 1200,
+	VRInitError_VendorSpecific_VRLink_OutdatedDriverNVIDIA			= 1201,
+	VRInitError_VendorSpecific_VRLink_NoVideoSupport				= 1202,
+
 	VRInitError_Steam_SteamInstallationNotFound = 2000,
 
 	// Strictly a placeholder
@@ -2221,6 +2251,22 @@
 	uint32_t unOffScaleFlags;
 };
 
+enum class EVRDistortionChannel : uint32_t
+{
+	Red = 0,		// given a coordinate in distorted panel space, returns the coordinate to sample in rectilinear render space for the red channel
+	Green,			// given a coordinate in distorted panel space, returns the coordinate to sample in rectilinear render space for the green channel
+	Blue,			// given a coordinate in distorted panel space, returns the coordinate to sample in rectilinear render space for the blue channel
+	InverseRed,		// given a coordinate in rectilinear render space, returns the corresponding coordinate in distorted panel space for the red channel
+	InverseGreen,	// given a coordinate in rectilinear render space, returns the corresponding coordinate in distorted panel space for the green channel
+	InverseBlue,	// given a coordinate in rectilinear render space, returns the corresponding coordinate in distorted panel space for the blue channel
+	Count
+};
+
+struct DistortionCoordinate_t
+{
+	float u, v; // 0..1
+};
+
 #pragma pack( pop )
 
 // figure out how to import from the VR API dll
@@ -2307,6 +2353,12 @@
 	* Returns true for success. Otherwise, returns false, and distortion coordinates are not suitable. */
 	virtual bool ComputeDistortion( EVREye eEye, float fU, float fV, DistortionCoordinates_t *pDistortionCoordinates ) = 0;
 
+	/** Gets the result of the distortion functions for the specified eye and set of input UVs.
+	 * nNumCoordinates must be the number of elements of pInput and pOutput.
+	 * Returns true for success. Otherwise, returns false, and distortion coordinates are not suitable. */
+	virtual bool ComputeDistortionSet( EVREye eEye, EVRDistortionChannel eChannel, bool bAsNormalizedDeviceCoordinates,
+		uint32_t nNumCoordinates, const DistortionCoordinate_t *pInput, DistortionCoordinate_t *pOutput ) = 0;
+
 	/** Returns the transform from eye space to the head space. Eye space is the per-eye flavor of head
 	* space that provides stereo disparity. Instead of Model * View * Projection the sequence is Model * View * Eye^-1 * Projection.
 	* Normally View and Eye^-1 will be multiplied together and treated as View in your application.
@@ -2504,6 +2556,18 @@
 	*/
 	virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye, EHiddenAreaMeshType type = k_eHiddenAreaMesh_Standard ) = 0;
 
+	/** Provides per-eye NDC foveation centers based on eye tracking, using the projection matrices accessible
+	* from IVRSystem::GetProjectionMatrix(...). Returns true if these NDC points are valid; false otherwise.
+	* This API will return false on systems that do not have an eye tracker, or may transiently return false if a
+	* system's eye tracker reports that eye tracking is invalid.
+	*/
+	virtual bool GetEyeTrackedFoveationCenter( HmdVector2_t *pNdcLeft, HmdVector2_t *pNdcRight ) = 0;
+
+	/** A variant of GetEyeTrackedFoveationCenter(...), where the caller specifies the projection matrix to use.
+	* Use this if you need a foveation center for a projection matrix other than what is returned from IVRSystem::GetProjectionMatrix(...).
+	*/
+	virtual bool GetEyeTrackedFoveationCenterForProjection( const HmdMatrix44_t *pProjMat, HmdVector2_t *pNdc ) = 0;
+
 	// ------------------------------------
 	// Controller methods
 	// ------------------------------------
@@ -2582,9 +2646,11 @@
 	* presence information is provided by other APIs. */
 	virtual const char *GetRuntimeVersion() = 0;
 
+	/** Tells the SteamVR runtime which version of the SDK our client was compiled against. */
+	virtual vr::EVRInitError SetSDKVersion( uint32_t nVersionMajor, uint32_t nVersionMinor, uint32_t nVersionBuild ) = 0;
 };
 
-static const char * const IVRSystem_Version = "IVRSystem_023";
+static const char * const IVRSystem_Version = "IVRSystem_026";
 
 }
 
@@ -2611,10 +2677,11 @@
 		VRApplicationError_LaunchFailed = 109,			// the process didn't start
 		VRApplicationError_ApplicationAlreadyStarting = 110, // the system was already starting the same application
 		VRApplicationError_LaunchInProgress = 111,		// The system was already starting a different application
-		VRApplicationError_OldApplicationQuitting = 112,
+		VRApplicationError_OldApplicationQuitting = 112, // Caller should retry while PerformApplicationPrelaunchCheck is returing this
 		VRApplicationError_TransitionAborted = 113,
 		VRApplicationError_IsTemplate = 114, // error when you try to call LaunchApplication() on a template type app (use LaunchTemplateApplication)
 		VRApplicationError_SteamVRIsExiting = 115,
+		VRApplicationError_WaitingForChaperone = 116,   // Caller should retry while PerformApplicationPrelaunchCheck is returing this
 
 		VRApplicationError_BufferTooSmall = 200,		// The provided buffer was too small to fit the requested data
 		VRApplicationError_PropertyNotSet = 201,		// The requested property was not set
@@ -2778,6 +2845,7 @@
 		* What the caller should do about these failures depends on the failure:
 		*   VRApplicationError_OldApplicationQuitting - An existing application has been told to quit. Wait for a VREvent_ProcessQuit
 		*                                               and try again.
+		*   VRApplicationError_WaitingForChaperone    - Room setup is in progress. Wait for VREvent_ChaperoneRoomSetupCommitted and try again.
 		*   VRApplicationError_ApplicationAlreadyStarting - This application is already starting. This is a permanent failure.
 		*   VRApplicationError_LaunchInProgress	      - A different application is already starting. This is a permanent failure.
 		*   VRApplicationError_None                   - Go ahead and launch. Everything is clear.
@@ -2794,13 +2862,18 @@
 		* the working directory. */
 		virtual EVRApplicationError LaunchInternalProcess( const char *pchBinaryPath, const char *pchArguments, const char *pchWorkingDirectory ) = 0;
 
+		/** Registers a new subprocess launched by the calling application. This
+		 * suppresses all application transition UI and automatically identifies the new process
+		 * as part of the same application. On success the calling process should exit immediately. */
+		virtual EVRApplicationError RegisterSubprocess( uint32_t nPid ) = 0;
+
 		/** Returns the current scene process ID according to the application system. A scene process will get scene
 		* focus once it starts rendering, but it will appear here once it calls VR_Init with the Scene application
 		* type. */
 		virtual uint32_t GetCurrentSceneProcessId() = 0;
 	};
 
-	static const char * const IVRApplications_Version = "IVRApplications_007";
+	static const char * const IVRApplications_Version = "IVRApplications_008";
 
 } // namespace vr
 
@@ -2933,6 +3006,7 @@
 	//-----------------------------------------------------------------------------
 	// steamvr keys
 	static const char * const k_pch_SteamVR_Section = "steamvr";
+	static const char * const k_pch_SteamVR_Contrast_Float = "contrast";
 	static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd";
 	static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
 	static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
@@ -2950,6 +3024,7 @@
 	static const char * const k_pch_SteamVR_GridColor_String = "gridColor";
 	static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
 	static const char * const k_pch_SteamVR_TrackingLossColor_String = "trackingLossColor";
+	static const char * const k_pch_SteamVR_StartColor_String = "startColor";
 	static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage";
 	static const char * const k_pch_SteamVR_DrawTrackingReferences_Bool = "drawTrackingReferences";
 	static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
@@ -2962,6 +3037,8 @@
 	static const char * const k_pch_SteamVR_MaxRecommendedResolution_Int32 = "maxRecommendedResolution";
 	static const char * const k_pch_SteamVR_MotionSmoothing_Bool = "motionSmoothing";
 	static const char * const k_pch_SteamVR_MotionSmoothingOverride_Int32 = "motionSmoothingOverride";
+	static const char * const k_pch_SteamVR_FoveatedSharpening_Bool = "sharpening";
+	static const char * const k_pch_SteamVR_FoveatedSharpeningOverride_Int32 = "sharpeningOverride";
 	static const char * const k_pch_SteamVR_FramesToThrottle_Int32 = "framesToThrottle";
 	static const char * const k_pch_SteamVR_AdditionalFramesToPredict_Int32 = "additionalFramesToPredict";
 	static const char * const k_pch_SteamVR_WorldScale_Float = "worldScale";
@@ -3160,6 +3237,7 @@
 	static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout";
 	static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress";
 	static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby";
+	static const char * const k_pch_Power_OverrideWindowsPowerScheme_Bool = "overrideWindowsPowerScheme";
 
 	//-----------------------------------------------------------------------------
 	// dashboard keys
@@ -3167,14 +3245,13 @@
 	static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard";
 	static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode";
 	static const char * const k_pch_Dashboard_Position = "position";
-	static const char * const k_pch_Dashboard_DesktopScale = "desktopScale";
 	static const char * const k_pch_Dashboard_DashboardScale = "dashboardScale";
 	static const char * const k_pch_Dashboard_UseStandaloneSystemLayer = "standaloneSystemLayer";
 	static const char * const k_pch_Dashboard_AllowSteamOverlays_Bool = "allowSteamOverlays";
 	static const char * const k_pch_Dashboard_AllowVRGamepadUI_Bool = "allowVRGamepadUI";
-	static const char * const k_pch_Dashboard_AllowVRGamepadUIViaGamescope_Bool = "allowVRGamepadUIViaGamescope";
 	static const char * const k_pch_Dashboard_SteamMatchesHMDFramerate = "steamMatchesHMDFramerate";
 	static const char * const k_pch_Dashboard_GrabHandleAcceleration = "grabHandleAcceleration";
+	static const char * const k_pch_Dashboard_OverlayBacksideColor_String = "overlayBacksideColor";
 
 	//-----------------------------------------------------------------------------
 	// model skin keys
@@ -3405,7 +3482,7 @@
 	virtual void SetWorkingCollisionBoundsInfo( VR_ARRAY_COUNT(unQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t unQuadsCount ) = 0;
 
 	/** Sets the Collision Bounds in the working copy. */
-	virtual void SetWorkingPerimeter( VR_ARRAY_COUNT( unPointCount ) HmdVector2_t *pPointBuffer, uint32_t unPointCount ) = 0;
+	virtual void SetWorkingPerimeter( VR_ARRAY_COUNT( unPointCount ) const HmdVector2_t *pPointBuffer, uint32_t unPointCount ) = 0;
 
 	/** Sets the preferred seated position in the working copy. */
 	virtual void SetWorkingSeatedZeroPoseToRawTrackingPose( const HmdMatrix34_t *pMatSeatedZeroPoseToRawTrackingPose ) = 0;
@@ -4075,6 +4152,12 @@
 		// If this is set, laser mouse pointer events may be sent for the secondary laser. These events will have
 		// cursorIndex set to 0 for the primary laser and 1 for the secondary.
 		VROverlayFlags_MultiCursor = 1 << 28,
+
+		// If this is set, the compositor won't draw any stylized backing when viewing the overlay from behind.
+		// NOTE: Overlays will only have a backside in the first place if build with OpenVR SDK 2.15.x and higher.
+		// NOTE: DashboardOverlays ignore this flag and the SDK version; they always have a backside unless the user
+		//       globally disables that.
+		VROverlayFlags_NoBackside = 1 << 29,
 	};
 
 	enum VRMessageOverlayResponse
@@ -4836,6 +4919,12 @@
 class IVRTrackedCamera
 {
 public:
+
+	// ------------------------------------
+	// IVRTrackedCamera is used by client applications to poll for camera frames, when available.
+	// This API has no relevance to driver writers adding camera support to a particular HMD.
+	// ------------------------------------
+
 	/** Returns a string for an error */
 	virtual const char *GetCameraErrorNameFromEnum( vr::EVRTrackedCameraError eCameraError ) = 0;
 
@@ -5309,6 +5398,14 @@
 		/** Sets the dominant hand for the user for this application. */
 		virtual EVRInputError SetDominantHand( ETrackedControllerRole eDominantHand ) = 0;
 
+		/** Reads the state of an eye tracking action given its handle for the number of seconds relative to now.
+		 * This will generally be called with negative times from the fUpdateTime fields in other actions. */
+		virtual EVRInputError GetEyeTrackingDataRelativeToNow( VRActionHandle_t action, vr::ETrackingUniverseOrigin eOrigin, float fPredictedSecondsFromNow, vr::VREyeTrackingData_t *pEyeTrackingData, uint32_t ulEyeTrackingDataSize ) = 0;
+
+		/** Reads the state of an eye tracking action given its handle. The returned data will be for the frame
+		 * predicted by last call to IVRCompositor::WaitGetPoses(). */
+		virtual EVRInputError GetEyeTrackingDataForNextFrame( VRActionHandle_t action, vr::ETrackingUniverseOrigin eOrigin, vr::VREyeTrackingData_t *pEyeTrackingData, uint32_t ulEyeTrackingDataSize ) = 0;
+
 		// ---------------  Static Skeletal Data ------------------- //
 
 		/** Reads the number of bones in skeleton associated with the given action */
@@ -5391,7 +5488,7 @@
 
 	};
 
-	static const char * const IVRInput_Version = "IVRInput_010";
+	static const char * const IVRInput_Version = "IVRInput_011";
 
 } // namespace vr
 
@@ -5561,7 +5658,7 @@
 	 *
 	 * nImageFormat: in VkFormat
 	 */
-	virtual bool NewSharedVulkanImage( uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
+	virtual bool NewSharedVulkanImage( uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, uint32_t unAdditionalVkCreateFlags, uint32_t unAdditionalVkUsageFlags, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
 
 	/** Create a new tracked Vulkan Buffer */
 	virtual bool NewSharedVulkanBuffer( uint32_t nSize, uint32_t nUsageFlags, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
@@ -5619,7 +5716,7 @@
 	virtual ~IVRIPCResourceManagerClient() {};
 };
 
-static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
+static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_003";
 
 }
 // End
@@ -6036,17 +6133,21 @@
 		COpenVRContext &ctx = OpenVRInternal_ModuleContext();
 		ctx.Clear();
 
+		if ( eError == VRInitError_None && !VR_IsInterfaceVersionValid( IVRSystem_Version ) )
+		{
+			eError = VRInitError_Init_InterfaceNotFound;
+		}
+
 		if ( eError == VRInitError_None )
 		{
-			if ( VR_IsInterfaceVersionValid( IVRSystem_Version ) )
-			{
-				pVRSystem = VRSystem();
-			}
-			else
-			{
-				VR_ShutdownInternal();
-				eError = VRInitError_Init_InterfaceNotFound;
-			}
+			pVRSystem = VRSystem();
+			eError = pVRSystem->SetSDKVersion( k_nSteamVRVersionMajor, k_nSteamVRVersionMinor, k_nSteamVRVersionBuild );
+		}
+
+		if ( eError != VRInitError_None )
+		{
+			pVRSystem = nullptr;
+			VR_ShutdownInternal();
 		}
 
 		if ( peError )
diff --git a/headers/openvr_api.cs b/headers/openvr_api.cs
index bfaec40..3050761 100644
--- a/headers/openvr_api.cs
+++ b/headers/openvr_api.cs
@@ -42,6 +42,12 @@
 	internal _ComputeDistortion ComputeDistortion;
 
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	[return: MarshalAs(UnmanagedType.I1)]
+	internal delegate bool _ComputeDistortionSet(EVREye eEye, EVRDistortionChannel eChannel, [MarshalAs(UnmanagedType.I1)] bool bAsNormalizedDeviceCoordinates, uint nNumCoordinates, ref DistortionCoordinate_t pInput, ref DistortionCoordinate_t pOutput);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _ComputeDistortionSet ComputeDistortionSet;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	internal delegate HmdMatrix34_t _GetEyeToHeadTransform(EVREye eEye);
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _GetEyeToHeadTransform GetEyeToHeadTransform;
@@ -201,6 +207,18 @@
 
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	[return: MarshalAs(UnmanagedType.I1)]
+	internal delegate bool _GetEyeTrackedFoveationCenter(ref HmdVector2_t pNdcLeft, ref HmdVector2_t pNdcRight);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _GetEyeTrackedFoveationCenter GetEyeTrackedFoveationCenter;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	[return: MarshalAs(UnmanagedType.I1)]
+	internal delegate bool _GetEyeTrackedFoveationCenterForProjection(ref HmdMatrix44_t pProjMat, ref HmdVector2_t pNdc);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _GetEyeTrackedFoveationCenterForProjection GetEyeTrackedFoveationCenterForProjection;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	[return: MarshalAs(UnmanagedType.I1)]
 	internal delegate bool _GetControllerState(uint unControllerDeviceIndex, ref VRControllerState_t pControllerState, uint unControllerStateSize);
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _GetControllerState GetControllerState;
@@ -270,6 +288,11 @@
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _GetRuntimeVersion GetRuntimeVersion;
 
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	internal delegate EVRInitError _SetSDKVersion(uint nVersionMajor, uint nVersionMinor, uint nVersionBuild);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _SetSDKVersion SetSDKVersion;
+
 }
 
 [StructLayout(LayoutKind.Sequential)]
@@ -522,6 +545,11 @@
 	internal _LaunchInternalProcess LaunchInternalProcess;
 
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	internal delegate EVRApplicationError _RegisterSubprocess(uint nPid);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _RegisterSubprocess RegisterSubprocess;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	internal delegate uint _GetCurrentSceneProcessId();
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _GetCurrentSceneProcessId GetCurrentSceneProcessId;
@@ -1798,6 +1826,16 @@
 	internal _SetDominantHand SetDominantHand;
 
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	internal delegate EVRInputError _GetEyeTrackingDataRelativeToNow(ulong action, ETrackingUniverseOrigin eOrigin, float fPredictedSecondsFromNow, ref VREyeTrackingData_t pEyeTrackingData, uint ulEyeTrackingDataSize);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _GetEyeTrackingDataRelativeToNow GetEyeTrackingDataRelativeToNow;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
+	internal delegate EVRInputError _GetEyeTrackingDataForNextFrame(ulong action, ETrackingUniverseOrigin eOrigin, ref VREyeTrackingData_t pEyeTrackingData, uint ulEyeTrackingDataSize);
+	[MarshalAs(UnmanagedType.FunctionPtr)]
+	internal _GetEyeTrackingDataForNextFrame GetEyeTrackingDataForNextFrame;
+
+	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	internal delegate EVRInputError _GetBoneCount(ulong action, ref uint pBoneCount);
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _GetBoneCount GetBoneCount;
@@ -1991,7 +2029,7 @@
 {
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 	[return: MarshalAs(UnmanagedType.I1)]
-	internal delegate bool _NewSharedVulkanImage(uint nImageFormat, uint nWidth, uint nHeight, [MarshalAs(UnmanagedType.I1)] bool bRenderable, [MarshalAs(UnmanagedType.I1)] bool bMappable, [MarshalAs(UnmanagedType.I1)] bool bComputeAccess, uint unMipLevels, uint unArrayLayerCount, ref ulong pSharedHandle);
+	internal delegate bool _NewSharedVulkanImage(uint nImageFormat, uint nWidth, uint nHeight, [MarshalAs(UnmanagedType.I1)] bool bRenderable, [MarshalAs(UnmanagedType.I1)] bool bMappable, [MarshalAs(UnmanagedType.I1)] bool bComputeAccess, uint unMipLevels, uint unArrayLayerCount, uint unAdditionalVkCreateFlags, uint unAdditionalVkUsageFlags, ref ulong pSharedHandle);
 	[MarshalAs(UnmanagedType.FunctionPtr)]
 	internal _NewSharedVulkanImage NewSharedVulkanImage;
 
@@ -2202,6 +2240,11 @@
 		bool result = FnTable.ComputeDistortion(eEye,fU,fV,ref pDistortionCoordinates);
 		return result;
 	}
+	public bool ComputeDistortionSet(EVREye eEye,EVRDistortionChannel eChannel,bool bAsNormalizedDeviceCoordinates,uint nNumCoordinates,ref DistortionCoordinate_t pInput,ref DistortionCoordinate_t pOutput)
+	{
+		bool result = FnTable.ComputeDistortionSet(eEye,eChannel,bAsNormalizedDeviceCoordinates,nNumCoordinates,ref pInput,ref pOutput);
+		return result;
+	}
 	public HmdMatrix34_t GetEyeToHeadTransform(EVREye eEye)
 	{
 		HmdMatrix34_t result = FnTable.GetEyeToHeadTransform(eEye);
@@ -2405,6 +2448,16 @@
 		HiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye,type);
 		return result;
 	}
+	public bool GetEyeTrackedFoveationCenter(ref HmdVector2_t pNdcLeft,ref HmdVector2_t pNdcRight)
+	{
+		bool result = FnTable.GetEyeTrackedFoveationCenter(ref pNdcLeft,ref pNdcRight);
+		return result;
+	}
+	public bool GetEyeTrackedFoveationCenterForProjection(ref HmdMatrix44_t pProjMat,ref HmdVector2_t pNdc)
+	{
+		bool result = FnTable.GetEyeTrackedFoveationCenterForProjection(ref pProjMat,ref pNdc);
+		return result;
+	}
 // This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were
 // originally mis-compiled with the wrong packing for Linux and OSX.
 	[UnmanagedFunctionPointer(CallingConvention.StdCall)]
@@ -2520,6 +2573,11 @@
 		IntPtr result = FnTable.GetRuntimeVersion();
 		return Marshal.PtrToStringAnsi(result);
 	}
+	public EVRInitError SetSDKVersion(uint nVersionMajor,uint nVersionMinor,uint nVersionBuild)
+	{
+		EVRInitError result = FnTable.SetSDKVersion(nVersionMajor,nVersionMinor,nVersionBuild);
+		return result;
+	}
 }
 
 
@@ -2846,6 +2904,11 @@
 		Marshal.FreeHGlobal(pchWorkingDirectoryUtf8);
 		return result;
 	}
+	public EVRApplicationError RegisterSubprocess(uint nPid)
+	{
+		EVRApplicationError result = FnTable.RegisterSubprocess(nPid);
+		return result;
+	}
 	public uint GetCurrentSceneProcessId()
 	{
 		uint result = FnTable.GetCurrentSceneProcessId();
@@ -4342,6 +4405,16 @@
 		EVRInputError result = FnTable.SetDominantHand(eDominantHand);
 		return result;
 	}
+	public EVRInputError GetEyeTrackingDataRelativeToNow(ulong action,ETrackingUniverseOrigin eOrigin,float fPredictedSecondsFromNow,ref VREyeTrackingData_t pEyeTrackingData,uint ulEyeTrackingDataSize)
+	{
+		EVRInputError result = FnTable.GetEyeTrackingDataRelativeToNow(action,eOrigin,fPredictedSecondsFromNow,ref pEyeTrackingData,ulEyeTrackingDataSize);
+		return result;
+	}
+	public EVRInputError GetEyeTrackingDataForNextFrame(ulong action,ETrackingUniverseOrigin eOrigin,ref VREyeTrackingData_t pEyeTrackingData,uint ulEyeTrackingDataSize)
+	{
+		EVRInputError result = FnTable.GetEyeTrackingDataForNextFrame(action,eOrigin,ref pEyeTrackingData,ulEyeTrackingDataSize);
+		return result;
+	}
 	public EVRInputError GetBoneCount(ulong action,ref uint pBoneCount)
 	{
 		pBoneCount = 0;
@@ -4577,10 +4650,10 @@
 	{
 		FnTable = (IVRIPCResourceManagerClient)Marshal.PtrToStructure(pInterface, typeof(IVRIPCResourceManagerClient));
 	}
-	public bool NewSharedVulkanImage(uint nImageFormat,uint nWidth,uint nHeight,bool bRenderable,bool bMappable,bool bComputeAccess,uint unMipLevels,uint unArrayLayerCount,ref ulong pSharedHandle)
+	public bool NewSharedVulkanImage(uint nImageFormat,uint nWidth,uint nHeight,bool bRenderable,bool bMappable,bool bComputeAccess,uint unMipLevels,uint unArrayLayerCount,uint unAdditionalVkCreateFlags,uint unAdditionalVkUsageFlags,ref ulong pSharedHandle)
 	{
 		pSharedHandle = 0;
-		bool result = FnTable.NewSharedVulkanImage(nImageFormat,nWidth,nHeight,bRenderable,bMappable,bComputeAccess,unMipLevels,unArrayLayerCount,ref pSharedHandle);
+		bool result = FnTable.NewSharedVulkanImage(nImageFormat,nWidth,nHeight,bRenderable,bMappable,bComputeAccess,unMipLevels,unArrayLayerCount,unAdditionalVkCreateFlags,unAdditionalVkUsageFlags,ref pSharedHandle);
 		return result;
 	}
 	public bool NewSharedVulkanBuffer(uint nSize,uint nUsageFlags,ref ulong pSharedHandle)
@@ -4923,12 +4996,14 @@
 	Prop_AllowLightSourceFrequency_Bool = 1056,
 	Prop_SteamRemoteClientID_Uint64 = 1057,
 	Prop_Reserved_1058 = 1058,
+	Prop_Reserved_1059 = 1059,
+	Prop_Reserved_1060 = 1060,
 	Prop_ReportsTimeSinceVSync_Bool = 2000,
 	Prop_SecondsFromVsyncToPhotons_Float = 2001,
 	Prop_DisplayFrequency_Float = 2002,
 	Prop_UserIpdMeters_Float = 2003,
 	Prop_CurrentUniverseId_Uint64 = 2004,
-	Prop_PreviousUniverseId_Uint64 = 2005,
+	Prop_PreviousUniverseId_Uint64_deprecated = 0,
 	Prop_DisplayFirmwareVersion_Uint64 = 2006,
 	Prop_IsOnDesktop_Bool = 2007,
 	Prop_DisplayMCType_Int32 = 2008,
@@ -5147,10 +5222,12 @@
 	Submit_VulkanTextureWithArrayData = 64,
 	Submit_GlArrayTexture = 128,
 	Submit_IsEgl = 256,
+	Submit_TextureWithMotion = 536,
 	Submit_Reserved2 = 32768,
 	Submit_Reserved3 = 65536,
 	Submit_Reserved4 = 131072,
 	Submit_Reserved5 = 262144,
+	Submit_Reserved6 = 524288,
 }
 public enum EVRState
 {
@@ -5248,6 +5325,7 @@
 	VREvent_MutualSteamCapabilitiesChanged = 538,
 	VREvent_OverlayCreated = 539,
 	VREvent_OverlayDestroyed = 540,
+	VREvent_OverlayNameChanged = 544,
 	VREvent_TrackingRecordingStarted = 541,
 	VREvent_TrackingRecordingStopped = 542,
 	VREvent_SetTrackingRecordingPath = 543,
@@ -5278,6 +5356,9 @@
 	VREvent_Reserved_0809 = 809,
 	VREvent_Reserved_0810 = 810,
 	VREvent_Reserved_0811 = 811,
+	VREvent_Reserved_0812 = 812,
+	VREvent_Reserved_0813 = 813,
+	VREvent_Reserved_0814 = 814,
 	VREvent_AudioSettingsHaveChanged = 820,
 	VREvent_BackgroundSettingHasChanged = 850,
 	VREvent_CameraSettingsHaveChanged = 851,
@@ -5302,6 +5383,7 @@
 	VREvent_WindowsMRSectionSettingChanged = 870,
 	VREvent_OtherSectionSettingChanged = 871,
 	VREvent_AnyDriverSettingsChanged = 872,
+	VREvent_Reserved_0873 = 873,
 	VREvent_StatusUpdate = 900,
 	VREvent_WebInterface_InstallDriverCompleted = 950,
 	VREvent_MCImageUpdated = 1000,
@@ -5644,6 +5726,8 @@
 	Init_VRDashboardTokenFailure = 165,
 	Init_VRDashboardEnvironmentFailure = 166,
 	Init_VRDashboardPathFailure = 167,
+	Init_InstallationTooOld = 168,
+	Init_ClientVersionAlreadyProvided = 169,
 	Driver_Failed = 200,
 	Driver_Unknown = 201,
 	Driver_HmdUnknown = 202,
@@ -5789,6 +5873,10 @@
 	VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113,
 	VendorSpecific_OculusRuntimeBadInstall = 1114,
 	VendorSpecific_HmdFound_UnexpectedConfiguration_1 = 1115,
+	VendorSpecific_Oasis_UnlockRequired = 1150,
+	VendorSpecific_VRLink_OutdatedDriverMESA = 1200,
+	VendorSpecific_VRLink_OutdatedDriverNVIDIA = 1201,
+	VendorSpecific_VRLink_NoVideoSupport = 1202,
 	Steam_SteamInstallationNotFound = 2000,
 	LastError = 2001,
 }
@@ -5867,6 +5955,16 @@
 	OffScale_GyroY = 16,
 	OffScale_GyroZ = 32,
 }
+public enum EVRDistortionChannel
+{
+	Red = 0,
+	Green = 1,
+	Blue = 2,
+	InverseRed = 3,
+	InverseGreen = 4,
+	InverseBlue = 5,
+	Count = 6,
+}
 public enum EVRApplicationError
 {
 	None = 0,
@@ -5886,6 +5984,7 @@
 	TransitionAborted = 113,
 	IsTemplate = 114,
 	SteamVRIsExiting = 115,
+	WaitingForChaperone = 116,
 	BufferTooSmall = 200,
 	PropertyNotSet = 201,
 	UnknownProperty = 202,
@@ -6016,6 +6115,7 @@
 	MinimalControlBar = 67108864,
 	EnableClickStabilization = 134217728,
 	MultiCursor = 268435456,
+	NoBackside = 536870912,
 }
 public enum VRMessageOverlayResponse
 {
@@ -6465,6 +6565,15 @@
 	public HmdMatrix34_t mDeviceToAbsoluteTracking;
 	public VRTextureDepthInfo_t depth;
 }
+[StructLayout(LayoutKind.Sequential)] public struct VRTextureMotionInfo_t
+{
+	public IntPtr handle; // void *
+	public HmdMatrix44_t mDeltaPose;
+}
+[StructLayout(LayoutKind.Sequential)] public struct VRTextureWithMotion_t
+{
+	public VRTextureMotionInfo_t motion;
+}
 [StructLayout(LayoutKind.Sequential)] public struct DmabufPlane_t
 {
 	public uint unOffset;
@@ -6605,7 +6714,7 @@
 }
 [StructLayout(LayoutKind.Sequential)] public struct VREvent_Chaperone_t
 {
-	public ulong m_nPreviousUniverse;
+	public ulong m_nPreviousUniverse_deprecated;
 	public ulong m_nCurrentUniverse;
 }
 [StructLayout(LayoutKind.Sequential)] public struct VREvent_Reserved_t
@@ -6864,6 +6973,11 @@
 	public HmdVector3d_t vGyro;
 	public uint unOffScaleFlags;
 }
+[StructLayout(LayoutKind.Sequential)] public struct DistortionCoordinate_t
+{
+	public float u;
+	public float v;
+}
 [StructLayout(LayoutKind.Sequential)] public struct AppOverrideKeys_t
 {
 	public IntPtr pchKey; // const char *
@@ -7896,6 +8010,11 @@
 {
 	public IntPtr m_pProperties; // class vr::IVRProperties *
 }
+[StructLayout(LayoutKind.Sequential)] public struct PathWriteOptions_t
+{
+	[MarshalAs(UnmanagedType.I1)]
+	public bool bPostEvents;
+}
 [StructLayout(LayoutKind.Sequential)] public struct PathWrite_t
 {
 	public ulong ulPath;
@@ -7906,6 +8025,10 @@
 	public uint unTag;
 	public ETrackedPropertyError eError;
 	public IntPtr pszPath; // const char *
+	[MarshalAs(UnmanagedType.I1)]
+	public bool bPostEvents;
+	[MarshalAs(UnmanagedType.I1)]
+	public bool bValueChanged;
 }
 [StructLayout(LayoutKind.Sequential)] public struct PathRead_t
 {
@@ -8030,13 +8153,13 @@
 	public const ulong k_ulOverlayHandleInvalid = 0;
 	public const uint k_unMaxDistortionFunctionParameters = 8;
 	public const uint k_unScreenshotHandleInvalid = 0;
-	public const string IVRSystem_Version = "IVRSystem_023";
+	public const string IVRSystem_Version = "IVRSystem_026";
 	public const string IVRExtendedDisplay_Version = "IVRExtendedDisplay_001";
 	public const string IVRTrackedCamera_Version = "IVRTrackedCamera_006";
 	public const uint k_unMaxApplicationKeyLength = 128;
 	public const string k_pch_MimeType_HomeApp = "vr/home";
 	public const string k_pch_MimeType_GameTheater = "vr/game_theater";
-	public const string IVRApplications_Version = "IVRApplications_007";
+	public const string IVRApplications_Version = "IVRApplications_008";
 	public const string IVRChaperone_Version = "IVRChaperone_004";
 	public const string IVRChaperoneSetup_Version = "IVRChaperoneSetup_006";
 	public const string IVRCompositor_Version = "IVRCompositor_029";
@@ -8064,6 +8187,7 @@
 	public const uint k_unMaxSettingsKeyLength = 128;
 	public const string IVRSettings_Version = "IVRSettings_003";
 	public const string k_pch_SteamVR_Section = "steamvr";
+	public const string k_pch_SteamVR_Contrast_Float = "contrast";
 	public const string k_pch_SteamVR_RequireHmd_String = "requireHmd";
 	public const string k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
 	public const string k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
@@ -8081,6 +8205,7 @@
 	public const string k_pch_SteamVR_GridColor_String = "gridColor";
 	public const string k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
 	public const string k_pch_SteamVR_TrackingLossColor_String = "trackingLossColor";
+	public const string k_pch_SteamVR_StartColor_String = "startColor";
 	public const string k_pch_SteamVR_ShowStage_Bool = "showStage";
 	public const string k_pch_SteamVR_DrawTrackingReferences_Bool = "drawTrackingReferences";
 	public const string k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
@@ -8093,6 +8218,8 @@
 	public const string k_pch_SteamVR_MaxRecommendedResolution_Int32 = "maxRecommendedResolution";
 	public const string k_pch_SteamVR_MotionSmoothing_Bool = "motionSmoothing";
 	public const string k_pch_SteamVR_MotionSmoothingOverride_Int32 = "motionSmoothingOverride";
+	public const string k_pch_SteamVR_FoveatedSharpening_Bool = "sharpening";
+	public const string k_pch_SteamVR_FoveatedSharpeningOverride_Int32 = "sharpeningOverride";
 	public const string k_pch_SteamVR_FramesToThrottle_Int32 = "framesToThrottle";
 	public const string k_pch_SteamVR_AdditionalFramesToPredict_Int32 = "additionalFramesToPredict";
 	public const string k_pch_SteamVR_WorldScale_Float = "worldScale";
@@ -8252,18 +8379,18 @@
 	public const string k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout";
 	public const string k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress";
 	public const string k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby";
+	public const string k_pch_Power_OverrideWindowsPowerScheme_Bool = "overrideWindowsPowerScheme";
 	public const string k_pch_Dashboard_Section = "dashboard";
 	public const string k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard";
 	public const string k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode";
 	public const string k_pch_Dashboard_Position = "position";
-	public const string k_pch_Dashboard_DesktopScale = "desktopScale";
 	public const string k_pch_Dashboard_DashboardScale = "dashboardScale";
 	public const string k_pch_Dashboard_UseStandaloneSystemLayer = "standaloneSystemLayer";
 	public const string k_pch_Dashboard_AllowSteamOverlays_Bool = "allowSteamOverlays";
 	public const string k_pch_Dashboard_AllowVRGamepadUI_Bool = "allowVRGamepadUI";
-	public const string k_pch_Dashboard_AllowVRGamepadUIViaGamescope_Bool = "allowVRGamepadUIViaGamescope";
 	public const string k_pch_Dashboard_SteamMatchesHMDFramerate = "steamMatchesHMDFramerate";
 	public const string k_pch_Dashboard_GrabHandleAcceleration = "grabHandleAcceleration";
+	public const string k_pch_Dashboard_OverlayBacksideColor_String = "overlayBacksideColor";
 	public const string k_pch_modelskin_Section = "modelskins";
 	public const string k_pch_Driver_Enable_Bool = "enable";
 	public const string k_pch_Driver_BlockedBySafemode_Bool = "blocked_by_safe_mode";
@@ -8309,13 +8436,16 @@
 	public const int k_nActionSetOverlayGlobalPriorityMin = 16777216;
 	public const int k_nActionSetOverlayGlobalPriorityMax = 33554431;
 	public const int k_nActionSetPriorityReservedMin = 33554432;
-	public const string IVRInput_Version = "IVRInput_010";
+	public const string IVRInput_Version = "IVRInput_011";
 	public const ulong k_ulInvalidIOBufferHandle = 0;
 	public const string IVRIOBuffer_Version = "IVRIOBuffer_002";
 	public const uint k_ulInvalidSpatialAnchorHandle = 0;
 	public const string IVRSpatialAnchors_Version = "IVRSpatialAnchors_001";
 	public const string IVRDebug_Version = "IVRDebug_001";
-	public const string IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
+	public const string IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_003";
+	public const uint k_nSteamVRVersionMajor = 2;
+	public const uint k_nSteamVRVersionMinor = 15;
+	public const uint k_nSteamVRVersionBuild = 6;
 	public const ulong k_ulDisplayRedirectContainer = 25769803779;
 	public const string IVRProperties_Version = "IVRProperties_001";
 	public const string k_pchPathUserHandRight = "/user/hand/right";
@@ -8361,7 +8491,7 @@
 	public const string k_pchPathUserKeyboard = "/user/keyboard";
 	public const string k_pchPathClientAppKey = "/client_info/app_key";
 	public const ulong k_ulInvalidPathHandle = 0;
-	public const string IVRPaths_Version = "IVRPaths_001";
+	public const string IVRPaths_Version = "IVRPaths_002";
 	public const string IVRBlockQueue_Version = "IVRBlockQueue_005";
 
 	static uint VRToken { get; set; }
@@ -8382,6 +8512,7 @@
 			m_pVROverlay = null;
 			m_pVROverlayView = null;
 			m_pVRRenderModels = null;
+			m_pVRResources = null;
 			m_pVRExtendedDisplay = null;
 			m_pVRSettings = null;
 			m_pVRApplications = null;
@@ -8507,6 +8638,19 @@
 			return m_pVRRenderModels;
 		}
 
+		public CVRResources VRResources()
+		{
+			CheckClear();
+			if (m_pVRResources == null)
+			{
+				var eError = EVRInitError.None;
+				var pInterface = OpenVRInterop.GetGenericInterface(FnTable_Prefix+IVRResources_Version, ref eError);
+				if (pInterface != IntPtr.Zero && eError == EVRInitError.None)
+					m_pVRResources = new CVRResources(pInterface);
+			}
+			return m_pVRResources;
+		}
+
 		public CVRExtendedDisplay VRExtendedDisplay()
 		{
 			CheckClear();
@@ -8645,6 +8789,7 @@
 		private CVROverlay m_pVROverlay;
 		private CVROverlayView m_pVROverlayView;
 		private CVRRenderModels m_pVRRenderModels;
+		private CVRResources m_pVRResources;
 		private CVRExtendedDisplay m_pVRExtendedDisplay;
 		private CVRSettings m_pVRSettings;
 		private CVRApplications m_pVRApplications;
@@ -8676,6 +8821,7 @@
 	public static CVROverlay Overlay { get { return OpenVRInternal_ModuleContext.VROverlay(); } }
 	public static CVROverlayView OverlayView { get { return OpenVRInternal_ModuleContext.VROverlayView(); } }
 	public static CVRRenderModels RenderModels { get { return OpenVRInternal_ModuleContext.VRRenderModels(); } }
+	public static CVRResources Resources { get { return OpenVRInternal_ModuleContext.VRResources(); } }
 	public static CVRExtendedDisplay ExtendedDisplay { get { return OpenVRInternal_ModuleContext.VRExtendedDisplay(); } }
 	public static CVRSettings Settings { get { return OpenVRInternal_ModuleContext.VRSettings(); } }
 	public static CVRApplications Applications { get { return OpenVRInternal_ModuleContext.VRApplications(); } }
@@ -8691,6 +8837,8 @@
 	/** Finds the active installation of vrclient.dll and initializes it */
 	public static CVRSystem Init(ref EVRInitError peError, EVRApplicationType eApplicationType = EVRApplicationType.VRApplication_Scene, string pchStartupInfo= "")
 	{
+		CVRSystem pSystem = null;
+
 		try
 		{
 			VRToken = InitInternal2(ref peError, eApplicationType, pchStartupInfo);
@@ -8702,18 +8850,24 @@
 
 		OpenVRInternal_ModuleContext.Clear();
 
-		if (peError != EVRInitError.None)
-			return null;
-
-		bool bInterfaceValid = IsInterfaceVersionValid(IVRSystem_Version);
-		if (!bInterfaceValid)
+		if (peError == EVRInitError.None && !IsInterfaceVersionValid(IVRSystem_Version))
 		{
-			ShutdownInternal();
 			peError = EVRInitError.Init_InterfaceNotFound;
-			return null;
 		}
 
-		return OpenVR.System;
+		if (peError == EVRInitError.None)
+		{
+			pSystem = OpenVR.System;
+			peError = pSystem.SetSDKVersion(k_nSteamVRVersionMajor, k_nSteamVRVersionMinor, k_nSteamVRVersionBuild);
+		}
+
+		if (peError != EVRInitError.None)
+		{
+			pSystem = null;
+			ShutdownInternal();
+		}
+
+		return pSystem;
 	}
 
 	/** unloads vrclient.dll. Any interface pointers from the interface are
diff --git a/headers/openvr_api.json b/headers/openvr_api.json
index 382e051..6e0be00 100644
--- a/headers/openvr_api.json
+++ b/headers/openvr_api.json
@@ -165,12 +165,14 @@
 	,{"name": "Prop_AllowLightSourceFrequency_Bool","value": "1056"}
 	,{"name": "Prop_SteamRemoteClientID_Uint64","value": "1057"}
 	,{"name": "Prop_Reserved_1058","value": "1058"}
+	,{"name": "Prop_Reserved_1059","value": "1059"}
+	,{"name": "Prop_Reserved_1060","value": "1060"}
 	,{"name": "Prop_ReportsTimeSinceVSync_Bool","value": "2000"}
 	,{"name": "Prop_SecondsFromVsyncToPhotons_Float","value": "2001"}
 	,{"name": "Prop_DisplayFrequency_Float","value": "2002"}
 	,{"name": "Prop_UserIpdMeters_Float","value": "2003"}
 	,{"name": "Prop_CurrentUniverseId_Uint64","value": "2004"}
-	,{"name": "Prop_PreviousUniverseId_Uint64","value": "2005"}
+	,{"name": "Prop_PreviousUniverseId_Uint64_deprecated","value": "0"}
 	,{"name": "Prop_DisplayFirmwareVersion_Uint64","value": "2006"}
 	,{"name": "Prop_IsOnDesktop_Bool","value": "2007"}
 	,{"name": "Prop_DisplayMCType_Int32","value": "2008"}
@@ -386,10 +388,12 @@
 	,{"name": "Submit_VulkanTextureWithArrayData","value": "64"}
 	,{"name": "Submit_GlArrayTexture","value": "128"}
 	,{"name": "Submit_IsEgl","value": "256"}
+	,{"name": "Submit_TextureWithMotion","value": "536"}
 	,{"name": "Submit_Reserved2","value": "32768"}
 	,{"name": "Submit_Reserved3","value": "65536"}
 	,{"name": "Submit_Reserved4","value": "131072"}
 	,{"name": "Submit_Reserved5","value": "262144"}
+	,{"name": "Submit_Reserved6","value": "524288"}
 ]}
 ,	{"enumname": "vr::EVRState","values": [ 
 	{"name": "VRState_Undefined","value": "-1"}
@@ -485,6 +489,7 @@
 	,{"name": "VREvent_MutualSteamCapabilitiesChanged","value": "538"}
 	,{"name": "VREvent_OverlayCreated","value": "539"}
 	,{"name": "VREvent_OverlayDestroyed","value": "540"}
+	,{"name": "VREvent_OverlayNameChanged","value": "544"}
 	,{"name": "VREvent_TrackingRecordingStarted","value": "541"}
 	,{"name": "VREvent_TrackingRecordingStopped","value": "542"}
 	,{"name": "VREvent_SetTrackingRecordingPath","value": "543"}
@@ -515,6 +520,9 @@
 	,{"name": "VREvent_Reserved_0809","value": "809"}
 	,{"name": "VREvent_Reserved_0810","value": "810"}
 	,{"name": "VREvent_Reserved_0811","value": "811"}
+	,{"name": "VREvent_Reserved_0812","value": "812"}
+	,{"name": "VREvent_Reserved_0813","value": "813"}
+	,{"name": "VREvent_Reserved_0814","value": "814"}
 	,{"name": "VREvent_AudioSettingsHaveChanged","value": "820"}
 	,{"name": "VREvent_BackgroundSettingHasChanged","value": "850"}
 	,{"name": "VREvent_CameraSettingsHaveChanged","value": "851"}
@@ -539,6 +547,7 @@
 	,{"name": "VREvent_WindowsMRSectionSettingChanged","value": "870"}
 	,{"name": "VREvent_OtherSectionSettingChanged","value": "871"}
 	,{"name": "VREvent_AnyDriverSettingsChanged","value": "872"}
+	,{"name": "VREvent_Reserved_0873","value": "873"}
 	,{"name": "VREvent_StatusUpdate","value": "900"}
 	,{"name": "VREvent_WebInterface_InstallDriverCompleted","value": "950"}
 	,{"name": "VREvent_MCImageUpdated","value": "1000"}
@@ -862,6 +871,8 @@
 	,{"name": "VRInitError_Init_VRDashboardTokenFailure","value": "165"}
 	,{"name": "VRInitError_Init_VRDashboardEnvironmentFailure","value": "166"}
 	,{"name": "VRInitError_Init_VRDashboardPathFailure","value": "167"}
+	,{"name": "VRInitError_Init_InstallationTooOld","value": "168"}
+	,{"name": "VRInitError_Init_ClientVersionAlreadyProvided","value": "169"}
 	,{"name": "VRInitError_Driver_Failed","value": "200"}
 	,{"name": "VRInitError_Driver_Unknown","value": "201"}
 	,{"name": "VRInitError_Driver_HmdUnknown","value": "202"}
@@ -1007,6 +1018,10 @@
 	,{"name": "VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck","value": "1113"}
 	,{"name": "VRInitError_VendorSpecific_OculusRuntimeBadInstall","value": "1114"}
 	,{"name": "VRInitError_VendorSpecific_HmdFound_UnexpectedConfiguration_1","value": "1115"}
+	,{"name": "VRInitError_VendorSpecific_Oasis_UnlockRequired","value": "1150"}
+	,{"name": "VRInitError_VendorSpecific_VRLink_OutdatedDriverMESA","value": "1200"}
+	,{"name": "VRInitError_VendorSpecific_VRLink_OutdatedDriverNVIDIA","value": "1201"}
+	,{"name": "VRInitError_VendorSpecific_VRLink_NoVideoSupport","value": "1202"}
 	,{"name": "VRInitError_Steam_SteamInstallationNotFound","value": "2000"}
 	,{"name": "VRInitError_LastError","value": "2001"}
 ]}
@@ -1076,6 +1091,15 @@
 	,{"name": "OffScale_GyroY","value": "16"}
 	,{"name": "OffScale_GyroZ","value": "32"}
 ]}
+,	{"enumname": "vr::EVRDistortionChannel","values": [ 
+	{"name": "Red","value": "0"}
+	,{"name": "Green","value": "1"}
+	,{"name": "Blue","value": "2"}
+	,{"name": "InverseRed","value": "3"}
+	,{"name": "InverseGreen","value": "4"}
+	,{"name": "InverseBlue","value": "5"}
+	,{"name": "Count","value": "6"}
+]}
 ,	{"enumname": "vr::EVRApplicationError","values": [ 
 	{"name": "VRApplicationError_None","value": "0"}
 	,{"name": "VRApplicationError_AppKeyAlreadyExists","value": "100"}
@@ -1094,6 +1118,7 @@
 	,{"name": "VRApplicationError_TransitionAborted","value": "113"}
 	,{"name": "VRApplicationError_IsTemplate","value": "114"}
 	,{"name": "VRApplicationError_SteamVRIsExiting","value": "115"}
+	,{"name": "VRApplicationError_WaitingForChaperone","value": "116"}
 	,{"name": "VRApplicationError_BufferTooSmall","value": "200"}
 	,{"name": "VRApplicationError_PropertyNotSet","value": "201"}
 	,{"name": "VRApplicationError_UnknownProperty","value": "202"}
@@ -1213,6 +1238,7 @@
 	,{"name": "VROverlayFlags_MinimalControlBar","value": "67108864"}
 	,{"name": "VROverlayFlags_EnableClickStabilization","value": "134217728"}
 	,{"name": "VROverlayFlags_MultiCursor","value": "268435456"}
+	,{"name": "VROverlayFlags_NoBackside","value": "536870912"}
 ]}
 ,	{"enumname": "vr::VRMessageOverlayResponse","values": [ 
 	{"name": "VRMessageOverlayResponse_ButtonPress_0","value": "0"}
@@ -1477,7 +1503,7 @@
 ,{
 	"constname": "k_unScreenshotHandleInvalid","consttype": "const uint32_t", "constval": "0"}
 ,{
-	"constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_023"}
+	"constname": "IVRSystem_Version","consttype": "const char *const", "constval": "IVRSystem_026"}
 ,{
 	"constname": "IVRExtendedDisplay_Version","consttype": "const char *const", "constval": "IVRExtendedDisplay_001"}
 ,{
@@ -1489,7 +1515,7 @@
 ,{
 	"constname": "k_pch_MimeType_GameTheater","consttype": "const char *const", "constval": "vr/game_theater"}
 ,{
-	"constname": "IVRApplications_Version","consttype": "const char *const", "constval": "IVRApplications_007"}
+	"constname": "IVRApplications_Version","consttype": "const char *const", "constval": "IVRApplications_008"}
 ,{
 	"constname": "IVRChaperone_Version","consttype": "const char *const", "constval": "IVRChaperone_004"}
 ,{
@@ -1545,6 +1571,8 @@
 ,{
 	"constname": "k_pch_SteamVR_Section","consttype": "const char *const", "constval": "steamvr"}
 ,{
+	"constname": "k_pch_SteamVR_Contrast_Float","consttype": "const char *const", "constval": "contrast"}
+,{
 	"constname": "k_pch_SteamVR_RequireHmd_String","consttype": "const char *const", "constval": "requireHmd"}
 ,{
 	"constname": "k_pch_SteamVR_ForcedDriverKey_String","consttype": "const char *const", "constval": "forcedDriver"}
@@ -1579,6 +1607,8 @@
 ,{
 	"constname": "k_pch_SteamVR_TrackingLossColor_String","consttype": "const char *const", "constval": "trackingLossColor"}
 ,{
+	"constname": "k_pch_SteamVR_StartColor_String","consttype": "const char *const", "constval": "startColor"}
+,{
 	"constname": "k_pch_SteamVR_ShowStage_Bool","consttype": "const char *const", "constval": "showStage"}
 ,{
 	"constname": "k_pch_SteamVR_DrawTrackingReferences_Bool","consttype": "const char *const", "constval": "drawTrackingReferences"}
@@ -1603,6 +1633,10 @@
 ,{
 	"constname": "k_pch_SteamVR_MotionSmoothingOverride_Int32","consttype": "const char *const", "constval": "motionSmoothingOverride"}
 ,{
+	"constname": "k_pch_SteamVR_FoveatedSharpening_Bool","consttype": "const char *const", "constval": "sharpening"}
+,{
+	"constname": "k_pch_SteamVR_FoveatedSharpeningOverride_Int32","consttype": "const char *const", "constval": "sharpeningOverride"}
+,{
 	"constname": "k_pch_SteamVR_FramesToThrottle_Int32","consttype": "const char *const", "constval": "framesToThrottle"}
 ,{
 	"constname": "k_pch_SteamVR_AdditionalFramesToPredict_Int32","consttype": "const char *const", "constval": "additionalFramesToPredict"}
@@ -1921,6 +1955,8 @@
 ,{
 	"constname": "k_pch_Power_PauseCompositorOnStandby_Bool","consttype": "const char *const", "constval": "pauseCompositorOnStandby"}
 ,{
+	"constname": "k_pch_Power_OverrideWindowsPowerScheme_Bool","consttype": "const char *const", "constval": "overrideWindowsPowerScheme"}
+,{
 	"constname": "k_pch_Dashboard_Section","consttype": "const char *const", "constval": "dashboard"}
 ,{
 	"constname": "k_pch_Dashboard_EnableDashboard_Bool","consttype": "const char *const", "constval": "enableDashboard"}
@@ -1929,8 +1965,6 @@
 ,{
 	"constname": "k_pch_Dashboard_Position","consttype": "const char *const", "constval": "position"}
 ,{
-	"constname": "k_pch_Dashboard_DesktopScale","consttype": "const char *const", "constval": "desktopScale"}
-,{
 	"constname": "k_pch_Dashboard_DashboardScale","consttype": "const char *const", "constval": "dashboardScale"}
 ,{
 	"constname": "k_pch_Dashboard_UseStandaloneSystemLayer","consttype": "const char *const", "constval": "standaloneSystemLayer"}
@@ -1939,12 +1973,12 @@
 ,{
 	"constname": "k_pch_Dashboard_AllowVRGamepadUI_Bool","consttype": "const char *const", "constval": "allowVRGamepadUI"}
 ,{
-	"constname": "k_pch_Dashboard_AllowVRGamepadUIViaGamescope_Bool","consttype": "const char *const", "constval": "allowVRGamepadUIViaGamescope"}
-,{
 	"constname": "k_pch_Dashboard_SteamMatchesHMDFramerate","consttype": "const char *const", "constval": "steamMatchesHMDFramerate"}
 ,{
 	"constname": "k_pch_Dashboard_GrabHandleAcceleration","consttype": "const char *const", "constval": "grabHandleAcceleration"}
 ,{
+	"constname": "k_pch_Dashboard_OverlayBacksideColor_String","consttype": "const char *const", "constval": "overlayBacksideColor"}
+,{
 	"constname": "k_pch_modelskin_Section","consttype": "const char *const", "constval": "modelskins"}
 ,{
 	"constname": "k_pch_Driver_Enable_Bool","consttype": "const char *const", "constval": "enable"}
@@ -2035,7 +2069,7 @@
 ,{
 	"constname": "k_nActionSetPriorityReservedMin","consttype": "const int32_t", "constval": "33554432"}
 ,{
-	"constname": "IVRInput_Version","consttype": "const char *const", "constval": "IVRInput_010"}
+	"constname": "IVRInput_Version","consttype": "const char *const", "constval": "IVRInput_011"}
 ,{
 	"constname": "k_ulInvalidIOBufferHandle","consttype": "const uint64_t", "constval": "0"}
 ,{
@@ -2047,99 +2081,105 @@
 ,{
 	"constname": "IVRDebug_Version","consttype": "const char *const", "constval": "IVRDebug_001"}
 ,{
-	"constname": "IVRIPCResourceManagerClient_Version","consttype": "const char *", "constval": "IVRIPCResourceManagerClient_002"}
+	"constname": "IVRIPCResourceManagerClient_Version","consttype": "const char *", "constval": "IVRIPCResourceManagerClient_003"}
+,{
+	"constname": "k_nSteamVRVersionMajor","consttype": "const uint32_t", "constval": "2"}
+,{
+	"constname": "k_nSteamVRVersionMinor","consttype": "const uint32_t", "constval": "15"}
+,{
+	"constname": "k_nSteamVRVersionBuild","consttype": "const uint32_t", "constval": "6"}
 ,{
 	"constname": "k_ulDisplayRedirectContainer","consttype": "const PropertyContainerHandle_t", "constval": "25769803779"}
 ,{
 	"constname": "IVRProperties_Version","consttype": "const char *const", "constval": "IVRProperties_001"}
 ,{
-	"constname": "k_pchPathUserHandRight","consttype": "const char *", "constval": "/user/hand/right"}
+	"constname": "k_pchPathUserHandRight","consttype": "const char *const", "constval": "/user/hand/right"}
 ,{
-	"constname": "k_pchPathUserHandLeft","consttype": "const char *", "constval": "/user/hand/left"}
+	"constname": "k_pchPathUserHandLeft","consttype": "const char *const", "constval": "/user/hand/left"}
 ,{
-	"constname": "k_pchPathUserHandPrimary","consttype": "const char *", "constval": "/user/hand/primary"}
+	"constname": "k_pchPathUserHandPrimary","consttype": "const char *const", "constval": "/user/hand/primary"}
 ,{
-	"constname": "k_pchPathUserHandSecondary","consttype": "const char *", "constval": "/user/hand/secondary"}
+	"constname": "k_pchPathUserHandSecondary","consttype": "const char *const", "constval": "/user/hand/secondary"}
 ,{
-	"constname": "k_pchPathUserHead","consttype": "const char *", "constval": "/user/head"}
+	"constname": "k_pchPathUserHead","consttype": "const char *const", "constval": "/user/head"}
 ,{
-	"constname": "k_pchPathUserGamepad","consttype": "const char *", "constval": "/user/gamepad"}
+	"constname": "k_pchPathUserGamepad","consttype": "const char *const", "constval": "/user/gamepad"}
 ,{
-	"constname": "k_pchPathUserTreadmill","consttype": "const char *", "constval": "/user/treadmill"}
+	"constname": "k_pchPathUserTreadmill","consttype": "const char *const", "constval": "/user/treadmill"}
 ,{
-	"constname": "k_pchPathUserStylus","consttype": "const char *", "constval": "/user/stylus"}
+	"constname": "k_pchPathUserStylus","consttype": "const char *const", "constval": "/user/stylus"}
 ,{
-	"constname": "k_pchPathDevices","consttype": "const char *", "constval": "/devices"}
+	"constname": "k_pchPathDevices","consttype": "const char *const", "constval": "/devices"}
 ,{
-	"constname": "k_pchPathDevicePath","consttype": "const char *", "constval": "/device_path"}
+	"constname": "k_pchPathDevicePath","consttype": "const char *const", "constval": "/device_path"}
 ,{
-	"constname": "k_pchPathBestAliasPath","consttype": "const char *", "constval": "/best_alias_path"}
+	"constname": "k_pchPathBestAliasPath","consttype": "const char *const", "constval": "/best_alias_path"}
 ,{
-	"constname": "k_pchPathBoundTrackerAliasPath","consttype": "const char *", "constval": "/bound_tracker_path"}
+	"constname": "k_pchPathBoundTrackerAliasPath","consttype": "const char *const", "constval": "/bound_tracker_path"}
 ,{
-	"constname": "k_pchPathBoundTrackerRole","consttype": "const char *", "constval": "/bound_tracker_role"}
+	"constname": "k_pchPathBoundTrackerRole","consttype": "const char *const", "constval": "/bound_tracker_role"}
 ,{
-	"constname": "k_pchPathPoseRaw","consttype": "const char *", "constval": "/pose/raw"}
+	"constname": "k_pchPathPoseRaw","consttype": "const char *const", "constval": "/pose/raw"}
 ,{
-	"constname": "k_pchPathPoseTip","consttype": "const char *", "constval": "/pose/tip"}
+	"constname": "k_pchPathPoseTip","consttype": "const char *const", "constval": "/pose/tip"}
 ,{
-	"constname": "k_pchPathPoseGrip","consttype": "const char *", "constval": "/pose/grip"}
+	"constname": "k_pchPathPoseGrip","consttype": "const char *const", "constval": "/pose/grip"}
 ,{
-	"constname": "k_pchPathSystemButtonClick","consttype": "const char *", "constval": "/input/system/click"}
+	"constname": "k_pchPathSystemButtonClick","consttype": "const char *const", "constval": "/input/system/click"}
 ,{
-	"constname": "k_pchPathProximity","consttype": "const char *", "constval": "/proximity"}
+	"constname": "k_pchPathProximity","consttype": "const char *const", "constval": "/proximity"}
 ,{
-	"constname": "k_pchPathControllerTypePrefix","consttype": "const char *", "constval": "/controller_type/"}
+	"constname": "k_pchPathControllerTypePrefix","consttype": "const char *const", "constval": "/controller_type/"}
 ,{
-	"constname": "k_pchPathInputProfileSuffix","consttype": "const char *", "constval": "/input_profile"}
+	"constname": "k_pchPathInputProfileSuffix","consttype": "const char *const", "constval": "/input_profile"}
 ,{
-	"constname": "k_pchPathBindingNameSuffix","consttype": "const char *", "constval": "/binding_name"}
+	"constname": "k_pchPathBindingNameSuffix","consttype": "const char *const", "constval": "/binding_name"}
 ,{
-	"constname": "k_pchPathBindingUrlSuffix","consttype": "const char *", "constval": "/binding_url"}
+	"constname": "k_pchPathBindingUrlSuffix","consttype": "const char *const", "constval": "/binding_url"}
 ,{
-	"constname": "k_pchPathBindingErrorSuffix","consttype": "const char *", "constval": "/binding_error"}
+	"constname": "k_pchPathBindingErrorSuffix","consttype": "const char *const", "constval": "/binding_error"}
 ,{
-	"constname": "k_pchPathActiveActionSets","consttype": "const char *", "constval": "/active_action_sets"}
+	"constname": "k_pchPathActiveActionSets","consttype": "const char *const", "constval": "/active_action_sets"}
 ,{
-	"constname": "k_pchPathComponentUpdates","consttype": "const char *", "constval": "/total_component_updates"}
+	"constname": "k_pchPathComponentUpdates","consttype": "const char *const", "constval": "/total_component_updates"}
 ,{
-	"constname": "k_pchPathUserFootLeft","consttype": "const char *", "constval": "/user/foot/left"}
+	"constname": "k_pchPathUserFootLeft","consttype": "const char *const", "constval": "/user/foot/left"}
 ,{
-	"constname": "k_pchPathUserFootRight","consttype": "const char *", "constval": "/user/foot/right"}
+	"constname": "k_pchPathUserFootRight","consttype": "const char *const", "constval": "/user/foot/right"}
 ,{
-	"constname": "k_pchPathUserShoulderLeft","consttype": "const char *", "constval": "/user/shoulder/left"}
+	"constname": "k_pchPathUserShoulderLeft","consttype": "const char *const", "constval": "/user/shoulder/left"}
 ,{
-	"constname": "k_pchPathUserShoulderRight","consttype": "const char *", "constval": "/user/shoulder/right"}
+	"constname": "k_pchPathUserShoulderRight","consttype": "const char *const", "constval": "/user/shoulder/right"}
 ,{
-	"constname": "k_pchPathUserElbowLeft","consttype": "const char *", "constval": "/user/elbow/left"}
+	"constname": "k_pchPathUserElbowLeft","consttype": "const char *const", "constval": "/user/elbow/left"}
 ,{
-	"constname": "k_pchPathUserElbowRight","consttype": "const char *", "constval": "/user/elbow/right"}
+	"constname": "k_pchPathUserElbowRight","consttype": "const char *const", "constval": "/user/elbow/right"}
 ,{
-	"constname": "k_pchPathUserKneeLeft","consttype": "const char *", "constval": "/user/knee/left"}
+	"constname": "k_pchPathUserKneeLeft","consttype": "const char *const", "constval": "/user/knee/left"}
 ,{
-	"constname": "k_pchPathUserKneeRight","consttype": "const char *", "constval": "/user/knee/right"}
+	"constname": "k_pchPathUserKneeRight","consttype": "const char *const", "constval": "/user/knee/right"}
 ,{
-	"constname": "k_pchPathUserWristLeft","consttype": "const char *", "constval": "/user/wrist/left"}
+	"constname": "k_pchPathUserWristLeft","consttype": "const char *const", "constval": "/user/wrist/left"}
 ,{
-	"constname": "k_pchPathUserWristRight","consttype": "const char *", "constval": "/user/wrist/right"}
+	"constname": "k_pchPathUserWristRight","consttype": "const char *const", "constval": "/user/wrist/right"}
 ,{
-	"constname": "k_pchPathUserAnkleLeft","consttype": "const char *", "constval": "/user/ankle/left"}
+	"constname": "k_pchPathUserAnkleLeft","consttype": "const char *const", "constval": "/user/ankle/left"}
 ,{
-	"constname": "k_pchPathUserAnkleRight","consttype": "const char *", "constval": "/user/ankle/right"}
+	"constname": "k_pchPathUserAnkleRight","consttype": "const char *const", "constval": "/user/ankle/right"}
 ,{
-	"constname": "k_pchPathUserWaist","consttype": "const char *", "constval": "/user/waist"}
+	"constname": "k_pchPathUserWaist","consttype": "const char *const", "constval": "/user/waist"}
 ,{
-	"constname": "k_pchPathUserChest","consttype": "const char *", "constval": "/user/chest"}
+	"constname": "k_pchPathUserChest","consttype": "const char *const", "constval": "/user/chest"}
 ,{
-	"constname": "k_pchPathUserCamera","consttype": "const char *", "constval": "/user/camera"}
+	"constname": "k_pchPathUserCamera","consttype": "const char *const", "constval": "/user/camera"}
 ,{
-	"constname": "k_pchPathUserKeyboard","consttype": "const char *", "constval": "/user/keyboard"}
+	"constname": "k_pchPathUserKeyboard","consttype": "const char *const", "constval": "/user/keyboard"}
 ,{
-	"constname": "k_pchPathClientAppKey","consttype": "const char *", "constval": "/client_info/app_key"}
+	"constname": "k_pchPathClientAppKey","consttype": "const char *const", "constval": "/client_info/app_key"}
 ,{
 	"constname": "k_ulInvalidPathHandle","consttype": "const PathHandle_t", "constval": "0"}
 ,{
-	"constname": "IVRPaths_Version","consttype": "const char *const", "constval": "IVRPaths_001"}
+	"constname": "IVRPaths_Version","consttype": "const char *const", "constval": "IVRPaths_002"}
 ,{
 	"constname": "IVRBlockQueue_Version","consttype": "const char *", "constval": "IVRBlockQueue_005"}
 ],
@@ -2209,6 +2249,11 @@
 { "fieldname": "depth", "fieldtype": "struct vr::VRTextureDepthInfo_t"}]}
 ,{"struct": "vr::VRTextureWithPoseAndDepth_t","fields": [
 { "fieldname": "depth", "fieldtype": "struct vr::VRTextureDepthInfo_t"}]}
+,{"struct": "vr::VRTextureMotionInfo_t","fields": [
+{ "fieldname": "handle", "fieldtype": "void *"},
+{ "fieldname": "mDeltaPose", "fieldtype": "struct vr::HmdMatrix44_t"}]}
+,{"struct": "vr::VRTextureWithMotion_t","fields": [
+{ "fieldname": "motion", "fieldtype": "struct vr::VRTextureMotionInfo_t"}]}
 ,{"struct": "vr::DmabufPlane_t","fields": [
 { "fieldname": "unOffset", "fieldtype": "uint32_t"},
 { "fieldname": "unStride", "fieldtype": "uint32_t"},
@@ -2292,7 +2337,7 @@
 ,{"struct": "vr::VREvent_Ipd_t","fields": [
 { "fieldname": "ipdMeters", "fieldtype": "float"}]}
 ,{"struct": "vr::VREvent_Chaperone_t","fields": [
-{ "fieldname": "m_nPreviousUniverse", "fieldtype": "uint64_t"},
+{ "fieldname": "m_nPreviousUniverse_deprecated", "fieldtype": "uint64_t"},
 { "fieldname": "m_nCurrentUniverse", "fieldtype": "uint64_t"}]}
 ,{"struct": "vr::VREvent_Reserved_t","fields": [
 { "fieldname": "reserved0", "fieldtype": "uint64_t"},
@@ -2460,6 +2505,9 @@
 { "fieldname": "vAccel", "fieldtype": "struct vr::HmdVector3d_t"},
 { "fieldname": "vGyro", "fieldtype": "struct vr::HmdVector3d_t"},
 { "fieldname": "unOffScaleFlags", "fieldtype": "uint32_t"}]}
+,{"struct": "vr::DistortionCoordinate_t","fields": [
+{ "fieldname": "u", "fieldtype": "float"},
+{ "fieldname": "v", "fieldtype": "float"}]}
 ,{"struct": "vr::AppOverrideKeys_t","fields": [
 { "fieldname": "pchKey", "fieldtype": "const char *"},
 { "fieldname": "pchValue", "fieldtype": "const char *"}]}
@@ -2645,6 +2693,8 @@
 { "fieldname": "eError", "fieldtype": "enum vr::ETrackedPropertyError"}]}
 ,{"struct": "vr::CVRPropertyHelpers","fields": [
 { "fieldname": "m_pProperties", "fieldtype": "class vr::IVRProperties *"}]}
+,{"struct": "vr::PathWriteOptions_t","fields": [
+{ "fieldname": "bPostEvents", "fieldtype": "_Bool"}]}
 ,{"struct": "vr::PathWrite_t","fields": [
 { "fieldname": "ulPath", "fieldtype": "PathHandle_t"},
 { "fieldname": "writeType", "fieldtype": "enum vr::EPropertyWriteType"},
@@ -2653,7 +2703,9 @@
 { "fieldname": "unBufferSize", "fieldtype": "uint32_t"},
 { "fieldname": "unTag", "fieldtype": "PropertyTypeTag_t"},
 { "fieldname": "eError", "fieldtype": "enum vr::ETrackedPropertyError"},
-{ "fieldname": "pszPath", "fieldtype": "const char *"}]}
+{ "fieldname": "pszPath", "fieldtype": "const char *"},
+{ "fieldname": "bPostEvents", "fieldtype": "_Bool"},
+{ "fieldname": "bValueChanged", "fieldtype": "_Bool"}]}
 ,{"struct": "vr::PathRead_t","fields": [
 { "fieldname": "ulPath", "fieldtype": "PathHandle_t"},
 { "fieldname": "pvBuffer", "fieldtype": "void *"},
@@ -2707,6 +2759,19 @@
 }
 ,{
 	"classname": "vr::IVRSystem",
+	"methodname": "ComputeDistortionSet",
+	"returntype": "bool",
+	"params": [ 
+{	"paramname": "eEye" ,"paramtype": "vr::EVREye"},
+{	"paramname": "eChannel" ,"paramtype": "vr::EVRDistortionChannel"},
+{	"paramname": "bAsNormalizedDeviceCoordinates" ,"paramtype": "bool"},
+{	"paramname": "nNumCoordinates" ,"paramtype": "uint32_t"},
+{	"paramname": "pInput" ,"paramtype": "const struct vr::DistortionCoordinate_t *"},
+{	"paramname": "pOutput" ,"paramtype": "struct vr::DistortionCoordinate_t *"}
+	 ]
+}
+,{
+	"classname": "vr::IVRSystem",
 	"methodname": "GetEyeToHeadTransform",
 	"returntype": "struct vr::HmdMatrix34_t",
 	"params": [ 
@@ -2974,6 +3039,24 @@
 }
 ,{
 	"classname": "vr::IVRSystem",
+	"methodname": "GetEyeTrackedFoveationCenter",
+	"returntype": "bool",
+	"params": [ 
+{	"paramname": "pNdcLeft" ,"paramtype": "struct vr::HmdVector2_t *"},
+{	"paramname": "pNdcRight" ,"paramtype": "struct vr::HmdVector2_t *"}
+	 ]
+}
+,{
+	"classname": "vr::IVRSystem",
+	"methodname": "GetEyeTrackedFoveationCenterForProjection",
+	"returntype": "bool",
+	"params": [ 
+{	"paramname": "pProjMat" ,"paramtype": "const struct vr::HmdMatrix44_t *"},
+{	"paramname": "pNdc" ,"paramtype": "struct vr::HmdVector2_t *"}
+	 ]
+}
+,{
+	"classname": "vr::IVRSystem",
 	"methodname": "GetControllerState",
 	"returntype": "bool",
 	"params": [ 
@@ -3068,6 +3151,16 @@
 	"returntype": "const char *"
 }
 ,{
+	"classname": "vr::IVRSystem",
+	"methodname": "SetSDKVersion",
+	"returntype": "vr::EVRInitError",
+	"params": [ 
+{	"paramname": "nVersionMajor" ,"paramtype": "uint32_t"},
+{	"paramname": "nVersionMinor" ,"paramtype": "uint32_t"},
+{	"paramname": "nVersionBuild" ,"paramtype": "uint32_t"}
+	 ]
+}
+,{
 	"classname": "vr::IVRExtendedDisplay",
 	"methodname": "GetWindowBounds",
 	"returntype": "void",
@@ -3501,6 +3594,14 @@
 }
 ,{
 	"classname": "vr::IVRApplications",
+	"methodname": "RegisterSubprocess",
+	"returntype": "vr::EVRApplicationError",
+	"params": [ 
+{	"paramname": "nPid" ,"paramtype": "uint32_t"}
+	 ]
+}
+,{
+	"classname": "vr::IVRApplications",
 	"methodname": "GetCurrentSceneProcessId",
 	"returntype": "uint32_t"
 }
@@ -3658,7 +3759,7 @@
 	"methodname": "SetWorkingPerimeter",
 	"returntype": "void",
 	"params": [ 
-{	"paramname": "pPointBuffer" ,"array_count": "unPointCount" ,"paramtype": "struct vr::HmdVector2_t *"},
+{	"paramname": "pPointBuffer" ,"array_count": "unPointCount" ,"paramtype": "const struct vr::HmdVector2_t *"},
 {	"paramname": "unPointCount" ,"paramtype": "uint32_t"}
 	 ]
 }
@@ -5556,6 +5657,29 @@
 }
 ,{
 	"classname": "vr::IVRInput",
+	"methodname": "GetEyeTrackingDataRelativeToNow",
+	"returntype": "vr::EVRInputError",
+	"params": [ 
+{	"paramname": "action" ,"paramtype": "vr::VRActionHandle_t"},
+{	"paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"},
+{	"paramname": "fPredictedSecondsFromNow" ,"paramtype": "float"},
+{	"paramname": "pEyeTrackingData" ,"paramtype": "vr::VREyeTrackingData_t *"},
+{	"paramname": "ulEyeTrackingDataSize" ,"paramtype": "uint32_t"}
+	 ]
+}
+,{
+	"classname": "vr::IVRInput",
+	"methodname": "GetEyeTrackingDataForNextFrame",
+	"returntype": "vr::EVRInputError",
+	"params": [ 
+{	"paramname": "action" ,"paramtype": "vr::VRActionHandle_t"},
+{	"paramname": "eOrigin" ,"paramtype": "vr::ETrackingUniverseOrigin"},
+{	"paramname": "pEyeTrackingData" ,"paramtype": "vr::VREyeTrackingData_t *"},
+{	"paramname": "ulEyeTrackingDataSize" ,"paramtype": "uint32_t"}
+	 ]
+}
+,{
+	"classname": "vr::IVRInput",
 	"methodname": "GetBoneCount",
 	"returntype": "vr::EVRInputError",
 	"params": [ 
@@ -5913,6 +6037,8 @@
 {	"paramname": "bComputeAccess" ,"paramtype": "bool"},
 {	"paramname": "unMipLevels" ,"paramtype": "uint32_t"},
 {	"paramname": "unArrayLayerCount" ,"paramtype": "uint32_t"},
+{	"paramname": "unAdditionalVkCreateFlags" ,"paramtype": "uint32_t"},
+{	"paramname": "unAdditionalVkUsageFlags" ,"paramtype": "uint32_t"},
 {	"paramname": "pSharedHandle" ,"paramtype": "vr::SharedTextureHandle_t *"}
 	 ]
 }
diff --git a/headers/openvr_capi.h b/headers/openvr_capi.h
index c4b6877..b4dd992 100644
--- a/headers/openvr_capi.h
+++ b/headers/openvr_capi.h
@@ -118,13 +118,13 @@
 static const unsigned long long k_ulOverlayHandleInvalid = 0;
 static const unsigned long k_unMaxDistortionFunctionParameters = 8;
 static const unsigned long k_unScreenshotHandleInvalid = 0;
-static const char * IVRSystem_Version = "IVRSystem_023";
+static const char * IVRSystem_Version = "IVRSystem_026";
 static const char * IVRExtendedDisplay_Version = "IVRExtendedDisplay_001";
 static const char * IVRTrackedCamera_Version = "IVRTrackedCamera_006";
 static const unsigned long k_unMaxApplicationKeyLength = 128;
 static const char * k_pch_MimeType_HomeApp = "vr/home";
 static const char * k_pch_MimeType_GameTheater = "vr/game_theater";
-static const char * IVRApplications_Version = "IVRApplications_007";
+static const char * IVRApplications_Version = "IVRApplications_008";
 static const char * IVRChaperone_Version = "IVRChaperone_004";
 static const char * IVRChaperoneSetup_Version = "IVRChaperoneSetup_006";
 static const char * IVRCompositor_Version = "IVRCompositor_029";
@@ -152,6 +152,7 @@
 static const unsigned long k_unMaxSettingsKeyLength = 128;
 static const char * IVRSettings_Version = "IVRSettings_003";
 static const char * k_pch_SteamVR_Section = "steamvr";
+static const char * k_pch_SteamVR_Contrast_Float = "contrast";
 static const char * k_pch_SteamVR_RequireHmd_String = "requireHmd";
 static const char * k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
 static const char * k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
@@ -169,6 +170,7 @@
 static const char * k_pch_SteamVR_GridColor_String = "gridColor";
 static const char * k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
 static const char * k_pch_SteamVR_TrackingLossColor_String = "trackingLossColor";
+static const char * k_pch_SteamVR_StartColor_String = "startColor";
 static const char * k_pch_SteamVR_ShowStage_Bool = "showStage";
 static const char * k_pch_SteamVR_DrawTrackingReferences_Bool = "drawTrackingReferences";
 static const char * k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
@@ -181,6 +183,8 @@
 static const char * k_pch_SteamVR_MaxRecommendedResolution_Int32 = "maxRecommendedResolution";
 static const char * k_pch_SteamVR_MotionSmoothing_Bool = "motionSmoothing";
 static const char * k_pch_SteamVR_MotionSmoothingOverride_Int32 = "motionSmoothingOverride";
+static const char * k_pch_SteamVR_FoveatedSharpening_Bool = "sharpening";
+static const char * k_pch_SteamVR_FoveatedSharpeningOverride_Int32 = "sharpeningOverride";
 static const char * k_pch_SteamVR_FramesToThrottle_Int32 = "framesToThrottle";
 static const char * k_pch_SteamVR_AdditionalFramesToPredict_Int32 = "additionalFramesToPredict";
 static const char * k_pch_SteamVR_WorldScale_Float = "worldScale";
@@ -340,18 +344,18 @@
 static const char * k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout";
 static const char * k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress";
 static const char * k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby";
+static const char * k_pch_Power_OverrideWindowsPowerScheme_Bool = "overrideWindowsPowerScheme";
 static const char * k_pch_Dashboard_Section = "dashboard";
 static const char * k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard";
 static const char * k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode";
 static const char * k_pch_Dashboard_Position = "position";
-static const char * k_pch_Dashboard_DesktopScale = "desktopScale";
 static const char * k_pch_Dashboard_DashboardScale = "dashboardScale";
 static const char * k_pch_Dashboard_UseStandaloneSystemLayer = "standaloneSystemLayer";
 static const char * k_pch_Dashboard_AllowSteamOverlays_Bool = "allowSteamOverlays";
 static const char * k_pch_Dashboard_AllowVRGamepadUI_Bool = "allowVRGamepadUI";
-static const char * k_pch_Dashboard_AllowVRGamepadUIViaGamescope_Bool = "allowVRGamepadUIViaGamescope";
 static const char * k_pch_Dashboard_SteamMatchesHMDFramerate = "steamMatchesHMDFramerate";
 static const char * k_pch_Dashboard_GrabHandleAcceleration = "grabHandleAcceleration";
+static const char * k_pch_Dashboard_OverlayBacksideColor_String = "overlayBacksideColor";
 static const char * k_pch_modelskin_Section = "modelskins";
 static const char * k_pch_Driver_Enable_Bool = "enable";
 static const char * k_pch_Driver_BlockedBySafemode_Bool = "blocked_by_safe_mode";
@@ -397,13 +401,16 @@
 static const int k_nActionSetOverlayGlobalPriorityMin = 16777216;
 static const int k_nActionSetOverlayGlobalPriorityMax = 33554431;
 static const int k_nActionSetPriorityReservedMin = 33554432;
-static const char * IVRInput_Version = "IVRInput_010";
+static const char * IVRInput_Version = "IVRInput_011";
 static const unsigned long long k_ulInvalidIOBufferHandle = 0;
 static const char * IVRIOBuffer_Version = "IVRIOBuffer_002";
 static const unsigned long k_ulInvalidSpatialAnchorHandle = 0;
 static const char * IVRSpatialAnchors_Version = "IVRSpatialAnchors_001";
 static const char * IVRDebug_Version = "IVRDebug_001";
-static const char * IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
+static const char * IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_003";
+static const unsigned long k_nSteamVRVersionMajor = 2;
+static const unsigned long k_nSteamVRVersionMinor = 15;
+static const unsigned long k_nSteamVRVersionBuild = 6;
 static const unsigned long long k_ulDisplayRedirectContainer = 25769803779;
 static const char * IVRProperties_Version = "IVRProperties_001";
 static const char * k_pchPathUserHandRight = "/user/hand/right";
@@ -449,7 +456,7 @@
 static const char * k_pchPathUserKeyboard = "/user/keyboard";
 static const char * k_pchPathClientAppKey = "/client_info/app_key";
 static const unsigned long long k_ulInvalidPathHandle = 0;
-static const char * IVRPaths_Version = "IVRPaths_001";
+static const char * IVRPaths_Version = "IVRPaths_002";
 static const char * IVRBlockQueue_Version = "IVRBlockQueue_005";
 
 // OpenVR Enums
@@ -590,12 +597,14 @@
 	ETrackedDeviceProperty_Prop_AllowLightSourceFrequency_Bool = 1056,
 	ETrackedDeviceProperty_Prop_SteamRemoteClientID_Uint64 = 1057,
 	ETrackedDeviceProperty_Prop_Reserved_1058 = 1058,
+	ETrackedDeviceProperty_Prop_Reserved_1059 = 1059,
+	ETrackedDeviceProperty_Prop_Reserved_1060 = 1060,
 	ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool = 2000,
 	ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float = 2001,
 	ETrackedDeviceProperty_Prop_DisplayFrequency_Float = 2002,
 	ETrackedDeviceProperty_Prop_UserIpdMeters_Float = 2003,
 	ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64 = 2004,
-	ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64 = 2005,
+	ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64_deprecated = 0,
 	ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64 = 2006,
 	ETrackedDeviceProperty_Prop_IsOnDesktop_Bool = 2007,
 	ETrackedDeviceProperty_Prop_DisplayMCType_Int32 = 2008,
@@ -817,10 +826,12 @@
 	EVRSubmitFlags_Submit_VulkanTextureWithArrayData = 64,
 	EVRSubmitFlags_Submit_GlArrayTexture = 128,
 	EVRSubmitFlags_Submit_IsEgl = 256,
+	EVRSubmitFlags_Submit_TextureWithMotion = 536,
 	EVRSubmitFlags_Submit_Reserved2 = 32768,
 	EVRSubmitFlags_Submit_Reserved3 = 65536,
 	EVRSubmitFlags_Submit_Reserved4 = 131072,
 	EVRSubmitFlags_Submit_Reserved5 = 262144,
+	EVRSubmitFlags_Submit_Reserved6 = 524288,
 } EVRSubmitFlags;
 
 typedef enum EVRState
@@ -920,6 +931,7 @@
 	EVREventType_VREvent_MutualSteamCapabilitiesChanged = 538,
 	EVREventType_VREvent_OverlayCreated = 539,
 	EVREventType_VREvent_OverlayDestroyed = 540,
+	EVREventType_VREvent_OverlayNameChanged = 544,
 	EVREventType_VREvent_TrackingRecordingStarted = 541,
 	EVREventType_VREvent_TrackingRecordingStopped = 542,
 	EVREventType_VREvent_SetTrackingRecordingPath = 543,
@@ -950,6 +962,9 @@
 	EVREventType_VREvent_Reserved_0809 = 809,
 	EVREventType_VREvent_Reserved_0810 = 810,
 	EVREventType_VREvent_Reserved_0811 = 811,
+	EVREventType_VREvent_Reserved_0812 = 812,
+	EVREventType_VREvent_Reserved_0813 = 813,
+	EVREventType_VREvent_Reserved_0814 = 814,
 	EVREventType_VREvent_AudioSettingsHaveChanged = 820,
 	EVREventType_VREvent_BackgroundSettingHasChanged = 850,
 	EVREventType_VREvent_CameraSettingsHaveChanged = 851,
@@ -974,6 +989,7 @@
 	EVREventType_VREvent_WindowsMRSectionSettingChanged = 870,
 	EVREventType_VREvent_OtherSectionSettingChanged = 871,
 	EVREventType_VREvent_AnyDriverSettingsChanged = 872,
+	EVREventType_VREvent_Reserved_0873 = 873,
 	EVREventType_VREvent_StatusUpdate = 900,
 	EVREventType_VREvent_WebInterface_InstallDriverCompleted = 950,
 	EVREventType_VREvent_MCImageUpdated = 1000,
@@ -1335,6 +1351,8 @@
 	EVRInitError_VRInitError_Init_VRDashboardTokenFailure = 165,
 	EVRInitError_VRInitError_Init_VRDashboardEnvironmentFailure = 166,
 	EVRInitError_VRInitError_Init_VRDashboardPathFailure = 167,
+	EVRInitError_VRInitError_Init_InstallationTooOld = 168,
+	EVRInitError_VRInitError_Init_ClientVersionAlreadyProvided = 169,
 	EVRInitError_VRInitError_Driver_Failed = 200,
 	EVRInitError_VRInitError_Driver_Unknown = 201,
 	EVRInitError_VRInitError_Driver_HmdUnknown = 202,
@@ -1480,6 +1498,10 @@
 	EVRInitError_VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113,
 	EVRInitError_VRInitError_VendorSpecific_OculusRuntimeBadInstall = 1114,
 	EVRInitError_VRInitError_VendorSpecific_HmdFound_UnexpectedConfiguration_1 = 1115,
+	EVRInitError_VRInitError_VendorSpecific_Oasis_UnlockRequired = 1150,
+	EVRInitError_VRInitError_VendorSpecific_VRLink_OutdatedDriverMESA = 1200,
+	EVRInitError_VRInitError_VendorSpecific_VRLink_OutdatedDriverNVIDIA = 1201,
+	EVRInitError_VRInitError_VendorSpecific_VRLink_NoVideoSupport = 1202,
 	EVRInitError_VRInitError_Steam_SteamInstallationNotFound = 2000,
 	EVRInitError_VRInitError_LastError = 2001,
 } EVRInitError;
@@ -1568,6 +1590,17 @@
 	Imu_OffScaleFlags_OffScale_GyroZ = 32,
 } Imu_OffScaleFlags;
 
+typedef enum EVRDistortionChannel
+{
+	EVRDistortionChannel_Red = 0,
+	EVRDistortionChannel_Green = 1,
+	EVRDistortionChannel_Blue = 2,
+	EVRDistortionChannel_InverseRed = 3,
+	EVRDistortionChannel_InverseGreen = 4,
+	EVRDistortionChannel_InverseBlue = 5,
+	EVRDistortionChannel_Count = 6,
+} EVRDistortionChannel;
+
 typedef enum EVRApplicationError
 {
 	EVRApplicationError_VRApplicationError_None = 0,
@@ -1587,6 +1620,7 @@
 	EVRApplicationError_VRApplicationError_TransitionAborted = 113,
 	EVRApplicationError_VRApplicationError_IsTemplate = 114,
 	EVRApplicationError_VRApplicationError_SteamVRIsExiting = 115,
+	EVRApplicationError_VRApplicationError_WaitingForChaperone = 116,
 	EVRApplicationError_VRApplicationError_BufferTooSmall = 200,
 	EVRApplicationError_VRApplicationError_PropertyNotSet = 201,
 	EVRApplicationError_VRApplicationError_UnknownProperty = 202,
@@ -1728,6 +1762,7 @@
 	VROverlayFlags_MinimalControlBar = 67108864,
 	VROverlayFlags_EnableClickStabilization = 134217728,
 	VROverlayFlags_MultiCursor = 268435456,
+	VROverlayFlags_NoBackside = 536870912,
 } VROverlayFlags;
 
 typedef enum VRMessageOverlayResponse
@@ -2147,6 +2182,17 @@
 	struct VRTextureDepthInfo_t depth;
 } VRTextureWithPoseAndDepth_t;
 
+typedef struct VRTextureMotionInfo_t
+{
+	void * handle; // void *
+	struct HmdMatrix44_t mDeltaPose;
+} VRTextureMotionInfo_t;
+
+typedef struct VRTextureWithMotion_t
+{
+	struct VRTextureMotionInfo_t motion;
+} VRTextureWithMotion_t;
+
 typedef struct DmabufPlane_t
 {
 	uint32_t unOffset;
@@ -2279,7 +2325,7 @@
 
 typedef struct VREvent_Chaperone_t
 {
-	uint64_t m_nPreviousUniverse;
+	uint64_t m_nPreviousUniverse_deprecated;
 	uint64_t m_nCurrentUniverse;
 } VREvent_Chaperone_t;
 
@@ -2499,6 +2545,12 @@
 	uint32_t unOffScaleFlags;
 } ImuSample_t;
 
+typedef struct DistortionCoordinate_t
+{
+	float u;
+	float v;
+} DistortionCoordinate_t;
+
 typedef struct AppOverrideKeys_t
 {
 	char * pchKey; // const char *
@@ -2780,6 +2832,11 @@
 	intptr_t m_pProperties; // class vr::IVRProperties *
 } CVRPropertyHelpers;
 
+typedef struct PathWriteOptions_t
+{
+	bool bPostEvents;
+} PathWriteOptions_t;
+
 typedef struct PathWrite_t
 {
 	PathHandle_t ulPath;
@@ -2790,6 +2847,8 @@
 	PropertyTypeTag_t unTag;
 	enum ETrackedPropertyError eError;
 	char * pszPath; // const char *
+	bool bPostEvents;
+	bool bValueChanged;
 } PathWrite_t;
 
 typedef struct PathRead_t
@@ -2881,6 +2940,7 @@
 	struct HmdMatrix44_t (OPENVR_FNTABLE_CALLTYPE *GetProjectionMatrix)(EVREye eEye, float fNearZ, float fFarZ);
 	void (OPENVR_FNTABLE_CALLTYPE *GetProjectionRaw)(EVREye eEye, float * pfLeft, float * pfRight, float * pfTop, float * pfBottom);
 	bool (OPENVR_FNTABLE_CALLTYPE *ComputeDistortion)(EVREye eEye, float fU, float fV, struct DistortionCoordinates_t * pDistortionCoordinates);
+	bool (OPENVR_FNTABLE_CALLTYPE *ComputeDistortionSet)(EVREye eEye, EVRDistortionChannel eChannel, bool bAsNormalizedDeviceCoordinates, uint32_t nNumCoordinates, struct DistortionCoordinate_t * pInput, struct DistortionCoordinate_t * pOutput);
 	struct HmdMatrix34_t (OPENVR_FNTABLE_CALLTYPE *GetEyeToHeadTransform)(EVREye eEye);
 	bool (OPENVR_FNTABLE_CALLTYPE *GetTimeSinceLastVsync)(float * pfSecondsSinceLastVsync, uint64_t * pulFrameCounter);
 	int32_t (OPENVR_FNTABLE_CALLTYPE *GetD3D9AdapterIndex)();
@@ -2911,6 +2971,8 @@
 	bool (OPENVR_FNTABLE_CALLTYPE *PollNextEventWithPoseAndOverlays)(ETrackingUniverseOrigin eOrigin, struct VREvent_t * pEvent, uint32_t uncbVREvent, struct TrackedDevicePose_t * pTrackedDevicePose, VROverlayHandle_t * pulOverlayHandle);
 	char * (OPENVR_FNTABLE_CALLTYPE *GetEventTypeNameFromEnum)(EVREventType eType);
 	struct HiddenAreaMesh_t (OPENVR_FNTABLE_CALLTYPE *GetHiddenAreaMesh)(EVREye eEye, EHiddenAreaMeshType type);
+	bool (OPENVR_FNTABLE_CALLTYPE *GetEyeTrackedFoveationCenter)(struct HmdVector2_t * pNdcLeft, struct HmdVector2_t * pNdcRight);
+	bool (OPENVR_FNTABLE_CALLTYPE *GetEyeTrackedFoveationCenterForProjection)(struct HmdMatrix44_t * pProjMat, struct HmdVector2_t * pNdc);
 	bool (OPENVR_FNTABLE_CALLTYPE *GetControllerState)(TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize);
 	bool (OPENVR_FNTABLE_CALLTYPE *GetControllerStateWithPose)(ETrackingUniverseOrigin eOrigin, TrackedDeviceIndex_t unControllerDeviceIndex, VRControllerState_t * pControllerState, uint32_t unControllerStateSize, struct TrackedDevicePose_t * pTrackedDevicePose);
 	void (OPENVR_FNTABLE_CALLTYPE *TriggerHapticPulse)(TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec);
@@ -2924,6 +2986,7 @@
 	void (OPENVR_FNTABLE_CALLTYPE *AcknowledgeQuit_Exiting)();
 	uint32_t (OPENVR_FNTABLE_CALLTYPE *GetAppContainerFilePaths)(char * pchBuffer, uint32_t unBufferSize);
 	char * (OPENVR_FNTABLE_CALLTYPE *GetRuntimeVersion)();
+	EVRInitError (OPENVR_FNTABLE_CALLTYPE *SetSDKVersion)(uint32_t nVersionMajor, uint32_t nVersionMinor, uint32_t nVersionBuild);
 };
 
 struct VR_IVRExtendedDisplay_FnTable
@@ -2982,6 +3045,7 @@
 	EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *PerformApplicationPrelaunchCheck)(char * pchAppKey);
 	char * (OPENVR_FNTABLE_CALLTYPE *GetSceneApplicationStateNameFromEnum)(EVRSceneApplicationState state);
 	EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *LaunchInternalProcess)(char * pchBinaryPath, char * pchArguments, char * pchWorkingDirectory);
+	EVRApplicationError (OPENVR_FNTABLE_CALLTYPE *RegisterSubprocess)(uint32_t nPid);
 	uint32_t (OPENVR_FNTABLE_CALLTYPE *GetCurrentSceneProcessId)();
 };
 
@@ -3269,6 +3333,8 @@
 	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetSkeletalActionData)(VRActionHandle_t action, struct InputSkeletalActionData_t * pActionData, uint32_t unActionDataSize);
 	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetDominantHand)(ETrackedControllerRole * peDominantHand);
 	EVRInputError (OPENVR_FNTABLE_CALLTYPE *SetDominantHand)(ETrackedControllerRole eDominantHand);
+	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetEyeTrackingDataRelativeToNow)(VRActionHandle_t action, ETrackingUniverseOrigin eOrigin, float fPredictedSecondsFromNow, VREyeTrackingData_t * pEyeTrackingData, uint32_t ulEyeTrackingDataSize);
+	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetEyeTrackingDataForNextFrame)(VRActionHandle_t action, ETrackingUniverseOrigin eOrigin, VREyeTrackingData_t * pEyeTrackingData, uint32_t ulEyeTrackingDataSize);
 	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetBoneCount)(VRActionHandle_t action, uint32_t * pBoneCount);
 	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetBoneHierarchy)(VRActionHandle_t action, BoneIndex_t * pParentIndices, uint32_t unIndexArayCount);
 	EVRInputError (OPENVR_FNTABLE_CALLTYPE *GetBoneName)(VRActionHandle_t action, BoneIndex_t nBoneIndex, char * pchBoneName, uint32_t unNameBufferSize);
@@ -3319,7 +3385,7 @@
 
 struct VR_IVRIPCResourceManagerClient_FnTable
 {
-	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanImage)(uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, SharedTextureHandle_t * pSharedHandle);
+	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanImage)(uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, uint32_t unAdditionalVkCreateFlags, uint32_t unAdditionalVkUsageFlags, SharedTextureHandle_t * pSharedHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanBuffer)(uint32_t nSize, uint32_t nUsageFlags, SharedTextureHandle_t * pSharedHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *NewSharedVulkanSemaphore)(bool bCounting, SharedTextureHandle_t * pSharedHandle);
 	bool (OPENVR_FNTABLE_CALLTYPE *RefResource)(SharedTextureHandle_t hSharedHandle, uint64_t * pNewIpcHandle);
diff --git a/headers/openvr_driver.h b/headers/openvr_driver.h
index c967c94..fcd6755 100644
--- a/headers/openvr_driver.h
+++ b/headers/openvr_driver.h
@@ -16,8 +16,8 @@
 namespace vr
 {
 	static const uint32_t k_nSteamVRVersionMajor = 2;
-	static const uint32_t k_nSteamVRVersionMinor = 12;
-	static const uint32_t k_nSteamVRVersionBuild = 14;
+	static const uint32_t k_nSteamVRVersionMinor = 15;
+	static const uint32_t k_nSteamVRVersionBuild = 6;
 } // namespace vr
 
 // public_vrtypes.h
@@ -193,6 +193,17 @@
 	VRTextureDepthInfo_t depth;
 };
 
+struct VRTextureMotionInfo_t
+{
+	void *handle; // See ETextureType definition above
+	HmdMatrix44_t mDeltaPose; // Incremental application-applied transform, if any, since the previous frame that affects the view.
+};
+
+struct VRTextureWithMotion_t : VRTextureWithPoseAndDepth_t
+{
+	VRTextureMotionInfo_t motion;
+};
+
 // 64-bit types that are part of public structures
 // that are replicated in shared memory.
 #if defined(__linux__) || defined(__APPLE__)
@@ -209,7 +220,7 @@
 {
 	uint32_t unOffset;
 	uint32_t unStride;
-	int32_t nFd;
+	int32_t nFd; // This is not consumed, it is dup'ed.
 };
 
 struct DmabufAttributes_t
@@ -476,6 +487,8 @@
 	Prop_AllowLightSourceFrequency_Bool			= 1056, // Shows the Anti-Flicker option in camera settings.
 	Prop_SteamRemoteClientID_Uint64				= 1057, // For vrlink
 	Prop_Reserved_1058							= 1058,
+	Prop_Reserved_1059							= 1059,
+	Prop_Reserved_1060							= 1060,
 
 	// Properties that are unique to TrackedDeviceClass_HMD
 	Prop_ReportsTimeSinceVSync_Bool				= 2000,
@@ -483,7 +496,7 @@
 	Prop_DisplayFrequency_Float					= 2002,
 	Prop_UserIpdMeters_Float					= 2003,
 	Prop_CurrentUniverseId_Uint64				= 2004,
-	Prop_PreviousUniverseId_Uint64				= 2005,
+	Prop_PreviousUniverseId_Uint64_deprecated	= Prop_Invalid,
 	Prop_DisplayFirmwareVersion_Uint64			= 2006,
 	Prop_IsOnDesktop_Bool						= 2007,
 	Prop_DisplayMCType_Int32					= 2008,
@@ -778,11 +791,15 @@
 	// If the texture is an EGL texture and not an glX/wGL texture (Linux only, currently)
 	Submit_IsEgl = 0x100,
 
+	// Set to indicate that pTexture is a pointer to a VRTextureWithMotion_t.
+	Submit_TextureWithMotion = 0x200 | Submit_TextureWithPose | Submit_TextureWithDepth,
+
 	// Do not use
 	Submit_Reserved2 = 0x08000,
 	Submit_Reserved3 = 0x10000,
 	Submit_Reserved4 = 0x20000,
 	Submit_Reserved5 = 0x40000,
+	Submit_Reserved6 = 0x80000,
 };
 
 /** Data required for passing Vulkan textures to IVRCompositor::Submit.
@@ -930,8 +947,8 @@
 	VREvent_ScreenshotProgressToDashboard	= 524, // Sent by compositor to the dashboard that a completed screenshot was submitted
 
 	VREvent_PrimaryDashboardDeviceChanged	= 525,
-	VREvent_RoomViewShown					= 526, // Sent by compositor whenever room-view is enabled
-	VREvent_RoomViewHidden					= 527, // Sent by compositor whenever room-view is disabled
+	VREvent_RoomViewShown					= 526, // Sent by compositor whenever room-view is enabled (for scene apps only - not for construct or transient bounds)
+	VREvent_RoomViewHidden					= 527, // Sent by compositor whenever room-view is disabled (for scene apps only - not for construct or transient bounds)
 	VREvent_ShowUI							= 528, // data is showUi
 	VREvent_ShowDevTools					= 529, // data is showDevTools
 	VREvent_DesktopViewUpdating				= 530,
@@ -939,13 +956,14 @@
 
 	VREvent_StartDashboard					= 532,
 	VREvent_ElevatePrism					= 533,
-	VREvent_OverlayClosed					= 534,
+	VREvent_OverlayClosed					= 534, // The overlay's close button is pressed.
 	VREvent_DashboardThumbChanged			= 535, // Sent when a dashboard thumbnail image changes
 	VREvent_DesktopMightBeVisible			= 536, // Sent when any known desktop related overlay is visible
 	VREvent_DesktopMightBeHidden			= 537, // Sent when all known desktop related overlays are hidden
 	VREvent_MutualSteamCapabilitiesChanged	= 538, // Sent when the set of capabilities common between both Steam and SteamVR have changed.
 	VREvent_OverlayCreated					= 539, // An OpenVR overlay of any sort was created. Data is overlay.
 	VREvent_OverlayDestroyed				= 540, // An OpenVR overlay of any sort was destroyed. Data is overlay.
+	VREvent_OverlayNameChanged				= 544, // An OpenVR overlay's name changed. Data is overlay.
 
 	VREvent_TrackingRecordingStarted		= 541,
 	VREvent_TrackingRecordingStopped		= 542,
@@ -982,6 +1000,9 @@
 	VREvent_Reserved_0809  					= 809,
 	VREvent_Reserved_0810  					= 810,
 	VREvent_Reserved_0811  					= 811,
+	VREvent_Reserved_0812  					= 812,
+	VREvent_Reserved_0813  					= 813,
+	VREvent_Reserved_0814  					= 814,
 
 	VREvent_AudioSettingsHaveChanged		= 820,
 
@@ -1008,6 +1029,7 @@
 	VREvent_WindowsMRSectionSettingChanged			= 870,
 	VREvent_OtherSectionSettingChanged				= 871,
 	VREvent_AnyDriverSettingsChanged				= 872,
+	VREvent_Reserved_0873							= 873,
 
 	VREvent_StatusUpdate					= 900,
 
@@ -1259,7 +1281,7 @@
 
 struct VREvent_Chaperone_t
 {
-	uint64_t m_nPreviousUniverse;
+	uint64_t m_nPreviousUniverse_deprecated;
 	uint64_t m_nCurrentUniverse;
 };
 
@@ -1843,6 +1865,8 @@
 	VRInitError_Init_VRDashboardTokenFailure		= 165,
 	VRInitError_Init_VRDashboardEnvironmentFailure	= 166,
 	VRInitError_Init_VRDashboardPathFailure			= 167,
+	VRInitError_Init_InstallationTooOld				= 168,
+	VRInitError_Init_ClientVersionAlreadyProvided	= 169,
 
 	VRInitError_Driver_Failed						= 200,
 	VRInitError_Driver_Unknown						= 201,
@@ -1997,6 +2021,12 @@
 	VRInitError_VendorSpecific_OculusRuntimeBadInstall				= 1114,
 	VRInitError_VendorSpecific_HmdFound_UnexpectedConfiguration_1	= 1115,
 
+	VRInitError_VendorSpecific_Oasis_UnlockRequired					= 1150,
+
+	VRInitError_VendorSpecific_VRLink_OutdatedDriverMESA			= 1200,
+	VRInitError_VendorSpecific_VRLink_OutdatedDriverNVIDIA			= 1201,
+	VRInitError_VendorSpecific_VRLink_NoVideoSupport				= 1202,
+
 	VRInitError_Steam_SteamInstallationNotFound = 2000,
 
 	// Strictly a placeholder
@@ -2221,6 +2251,22 @@
 	uint32_t unOffScaleFlags;
 };
 
+enum class EVRDistortionChannel : uint32_t
+{
+	Red = 0,		// given a coordinate in distorted panel space, returns the coordinate to sample in rectilinear render space for the red channel
+	Green,			// given a coordinate in distorted panel space, returns the coordinate to sample in rectilinear render space for the green channel
+	Blue,			// given a coordinate in distorted panel space, returns the coordinate to sample in rectilinear render space for the blue channel
+	InverseRed,		// given a coordinate in rectilinear render space, returns the corresponding coordinate in distorted panel space for the red channel
+	InverseGreen,	// given a coordinate in rectilinear render space, returns the corresponding coordinate in distorted panel space for the green channel
+	InverseBlue,	// given a coordinate in rectilinear render space, returns the corresponding coordinate in distorted panel space for the blue channel
+	Count
+};
+
+struct DistortionCoordinate_t
+{
+	float u, v; // 0..1
+};
+
 #pragma pack( pop )
 
 // figure out how to import from the VR API dll
@@ -2515,6 +2561,7 @@
 	//-----------------------------------------------------------------------------
 	// steamvr keys
 	static const char * const k_pch_SteamVR_Section = "steamvr";
+	static const char * const k_pch_SteamVR_Contrast_Float = "contrast";
 	static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd";
 	static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
 	static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
@@ -2532,6 +2579,7 @@
 	static const char * const k_pch_SteamVR_GridColor_String = "gridColor";
 	static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
 	static const char * const k_pch_SteamVR_TrackingLossColor_String = "trackingLossColor";
+	static const char * const k_pch_SteamVR_StartColor_String = "startColor";
 	static const char * const k_pch_SteamVR_ShowStage_Bool = "showStage";
 	static const char * const k_pch_SteamVR_DrawTrackingReferences_Bool = "drawTrackingReferences";
 	static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
@@ -2544,6 +2592,8 @@
 	static const char * const k_pch_SteamVR_MaxRecommendedResolution_Int32 = "maxRecommendedResolution";
 	static const char * const k_pch_SteamVR_MotionSmoothing_Bool = "motionSmoothing";
 	static const char * const k_pch_SteamVR_MotionSmoothingOverride_Int32 = "motionSmoothingOverride";
+	static const char * const k_pch_SteamVR_FoveatedSharpening_Bool = "sharpening";
+	static const char * const k_pch_SteamVR_FoveatedSharpeningOverride_Int32 = "sharpeningOverride";
 	static const char * const k_pch_SteamVR_FramesToThrottle_Int32 = "framesToThrottle";
 	static const char * const k_pch_SteamVR_AdditionalFramesToPredict_Int32 = "additionalFramesToPredict";
 	static const char * const k_pch_SteamVR_WorldScale_Float = "worldScale";
@@ -2742,6 +2792,7 @@
 	static const char * const k_pch_Power_ReturnToWatchdogTimeout_Float = "returnToWatchdogTimeout";
 	static const char * const k_pch_Power_AutoLaunchSteamVROnButtonPress = "autoLaunchSteamVROnButtonPress";
 	static const char * const k_pch_Power_PauseCompositorOnStandby_Bool = "pauseCompositorOnStandby";
+	static const char * const k_pch_Power_OverrideWindowsPowerScheme_Bool = "overrideWindowsPowerScheme";
 
 	//-----------------------------------------------------------------------------
 	// dashboard keys
@@ -2749,14 +2800,13 @@
 	static const char * const k_pch_Dashboard_EnableDashboard_Bool = "enableDashboard";
 	static const char * const k_pch_Dashboard_ArcadeMode_Bool = "arcadeMode";
 	static const char * const k_pch_Dashboard_Position = "position";
-	static const char * const k_pch_Dashboard_DesktopScale = "desktopScale";
 	static const char * const k_pch_Dashboard_DashboardScale = "dashboardScale";
 	static const char * const k_pch_Dashboard_UseStandaloneSystemLayer = "standaloneSystemLayer";
 	static const char * const k_pch_Dashboard_AllowSteamOverlays_Bool = "allowSteamOverlays";
 	static const char * const k_pch_Dashboard_AllowVRGamepadUI_Bool = "allowVRGamepadUI";
-	static const char * const k_pch_Dashboard_AllowVRGamepadUIViaGamescope_Bool = "allowVRGamepadUIViaGamescope";
 	static const char * const k_pch_Dashboard_SteamMatchesHMDFramerate = "steamMatchesHMDFramerate";
 	static const char * const k_pch_Dashboard_GrabHandleAcceleration = "grabHandleAcceleration";
+	static const char * const k_pch_Dashboard_OverlayBacksideColor_String = "overlayBacksideColor";
 
 	//-----------------------------------------------------------------------------
 	// model skin keys
@@ -4256,7 +4306,7 @@
 	 *
 	 * nImageFormat: in VkFormat
 	 */
-	virtual bool NewSharedVulkanImage( uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
+	virtual bool NewSharedVulkanImage( uint32_t nImageFormat, uint32_t nWidth, uint32_t nHeight, bool bRenderable, bool bMappable, bool bComputeAccess, uint32_t unMipLevels, uint32_t unArrayLayerCount, uint32_t unAdditionalVkCreateFlags, uint32_t unAdditionalVkUsageFlags, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
 
 	/** Create a new tracked Vulkan Buffer */
 	virtual bool NewSharedVulkanBuffer( uint32_t nSize, uint32_t nUsageFlags, vr::SharedTextureHandle_t *pSharedHandle ) = 0;
@@ -4314,7 +4364,7 @@
 	virtual ~IVRIPCResourceManagerClient() {};
 };
 
-static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_002";
+static const char *IVRIPCResourceManagerClient_Version = "IVRIPCResourceManagerClient_003";
 
 }
 
diff --git a/lib/linuxarm64/libopenvr_api_unity.so b/lib/linuxarm64/libopenvr_api_unity.so
index 90cfd40..b924fde 100644
--- a/lib/linuxarm64/libopenvr_api_unity.so
+++ b/lib/linuxarm64/libopenvr_api_unity.so
Binary files differ
diff --git a/samples/bin/androidarm64/libopenvr_api.so b/samples/bin/androidarm64/libopenvr_api.so
index 104fd37..ff71df7 100644
--- a/samples/bin/androidarm64/libopenvr_api.so
+++ b/samples/bin/androidarm64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/linux32/libopenvr_api.so b/samples/bin/linux32/libopenvr_api.so
index b04a4c2..8af2f11 100644
--- a/samples/bin/linux32/libopenvr_api.so
+++ b/samples/bin/linux32/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/linux64/libopenvr_api.so b/samples/bin/linux64/libopenvr_api.so
index 198da62..614970f 100644
--- a/samples/bin/linux64/libopenvr_api.so
+++ b/samples/bin/linux64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/linuxarm64/libopenvr_api.so b/samples/bin/linuxarm64/libopenvr_api.so
index 74b9301..109815e 100644
--- a/samples/bin/linuxarm64/libopenvr_api.so
+++ b/samples/bin/linuxarm64/libopenvr_api.so
Binary files differ
diff --git a/samples/bin/win32/hmd_opencv_sandbox.exe b/samples/bin/win32/hmd_opencv_sandbox.exe
index 47b8c6e..6240992 100755
--- a/samples/bin/win32/hmd_opencv_sandbox.exe
+++ b/samples/bin/win32/hmd_opencv_sandbox.exe
Binary files differ
diff --git a/samples/bin/win32/openvr_api.dll b/samples/bin/win32/openvr_api.dll
index b17a514..5e2468e 100644
--- a/samples/bin/win32/openvr_api.dll
+++ b/samples/bin/win32/openvr_api.dll
Binary files differ
diff --git a/samples/bin/win64/hmd_opencv_sandbox.exe b/samples/bin/win64/hmd_opencv_sandbox.exe
index d4b0427..9f50b4b 100755
--- a/samples/bin/win64/hmd_opencv_sandbox.exe
+++ b/samples/bin/win64/hmd_opencv_sandbox.exe
Binary files differ
diff --git a/samples/bin/win64/openvr_api.dll b/samples/bin/win64/openvr_api.dll
index ab53dc6..83b2019 100644
--- a/samples/bin/win64/openvr_api.dll
+++ b/samples/bin/win64/openvr_api.dll
Binary files differ
diff --git a/samples/drivers/drivers/simplecontroller/src/controller_device_driver.cpp b/samples/drivers/drivers/simplecontroller/src/controller_device_driver.cpp
index 8bf25b0..37e692d 100644
--- a/samples/drivers/drivers/simplecontroller/src/controller_device_driver.cpp
+++ b/samples/drivers/drivers/simplecontroller/src/controller_device_driver.cpp
@@ -11,8 +11,8 @@
 static const char *my_controller_main_settings_section = "driver_simplecontroller";
 
 // Individual right/left hand settings sections
-static const char *my_controller_right_settings_section = "driver_simplecontroller_left_controller";
-static const char *my_controller_left_settings_section = "driver_simplecontroller_right_controller";
+static const char *my_controller_right_settings_section = "driver_simplecontroller_right_controller";
+static const char *my_controller_left_settings_section = "driver_simplecontroller_left_controller";
 
 // These are the keys we want to retrieve the values for in the settings
 static const char *my_controller_settings_key_model_number = "mycontroller_model_number";
diff --git a/samples/drivers/drivers/simpletrackers/src/tracker_device_driver.h b/samples/drivers/drivers/simpletrackers/src/tracker_device_driver.h
index 0581388..b5dbb4d 100644
--- a/samples/drivers/drivers/simpletrackers/src/tracker_device_driver.h
+++ b/samples/drivers/drivers/simpletrackers/src/tracker_device_driver.h
@@ -16,6 +16,8 @@
 	MyComponent_trigger_value,
 	MyComponent_trigger_click,
 
+	MyComponent_grip_click,
+
 	MyComponent_MAX
 };
 
diff --git a/src/vrcore/hmderrors_public.cpp b/src/vrcore/hmderrors_public.cpp
index ef204bd..9602a04 100644
--- a/src/vrcore/hmderrors_public.cpp
+++ b/src/vrcore/hmderrors_public.cpp
@@ -206,6 +206,8 @@
 		RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardTokenFailure );
 		RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardEnvironmentFailure );
 		RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardPathFailure );
+		RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationTooOld );
+		RETURN_ENUM_AS_STRING( VRInitError_Init_ClientVersionAlreadyProvided );
 
 		RETURN_ENUM_AS_STRING( VRInitError_Driver_Failed );
 		RETURN_ENUM_AS_STRING( VRInitError_Driver_Unknown );
@@ -360,6 +362,13 @@
 		RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataError );
 		RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnexpectedConfiguration_1 );
 
+		// VRLink
+		RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_VRLink_OutdatedDriverMESA );
+		RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_VRLink_OutdatedDriverNVIDIA );
+		RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_VRLink_NoVideoSupport );
+
+		RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_Oasis_UnlockRequired );
+
 		RETURN_ENUM_AS_STRING( VRInitError_Steam_SteamInstallationNotFound );
 
 	default:
diff --git a/src/vrcore/sharedlibtools_public.cpp b/src/vrcore/sharedlibtools_public.cpp
index dd4575a..46199c2 100644
--- a/src/vrcore/sharedlibtools_public.cpp
+++ b/src/vrcore/sharedlibtools_public.cpp
@@ -1,5 +1,8 @@
 //========= Copyright Valve Corporation ============//
 #include <vrcore/sharedlibtools_public.h>
+
+#include "vrcore/strtools_public.h"
+
 #include <string.h>
 
 #if defined(_WIN32)
@@ -14,7 +17,9 @@
 {
 	SharedLibHandle pHandle = nullptr;
 #if defined( _WIN32)
-	pHandle = ( SharedLibHandle )LoadLibraryEx( pchPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
+	std::wstring wsFixedPath = UTF8to16( pchPath );
+
+	pHandle = ( SharedLibHandle )LoadLibraryExW( wsFixedPath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
 #elif defined(POSIX)
 	pHandle = (SharedLibHandle) dlopen( pchPath, RTLD_LOCAL|RTLD_NOW );
 #endif
diff --git a/src/vrcore/vrpathregistry_public.cpp b/src/vrcore/vrpathregistry_public.cpp
index 0fbff25..2939efd 100644
--- a/src/vrcore/vrpathregistry_public.cpp
+++ b/src/vrcore/vrpathregistry_public.cpp
@@ -482,6 +482,7 @@
 }
 
 //-----------------------------------------------------------------------------
+// Purpose: Used by things that guess appkey to special case children of SteamVR processes
 //-----------------------------------------------------------------------------
 bool CVRPathRegistry_Public::IsChildOfVRServer()
 {