diff --git a/Sources/ElixxirDAppsSDK/Legacy/ClientError.swift b/Sources/ElixxirDAppsSDK/ClientError.swift
similarity index 100%
rename from Sources/ElixxirDAppsSDK/Legacy/ClientError.swift
rename to Sources/ElixxirDAppsSDK/ClientError.swift
diff --git a/Sources/ElixxirDAppsSDK/ClientErrorCallback.swift b/Sources/ElixxirDAppsSDK/ClientErrorCallback.swift
new file mode 100644
index 0000000000000000000000000000000000000000..065a243e35d15d15b338f6075215d7f915f20096
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/ClientErrorCallback.swift
@@ -0,0 +1,47 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ClientErrorCallback {
+  public init(handle: @escaping (ClientError) -> Void) {
+    self.handle = handle
+  }
+
+  public var handle: (ClientError) -> Void
+}
+
+extension ClientErrorCallback {
+  public static let unimplemented = ClientErrorCallback(
+    handle: XCTUnimplemented("\(Self.self)")
+  )
+}
+
+extension ClientErrorCallback {
+  func makeBindingsClientError() -> BindingsClientErrorProtocol {
+    class Reporter: NSObject, BindingsClientErrorProtocol {
+      init(_ callback: ClientErrorCallback) {
+        self.callback = callback
+      }
+
+      let callback: ClientErrorCallback
+
+      func report(_ source: String?, message: String?, trace: String?) {
+        guard let source = source else {
+          fatalError("BindingsClientError.report received `nil` source")
+        }
+        guard let message = message else {
+          fatalError("BindingsClientError.report received `nil` message")
+        }
+        guard let trace = trace else {
+          fatalError("BindingsClientError.report received `nil` trace")
+        }
+        callback.handle(ClientError(
+          source: source,
+          message: message,
+          trace: trace
+        ))
+      }
+    }
+
+    return Reporter(self)
+  }
+}
diff --git a/Sources/ElixxirDAppsSDK/Cmix.swift b/Sources/ElixxirDAppsSDK/Cmix.swift
index 092cff8b0807a89be2be710fcb1020578462deaf..5760d32f4db5b568c6cf84117ebc5cd86c57e1bc 100644
--- a/Sources/ElixxirDAppsSDK/Cmix.swift
+++ b/Sources/ElixxirDAppsSDK/Cmix.swift
@@ -10,6 +10,7 @@ public struct Cmix {
   public var startNetworkFollower: CmixStartNetworkFollower
   public var stopNetworkFollower: CmixStopNetworkFollower
   public var waitForNetwork: CmixWaitForNetwork
+  public var registerClientErrorCallback: CmixRegisterClientErrorCallback
 }
 
 extension Cmix {
@@ -23,7 +24,8 @@ extension Cmix {
       networkFollowerStatus: .live(bindingsCmix),
       startNetworkFollower: .live(bindingsCmix),
       stopNetworkFollower: .live(bindingsCmix),
-      waitForNetwork: .live(bindingsCmix)
+      waitForNetwork: .live(bindingsCmix),
+      registerClientErrorCallback: .live(bindingsCmix)
     )
   }
 }
@@ -38,6 +40,7 @@ extension Cmix {
     networkFollowerStatus: .unimplemented,
     startNetworkFollower: .unimplemented,
     stopNetworkFollower: .unimplemented,
-    waitForNetwork: .unimplemented
+    waitForNetwork: .unimplemented,
+    registerClientErrorCallback: .unimplemented
   )
 }
diff --git a/Sources/ElixxirDAppsSDK/CmixRegisterClientErrorCallback.swift b/Sources/ElixxirDAppsSDK/CmixRegisterClientErrorCallback.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a8a56a8f402eb4f8d9efe7d4ca1aca8972c76367
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/CmixRegisterClientErrorCallback.swift
@@ -0,0 +1,28 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct CmixRegisterClientErrorCallback {
+  public var run: (ClientErrorCallback) -> Void
+
+  public func callAsFunction(
+    _ callback: ClientErrorCallback
+  ) {
+    run(callback)
+  }
+}
+
+extension CmixRegisterClientErrorCallback {
+  public static func live(_ bindingsCmix: BindingsCmix) -> CmixRegisterClientErrorCallback {
+    CmixRegisterClientErrorCallback { callback in
+      bindingsCmix.registerClientErrorCallback(
+        callback.makeBindingsClientError()
+      )
+    }
+  }
+}
+
+extension CmixRegisterClientErrorCallback {
+  public static let unimplemented = CmixRegisterClientErrorCallback(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Legacy/ClientErrorListener.swift b/Sources/ElixxirDAppsSDK/Legacy/ClientErrorListener.swift
deleted file mode 100644
index 7babe34e57c1ad2e9ae0ff33a760f55fda419dc9..0000000000000000000000000000000000000000
--- a/Sources/ElixxirDAppsSDK/Legacy/ClientErrorListener.swift
+++ /dev/null
@@ -1,48 +0,0 @@
-import Bindings
-
-public struct ClientErrorListener {
-  public var listen: (@escaping (ClientError) -> Void) -> Void
-
-  public func callAsFunction(callback: @escaping (ClientError) -> Void) {
-    listen(callback)
-  }
-}
-
-extension ClientErrorListener {
-  public static func live(bindingsClient: BindingsCmix) -> ClientErrorListener {
-    ClientErrorListener { callback in
-      let listener = Listener(onReport: callback)
-      bindingsClient.registerClientErrorCallback(listener)
-    }
-  }
-}
-
-private final class Listener: NSObject, BindingsClientErrorProtocol {
-  init(onReport: @escaping (ClientError) -> Void) {
-    self.onReport = onReport
-    super.init()
-  }
-
-  let onReport: (ClientError) -> Void
-
-  func report(_ source: String?, message: String?, trace: String?) {
-    guard let source = source else {
-      fatalError("BindingsClientError.source is `nil`")
-    }
-    guard let message = message else {
-      fatalError("BindingsClientError.message is `nil`")
-    }
-    guard let trace = trace else {
-      fatalError("BindingsClientError.trace is `nil`")
-    }
-    onReport(ClientError(source: source, message: message, trace: trace))
-  }
-}
-
-#if DEBUG
-extension ClientErrorListener {
-  public static let failing = ClientErrorListener { _ in
-    fatalError("Not implemented")
-  }
-}
-#endif