diff --git a/src/dawn_native/Buffer.h b/src/dawn_native/Buffer.h
index 9c3d40281..7ad78a9 100644
--- a/src/dawn_native/Buffer.h
+++ b/src/dawn_native/Buffer.h
@@ -15,7 +15,6 @@
 #ifndef DAWNNATIVE_BUFFER_H_
 #define DAWNNATIVE_BUFFER_H_
 
-#include "dawn_native/Builder.h"
 #include "dawn_native/Error.h"
 #include "dawn_native/Forward.h"
 #include "dawn_native/ObjectBase.h"
@@ -94,18 +93,6 @@
         BufferState mState;
     };
 
-    // This builder class is kept around purely for testing but should not be used.
-    class BufferBuilder : public Builder<BufferBase> {
-      public:
-        BufferBuilder(DeviceBase* device) : Builder(device) {
-            UNREACHABLE();
-        }
-
-        void SetSize(uint32_t) {
-            UNREACHABLE();
-        }
-    };
-
 }  // namespace dawn_native
 
 #endif  // DAWNNATIVE_BUFFER_H_
diff --git a/src/dawn_native/Builder.cpp b/src/dawn_native/Builder.cpp
deleted file mode 100644
index 8c77632..0000000
--- a/src/dawn_native/Builder.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2017 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/Builder.h"
-
-#include "common/Assert.h"
-#include "dawn_native/Device.h"
-
-namespace dawn_native {
-
-    bool BuilderBase::CanBeUsed() const {
-        return !mIsConsumed && !mGotStatus;
-    }
-
-    void BuilderBase::HandleError(const char* message) {
-        SetStatus(dawn::BuilderErrorStatus::Error, message);
-    }
-
-    void BuilderBase::SetErrorCallback(dawn::BuilderErrorCallback callback,
-                                       dawn::CallbackUserdata userdata1,
-                                       dawn::CallbackUserdata userdata2) {
-        mCallback = callback;
-        mUserdata1 = userdata1;
-        mUserdata2 = userdata2;
-    }
-
-    BuilderBase::BuilderBase(DeviceBase* device) : ObjectBase(device) {
-    }
-
-    BuilderBase::~BuilderBase() {
-        if (!mIsConsumed && mCallback != nullptr) {
-            mCallback(DAWN_BUILDER_ERROR_STATUS_UNKNOWN, "Builder destroyed before GetResult",
-                      mUserdata1, mUserdata2);
-        }
-    }
-
-    void BuilderBase::SetStatus(dawn::BuilderErrorStatus status, const char* message) {
-        ASSERT(status != dawn::BuilderErrorStatus::Success);
-        ASSERT(status != dawn::BuilderErrorStatus::Unknown);
-        ASSERT(!mGotStatus);  // This is not strictly necessary but something to strive for.
-        mGotStatus = true;
-
-        mStoredStatus = status;
-        mStoredMessage = message;
-    }
-
-    bool BuilderBase::HandleResult(ObjectBase* result) {
-        // GetResult can only be called once.
-        ASSERT(!mIsConsumed);
-        mIsConsumed = true;
-
-        // result == nullptr implies there was an error which implies we should have a status set.
-        ASSERT(result != nullptr || mGotStatus);
-
-        // If we have any error, then we have to return nullptr
-        if (mGotStatus) {
-            ASSERT(mStoredStatus != dawn::BuilderErrorStatus::Success);
-
-            // The application will never see "result" so we need to remove the
-            // external ref here.
-            if (result != nullptr) {
-                result->Release();
-                result = nullptr;
-            }
-
-            // Unhandled builder errors are promoted to device errors
-            if (!mCallback)
-                GetDevice()->HandleError(("Unhandled builder error: " + mStoredMessage).c_str());
-        } else {
-            ASSERT(mStoredStatus == dawn::BuilderErrorStatus::Success);
-            ASSERT(mStoredMessage.empty());
-        }
-
-        if (mCallback != nullptr) {
-            mCallback(static_cast<DawnBuilderErrorStatus>(mStoredStatus), mStoredMessage.c_str(),
-                      mUserdata1, mUserdata2);
-        }
-
-        return result != nullptr;
-    }
-
-}  // namespace dawn_native
diff --git a/src/dawn_native/Builder.h b/src/dawn_native/Builder.h
deleted file mode 100644
index 19fef8e..0000000
--- a/src/dawn_native/Builder.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2017 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_BUILDER_H_
-#define DAWNNATIVE_BUILDER_H_
-
-#include "dawn_native/Forward.h"
-#include "dawn_native/ObjectBase.h"
-
-#include "dawn_native/dawn_platform.h"
-
-#include <string>
-
-namespace dawn_native {
-
-    // This class implements behavior shared by all builders:
-    //  - Tracking whether GetResult has been called already, needed by the autogenerated code to
-    //    prevent operations on "consumed" builders.
-    //  - The error status callback of the API. The callback is guaranteed to be called exactly once
-    //    with an error, a success, or "unknown" if the builder is destroyed; also the builder
-    //    callback cannot be called before either the object is destroyed or GetResult is called.
-    //
-    // It is possible for error to be generated before the error callback is registered when a
-    // builder "set" function performance validation inline. Because of this we have to store the
-    // status in the builder and defer calling the callback to GetResult.
-
-    class BuilderBase : public ObjectBase {
-      public:
-        // Used by the auto-generated validation to prevent usage of the builder
-        // after GetResult or an error.
-        bool CanBeUsed() const;
-
-        // Set the status of the builder to an error.
-        void HandleError(const char* message);
-
-        // Internal API, to be used by builder and BackendProcTable only.
-        // Returns true for success cases, and calls the callback with appropriate status.
-        bool HandleResult(ObjectBase* result);
-
-        // Dawn API
-        void SetErrorCallback(dawn::BuilderErrorCallback callback,
-                              dawn::CallbackUserdata userdata1,
-                              dawn::CallbackUserdata userdata2);
-
-      protected:
-        BuilderBase(DeviceBase* device);
-        ~BuilderBase();
-
-        bool mGotStatus = false;
-
-      private:
-        void SetStatus(dawn::BuilderErrorStatus status, const char* message);
-
-        dawn::BuilderErrorCallback mCallback = nullptr;
-        dawn::CallbackUserdata mUserdata1 = 0;
-        dawn::CallbackUserdata mUserdata2 = 0;
-
-        dawn::BuilderErrorStatus mStoredStatus = dawn::BuilderErrorStatus::Success;
-        std::string mStoredMessage;
-
-        bool mIsConsumed = false;
-    };
-
-    // This builder base class is used to capture the calls to GetResult and make sure that either:
-    //  - There was an error, callback is called with an error and nullptr is returned.
-    //  - There was no error, callback is called with success and a non-null T* is returned.
-    template <typename T>
-    class Builder : public BuilderBase {
-      public:
-        // Dawn API
-        T* GetResult();
-
-      protected:
-        using BuilderBase::BuilderBase;
-
-      private:
-        virtual T* GetResultImpl() = 0;
-    };
-
-    template <typename T>
-    T* Builder<T>::GetResult() {
-        T* result = GetResultImpl();
-        // An object can have been returned but failed its initialization, so if an error happened,
-        // return nullptr instead of result.
-        if (HandleResult(result)) {
-            return result;
-        } else {
-            return nullptr;
-        }
-    }
-
-}  // namespace dawn_native
-
-#endif  // DAWNNATIVE_BUILDER_H_
diff --git a/src/dawn_native/Device.h b/src/dawn_native/Device.h
index 188dd6c..82b01b5 100644
--- a/src/dawn_native/Device.h
+++ b/src/dawn_native/Device.h
@@ -30,7 +30,6 @@
     using ErrorCallback = void (*)(const char* errorMessage, void* userData);
 
     class AdapterBase;
