diff --git a/BUILD.gn b/BUILD.gn
index 4604f8a..92370be 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -506,6 +506,10 @@
   if (dawn_enable_d3d12) {
     libs += [ "dxguid.lib" ]
     sources += [
+      "src/dawn_native/d3d12/AdapterD3D12.cpp",
+      "src/dawn_native/d3d12/AdapterD3D12.h",
+      "src/dawn_native/d3d12/BackendD3D12.cpp",
+      "src/dawn_native/d3d12/BackendD3D12.h",
       "src/dawn_native/d3d12/BindGroupD3D12.cpp",
       "src/dawn_native/d3d12/BindGroupD3D12.h",
       "src/dawn_native/d3d12/BindGroupLayoutD3D12.cpp",
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index c5f6993..f0f879c 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -70,6 +70,10 @@
         mErrorUserdata = userdata;
     }
 
+    AdapterBase* DeviceBase::GetAdapter() const {
+        return mAdapter;
+    }
+
     DeviceBase* DeviceBase::GetDevice() {
         return this;
     }
diff --git a/src/dawn_native/Device.h b/src/dawn_native/Device.h
index fc79075..977ba73 100644
--- a/src/dawn_native/Device.h
+++ b/src/dawn_native/Device.h
@@ -49,6 +49,8 @@
             return false;
         }
 
+        AdapterBase* GetAdapter() const;
+
         // Used by autogenerated code, returns itself
         DeviceBase* GetDevice();
 
