diff --git a/examples/sendE2E/sender.html b/examples/sendE2E/sender.html
index b84fa82744c89544b7f965a40563bdb3c1d4d96f..727b59eb07aecdda3da9d0e963afba9ffa3c04cf 100644
--- a/examples/sendE2E/sender.html
+++ b/examples/sendE2E/sender.html
@@ -38,7 +38,7 @@
             const stopNetworkFollowerBtn = document.getElementById("stopNetworkFollowerBtn")
 
             // Client specific parameters
-            const recipientContactFile = '<xxc(2)I71lyX8LvKP6cJhedliFLIKzXN/2ArmBAfAxkk1QapADrgZ7Ugdw/BAr6RDo4K2MfHn7e06Kru7jW05ROtaaoNSyMIB3R77BIJy7xB/fvkzteTpxxmHtZdXPt9UpYVA9WKzbM57vkmy+U6BlRJIrN97tAlWbODIG1FGpjWI/BCdqwaLgu0wTYLzzEw38NNyax0E2MnvURgQoSfnX5V+m+Qd2sJBqfBKi9tlLuNcaFI+TGyKGbZdSs4AZdiL/Xm94w1/id4SDEoV73RaJb3RH+W+rEMIl1SnZ4U6Ifo39cZfRKevL2mXUZj/SE0NWGl4+10Jovy0Hp6NoW2iMH4zB30xv3fqyp8ATAYXYYO5ToFmHvP1fRLq7TKa+WtGnO70uiykBaYl219WcGYIz4jXDYyN3yNnOhihKo2tauyC0qGeGCSoACDxvzLGTHxHkS/cDA92L0MEsiXy3HIuv5+OYZBuiWl1dLxjkUKKo4f3VyDUaWjrlUFqVO95X29+Zuw++AK1TVnWtt/F4J+L91hwEfDGxYn5f2I6tNKLXnyXlPVDpa1EE6+d1LWznfXVHHzL58lBIK0Yk9MKGHQAAAgA7OaXVXCYpP2SfHIEp3s0tRA==xxc>';
+            const recipientContactFile = '<xxc(2)vL/3ePQKC3YZ/j5DjIdLC9TwEgB19PPvNSiJzv+TR4oDrgZ7Ugdw/BAr6Y/Ci8g9/nJQV3MVVMwJGVKoQSq4LVrJum1JBNHVwRJl/03bzAhV+YUnDYXEva1krP31gZ25pwuOlLqKyxy4gxicZZOKv5xcaqgIZeALbIUxpgAclHT1S/U1OTjdC9GnZoi+Ta/ftZhFcB/b8YIqLnp9+N9QGBCqYImr371cfhnSVSVNUhgKEReJkvQzfeeLXp6LHs9al9jvq8OR/uMLzjP+MqPaVc8/AXoPUMTSsQMhTQrbcgN7auK4mP0RcbIviKU1MIt8RGXrhLgPa2l1V1IinuMkpKoqwkolR13ZN6evw3rl57K7XEwK8di5bs2EisOceLd+IJPhQUxceaytKGCuqqOTlOj8f+tet4yZ92h//u3tWIIB7IoLyipxIj1Tq6Q+UDarf5+ReqIupTmiOjIxPJZxRqoMZGO45CcyPPdFEEMhozbH0WxyCruwKD352ZG9aKGoq97VclLxDOgE7Dx/oGmA3YvaJK5lUQPGO5egLHn23qmP7IN/8Pxn6D84Lovt8YddR4jjlIuY4qAhdAAAAgA7HsmlZr0oNSUMhb6OyUMn0A==xxc>';
             const myContactFileName = '';
             const statePath = 'statePathSender';
             const statePass = 'password';
diff --git a/examples/sendE2E/xxdk.js b/examples/sendE2E/xxdk.js
index 204036d541e06ef38fdf0dfce22c7cdfacb6dfb8..c31048163a486ea8726abfbfad74b832b9e2f273 100644
--- a/examples/sendE2E/xxdk.js
+++ b/examples/sendE2E/xxdk.js
@@ -56,7 +56,7 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
         htmlConsole.log("Getting reception identity.")
         identity = LoadReceptionIdentity(identityStorageKey, net.GetID());
     } catch (e) {
-        htmlConsole.log("No reception identity found. Generating a new one: " + e)
+        htmlConsole.log("No reception identity found. Generating a new one.")
 
         // If no extant xxdk.ReceptionIdentity, generate and store a new one
         identity = net.MakeReceptionIdentity();
@@ -88,7 +88,7 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
 
             htmlConsole.log("Calling confirm on contact " + dec.decode(contact))
             const rid = await e2eClient.Confirm(contact)
-            htmlConsole.log("Called confirm on round " + rid) 
+            htmlConsole.log("Called confirm on round " + rid)
         }
     }
 
@@ -109,27 +109,26 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
     htmlConsole.log("Started network follower")
 
     stopNetworkFollowerBtn.style.display = 'block';
