diff --git a/vulkan/libvulkan/api.cpp b/vulkan/libvulkan/api.cpp
index 1014c14..3db625f 100644
--- a/vulkan/libvulkan/api.cpp
+++ b/vulkan/libvulkan/api.cpp
@@ -549,11 +549,7 @@
         return VK_ERROR_LAYER_NOT_PRESENT;
     }
 
-    if (is_instance_)
-        new (&layer) ActiveLayer{GetInstanceLayerRef(*l), {}};
-    else
-        new (&layer) ActiveLayer{GetDeviceLayerRef(*l), {}};
-
+    new (&layer) ActiveLayer{GetLayerRef(*l), {}};
     if (!layer.ref) {
         ALOGW("Failed to open layer %s", name);
         layer.ref.~LayerRef();
@@ -878,10 +874,18 @@
 }
 
 bool LayerChain::IsLayerExtension(const char* name) const {
-    for (uint32_t i = 0; i < layer_count_; i++) {
-        const ActiveLayer& layer = layers_[i];
-        if (layer.ref.SupportsExtension(name))
-            return true;
+    if (is_instance_) {
+        for (uint32_t i = 0; i < layer_count_; i++) {
+            const ActiveLayer& layer = layers_[i];
+            if (FindLayerInstanceExtension(*layer.ref, name))
+                return true;
+        }
+    } else {
+        for (uint32_t i = 0; i < layer_count_; i++) {
+            const ActiveLayer& layer = layers_[i];
+            if (FindLayerDeviceExtension(*layer.ref, name))
+                return true;
+        }
     }
 
     return false;
diff --git a/vulkan/libvulkan/layers_extensions.cpp b/vulkan/libvulkan/layers_extensions.cpp
index 9998aee..f9b1002 100644
--- a/vulkan/libvulkan/layers_extensions.cpp
+++ b/vulkan/libvulkan/layers_extensions.cpp
@@ -330,6 +330,16 @@
     closedir(directory);
 }
 
+const VkExtensionProperties* FindExtension(
+    const std::vector<VkExtensionProperties>& extensions,
+    const char* name) {
+    auto it = std::find_if(extensions.cbegin(), extensions.cend(),
+                           [=](const VkExtensionProperties& ext) {
+                               return (strcmp(ext.extensionName, name) == 0);
+                           });
+    return (it != extensions.cend()) ? &*it : nullptr;
+}
+
 void* GetLayerGetProcAddr(const Layer& layer,
                           const char* gpa_name,
                           size_t gpa_name_len) {
@@ -383,19 +393,22 @@
     return layer.device_extensions.data();
 }
 
-LayerRef GetInstanceLayerRef(const Layer& layer) {
-    LayerLibrary& library = g_layer_libraries[layer.library_idx];
-    return LayerRef((library.Open()) ? &layer : nullptr, true);
+const VkExtensionProperties* FindLayerInstanceExtension(const Layer& layer,
+                                                        const char* name) {
+    return FindExtension(layer.instance_extensions, name);
 }
 
-LayerRef GetDeviceLayerRef(const Layer& layer) {
-    LayerLibrary& library = g_layer_libraries[layer.library_idx];
-    return LayerRef((layer.is_global && library.Open()) ? &layer : nullptr,
-                    false);
+const VkExtensionProperties* FindLayerDeviceExtension(const Layer& layer,
+                                                      const char* name) {
+    return FindExtension(layer.device_extensions, name);
 }
 
-LayerRef::LayerRef(const Layer* layer, bool is_instance)
-    : layer_(layer), is_instance_(is_instance) {}
+LayerRef GetLayerRef(const Layer& layer) {
+    LayerLibrary& library = g_layer_libraries[layer.library_idx];
+    return LayerRef((library.Open()) ? &layer : nullptr);
+}
+
+LayerRef::LayerRef(const Layer* layer) : layer_(layer) {}
 
 LayerRef::~LayerRef() {
     if (layer_) {
@@ -404,16 +417,7 @@
     }
 }
 
-const char* LayerRef::GetName() const {
-    return layer_->properties.layerName;
-}
-
-uint32_t LayerRef::GetSpecVersion() const {
-    return layer_->properties.specVersion;
-}
-
-LayerRef::LayerRef(LayerRef&& other)
-    : layer_(other.layer_), is_instance_(other.is_instance_) {
+LayerRef::LayerRef(LayerRef&& other) : layer_(other.layer_) {
     other.layer_ = nullptr;
 }
 
@@ -429,14 +433,5 @@
                   : nullptr;
 }
 
-bool LayerRef::SupportsExtension(const char* name) const {
-    const auto& extensions = (is_instance_) ? layer_->instance_extensions
-                                            : layer_->device_extensions;
-    return std::find_if(extensions.cbegin(), extensions.cend(),
-                        [=](const VkExtensionProperties& ext) {
-                            return strcmp(ext.extensionName, name) == 0;
-                        }) != extensions.cend();
-}
-
 }  // namespace api
 }  // namespace vulkan
diff --git a/vulkan/libvulkan/layers_extensions.h b/vulkan/libvulkan/layers_extensions.h
index 32e1a67..79fe59d 100644
--- a/vulkan/libvulkan/layers_extensions.h
+++ b/vulkan/libvulkan/layers_extensions.h
@@ -26,26 +26,20 @@
 
 class LayerRef {
    public:
-    LayerRef(const Layer* layer, bool is_instance);
+    LayerRef(const Layer* layer);
     LayerRef(LayerRef&& other);
     ~LayerRef();
     LayerRef(const LayerRef&) = delete;
     LayerRef& operator=(const LayerRef&) = delete;
 
-    const char* GetName() const;
-    uint32_t GetSpecVersion() const;
-
     // provides bool-like behavior
     operator const Layer*() const { return layer_; }
 
     PFN_vkGetInstanceProcAddr GetGetInstanceProcAddr() const;
     PFN_vkGetDeviceProcAddr GetGetDeviceProcAddr() const;
 
-    bool SupportsExtension(const char* name) const;
-
    private:
     const Layer* layer_;
-    bool is_instance_;
 };
 
 void DiscoverLayers();
@@ -61,8 +55,12 @@
 const VkExtensionProperties* GetLayerDeviceExtensions(const Layer& layer,
                                                       uint32_t& count);
 
-LayerRef GetInstanceLayerRef(const Layer& layer);
-LayerRef GetDeviceLayerRef(const Layer& layer);
+const VkExtensionProperties* FindLayerInstanceExtension(const Layer& layer,
+                                                        const char* name);
+const VkExtensionProperties* FindLayerDeviceExtension(const Layer& layer,
+                                                      const char* name);
+
+LayerRef GetLayerRef(const Layer& layer);
 
 }  // namespace api
 }  // namespace vulkan