diff --git a/src/dawn_native/d3d12/AdapterD3D12.cpp b/src/dawn_native/d3d12/AdapterD3D12.cpp
new file mode 100644
index 0000000..f1d4630
--- /dev/null
+++ b/src/dawn_native/d3d12/AdapterD3D12.cpp
@@ -0,0 +1,55 @@
+// Copyright 2019 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "dawn_native/d3d12/AdapterD3D12.h"
+
+#include "dawn_native/d3d12/BackendD3D12.h"
+#include "dawn_native/d3d12/DeviceD3D12.h"
+#include "dawn_native/d3d12/PlatformFunctions.h"
+
+#include <locale>
+
+namespace dawn_native { namespace d3d12 {
+
+    Adapter::Adapter(Backend* backend, ComPtr<IDXGIAdapter1> hardwareAdapter)
+        : AdapterBase(backend->GetInstance(), BackendType::D3D12),
+          mHardwareAdapter(hardwareAdapter),
+          mBackend(backend) {
+        DXGI_ADAPTER_DESC1 adapterDesc;
+        mHardwareAdapter->GetDesc1(&adapterDesc);
+
+        mPCIInfo.deviceId = adapterDesc.DeviceId;
+        mPCIInfo.vendorId = adapterDesc.VendorId;
+
+        std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> converter(
+            "Error converting");
+        mPCIInfo.name = converter.to_bytes(adapterDesc.Description);
+    }
+
+    Backend* Adapter::GetBackend() const {
+        return mBackend;
+    }
+
+    ResultOrError<DeviceBase*> Adapter::CreateDeviceImpl() {
+        ComPtr<ID3D12Device> d3d12Device;
+        if (FAILED(mBackend->GetFunctions()->d3d12CreateDevice(
+                mHardwareAdapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&d3d12Device)))) {
+            return DAWN_CONTEXT_LOST_ERROR("D3D12CreateDevice failed");
+        }
+
+        ASSERT(d3d12Device != nullptr);
+        return new Device(this, d3d12Device);
+    }
+
+}}  // namespace dawn_native::d3d12
diff --git a/src/dawn_native/d3d12/AdapterD3D12.h b/src/dawn_native/d3d12/AdapterD3D12.h
new file mode 100644
index 0000000..1ff8b6d
--- /dev/null
+++ b/src/dawn_native/d3d12/AdapterD3D12.h
@@ -0,0 +1,42 @@
+// Copyright 2019 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef DAWNNATIVE_D3D12_ADAPTERD3D12_H_
+#define DAWNNATIVE_D3D12_ADAPTERD3D12_H_
+
+#include "dawn_native/Adapter.h"
+
+#include "dawn_native/d3d12/d3d12_platform.h"
+
+namespace dawn_native { namespace d3d12 {
+
+    class Backend;
+
+    class Adapter : public AdapterBase {
+      public:
+        Adapter(Backend* backend, ComPtr<IDXGIAdapter1> hardwareAdapter);
+        virtual ~Adapter() = default;
+
+        Backend* GetBackend() const;
+
+      private:
+        ResultOrError<DeviceBase*> CreateDeviceImpl() override;
+
+        ComPtr<IDXGIAdapter1> mHardwareAdapter;
+        Backend* mBackend;
+    };
+
+}}  // namespace dawn_native::d3d12
+
+#endif  // DAWNNATIVE_D3D12_ADAPTERD3D12_H_
\ No newline at end of file
diff --git a/src/dawn_native/d3d12/BackendD3D12.cpp b/src/dawn_native/d3d12/BackendD3D12.cpp
new file mode 100644
index 0000000..4db3527
--- /dev/null
+++ b/src/dawn_native/d3d12/BackendD3D12.cpp
@@ -0,0 +1,111 @@
+// Copyright 2019 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "dawn_native/d3d12/BackendD3D12.h"
+
+#include "dawn_native/D3D12Backend.h"
+#include "dawn_native/Instance.h"
+#include "dawn_native/d3d12/AdapterD3D12.h"
+#include "dawn_native/d3d12/PlatformFunctions.h"
+
+namespace dawn_native { namespace d3d12 {
+
+    namespace {
+
+        ResultOrError<ComPtr<IDXGIFactory4>> CreateFactory(const PlatformFunctions* functions) {
+            ComPtr<IDXGIFactory4> factory;
+
+            uint32_t dxgiFactoryFlags = 0;
+#if defined(DAWN_ENABLE_ASSERTS)
+            // Enable the debug layer (requires the Graphics Tools "optional feature").
+            {
+                ComPtr<ID3D12Debug> debugController;
+                if (SUCCEEDED(functions->d3d12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
+                    ASSERT(debugController != nullptr);
+                    debugController->EnableDebugLayer();
+
+                    // Enable additional debug layers.
+                    dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
+                }
+
+                ComPtr<IDXGIDebug1> dxgiDebug;
+                if (SUCCEEDED(functions->dxgiGetDebugInterface1(0, IID_PPV_ARGS(&dxgiDebug)))) {
+                    ASSERT(dxgiDebug != nullptr);
+                    dxgiDebug->ReportLiveObjects(DXGI_DEBUG_ALL,
+                                                 DXGI_DEBUG_RLO_FLAGS(DXGI_DEBUG_RLO_ALL));
+                }
+            }
+#endif  // defined(DAWN_ENABLE_ASSERTS)
+
+            if (FAILED(functions->createDxgiFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&factory)))) {
+                return DAWN_CONTEXT_LOST_ERROR("Failed to create a DXGI factory");
+            }
+
+            ASSERT(factory != nullptr);
+            return factory;
+        }
+
+    }  // anonymous namespace
+
+    Backend::Backend(InstanceBase* instance) : BackendConnection(instance, BackendType::D3D12) {
+    }
+
+    MaybeError Backend::Initialize() {
+        mFunctions = std::make_unique<PlatformFunctions>();
+        DAWN_TRY(mFunctions->LoadFunctions());
+
+        DAWN_TRY_ASSIGN(mFactory, CreateFactory(mFunctions.get()));
+
+        return {};
+    }
+
+    ComPtr<IDXGIFactory4> Backend::GetFactory() const {
+        return mFactory;
+    }
+
+    const PlatformFunctions* Backend::GetFunctions() const {
+        return mFunctions.get();
+    }
+
+    std::vector<std::unique_ptr<AdapterBase>> Backend::DiscoverDefaultAdapters() {
+        std::vector<std::unique_ptr<AdapterBase>> adapters;
+
+        for (uint32_t adapterIndex = 0;; ++adapterIndex) {
+            ComPtr<IDXGIAdapter1> dxgiAdapter = nullptr;
+            if (mFactory->EnumAdapters1(adapterIndex, &dxgiAdapter) == DXGI_ERROR_NOT_FOUND) {
+                break;  // No more adapters to enumerate.
+            }
+
+            ASSERT(dxgiAdapter != nullptr);
+            if (SUCCEEDED(mFunctions->d3d12CreateDevice(dxgiAdapter.Get(), D3D_FEATURE_LEVEL_11_0,
+                                                        _uuidof(ID3D12Device), nullptr))) {
+                adapters.push_back(std::make_unique<Adapter>(this, dxgiAdapter));
+            }
+        }
+
+        return adapters;
+    }
+
+    BackendConnection* Connect(InstanceBase* instance) {
+        Backend* backend = new Backend(instance);
+
+        if (instance->ConsumedError(backend->Initialize())) {
+            delete backend;
+            return nullptr;
+        }
+
+        return backend;
+    }
+
+}}  // namespace dawn_native::d3d12
diff --git a/src/dawn_native/d3d12/BackendD3D12.h b/src/dawn_native/d3d12/BackendD3D12.h
new file mode 100644
index 0000000..3161048
--- /dev/null
+++ b/src/dawn_native/d3d12/BackendD3D12.h
@@ -0,0 +1,46 @@
+// Copyright 2019 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef DAWNNATIVE_D3D12_BACKENDD3D12_H_
+#define DAWNNATIVE_D3D12_BACKENDD3D12_H_
+
+#include "dawn_native/BackendConnection.h"
+
+#include "dawn_native/d3d12/d3d12_platform.h"
+
+namespace dawn_native { namespace d3d12 {
+
+    class PlatformFunctions;
+
+    class Backend : public BackendConnection {
+      public:
+        Backend(InstanceBase* instance);
+
+        MaybeError Initialize();
+
+        ComPtr<IDXGIFactory4> GetFactory() const;
+        const PlatformFunctions* GetFunctions() const;
+
+        std::vector<std::unique_ptr<AdapterBase>> DiscoverDefaultAdapters() override;
+
+      private:
+        // Keep mFunctions as the first member so that in the destructor it is freed last. Otherwise
+        // the D3D12 DLLs are unloaded before we are done using them.
+        std::unique_ptr<PlatformFunctions> mFunctions;
+        ComPtr<IDXGIFactory4> mFactory;
+    };
+
+}}  // namespace dawn_native::d3d12
+
+#endif  // DAWNNATIVE_D3D12_BACKENDD3D12_H_
\ No newline at end of file
diff --git a/src/dawn_native/d3d12/D3D12Backend.cpp b/src/dawn_native/d3d12/D3D12Backend.cpp
index 2195f61..0f09bbe 100644
--- a/src/dawn_native/d3d12/D3D12Backend.cpp
+++ b/src/dawn_native/d3d12/D3D12Backend.cpp
@@ -23,10 +23,6 @@
 
 namespace dawn_native { namespace d3d12 {
 
-    dawnDevice CreateDevice() {
-        return reinterpret_cast<dawnDevice>(new Device());
-    }
-
     dawnSwapChainImplementation CreateNativeSwapChainImpl(dawnDevice device, HWND window) {
         Device* backendDevice = reinterpret_cast<Device*>(device);
 
diff --git a/src/dawn_native/d3d12/DeviceD3D12.cpp b/src/dawn_native/d3d12/DeviceD3D12.cpp
index 0ad3f4d..9f5920c 100644
--- a/src/dawn_native/d3d12/DeviceD3D12.cpp
+++ b/src/dawn_native/d3d12/DeviceD3D12.cpp
@@ -17,6 +17,8 @@
 #include "common/Assert.h"
 #include "dawn_native/BackendConnection.h"
 #include "dawn_native/DynamicUploader.h"
+#include "dawn_native/d3d12/AdapterD3D12.h"
+#include "dawn_native/d3d12/BackendD3D12.h"
 #include "dawn_native/d3d12/BindGroupD3D12.h"
 #include "dawn_native/d3d12/BindGroupLayoutD3D12.h"
 #include "dawn_native/d3d12/BufferD3D12.h"
@@ -37,88 +39,14 @@
 #include "dawn_native/d3d12/SwapChainD3D12.h"
 #include "dawn_native/d3d12/TextureD3D12.h"
 
-#include <locale>
-
 namespace dawn_native { namespace d3d12 {
 
     void ASSERT_SUCCESS(HRESULT hr) {
         ASSERT(SUCCEEDED(hr));
     }
 
-    BackendConnection* Connect(InstanceBase* instance) {
-        return nullptr;
-    }
-
-    namespace {
-        ComPtr<IDXGIFactory4> CreateFactory(const PlatformFunctions* functions) {
-            ComPtr<IDXGIFactory4> factory;
-
-            uint32_t dxgiFactoryFlags = 0;
-#if defined(DAWN_ENABLE_ASSERTS)
-            // Enable the debug layer (requires the Graphics Tools "optional feature").
-            {
-                ComPtr<ID3D12Debug> debugController;
-                if (SUCCEEDED(functions->d3d12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
-                    debugController->EnableDebugLayer();
-
-                    // Enable additional debug layers.
-                    dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
-                }
-
-                ComPtr<IDXGIDebug1> dxgiDebug;
-                if (SUCCEEDED(functions->dxgiGetDebugInterface1(0, IID_PPV_ARGS(&dxgiDebug)))) {
-                    dxgiDebug->ReportLiveObjects(DXGI_DEBUG_ALL,
-                                                 DXGI_DEBUG_RLO_FLAGS(DXGI_DEBUG_RLO_ALL));
-                }
-            }
-#endif  // defined(DAWN_ENABLE_ASSERTS)
-
-            ASSERT_SUCCESS(functions->createDxgiFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&factory)));
-            return factory;
-        }
-
-        ComPtr<IDXGIAdapter1> GetHardwareAdapter(ComPtr<IDXGIFactory4> factory,
-                                                 const PlatformFunctions* functions) {
-            for (uint32_t adapterIndex = 0;; ++adapterIndex) {
-                IDXGIAdapter1* adapter = nullptr;
-                if (factory->EnumAdapters1(adapterIndex, &adapter) == DXGI_ERROR_NOT_FOUND) {
-                    break;  // No more adapters to enumerate.
-                }
-
-                // Check to see if the adapter supports Direct3D 12, but don't create the actual
-                // device yet.
-                if (SUCCEEDED(functions->d3d12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0,
-                                                           _uuidof(ID3D12Device), nullptr))) {
-                    return adapter;
-                }
-                adapter->Release();
-            }
-            return nullptr;
-        }
-
-    }  // anonymous namespace
-
-    Device::Device() : DeviceBase(nullptr) {
-        mFunctions = std::make_unique<PlatformFunctions>();
-
-        {
-            MaybeError status = mFunctions->LoadFunctions();
-            ASSERT(status.IsSuccess());
-        }
-
-        // Create the connection to DXGI and the D3D12 device
-        mFactory = CreateFactory(mFunctions.get());
-        ASSERT(mFactory.Get() != nullptr);
-
-        mHardwareAdapter = GetHardwareAdapter(mFactory, mFunctions.get());
-        ASSERT(mHardwareAdapter.Get() != nullptr);
-
-        ASSERT_SUCCESS(mFunctions->d3d12CreateDevice(mHardwareAdapter.Get(), D3D_FEATURE_LEVEL_11_0,
-                                                     IID_PPV_ARGS(&mD3d12Device)));
-
-        // Collect GPU information
-        CollectPCIInfo();
-
+    Device::Device(Adapter* adapter, ComPtr<ID3D12Device> d3d12Device)
+        : DeviceBase(adapter), mD3d12Device(d3d12Device) {
         // Create device-global objects
         D3D12_COMMAND_QUEUE_DESC queueDesc = {};
         queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
@@ -149,31 +77,31 @@
         ASSERT(mPendingCommands.commandList == nullptr);
     }
 
-    ComPtr<IDXGIFactory4> Device::GetFactory() {
-        return mFactory;
-    }
-
-    ComPtr<ID3D12Device> Device::GetD3D12Device() {
+    ComPtr<ID3D12Device> Device::GetD3D12Device() const {
         return mD3d12Device;
     }
 
-    ComPtr<ID3D12CommandQueue> Device::GetCommandQueue() {
+    ComPtr<ID3D12CommandQueue> Device::GetCommandQueue() const {
         return mCommandQueue;
     }
 
-    DescriptorHeapAllocator* Device::GetDescriptorHeapAllocator() {
+    DescriptorHeapAllocator* Device::GetDescriptorHeapAllocator() const {
         return mDescriptorHeapAllocator.get();
     }
 
-    const PlatformFunctions* Device::GetFunctions() {
-        return mFunctions.get();
+    ComPtr<IDXGIFactory4> Device::GetFactory() const {
+        return ToBackend(GetAdapter())->GetBackend()->GetFactory();
+    }
+
+    const PlatformFunctions* Device::GetFunctions() const {
+        return ToBackend(GetAdapter())->GetBackend()->GetFunctions();
     }
 
     MapRequestTracker* Device::GetMapRequestTracker() const {
         return mMapRequestTracker.get();
     }
 
-    ResourceAllocator* Device::GetResourceAllocator() {
+    ResourceAllocator* Device::GetResourceAllocator() const {
         return mResourceAllocator.get();
     }
 
@@ -225,10 +153,6 @@
         NextSerial();
     }
 
-    const dawn_native::PCIInfo& Device::GetPCIInfo() const {
-        return mPCIInfo;
-    }
-
     void Device::NextSerial() {
         mLastSubmittedSerial++;
         ASSERT_SUCCESS(mCommandQueue->Signal(mFence.Get(), mLastSubmittedSerial));
@@ -319,20 +243,6 @@
         return new TextureView(texture, descriptor);
     }
 
-    void Device::CollectPCIInfo() {
-        memset(&mPCIInfo, 0, sizeof(mPCIInfo));
-
-        DXGI_ADAPTER_DESC1 adapterDesc;
-        mHardwareAdapter->GetDesc1(&adapterDesc);
-
-        mPCIInfo.deviceId = adapterDesc.DeviceId;
-        mPCIInfo.vendorId = adapterDesc.VendorId;
-
-        std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> converter(
-            "Error converting");
-        mPCIInfo.name = converter.to_bytes(adapterDesc.Description);
-    }
-
     ResultOrError<std::unique_ptr<StagingBufferBase>> Device::CreateStagingBuffer(size_t size) {
         std::unique_ptr<StagingBufferBase> stagingBuffer =
             std::make_unique<StagingBuffer>(size, this);
diff --git a/src/dawn_native/d3d12/DeviceD3D12.h b/src/dawn_native/d3d12/DeviceD3D12.h
index be489d9..7182ae1 100644
--- a/src/dawn_native/d3d12/DeviceD3D12.h
+++ b/src/dawn_native/d3d12/DeviceD3D12.h
@@ -37,7 +37,7 @@
     // Definition of backend types
     class Device : public DeviceBase {
       public:
-        Device();
+        Device(Adapter* adapter, ComPtr<ID3D12Device> d3d12Device);
         ~Device();
 
         CommandBufferBase* CreateCommandBuffer(CommandBufferBuilder* builder) override;
@@ -50,16 +50,15 @@
         Serial GetLastSubmittedCommandSerial() const final override;
         void TickImpl() override;
 
-        const dawn_native::PCIInfo& GetPCIInfo() const override;
+        ComPtr<ID3D12Device> GetD3D12Device() const;
+        ComPtr<ID3D12CommandQueue> GetCommandQueue() const;
 
-        ComPtr<IDXGIFactory4> GetFactory();
-        ComPtr<ID3D12Device> GetD3D12Device();
-        ComPtr<ID3D12CommandQueue> GetCommandQueue();
-
-        DescriptorHeapAllocator* GetDescriptorHeapAllocator();
+        DescriptorHeapAllocator* GetDescriptorHeapAllocator() const;
         MapRequestTracker* GetMapRequestTracker() const;
-        const PlatformFunctions* GetFunctions();
-        ResourceAllocator* GetResourceAllocator();
+        ResourceAllocator* GetResourceAllocator() const;
+
+        const PlatformFunctions* GetFunctions() const;
+        ComPtr<IDXGIFactory4> GetFactory() const;
 
         void OpenCommandList(ComPtr<ID3D12GraphicsCommandList>* commandList);
         ComPtr<ID3D12GraphicsCommandList> GetPendingCommandList();
@@ -101,19 +100,12 @@
         ResultOrError<TextureViewBase*> CreateTextureViewImpl(
             TextureBase* texture,
             const TextureViewDescriptor* descriptor) override;
-        void CollectPCIInfo();
-
-        // Keep mFunctions as the first member so that in the destructor it is freed. Otherwise the
-        // D3D12 DLLs are unloaded before we are done using it.
-        std::unique_ptr<PlatformFunctions> mFunctions;
 
         Serial mCompletedSerial = 0;
         Serial mLastSubmittedSerial = 0;
         ComPtr<ID3D12Fence> mFence;
         HANDLE mFenceEvent;
 
-        ComPtr<IDXGIFactory4> mFactory;
-        ComPtr<IDXGIAdapter1> mHardwareAdapter;
         ComPtr<ID3D12Device> mD3d12Device;
         ComPtr<ID3D12CommandQueue> mCommandQueue;
 
diff --git a/src/dawn_native/opengl/BackendGL.h b/src/dawn_native/opengl/BackendGL.h
index eb5923a..e55cc52 100644
--- a/src/dawn_native/opengl/BackendGL.h
+++ b/src/dawn_native/opengl/BackendGL.h
@@ -12,6 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#ifndef DAWNNATIVE_OPENGL_BACKENDGL_H_
+#define DAWNNATIVE_OPENGL_BACKENDGL_H_
+
 #include "dawn_native/BackendConnection.h"
 
 namespace dawn_native { namespace opengl {
@@ -29,3 +32,5 @@
     };
 
 }}  // namespace dawn_native::opengl
+
+#endif  // DAWNNATIVE_OPENGL_BACKENDGL_H_
diff --git a/src/include/dawn_native/D3D12Backend.h b/src/include/dawn_native/D3D12Backend.h
index ddc3f12..5af3356 100644
--- a/src/include/dawn_native/D3D12Backend.h
+++ b/src/include/dawn_native/D3D12Backend.h
@@ -15,15 +15,12 @@
 #ifndef DAWNNATIVE_D3D12BACKEND_H_
 #define DAWNNATIVE_D3D12BACKEND_H_
 
-#include <dawn/dawn.h>
 #include <dawn/dawn_wsi.h>
-#include <dawn_native/dawn_native_export.h>
+#include <dawn_native/DawnNative.h>
 
 #include <windows.h>
 
 namespace dawn_native { namespace d3d12 {
-    DAWN_NATIVE_EXPORT dawnDevice CreateDevice();
-
     DAWN_NATIVE_EXPORT dawnSwapChainImplementation CreateNativeSwapChainImpl(dawnDevice device,
                                                                              HWND window);
     DAWN_NATIVE_EXPORT dawnTextureFormat
diff --git a/src/utils/D3D12Binding.cpp b/src/utils/D3D12Binding.cpp
index 7aa5722..c9a8f2a 100644
--- a/src/utils/D3D12Binding.cpp
+++ b/src/utils/D3D12Binding.cpp
@@ -30,8 +30,18 @@
         }
 
         dawnDevice CreateDevice() override {
-            mBackendDevice = dawn_native::d3d12::CreateDevice();
-            return mBackendDevice;
+            // Make an instance and find a D3D12 adapter
+            mInstance = std::make_unique<dawn_native::Instance>();
+            mInstance->DiscoverDefaultAdapters();
+
+            std::vector<dawn_native::Adapter> adapters = mInstance->GetAdapters();
+            for (dawn_native::Adapter adapter : adapters) {
+                if (adapter.GetBackendType() == dawn_native::BackendType::D3D12) {
+                    mBackendDevice = adapter.CreateDevice();
+                    return mBackendDevice;
+                }
+            }
+            UNREACHABLE();
         }
 
         uint64_t GetSwapChainImplementation() override {
@@ -49,6 +59,7 @@
         }
 
       private:
+        std::unique_ptr<dawn_native::Instance> mInstance;
         dawnDevice mBackendDevice = nullptr;
         dawnSwapChainImplementation mSwapchainImpl = {};
     };
