diff --git a/Sources/ElixxirDAppsSDK/Legacy/Cancellable.swift b/Sources/ElixxirDAppsSDK/Cancellable.swift
similarity index 100%
rename from Sources/ElixxirDAppsSDK/Legacy/Cancellable.swift
rename to Sources/ElixxirDAppsSDK/Cancellable.swift
diff --git a/Sources/ElixxirDAppsSDK/Cmix.swift b/Sources/ElixxirDAppsSDK/Cmix.swift
index 5760d32f4db5b568c6cf84117ebc5cd86c57e1bc..327e630c19e387ad76a652bdaa0f65506479ae11 100644
--- a/Sources/ElixxirDAppsSDK/Cmix.swift
+++ b/Sources/ElixxirDAppsSDK/Cmix.swift
@@ -11,6 +11,7 @@ public struct Cmix {
   public var stopNetworkFollower: CmixStopNetworkFollower
   public var waitForNetwork: CmixWaitForNetwork
   public var registerClientErrorCallback: CmixRegisterClientErrorCallback
+  public var addHealthCallback: CmixAddHealthCallback
 }
 
 extension Cmix {
@@ -25,7 +26,8 @@ extension Cmix {
       startNetworkFollower: .live(bindingsCmix),
       stopNetworkFollower: .live(bindingsCmix),
       waitForNetwork: .live(bindingsCmix),
-      registerClientErrorCallback: .live(bindingsCmix)
+      registerClientErrorCallback: .live(bindingsCmix),
+      addHealthCallback: .live(bindingsCmix)
     )
   }
 }
@@ -41,6 +43,7 @@ extension Cmix {
     startNetworkFollower: .unimplemented,
     stopNetworkFollower: .unimplemented,
     waitForNetwork: .unimplemented,
-    registerClientErrorCallback: .unimplemented
+    registerClientErrorCallback: .unimplemented,
+    addHealthCallback: .unimplemented
   )
 }
diff --git a/Sources/ElixxirDAppsSDK/CmixAddHealthCallback.swift b/Sources/ElixxirDAppsSDK/CmixAddHealthCallback.swift
new file mode 100644
index 0000000000000000000000000000000000000000..1326c85700ced8ae5b34b48bf87e17c7d91f67c9
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/CmixAddHealthCallback.swift
@@ -0,0 +1,29 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct CmixAddHealthCallback {
+  public var run: (HealthCallback) -> Cancellable
+
+  public func callAsFunction(_ callback: HealthCallback) -> Cancellable {
+    run(callback)
+  }
+}
+
+extension CmixAddHealthCallback {
+  public static func live(_ bindingsCmix: BindingsCmix) -> CmixAddHealthCallback {
+    CmixAddHealthCallback { callback in
+      let id = bindingsCmix.add(
+        callback.makeBindingsHealthCallback()
+      )
+      return Cancellable {
+        bindingsCmix.removeHealthCallback(id)
+      }
+    }
+  }
+}
+
+extension CmixAddHealthCallback {
+  public static let unimplemented = CmixAddHealthCallback(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/HealthCallback.swift b/Sources/ElixxirDAppsSDK/HealthCallback.swift
new file mode 100644
index 0000000000000000000000000000000000000000..c136521446bb2bd86859f0e90df8eb8068bf5c92
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/HealthCallback.swift
@@ -0,0 +1,34 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct HealthCallback {
+  public init(handle: @escaping (Bool) -> Void) {
+    self.handle = handle
+  }
+
+  public var handle: (Bool) -> Void
+}
+
+extension HealthCallback {
+  public static let unimplemented = HealthCallback(
+    handle: XCTUnimplemented("\(Self.self)")
+  )
+}
+
+extension HealthCallback {
+  func makeBindingsHealthCallback() -> BindingsNetworkHealthCallbackProtocol {
+    class Callback: NSObject, BindingsNetworkHealthCallbackProtocol {
+      init(_ healthCallback: HealthCallback) {
+        self.healthCallback = healthCallback
+      }
+
+      let healthCallback: HealthCallback
+
+      func callback(_ p0: Bool) {
+        healthCallback.handle(p0)
+      }
+    }
+
+    return Callback(self)
+  }
+}
diff --git a/Sources/ElixxirDAppsSDK/Legacy/NetworkHealthListener.swift b/Sources/ElixxirDAppsSDK/Legacy/NetworkHealthListener.swift
deleted file mode 100644
index 22473583899cc343bda522d8b287324e5a30bc33..0000000000000000000000000000000000000000
--- a/Sources/ElixxirDAppsSDK/Legacy/NetworkHealthListener.swift
+++ /dev/null
@@ -1,42 +0,0 @@
-//import Bindings
-//
-//public struct NetworkHealthListener {
-//  public var listen: (@escaping (Bool) -> Void) -> Cancellable
-//
-//  public func callAsFunction(callback: @escaping (Bool) -> Void) -> Cancellable {
-//    listen(callback)
-//  }
-//}
-//
-//extension NetworkHealthListener {
-//  public static func live(bindingsClient: BindingsCmix) -> NetworkHealthListener {
-//    NetworkHealthListener { callback in
-//      let listener = Listener(onCallback: callback)
-//      let id = bindingsClient.registerNetworkHealthCB(listener)
-//      return Cancellable {
-//        bindingsClient.unregisterNetworkHealthCB(id)
-//      }
-//    }
-//  }
-//}
-//
-//private final class Listener: NSObject, BindingsNetworkHealthCallbackProtocol {
-//  init(onCallback: @escaping (Bool) -> Void) {
-//    self.onCallback = onCallback
-//    super.init()
-//  }
-//
-//  let onCallback: (Bool) -> Void
-//
-//  func callback(_ p0: Bool) {
-//    onCallback(p0)
-//  }
-//}
-//
-//#if DEBUG
-//extension NetworkHealthListener {
-//  public static let failing = NetworkHealthListener { _ in
-//    fatalError("Not implemented")
-//  }
-//}
-//#endif