-    stopNetworkFollowerBtn.addEventListener('click', () => {
+    stopNetworkFollowerBtn.addEventListener('click', async () => {
         htmlConsole.log("Stopping network follower")
-        net.StopNetworkFollower()
-    })
-
-    // Provide a callback that will be signalled when network health status changes
-    let health = false
-    net.AddHealthCallback({
-        Callback: function (healthy) {
-            health = healthy;
+        try {
+            await net.StopNetworkFollower()
+        } catch (e) {
+            htmlConsole.log("Failed to stop network follower: " + e)
         }
-    });
+    })
 
+    // Wait for network to become healthy
     htmlConsole.log("Waiting for network to be healthy")
-    try {
-        await sleepUntil(() => health === true, 25000);
-    } catch {
-        htmlConsole.error("Timed out. Network is not healthy: " + health)
-        throw new Error("Timed out. Network is not healthy: " + health)
-    }
-    htmlConsole.log("Network is healthy: " + health)
+    net.WaitForNetwork(25000).then(
+        () => {
+            htmlConsole.log("Network is healthy")
+        },
+        () => {
+            htmlConsole.error("Timed out. Network is not healthy.")
+            throw new Error("Timed out. Network is not healthy.")
+        }
+    )
 
 
     ////////////////////////////////////////////////////////////////////////////
@@ -160,7 +159,7 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
     if (recipientContactFile !== '') {
         let exists = false;
         htmlConsole.log("getting ID from contact")
-        const recipientContactID = GetIDFromContact(recipientContactFile);
+        const recipientContactID = GetIDFromContact(enc.encode(recipientContactFile));
         const recipientContactIDBase64 = Uint8ArrayToBase64(recipientContactID)
 
         htmlConsole.log("Checking if partner " + recipientContactIDBase64 + " exists")
@@ -180,10 +179,10 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
 
         // If the partner does not exist, send a request
         if (exists === false) {
-            htmlConsole.log("Partner does not exist, Request being sent to " + recipientContactIDBase64) 
+            htmlConsole.log("Partner does not exist, Request being sent to " + recipientContactIDBase64)
             const factList = enc.encode('[]')
             const rid = await e2eClient.Request(enc.encode(recipientContactFile), factList)
-            htmlConsole.log("Request sent on round " + rid) 
+            htmlConsole.log("Request sent on round " + rid)
 
 
             htmlConsole.log("Waiting to receive confirmation.")
@@ -195,12 +194,14 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
                 throw new Error("Did not receive confirm: " + confirm)
             }
 
+            console.log("confirmContact: " + confirmContact)
+            console.log("confirmContact: " + dec.decode(confirmContact))
             const confirmContactID = GetIDFromContact(confirmContact)
             if (!Uint8ArrayEquals(recipientContactID, confirmContactID)) {
                 htmlConsole.log("contact ID from confirmation " +
                     Uint8ArrayToBase64(confirmContactID) +
-                    " does not match recipient ID " + recipientContactIDBase64) 
-               throw new Error("contact ID from confirmation " +
+                    " does not match recipient ID " + recipientContactIDBase64)
+                throw new Error("contact ID from confirmation " +
                     Uint8ArrayToBase64(confirmContactID) +
                     " does not match recipient ID " + recipientContactIDBase64)
             }
@@ -215,10 +216,10 @@ async function SendE2e(htmlConsole, stopNetworkFollowerBtn, ndf,
         // Test message
         const msgBody = "If this message is sent successfully, we'll have established contact with the recipient."
 
-        htmlConsole.log("Sending E2E message: " + msgBody) 
+        htmlConsole.log("Sending E2E message: " + msgBody)
         const e2eSendReport = await e2eClient.SendE2E(2, recipientContactID, enc.encode(msgBody), params)
 
-        htmlConsole.log("Send E2e message. Report: " + dec.decode(e2eSendReport)) 
+        htmlConsole.log("Send E2e message. Report: " + dec.decode(e2eSendReport))
     } else {
         htmlConsole.log("No recipient specified. Waiting for request")
     }
diff --git a/wasm/follow.go b/wasm/follow.go
index a21912fa8fe33355dd0a071eea009ca8dca50c22..f3a4e7bd6f3745ac7e1c1dcd0dd10f23dd36c662 100644
--- a/wasm/follow.go
+++ b/wasm/follow.go
@@ -88,9 +88,18 @@ func (c *Cmix) StopNetworkFollower(js.Value, []js.Value) interface{} {
 //  - args[0] - timeout when stopping threads in milliseconds (int)
 //
 // Returns:
-//  - returns true if the network is healthy (boolean)
+//  - A promise that resolves if the network is healthy and rejects if the
+//    network is not healthy.
 func (c *Cmix) WaitForNetwork(_ js.Value, args []js.Value) interface{} {
-	return c.api.WaitForNetwork(args[0].Int())
+	promiseFn := func(resolve, reject func(args ...interface{}) js.Value) {
+		if c.api.WaitForNetwork(args[0].Int()) {
+			resolve()
+		} else {
+			reject()
+		}
+	}
+
+	return utils.CreatePromise(promiseFn)
 }
 
 // NetworkFollowerStatus gets the state of the network follower. It returns a
diff --git a/wasm/identity.go b/wasm/identity.go
index c94de98d55f6352a9846871f74afb9e3b870944e..83911a93b9ca67db58c57fa6b6a6a8ba26e0d262 100644
--- a/wasm/identity.go
+++ b/wasm/identity.go
@@ -135,13 +135,13 @@ func GetContactFromReceptionIdentity(_ js.Value, args []js.Value) interface{} {
 // GetIDFromContact returns the ID in the [contact.Contact] object.
 //
 // Parameters:
-//  - args[0] - marshalled bytes of [contact.Contact] (string)
+//  - args[0] - marshalled bytes of [contact.Contact] (Uint8Array)
 //
 // Returns:
 //  - marshalled [id.ID] object (Uint8Array)
 //  - throws a TypeError if loading the ID from the contact file fails
 func GetIDFromContact(_ js.Value, args []js.Value) interface{} {
-	cID, err := bindings.GetIDFromContact([]byte(args[0].String()))
+	cID, err := bindings.GetIDFromContact(utils.CopyBytesToGo(args[0]))
 	if err != nil {
 		utils.Throw(utils.TypeError, err)
 		return nil