-    class BufferBuilder;
     class FenceSignalTracker;
     class DynamicUploader;
     class StagingBufferBase;
@@ -106,10 +105,6 @@
         void Reference();
         void Release();
 
-        BufferBuilder* CreateBufferBuilderForTesting() {
-            return nullptr;
-        }
-
         virtual ResultOrError<std::unique_ptr<StagingBufferBase>> CreateStagingBuffer(
             size_t size) = 0;
         virtual MaybeError CopyFromStagingToBuffer(StagingBufferBase* source,
diff --git a/src/dawn_native/Pipeline.h b/src/dawn_native/Pipeline.h
index cc1c542..1f141f9 100644
--- a/src/dawn_native/Pipeline.h
+++ b/src/dawn_native/Pipeline.h
@@ -15,7 +15,6 @@
 #ifndef DAWNNATIVE_PIPELINE_H_
 #define DAWNNATIVE_PIPELINE_H_
 
-#include "dawn_native/Builder.h"
 #include "dawn_native/Forward.h"
 #include "dawn_native/ObjectBase.h"
 #include "dawn_native/PerStage.h"
diff --git a/src/dawn_native/Queue.h b/src/dawn_native/Queue.h
index 3da2f02..7b1031e 100644
--- a/src/dawn_native/Queue.h
+++ b/src/dawn_native/Queue.h
@@ -15,7 +15,6 @@
 #ifndef DAWNNATIVE_QUEUE_H_
 #define DAWNNATIVE_QUEUE_H_
 
-#include "dawn_native/Builder.h"
 #include "dawn_native/Error.h"
 #include "dawn_native/Forward.h"
 #include "dawn_native/ObjectBase.h"
diff --git a/src/dawn_native/ShaderModule.h b/src/dawn_native/ShaderModule.h
index dbeeb7b..b8020f9 100644
--- a/src/dawn_native/ShaderModule.h
+++ b/src/dawn_native/ShaderModule.h
@@ -16,7 +16,6 @@
 #define DAWNNATIVE_SHADERMODULE_H_
 
 #include "common/Constants.h"
-#include "dawn_native/Builder.h"
 #include "dawn_native/Error.h"
 #include "dawn_native/Forward.h"
 #include "dawn_native/ObjectBase.h"
diff --git a/src/dawn_native/SwapChain.h b/src/dawn_native/SwapChain.h
index a17fc0c..c8479c6 100644
--- a/src/dawn_native/SwapChain.h
+++ b/src/dawn_native/SwapChain.h
@@ -15,7 +15,6 @@
 #ifndef DAWNNATIVE_SWAPCHAIN_H_
 #define DAWNNATIVE_SWAPCHAIN_H_
 
-#include "dawn_native/Builder.h"
 #include "dawn_native/Error.h"
 #include "dawn_native/Forward.h"
 #include "dawn_native/ObjectBase.h"
diff --git a/src/dawn_native/Texture.h b/src/dawn_native/Texture.h
index db613cf..af91a63 100644
--- a/src/dawn_native/Texture.h
+++ b/src/dawn_native/Texture.h
@@ -15,7 +15,6 @@
 #ifndef DAWNNATIVE_TEXTURE_H_
 #define DAWNNATIVE_TEXTURE_H_
 
-#include "dawn_native/Builder.h"
 #include "dawn_native/Error.h"
 #include "dawn_native/Forward.h"
 #include "dawn_native/ObjectBase.h"
diff --git a/src/tests/unittests/wire/WireArgumentTests.cpp b/src/tests/unittests/wire/WireArgumentTests.cpp
index 8ed66c8..10dbd89 100644
--- a/src/tests/unittests/wire/WireArgumentTests.cpp
+++ b/src/tests/unittests/wire/WireArgumentTests.cpp
@@ -21,7 +21,7 @@
 
 class WireArgumentTests : public WireTest {
   public:
-    WireArgumentTests() : WireTest(true) {
+    WireArgumentTests() {
     }
     ~WireArgumentTests() override = default;
 };
diff --git a/src/tests/unittests/wire/WireBasicTests.cpp b/src/tests/unittests/wire/WireBasicTests.cpp
index b7c8e29..38bff0b 100644
--- a/src/tests/unittests/wire/WireBasicTests.cpp
+++ b/src/tests/unittests/wire/WireBasicTests.cpp
@@ -19,7 +19,7 @@
 
 class WireBasicTests : public WireTest {
   public:
-    WireBasicTests() : WireTest(true) {
+    WireBasicTests() {
     }
     ~WireBasicTests() override = default;
 };
diff --git a/src/tests/unittests/wire/WireBufferMappingTests.cpp b/src/tests/unittests/wire/WireBufferMappingTests.cpp
index 6a3126a..e1037ff 100644
--- a/src/tests/unittests/wire/WireBufferMappingTests.cpp
+++ b/src/tests/unittests/wire/WireBufferMappingTests.cpp
@@ -63,7 +63,7 @@
 
 class WireBufferMappingTests : public WireTest {
   public:
-    WireBufferMappingTests() : WireTest(true) {
+    WireBufferMappingTests() {
     }
     ~WireBufferMappingTests() override = default;
 
diff --git a/src/tests/unittests/wire/WireCallbackTests.cpp b/src/tests/unittests/wire/WireCallbackTests.cpp
deleted file mode 100644
index 7525839..0000000
--- a/src/tests/unittests/wire/WireCallbackTests.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-// 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 "tests/unittests/wire/WireTest.h"
-
-using namespace testing;
-using namespace dawn_wire;
-
-namespace {
-
-    // Mock classes to add expectations on the wire calling callbacks
-    class MockDeviceErrorCallback {
-      public:
-        MOCK_METHOD2(Call, void(const char* message, DawnCallbackUserdata userdata));
-    };
-
-    std::unique_ptr<StrictMock<MockDeviceErrorCallback>> mockDeviceErrorCallback;
-    void ToMockDeviceErrorCallback(const char* message, DawnCallbackUserdata userdata) {
-        mockDeviceErrorCallback->Call(message, userdata);
-    }
-
-    class MockBuilderErrorCallback {
-      public:
-        MOCK_METHOD4(Call,
-                     void(DawnBuilderErrorStatus status,
-                          const char* message,
-                          DawnCallbackUserdata userdata1,
-                          DawnCallbackUserdata userdata2));
-    };
-
-    std::unique_ptr<StrictMock<MockBuilderErrorCallback>> mockBuilderErrorCallback;
-    void ToMockBuilderErrorCallback(DawnBuilderErrorStatus status,
-                                    const char* message,
-                                    DawnCallbackUserdata userdata1,
-                                    DawnCallbackUserdata userdata2) {
-        mockBuilderErrorCallback->Call(status, message, userdata1, userdata2);
-    }
-
-}  // anonymous namespace
-
-class WireCallbackTests : public WireTest {
-  public:
-    WireCallbackTests() : WireTest(true) {
-    }
-    ~WireCallbackTests() override = default;
-
-    void SetUp() override {
-        WireTest::SetUp();
-
-        mockDeviceErrorCallback = std::make_unique<StrictMock<MockDeviceErrorCallback>>();
-        mockBuilderErrorCallback = std::make_unique<StrictMock<MockBuilderErrorCallback>>();
-    }
-
-    void TearDown() override {
-        WireTest::TearDown();
-
-        mockDeviceErrorCallback = nullptr;
-        mockBuilderErrorCallback = nullptr;
-    }
-
-    void FlushServer() {
-        WireTest::FlushServer();
-
-        Mock::VerifyAndClearExpectations(&mockDeviceErrorCallback);
-        Mock::VerifyAndClearExpectations(&mockBuilderErrorCallback);
-    }
-};
-
-// Test that we get a success builder error status when no error happens
-TEST_F(WireCallbackTests, SuccessCallbackOnBuilderSuccess) {
-    DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-    dawnBufferBuilderSetErrorCallback(bufferBuilder, ToMockBuilderErrorCallback, 1, 2);
-    dawnBufferBuilderGetResult(bufferBuilder);
-
-    DawnBufferBuilder apiBufferBuilder = api.GetNewBufferBuilder();
-    EXPECT_CALL(api, DeviceCreateBufferBuilderForTesting(apiDevice))
-        .WillOnce(Return(apiBufferBuilder));
-
-    DawnBuffer apiBuffer = api.GetNewBuffer();
-    EXPECT_CALL(api, BufferBuilderGetResult(apiBufferBuilder))
-        .WillOnce(InvokeWithoutArgs([&]() -> DawnBuffer {
-            api.CallBuilderErrorCallback(apiBufferBuilder, DAWN_BUILDER_ERROR_STATUS_SUCCESS,
-                                         "I like cheese");
-            return apiBuffer;
-        }));
-
-    FlushClient();
-
-    EXPECT_CALL(*mockBuilderErrorCallback, Call(DAWN_BUILDER_ERROR_STATUS_SUCCESS, _, 1, 2));
-
-    FlushServer();
-}
-
-// Test that the client calls the builder callback with unknown when it HAS to fire the callback but
-// can't know the status yet.
-TEST_F(WireCallbackTests, UnknownBuilderErrorStatusCallback) {
-    // The builder is destroyed before the object is built
-    {
-        DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-        dawnBufferBuilderSetErrorCallback(bufferBuilder, ToMockBuilderErrorCallback, 1, 2);
-
-        EXPECT_CALL(*mockBuilderErrorCallback, Call(DAWN_BUILDER_ERROR_STATUS_UNKNOWN, _, 1, 2))
-            .Times(1);
-
-        dawnBufferBuilderRelease(bufferBuilder);
-    }
-
-    // If the builder has been consumed, it doesn't fire the callback with unknown
-    {
-        DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-        dawnBufferBuilderSetErrorCallback(bufferBuilder, ToMockBuilderErrorCallback, 3, 4);
-        dawnBufferBuilderGetResult(bufferBuilder);
-
-        EXPECT_CALL(*mockBuilderErrorCallback, Call(DAWN_BUILDER_ERROR_STATUS_UNKNOWN, _, 3, 4))
-            .Times(0);
-
-        dawnBufferBuilderRelease(bufferBuilder);
-    }
-
-    // If the builder has been consumed, and the object is destroyed before the result comes from
-    // the server, then the callback is fired with unknown
-    {
-        DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-        dawnBufferBuilderSetErrorCallback(bufferBuilder, ToMockBuilderErrorCallback, 5, 6);
-        DawnBuffer buffer = dawnBufferBuilderGetResult(bufferBuilder);
-
-        EXPECT_CALL(*mockBuilderErrorCallback, Call(DAWN_BUILDER_ERROR_STATUS_UNKNOWN, _, 5, 6))
-            .Times(1);
-
-        dawnBufferRelease(buffer);
-    }
-}
-
-// Test that a builder success status doesn't get forwarded to the device
-TEST_F(WireCallbackTests, SuccessCallbackNotForwardedToDevice) {
-    dawnDeviceSetErrorCallback(device, ToMockDeviceErrorCallback, 0);
-
-    DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-    dawnBufferBuilderGetResult(bufferBuilder);
-
-    DawnBufferBuilder apiBufferBuilder = api.GetNewBufferBuilder();
-    EXPECT_CALL(api, DeviceCreateBufferBuilderForTesting(apiDevice))
-        .WillOnce(Return(apiBufferBuilder));
-
-    DawnBuffer apiBuffer = api.GetNewBuffer();
-    EXPECT_CALL(api, BufferBuilderGetResult(apiBufferBuilder))
-        .WillOnce(InvokeWithoutArgs([&]() -> DawnBuffer {
-            api.CallBuilderErrorCallback(apiBufferBuilder, DAWN_BUILDER_ERROR_STATUS_SUCCESS,
-                                         "I like cheese");
-            return apiBuffer;
-        }));
-
-    FlushClient();
-    FlushServer();
-}
-
-// Test that a builder error status gets forwarded to the device
-TEST_F(WireCallbackTests, ErrorCallbackForwardedToDevice) {
-    uint64_t userdata = 30495;
-    dawnDeviceSetErrorCallback(device, ToMockDeviceErrorCallback, userdata);
-
-    DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-    dawnBufferBuilderGetResult(bufferBuilder);
-
-    DawnBufferBuilder apiBufferBuilder = api.GetNewBufferBuilder();
-    EXPECT_CALL(api, DeviceCreateBufferBuilderForTesting(apiDevice))
-        .WillOnce(Return(apiBufferBuilder));
-
-    EXPECT_CALL(api, BufferBuilderGetResult(apiBufferBuilder))
-        .WillOnce(InvokeWithoutArgs([&]() -> DawnBuffer {
-            api.CallBuilderErrorCallback(apiBufferBuilder, DAWN_BUILDER_ERROR_STATUS_ERROR,
-                                         "Error :(");
-            return nullptr;
-        }));
-
-    FlushClient();
-
-    EXPECT_CALL(*mockDeviceErrorCallback, Call(_, userdata)).Times(1);
-
-    FlushServer();
-}
-
-// Test the return wire for device error callbacks
-TEST_F(WireCallbackTests, DeviceErrorCallback) {
-    uint64_t userdata = 3049785;
-    dawnDeviceSetErrorCallback(device, ToMockDeviceErrorCallback, userdata);
-
-    // Setting the error callback should stay on the client side and do nothing
-    FlushClient();
-
-    // Calling the callback on the server side will result in the callback being called on the
-    // client side
-    api.CallDeviceErrorCallback(apiDevice, "Some error message");
-
-    EXPECT_CALL(*mockDeviceErrorCallback, Call(StrEq("Some error message"), userdata)).Times(1);
-
-    FlushServer();
-}
-
-// Test the return wire for device error callbacks
-TEST_F(WireCallbackTests, BuilderErrorCallback) {
-    uint64_t userdata1 = 982734;
-    uint64_t userdata2 = 982734239028;
-
-    // Create the buffer builder, the callback is set immediately on the server side
-    DawnBufferBuilder bufferBuilder = dawnDeviceCreateBufferBuilderForTesting(device);
-
-    DawnBufferBuilder apiBufferBuilder = api.GetNewBufferBuilder();
-    EXPECT_CALL(api, DeviceCreateBufferBuilderForTesting(apiDevice))
-        .WillOnce(Return(apiBufferBuilder));
-
-    EXPECT_CALL(api, OnBuilderSetErrorCallback(apiBufferBuilder, _, _, _)).Times(1);
-
-    FlushClient();
-
-    // Setting the callback on the client side doesn't do anything on the server side
-    dawnBufferBuilderSetErrorCallback(bufferBuilder, ToMockBuilderErrorCallback, userdata1,
-                                      userdata2);
-    FlushClient();
-
-    // Create an object so that it is a valid case to call the error callback
-    dawnBufferBuilderGetResult(bufferBuilder);
-
-    DawnBuffer apiBuffer = api.GetNewBuffer();
-    EXPECT_CALL(api, BufferBuilderGetResult(apiBufferBuilder))
-        .WillOnce(InvokeWithoutArgs([&]() -> DawnBuffer {
-            api.CallBuilderErrorCallback(apiBufferBuilder, DAWN_BUILDER_ERROR_STATUS_SUCCESS,
-                                         "Success!");
-            return apiBuffer;
-        }));
-
-    FlushClient();
-
-    // The error callback gets called on the client side
-    EXPECT_CALL(*mockBuilderErrorCallback,
-                Call(DAWN_BUILDER_ERROR_STATUS_SUCCESS, StrEq("Success!"), userdata1, userdata2))
-        .Times(1);
-
-    FlushServer();
-}
diff --git a/src/tests/unittests/wire/WireErrorCallbackTests.cpp b/src/tests/unittests/wire/WireErrorCallbackTests.cpp
new file mode 100644
index 0000000..d92b83c
--- /dev/null
+++ b/src/tests/unittests/wire/WireErrorCallbackTests.cpp
@@ -0,0 +1,75 @@
+// 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 "tests/unittests/wire/WireTest.h"
+
+using namespace testing;
+using namespace dawn_wire;
+
+namespace {
+
+    // Mock classes to add expectations on the wire calling callbacks
+    class MockDeviceErrorCallback {
+      public:
+        MOCK_METHOD2(Call, void(const char* message, DawnCallbackUserdata userdata));
+    };
+
+    std::unique_ptr<StrictMock<MockDeviceErrorCallback>> mockDeviceErrorCallback;
+    void ToMockDeviceErrorCallback(const char* message, DawnCallbackUserdata userdata) {
+        mockDeviceErrorCallback->Call(message, userdata);
+    }
+
+}  // anonymous namespace
+
+class WireErrorCallbackTests : public WireTest {
+  public:
+    WireErrorCallbackTests() {
+    }
+    ~WireErrorCallbackTests() override = default;
+
+    void SetUp() override {
+        WireTest::SetUp();
+
+        mockDeviceErrorCallback = std::make_unique<StrictMock<MockDeviceErrorCallback>>();
+    }
+
+    void TearDown() override {
+        WireTest::TearDown();
+
+        mockDeviceErrorCallback = nullptr;
+    }
+
+    void FlushServer() {
+        WireTest::FlushServer();
+
+        Mock::VerifyAndClearExpectations(&mockDeviceErrorCallback);
+    }
+};
+
+// Test the return wire for device error callbacks
+TEST_F(WireErrorCallbackTests, DeviceErrorCallback) {
+    uint64_t userdata = 3049785;
+    dawnDeviceSetErrorCallback(device, ToMockDeviceErrorCallback, userdata);
+
+    // Setting the error callback should stay on the client side and do nothing
+    FlushClient();
+
+    // Calling the callback on the server side will result in the callback being called on the
+    // client side
+    api.CallDeviceErrorCallback(apiDevice, "Some error message");
+
+    EXPECT_CALL(*mockDeviceErrorCallback, Call(StrEq("Some error message"), userdata)).Times(1);
+
+    FlushServer();
+}
diff --git a/src/tests/unittests/wire/WireFenceTests.cpp b/src/tests/unittests/wire/WireFenceTests.cpp
index a5275a3..f8d415f 100644
--- a/src/tests/unittests/wire/WireFenceTests.cpp
+++ b/src/tests/unittests/wire/WireFenceTests.cpp
@@ -45,7 +45,7 @@
 
 class WireFenceTests : public WireTest {
   public:
-    WireFenceTests() : WireTest(true) {
+    WireFenceTests() {
     }
     ~WireFenceTests() override = default;
 
diff --git a/src/tests/unittests/wire/WireInjectTextureTests.cpp b/src/tests/unittests/wire/WireInjectTextureTests.cpp
index 7c3a83b..b8e0cbe 100644
--- a/src/tests/unittests/wire/WireInjectTextureTests.cpp
+++ b/src/tests/unittests/wire/WireInjectTextureTests.cpp
@@ -22,7 +22,7 @@
 
 class WireInjectTextureTests : public WireTest {
   public:
-    WireInjectTextureTests() : WireTest(true) {
+    WireInjectTextureTests() {
     }
     ~WireInjectTextureTests() override = default;
 };
diff --git a/src/tests/unittests/wire/WireOptionalTests.cpp b/src/tests/unittests/wire/WireOptionalTests.cpp
index 59b5206..55b67ed 100644
--- a/src/tests/unittests/wire/WireOptionalTests.cpp
+++ b/src/tests/unittests/wire/WireOptionalTests.cpp
@@ -19,7 +19,7 @@
 
 class WireOptionalTests : public WireTest {
   public:
-    WireOptionalTests() : WireTest(true) {
+    WireOptionalTests() {
     }
     ~WireOptionalTests() override = default;
 };
diff --git a/src/tests/unittests/wire/WireTest.cpp b/src/tests/unittests/wire/WireTest.cpp
index 7bc94e0..94aa7cd 100644
--- a/src/tests/unittests/wire/WireTest.cpp
+++ b/src/tests/unittests/wire/WireTest.cpp
@@ -21,7 +21,7 @@
 using namespace testing;
 using namespace dawn_wire;
 
-WireTest::WireTest(bool ignoreSetCallbackCalls) : mIgnoreSetCallbackCalls(ignoreSetCallbackCalls) {
+WireTest::WireTest() {
 }
 
 WireTest::~WireTest() {
@@ -87,8 +87,5 @@
 }
 
 void WireTest::SetupIgnoredCallExpectations() {
-    if (mIgnoreSetCallbackCalls) {
-        EXPECT_CALL(api, OnBuilderSetErrorCallback(_, _, _, _)).Times(AnyNumber());
-    }
     EXPECT_CALL(api, DeviceTick(_)).Times(AnyNumber());
 }
diff --git a/src/tests/unittests/wire/WireTest.h b/src/tests/unittests/wire/WireTest.h
index 3d32437..3173292 100644
--- a/src/tests/unittests/wire/WireTest.h
+++ b/src/tests/unittests/wire/WireTest.h
@@ -77,7 +77,7 @@
 
 class WireTest : public testing::Test {
   protected:
-    WireTest(bool ignoreSetCallbackCalls);
+    WireTest();
     ~WireTest() override;
 
     void SetUp() override;
@@ -96,7 +96,6 @@
 
   private:
     void SetupIgnoredCallExpectations();
-    bool mIgnoreSetCallbackCalls = false;
 
     std::unique_ptr<dawn_wire::WireServer> mWireServer;
     std::unique_ptr<dawn_wire::WireClient> mWireClient;
