Add: KHR_calibrated_timestamp
diff --git a/Docs/MoltenVK_Runtime_UserGuide.md b/Docs/MoltenVK_Runtime_UserGuide.md
index 3f9cf22..4a4c465 100644
--- a/Docs/MoltenVK_Runtime_UserGuide.md
+++ b/Docs/MoltenVK_Runtime_UserGuide.md
@@ -314,6 +314,8 @@
 - `VK_KHR_bind_memory2`
 - `VK_KHR_buffer_device_address`
   - *Requires GPU Tier 2 argument buffers support.*
+- `VK_KHR_calibrated_timestamp`
+  - *Requires Metal 2.2.*
 - `VK_KHR_copy_commands2`
 - `VK_KHR_create_renderpass2`
 - `VK_KHR_dedicated_allocation`
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
index c0d4e19..a681d87 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
@@ -705,6 +705,8 @@
 	ADD_DVC_1_3_PROMOTED_ENTRY_POINT(vkSetPrivateData, EXT, EXT_PRIVATE_DATA);
 
 	// Device extension functions.
+	ADD_DVC_EXT_ENTRY_POINT(vkGetCalibratedTimestampsKHR, KHR_CALIBRATED_TIMESTAMPS);
+	ADD_DVC_EXT_ENTRY_POINT(vkGetPhysicalDeviceCalibrateableTimeDomainsKHR, KHR_CALIBRATED_TIMESTAMPS);
     ADD_DVC_EXT_ENTRY_POINT(vkCreateDeferredOperationKHR, KHR_DEFERRED_HOST_OPERATIONS);
     ADD_DVC_EXT_ENTRY_POINT(vkDeferredOperationJoinKHR, KHR_DEFERRED_HOST_OPERATIONS);
     ADD_DVC_EXT_ENTRY_POINT(vkDestroyDeferredOperationKHR, KHR_DEFERRED_HOST_OPERATIONS);
diff --git a/MoltenVK/MoltenVK/Layers/MVKExtensions.def b/MoltenVK/MoltenVK/Layers/MVKExtensions.def
index c3abb45..3385594 100644
--- a/MoltenVK/MoltenVK/Layers/MVKExtensions.def
+++ b/MoltenVK/MoltenVK/Layers/MVKExtensions.def
@@ -45,6 +45,7 @@
 MVK_EXTENSION(KHR_8bit_storage,                       KHR_8BIT_STORAGE,                       DEVICE,   10.11,  8.0,  1.0)
 MVK_EXTENSION(KHR_bind_memory2,                       KHR_BIND_MEMORY_2,                      DEVICE,   10.11,  8.0,  1.0)
 MVK_EXTENSION(KHR_buffer_device_address,              KHR_BUFFER_DEVICE_ADDRESS,              DEVICE,   13.0,  16.0,  1.0)
+MVK_EXTENSION(KHR_calibrated_timestamps,              KHR_CALIBRATED_TIMESTAMPS,              DEVICE,   10.15, 14.0,  1.0)
 MVK_EXTENSION(KHR_copy_commands2,                     KHR_COPY_COMMANDS_2,                    DEVICE,   10.11,  8.0,  1.0)
 MVK_EXTENSION(KHR_create_renderpass2,                 KHR_CREATE_RENDERPASS_2,                DEVICE,   10.11,  8.0,  1.0)
 MVK_EXTENSION(KHR_dedicated_allocation,               KHR_DEDICATED_ALLOCATION,               DEVICE,   10.11,  8.0,  1.0)
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index 1d228fa..8c1c24f 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -2876,6 +2876,33 @@
 
 
 #pragma mark -
+#pragma mark VK_KHR_calibrated_timestamps
+
+MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsKHR(
+	VkPhysicalDevice							physicalDevice,
+	uint32_t*									pTimeDomainCount,
+	VkTimeDomainEXT*							pTimeDomains) {
+	MVKTraceVulkanCallStart();
+	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
+	mvkPD->getCalibrateableTimeDomains(pTimeDomainCount, pTimeDomains);
+	MVKTraceVulkanCallEnd();
+	return VK_SUCCESS;
+}
+
+MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetCalibratedTimestampsKHR(
+	VkDevice									device,
+	uint32_t									timestampCount,
+	const VkCalibratedTimestampInfoEXT*			pTimestampInfos,
+	uint64_t*									pTimestamps,
+	uint64_t*									pMaxDeviation) {
+	MVKTraceVulkanCallStart();
+	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
+	mvkDev->getCalibratedTimestamps(timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
+	MVKTraceVulkanCallEnd();
+	return VK_SUCCESS;
+}
+
+#pragma mark -
 #pragma mark VK_KHR_copy_commands2 extension
 
 MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdBlitImage2, KHR);
@@ -3371,29 +3398,9 @@
 #pragma mark -
 #pragma mark VK_EXT_calibrated_timestamps extension
 
-MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
-	VkPhysicalDevice							physicalDevice,
-	uint32_t*									pTimeDomainCount,
-	VkTimeDomainEXT*							pTimeDomains) {
-	MVKTraceVulkanCallStart();
-	MVKPhysicalDevice* mvkPD = MVKPhysicalDevice::getMVKPhysicalDevice(physicalDevice);
-	mvkPD->getCalibrateableTimeDomains(pTimeDomainCount, pTimeDomains);
-	MVKTraceVulkanCallEnd();
-	return VK_SUCCESS;
-}
 
-MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetCalibratedTimestampsEXT(
-	VkDevice									device,
-	uint32_t									timestampCount,
-	const VkCalibratedTimestampInfoEXT*			pTimestampInfos,
-	uint64_t*									pTimestamps,
-	uint64_t*									pMaxDeviation) {
-	MVKTraceVulkanCallStart();
-	MVKDevice* mvkDev = MVKDevice::getMVKDevice(device);
-	mvkDev->getCalibratedTimestamps(timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
-	MVKTraceVulkanCallEnd();
-	return VK_SUCCESS;
-}
+MVK_PUBLIC_VULKAN_ALIAS(vkGetCalibratedTimestampsEXT, vkGetCalibratedTimestampsKHR);
+MVK_PUBLIC_VULKAN_ALIAS(vkGetPhysicalDeviceCalibrateableTimeDomainsEXT, vkGetPhysicalDeviceCalibrateableTimeDomainsKHR);
 
 
 #pragma mark -