diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index 273cdd5..9ed992b 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -636,7 +636,6 @@
             case ProcHook::EXT_swapchain_colorspace:
             case ProcHook::KHR_get_surface_capabilities2:
             case ProcHook::GOOGLE_surfaceless_query:
-            case ProcHook::EXT_surface_maintenance1:
                 hook_extensions_.set(ext_bit);
                 // return now as these extensions do not require HAL support
                 return;
@@ -658,11 +657,9 @@
             case ProcHook::KHR_shared_presentable_image:
             case ProcHook::KHR_swapchain:
             case ProcHook::EXT_hdr_metadata:
-            case ProcHook::EXT_swapchain_maintenance1:
             case ProcHook::ANDROID_external_memory_android_hardware_buffer:
             case ProcHook::ANDROID_native_buffer:
             case ProcHook::GOOGLE_display_timing:
-            case ProcHook::KHR_external_fence_fd:
             case ProcHook::EXTENSION_CORE_1_0:
             case ProcHook::EXTENSION_CORE_1_1:
             case ProcHook::EXTENSION_CORE_1_2:
@@ -693,22 +690,16 @@
                 ext_bit = ProcHook::ANDROID_native_buffer;
                 break;
             case ProcHook::KHR_incremental_present:
-            case ProcHook::KHR_shared_presentable_image:
             case ProcHook::GOOGLE_display_timing:
+            case ProcHook::KHR_shared_presentable_image:
                 hook_extensions_.set(ext_bit);
                 // return now as these extensions do not require HAL support
                 return;
-            case ProcHook::EXT_swapchain_maintenance1:
-                // map VK_KHR_swapchain_maintenance1 to KHR_external_fence_fd
-                name = VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME;
-                ext_bit = ProcHook::KHR_external_fence_fd;
-                break;
             case ProcHook::EXT_hdr_metadata:
             case ProcHook::KHR_bind_memory2:
                 hook_extensions_.set(ext_bit);
                 break;
             case ProcHook::ANDROID_external_memory_android_hardware_buffer:
-            case ProcHook::KHR_external_fence_fd:
             case ProcHook::EXTENSION_UNKNOWN:
                 // Extensions we don't need to do anything about at this level
                 break;
@@ -724,7 +715,6 @@
             case ProcHook::KHR_surface_protected_capabilities:
             case ProcHook::EXT_debug_report:
             case ProcHook::EXT_swapchain_colorspace:
-            case ProcHook::EXT_surface_maintenance1:
             case ProcHook::GOOGLE_surfaceless_query:
             case ProcHook::ANDROID_native_buffer:
             case ProcHook::EXTENSION_CORE_1_0:
@@ -757,18 +747,10 @@
         if (strcmp(name, props.extensionName) != 0)
             continue;
 
-        if (ext_bit != ProcHook::EXTENSION_UNKNOWN &&
-                hal_extensions_.test(ext_bit)) {
-            ALOGI("CreateInfoWrapper::FilterExtension: already have '%s'.", name);
-            continue;
-        }
-
         filter.names[filter.name_count++] = name;
         if (ext_bit != ProcHook::EXTENSION_UNKNOWN) {
             if (ext_bit == ProcHook::ANDROID_native_buffer)
                 hook_extensions_.set(ProcHook::KHR_swapchain);
-            if (ext_bit == ProcHook::KHR_external_fence_fd)
-                hook_extensions_.set(ProcHook::EXT_swapchain_maintenance1);
 
             hal_extensions_.set(ext_bit);
         }
@@ -958,9 +940,6 @@
          VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION});
     loader_extensions.push_back({VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME,
                                  VK_GOOGLE_SURFACELESS_QUERY_SPEC_VERSION});
-    loader_extensions.push_back({
-        VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME,
-        VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION});
 
     static const VkExtensionProperties loader_debug_report_extension = {
         VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION,
@@ -1093,33 +1072,6 @@
     return result;
 }
 
-bool CanSupportSwapchainMaintenance1Extension(VkPhysicalDevice physicalDevice) {
-    const auto& driver = GetData(physicalDevice).driver;
-    if (!driver.GetPhysicalDeviceExternalFenceProperties)
-        return false;
-
-    // Requires support for external fences imported from sync fds.
-    // This is _almost_ universal on Android, but may be missing on
-    // some extremely old drivers, or on strange implementations like
-    // cuttlefish.
-    VkPhysicalDeviceExternalFenceInfo fenceInfo = {
-        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,
-        nullptr,
-        VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
-    };
-    VkExternalFenceProperties fenceProperties = {
-        VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,
-        nullptr,
-        0, 0, 0
-    };
-
-    GetPhysicalDeviceExternalFenceProperties(physicalDevice, &fenceInfo, &fenceProperties);
-    if (fenceProperties.externalFenceFeatures & VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT)
-        return true;
-
-    return false;
-}
-
 VkResult EnumerateDeviceExtensionProperties(
     VkPhysicalDevice physicalDevice,
     const char* pLayerName,
@@ -1197,12 +1149,6 @@
              VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION});
     }
 
-    if (CanSupportSwapchainMaintenance1Extension(physicalDevice)) {
-        loader_extensions.push_back({
-                VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME,
-                VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION});
-    }
-
     // enumerate our extensions first
     if (!pLayerName && pProperties) {
         uint32_t count = std::min(
@@ -1698,12 +1644,6 @@
                 imageCompressionControlSwapchainInChain = true;
             } break;
 
-            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-                auto smf = reinterpret_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *>(
-                        pFeats);
-                smf->swapchainMaintenance1 = true;
-            } break;
-
             default:
                 break;
         }
