diff --git a/go.mod b/go.mod
index 269a4feffcc6de5c08ff6b71c0b5a74ed3fd79b1..80e2312b666a0582628ef9baf4278f29daae8fed 100644
--- a/go.mod
+++ b/go.mod
@@ -11,7 +11,7 @@ require (
 	github.com/spf13/cobra v1.7.0
 	github.com/spf13/jwalterweatherman v1.1.0
 	github.com/stretchr/testify v1.8.2
-	gitlab.com/elixxir/client/v4 v4.6.4-0.20230629214449-ae8876a2850c
+	gitlab.com/elixxir/client/v4 v4.6.4-0.20230630173422-ac9c5506b1fb
 	gitlab.com/elixxir/crypto v0.0.7-0.20230614183801-387e0cb8e76f
 	gitlab.com/elixxir/primitives v0.0.3-0.20230613193928-8cf8bdd777ef
 	gitlab.com/elixxir/wasm-utils v0.0.0-20230615222914-185dd3a6fa08
diff --git a/go.sum b/go.sum
index 2956bf2f5c2e52e1eec501ffd8150275a169da3f..2859c8d3bc77d40238cb07ef17228490f1c65a91 100644
--- a/go.sum
+++ b/go.sum
@@ -411,8 +411,8 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
 github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
 gitlab.com/elixxir/bloomfilter v0.0.0-20230322223210-fa84f6842de8 h1:uAFCyBkXprQoPkcDDfxXtaMyL5x+xSGrAWzR907xROQ=
 gitlab.com/elixxir/bloomfilter v0.0.0-20230322223210-fa84f6842de8/go.mod h1:1X8gRIAPDisS3W6Vtr/ymiUmZMJUIwDV1o5DEOo/pzw=
-gitlab.com/elixxir/client/v4 v4.6.4-0.20230629214449-ae8876a2850c h1:YCltggRu+zrUlru/gtGVIg672/uCNSGLemRpn/ClI5E=
-gitlab.com/elixxir/client/v4 v4.6.4-0.20230629214449-ae8876a2850c/go.mod h1:wSeJ9pk+qqUrKHwhd4qZW1CnNlakK75n+1fOjJ7k1Ns=
+gitlab.com/elixxir/client/v4 v4.6.4-0.20230630173422-ac9c5506b1fb h1:991u/qqqP2FI3MaH5y7MZE60HsXKXJ4lqCd2dYJcS88=
+gitlab.com/elixxir/client/v4 v4.6.4-0.20230630173422-ac9c5506b1fb/go.mod h1:wSeJ9pk+qqUrKHwhd4qZW1CnNlakK75n+1fOjJ7k1Ns=
 gitlab.com/elixxir/comms v0.0.4-0.20230613220741-7de1d2ca4a1c h1:0TpLn4AdarrqCwUMvnz4Md+9gLyk9wrQ73J3W9U5zJo=
 gitlab.com/elixxir/comms v0.0.4-0.20230613220741-7de1d2ca4a1c/go.mod h1:z+qW0D9VpY5QKTd7wRlb5SK4kBNqLYsa4DXBcUXue9Q=
 gitlab.com/elixxir/crypto v0.0.7-0.20230614183801-387e0cb8e76f h1:T0Jvhq5nCELiwkVr07Ti/Ew9ICdexviYeCkFV19kk9A=
diff --git a/indexedDb/impl/channels/callbacks.go b/indexedDb/impl/channels/callbacks.go
index a2ac5e3d9c927207de354679e397f9255f4d9374..8eeadabeb2a61236bded58a5abb77d9d263d27a3 100644
--- a/indexedDb/impl/channels/callbacks.go
+++ b/indexedDb/impl/channels/callbacks.go
@@ -75,7 +75,8 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 		return
 	}
 
-	m.model, err = NewWASMEventModel(msg.DatabaseName, encryption, m)
+	m.model, err = NewWASMEventModel(
+		msg.DatabaseName, encryption, m.eventUpdateCallback)
 	if err != nil {
 		reply([]byte(err.Error()))
 		return
@@ -84,10 +85,17 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 	reply(nil)
 }
 
-// EventUpdate implements [bindings.ChannelUICallbacks.EventUpdate].
-func (m *manager) EventUpdate(eventType int64, jsonData []byte) {
+// eventUpdateCallback JSON marshals the interface and sends it to the main
+// thread the with the event type to be sent on the EventUpdate callback.
+func (m *manager) eventUpdateCallback(eventType int64, jsonMarshallable any) {
+	jsonData, err := json.Marshal(jsonMarshallable)
+	if err != nil {
+		jww.FATAL.Panicf("[CH] Failed to JSON marshal %T for EventUpdate "+
+			"callback: %+v", jsonMarshallable, err)
+	}
+
 	// Package parameters for sending
-	msg := &wChannels.EventUpdateCallbackMessage{
+	msg := wChannels.EventUpdateCallbackMessage{
 		EventType: eventType,
 		JsonData:  jsonData,
 	}
diff --git a/indexedDb/impl/channels/implementation.go b/indexedDb/impl/channels/implementation.go
index 7cb2fbfb35bde45e278a9209d06df6f0356b6436..8980a4bbd337b0993bd4b9963f6d89cb326b10f6 100644
--- a/indexedDb/impl/channels/implementation.go
+++ b/indexedDb/impl/channels/implementation.go
@@ -36,9 +36,9 @@ import (
 // NOTE: This model is NOT thread safe - it is the responsibility of the
 // caller to ensure that its methods are called sequentially.
 type wasmModel struct {
-	db          *idb.Database
-	cipher      idbCrypto.Cipher
-	eventUpdate func(eventType int64, jsonMarshallable any)
+	db            *idb.Database
+	cipher        idbCrypto.Cipher
+	eventCallback eventUpdate
 }
 
 // JoinChannel is called whenever a channel is joined locally.
@@ -169,7 +169,7 @@ func (w *wasmModel) ReceiveMessage(channelID *id.ID, messageID message.ID,
 		return 0
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eventCallback(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    false,
@@ -211,7 +211,7 @@ func (w *wasmModel) ReceiveReply(channelID *id.ID, messageID,
 		return 0
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eventCallback(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    false,
@@ -253,7 +253,7 @@ func (w *wasmModel) ReceiveReaction(channelID *id.ID, messageID,
 		return 0
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eventCallback(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    false,
@@ -410,7 +410,7 @@ func (w *wasmModel) updateMessage(currentMsg *Message, messageID *message.ID,
 		return 0, err
 	}
 
-	go w.eventUpdate(bindings.MessageReceived, bindings.MessageReceivedJSON{
+	go w.eventCallback(bindings.MessageReceived, bindings.MessageReceivedJSON{
 		UUID:      int64(uuid),
 		ChannelID: channelID,
 		Update:    true,
@@ -532,8 +532,9 @@ func (w *wasmModel) DeleteMessage(messageID message.ID) error {
 		return err
 	}
 
-	go w.eventUpdate(bindings.MessageDeleted,
-		bindings.MessageDeletedJSON{MessageID: messageID})
+	go w.eventCallback(bindings.MessageDeleted, bindings.MessageDeletedJSON{
+		MessageID: messageID,
+	})
 
 	return nil
 }
@@ -542,7 +543,7 @@ func (w *wasmModel) DeleteMessage(messageID message.ID) error {
 func (w *wasmModel) MuteUser(
 	channelID *id.ID, pubKey ed25519.PublicKey, unmute bool) {
 
-	go w.eventUpdate(bindings.UserMuted, bindings.UserMutedJSON{
+	go w.eventCallback(bindings.UserMuted, bindings.UserMutedJSON{
 		ChannelID: channelID,
 		PubKey:    pubKey,
 		Unmute:    unmute,
diff --git a/indexedDb/impl/channels/implementation_test.go b/indexedDb/impl/channels/implementation_test.go
index b652931769ab0e1aac4c76f27c08e03135146213..4f52e0ff707de1a611384c41e816613ebd39638a 100644
--- a/indexedDb/impl/channels/implementation_test.go
+++ b/indexedDb/impl/channels/implementation_test.go
@@ -42,14 +42,12 @@ func TestMain(m *testing.M) {
 	os.Exit(m.Run())
 }
 
-type dummyCbs struct{}
-
-func (c *dummyCbs) EventUpdate(int64, []byte) {}
+var dummyEU = func(int64, any) {}
 
 // Happy path test for receiving, updating, getting, and deleting a File.
 func TestWasmModel_ReceiveFile(t *testing.T) {
 	testString := "TestWasmModel_ReceiveFile"
-	m, err := newWASMModel(testString, nil, &dummyCbs{})
+	m, err := newWASMModel(testString, nil, dummyEU)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -135,8 +133,7 @@ func TestWasmModel_GetMessage(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0, []byte(testString))
 
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -166,7 +163,7 @@ func TestWasmModel_DeleteMessage(t *testing.T) {
 	storage.GetLocalStorage().Clear()
 	testString := "TestWasmModel_DeleteMessage"
 	testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0, []byte(testString))
-	eventModel, err := newWASMModel(testString, nil, &dummyCbs{})
+	eventModel, err := newWASMModel(testString, nil, dummyEU)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -222,8 +219,7 @@ func Test_wasmModel_UpdateSentStatus(t *testing.T) {
 			testString := "Test_wasmModel_UpdateSentStatus" + cs
 			testMsgId := message.DeriveChannelMessageID(
 				&id.ID{1}, 0, []byte(testString))
-			eventModel, err2 := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err2 := newWASMModel(testString, c, dummyEU)
 			if err2 != nil {
 				t.Fatal(err)
 			}
@@ -294,7 +290,7 @@ func Test_wasmModel_JoinChannel_LeaveChannel(t *testing.T) {
 		}
 		t.Run("Test_wasmModel_JoinChannel_LeaveChannel"+cs, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
-			eventModel, err2 := newWASMModel("test", c, &dummyCbs{})
+			eventModel, err2 := newWASMModel("test", c, dummyEU)
 			if err2 != nil {
 				t.Fatal(err2)
 			}
@@ -347,8 +343,7 @@ func Test_wasmModel_UUIDTest(t *testing.T) {
 		t.Run("Test_wasmModel_UUIDTest"+cs, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			testString := "testHello" + cs
-			eventModel, err2 := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err2 := newWASMModel(testString, c, dummyEU)
 			if err2 != nil {
 				t.Fatal(err2)
 			}
@@ -394,8 +389,7 @@ func Test_wasmModel_DuplicateReceives(t *testing.T) {
 		testString := "Test_wasmModel_DuplicateReceives" + cs
 		t.Run(testString, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -446,8 +440,7 @@ func Test_wasmModel_deleteMsgByChannel(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			totalMessages := 10
 			expectedMessages := 5
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -517,8 +510,7 @@ func TestWasmModel_receiveHelper_UniqueIndex(t *testing.T) {
 		t.Run("TestWasmModel_receiveHelper_UniqueIndex"+cs, func(t *testing.T) {
 			storage.GetLocalStorage().Clear()
 			testString := fmt.Sprintf("test_receiveHelper_UniqueIndex_%d", i)
-			eventModel, err := newWASMModel(testString, c,
-				&dummyCbs{})
+			eventModel, err := newWASMModel(testString, c, dummyEU)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -632,8 +624,7 @@ func TestUpsertMessageDuplicates(t *testing.T) {
 		csprng.NewSystemRNG())
 	require.NoError(t, err)
 	testString := "test_duplicateUpsertMessage"
-	eventModel, err := newWASMModel(testString, cipher,
-		&dummyCbs{})
+	eventModel, err := newWASMModel(testString, cipher, dummyEU)
 	require.NoError(t, err)
 
 	uuid, err := eventModel.upsertMessage(msg1)
diff --git a/indexedDb/impl/channels/init.go b/indexedDb/impl/channels/init.go
index e604b666636e0953a0a9e19947c53550972d1e76..7a55c6d09823124e26360558aa7d3555bdbdb462 100644
--- a/indexedDb/impl/channels/init.go
+++ b/indexedDb/impl/channels/init.go
@@ -10,13 +10,11 @@
 package main
 
 import (
-	"encoding/json"
 	"syscall/js"
 
 	"github.com/hack-pad/go-indexeddb/idb"
 	jww "github.com/spf13/jwalterweatherman"
 
-	"gitlab.com/elixxir/client/v4/bindings"
 	"gitlab.com/elixxir/client/v4/channels"
 	idbCrypto "gitlab.com/elixxir/crypto/indexedDb"
 	"gitlab.com/elixxir/xxdk-wasm/indexedDb/impl"
@@ -26,17 +24,21 @@ import (
 // migration purposes.
 const currentVersion uint = 1
 
+// eventUpdate takes an event type and JSON object from
+// bindings/channelsCallbacks.go.
+type eventUpdate func(eventType int64, jsonMarshallable any)
+
 // NewWASMEventModel returns a [channels.EventModel] backed by a wasmModel.
 // The name should be a base64 encoding of the users public key. Returns the
 // EventModel based on IndexedDb and the database name as reported by IndexedDb.
 func NewWASMEventModel(databaseName string, encryption idbCrypto.Cipher,
-	uiCallbacks bindings.ChannelUICallbacks) (channels.EventModel, error) {
-	return newWASMModel(databaseName, encryption, uiCallbacks)
+	eventCallback eventUpdate) (channels.EventModel, error) {
+	return newWASMModel(databaseName, encryption, eventCallback)
 }
 
 // newWASMModel creates the given [idb.Database] and returns a wasmModel.
 func newWASMModel(databaseName string, encryption idbCrypto.Cipher,
-	uiCallbacks bindings.ChannelUICallbacks) (*wasmModel, error) {
+	eventCallback eventUpdate) (*wasmModel, error) {
 	// Attempt to open database object
 	ctx, cancel := impl.NewContext()
 	defer cancel()
@@ -75,16 +77,9 @@ func newWASMModel(databaseName string, encryption idbCrypto.Cipher,
 	}
 
 	wrapper := &wasmModel{
-		db:     db,
-		cipher: encryption,
-		eventUpdate: func(eventType int64, jsonMarshallable any) {
-			data, err := json.Marshal(jsonMarshallable)
-			if err != nil {
-				jww.FATAL.Panicf("Failed to JSON marshal %T for EventUpdate "+
-					"callback: %+v", jsonMarshallable, err)
-			}
-			uiCallbacks.EventUpdate(eventType, data)
-		},
+		db:            db,
+		cipher:        encryption,
+		eventCallback: eventCallback,
 	}
 	return wrapper, nil
 }
diff --git a/indexedDb/impl/dm/callbacks.go b/indexedDb/impl/dm/callbacks.go
index 72275ef9f9f093f74eda08462daa93508e64e9a2..a081a83dca9adf61a78e48101239edfd6a22c0b1 100644
--- a/indexedDb/impl/dm/callbacks.go
+++ b/indexedDb/impl/dm/callbacks.go
@@ -10,13 +10,11 @@
 package main
 
 import (
-	"crypto/ed25519"
 	"encoding/json"
 
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 
-	"gitlab.com/elixxir/client/v4/bindings"
 	"gitlab.com/elixxir/client/v4/dm"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	idbCrypto "gitlab.com/elixxir/crypto/indexedDb"
@@ -71,7 +69,7 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 	}
 
 	m.model, err = NewWASMEventModel(
-		msg.DatabaseName, encryption, m.messageReceivedCallback)
+		msg.DatabaseName, encryption, m.eventUpdateCallback)
 	if err != nil {
 		reply([]byte(err.Error()))
 		return
@@ -80,31 +78,31 @@ func (m *manager) newWASMEventModelCB(message []byte, reply func(message []byte)
 	reply(nil)
 }
 
-// messageReceivedCallback sends calls to the MessageReceivedCallback in the
-// main thread.
-//
-// messageReceivedCallback adhere to the MessageReceivedCallback type.
-func (m *manager) messageReceivedCallback(uuid uint64, pubKey ed25519.PublicKey,
-	messageUpdate, conversationUpdate bool) {
+// eventUpdateCallback JSON marshals the interface and sends it to the main
+// thread the with the event type to be sent on the EventUpdate callback.
+func (m *manager) eventUpdateCallback(eventType int64, jsonMarshallable any) {
+	jsonData, err := json.Marshal(jsonMarshallable)
+	if err != nil {
+		jww.FATAL.Panicf("[DM] Failed to JSON marshal %T for EventUpdate "+
+			"callback: %+v", jsonMarshallable, err)
+	}
+
 	// Package parameters for sending
-	msg := bindings.DmMessageReceivedJSON{
-		UUID:               uuid,
-		PubKey:             pubKey,
-		MessageUpdate:      messageUpdate,
-		ConversationUpdate: conversationUpdate,
+	msg := wDm.EventUpdateCallbackMessage{
+		EventType: eventType,
+		JsonData:  jsonData,
 	}
 	data, err := json.Marshal(msg)
 	if err != nil {
-		jww.ERROR.Printf(
-			"Could not JSON marshal MessageReceivedCallbackMessage: %+v", err)
-		return
+		exception.Throwf("[DM] Could not JSON marshal %T for EventUpdate "+
+			"callback: %+v", msg, err)
 	}
 
 	// Send it to the main thread
-	err = m.wtm.SendNoResponse(wDm.MessageReceivedCallbackTag, data)
+	err = m.wtm.SendNoResponse(wDm.EventUpdateCallbackTag, data)
 	if err != nil {
-		exception.Throwf("[DM] Could not send message for "+
-			"MessageReceivedCallback: %+v", err)
+		exception.Throwf(
+			"[DM] Could not send message for EventUpdate callback: %+v", err)
 	}
 }
 
diff --git a/indexedDb/impl/dm/implementation.go b/indexedDb/impl/dm/implementation.go
index 09303bcfa7747ef203d262c4da8e36b62c3daabe..e34bedb879c69daafbf0f5df1eb89c788b343b46 100644
--- a/indexedDb/impl/dm/implementation.go
+++ b/indexedDb/impl/dm/implementation.go
@@ -13,7 +13,6 @@ import (
 	"bytes"
 	"crypto/ed25519"
 	"encoding/json"
-	"gitlab.com/xx_network/primitives/netTime"
 	"strings"
 	"syscall/js"
 	"time"
@@ -22,6 +21,7 @@ import (
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 
+	"gitlab.com/elixxir/client/v4/bindings"
 	"gitlab.com/elixxir/client/v4/cmix/rounds"
 	"gitlab.com/elixxir/client/v4/dm"
 	idbCrypto "gitlab.com/elixxir/crypto/indexedDb"
@@ -29,15 +29,16 @@ import (
 	"gitlab.com/elixxir/wasm-utils/utils"
 	"gitlab.com/elixxir/xxdk-wasm/indexedDb/impl"
 	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/xx_network/primitives/netTime"
 )
 
 // wasmModel implements dm.EventModel interface backed by IndexedDb.
 // NOTE: This model is NOT thread safe - it is the responsibility of the
 // caller to ensure that its methods are called sequentially.
 type wasmModel struct {
-	db                *idb.Database
-	cipher            idbCrypto.Cipher
-	receivedMessageCB MessageReceivedCallback
+	db            *idb.Database
+	cipher        idbCrypto.Cipher
+	eventCallback eventUpdate
 }
 
 // upsertConversation is used for joining or updating a Conversation.
@@ -203,8 +204,12 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID,
 
 	jww.TRACE.Printf("[DM indexedDB] Calling ReceiveMessageCB(%v, %v, t, f)",
 		uuid, newMessage.ConversationPubKey)
-	go w.receivedMessageCB(uuid, newMessage.ConversationPubKey,
-		true, false)
+	go w.eventCallback(bindings.DmMessageReceived, bindings.DmMessageReceivedJSON{
+		UUID:               uuid,
+		PubKey:             newMessage.ConversationPubKey,
+		MessageUpdate:      true,
+		ConversationUpdate: false,
+	})
 }
 
 // receiveWrapper is a higher-level wrapper of upsertMessage.
@@ -292,7 +297,12 @@ func (w *wasmModel) receiveWrapper(messageID message.ID, parentID *message.ID, n
 
 	jww.TRACE.Printf("[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f, %t)",
 		uuid, partnerKey, conversationUpdated)
-	go w.receivedMessageCB(uuid, partnerKey, false, conversationUpdated)
+	go w.eventCallback(bindings.DmMessageReceived, bindings.DmMessageReceivedJSON{
+		UUID:               uuid,
+		PubKey:             partnerKey,
+		MessageUpdate:      false,
+		ConversationUpdate: conversationUpdated,
+	})
 	return uuid, nil
 }
 
@@ -395,6 +405,10 @@ func (w *wasmModel) DeleteMessage(messageID message.ID, senderPubKey ed25519.Pub
 		jww.ERROR.Printf("%s: %+v", parentErr, err)
 		return false
 	}
+
+	go w.eventCallback(bindings.DmMessageReceived, bindings.DmMessageDeletedJSON{
+		MessageID: messageID,
+	})
 	return true
 }
 
diff --git a/indexedDb/impl/dm/implementation_test.go b/indexedDb/impl/dm/implementation_test.go
index 39ca0036a078382ca232a2a725ff7a5ff412dddf..3ccadb2d8202f2b435a5331a52c7a569cd995ffa 100644
--- a/indexedDb/impl/dm/implementation_test.go
+++ b/indexedDb/impl/dm/implementation_test.go
@@ -29,7 +29,7 @@ import (
 	jww "github.com/spf13/jwalterweatherman"
 )
 
-func dummyReceivedMessageCB(uint64, ed25519.PublicKey, bool, bool) {}
+var dummyEU = func(int64, any) {}
 
 func TestMain(m *testing.M) {
 	jww.SetStdoutThreshold(jww.LevelDebug)
@@ -38,8 +38,7 @@ func TestMain(m *testing.M) {
 
 // Test simple receive of a new message for a new conversation.
 func TestImpl_Receive(t *testing.T) {
-	m, err := newWASMModel("TestImpl_Receive", nil,
-		dummyReceivedMessageCB)
+	m, err := newWASMModel("TestImpl_Receive", nil, dummyEU)
 	if err != nil {
 		t.Fatal(err.Error())
 	}
@@ -91,8 +90,7 @@ func TestImpl_Receive(t *testing.T) {
 
 // Test happy path. Insert some conversations and check they exist.
 func TestImpl_GetConversations(t *testing.T) {
-	m, err := newWASMModel("TestImpl_GetConversations", nil,
-		dummyReceivedMessageCB)
+	m, err := newWASMModel("TestImpl_GetConversations", nil, dummyEU)
 	if err != nil {
 		t.Fatal(err.Error())
 	}
@@ -127,7 +125,7 @@ func TestImpl_GetConversations(t *testing.T) {
 
 // Test happy path toggling between blocked/unblocked in a Conversation.
 func TestWasmModel_BlockSender(t *testing.T) {
-	m, err := newWASMModel("TestWasmModel_BlockSender", nil, dummyReceivedMessageCB)
+	m, err := newWASMModel("TestWasmModel_BlockSender", nil, dummyEU)
 	if err != nil {
 		t.Fatal(err.Error())
 	}
@@ -162,7 +160,7 @@ func TestWasmModel_BlockSender(t *testing.T) {
 
 // Test failed and successful deletes
 func TestWasmModel_DeleteMessage(t *testing.T) {
-	m, err := newWASMModel("TestWasmModel_DeleteMessage", nil, dummyReceivedMessageCB)
+	m, err := newWASMModel("TestWasmModel_DeleteMessage", nil, dummyEU)
 	if err != nil {
 		t.Fatal(err.Error())
 	}
diff --git a/indexedDb/impl/dm/init.go b/indexedDb/impl/dm/init.go
index aabad5c593eaca751ada0e364893aa6382135f35..0c33f614fc7cf2b9e2bbc041059e2e8b3bf0b90e 100644
--- a/indexedDb/impl/dm/init.go
+++ b/indexedDb/impl/dm/init.go
@@ -10,7 +10,6 @@
 package main
 
 import (
-	"crypto/ed25519"
 	"syscall/js"
 
 	"github.com/hack-pad/go-indexeddb/idb"
@@ -25,24 +24,20 @@ import (
 // migration purposes.
 const currentVersion uint = 1
 
-// MessageReceivedCallback is called any time a message is received or updated.
-//
-// messageUpdate is true if the Message already exists and was edited.
-// conversationUpdate is true if the Conversation was created or modified.
-type MessageReceivedCallback func(
-	uuid uint64, pubKey ed25519.PublicKey, messageUpdate, conversationUpdate bool)
+// eventUpdate takes an event type and JSON object from bindings/dm.go.
+type eventUpdate func(eventType int64, jsonMarshallable any)
 
 // NewWASMEventModel returns a [channels.EventModel] backed by a wasmModel.
 // The name should be a base64 encoding of the users public key. Returns the
 // EventModel based on IndexedDb and the database name as reported by IndexedDb.
 func NewWASMEventModel(databaseName string, encryption idbCrypto.Cipher,
-	cb MessageReceivedCallback) (dm.EventModel, error) {
-	return newWASMModel(databaseName, encryption, cb)
+	eventCallback eventUpdate) (dm.EventModel, error) {
+	return newWASMModel(databaseName, encryption, eventCallback)
 }
 
 // newWASMModel creates the given [idb.Database] and returns a wasmModel.
 func newWASMModel(databaseName string, encryption idbCrypto.Cipher,
-	cb MessageReceivedCallback) (*wasmModel, error) {
+	eventCallback eventUpdate) (*wasmModel, error) {
 	// Attempt to open database object
 	ctx, cancel := impl.NewContext()
 	defer cancel()
@@ -80,7 +75,11 @@ func newWASMModel(databaseName string, encryption idbCrypto.Cipher,
 		return nil, ctx.Err()
 	}
 
-	wrapper := &wasmModel{db: db, receivedMessageCB: cb, cipher: encryption}
+	wrapper := &wasmModel{
+		db:            db,
+		cipher:        encryption,
+		eventCallback: eventCallback,
+	}
 	return wrapper, nil
 }
 
diff --git a/indexedDb/worker/channels/init.go b/indexedDb/worker/channels/init.go
index dc88cbcf8b114c84696a9233c8ebca0e642d8580..7dbc56e6b77499e6c92dfb9903a72e06af77383a 100644
--- a/indexedDb/worker/channels/init.go
+++ b/indexedDb/worker/channels/init.go
@@ -26,11 +26,6 @@ import (
 // databaseSuffix is the suffix to be appended to the name of the database.
 const databaseSuffix = "_speakeasy"
 
-// eventUpdateCallback is the [bindings.ChannelUICallback] callback function
-// it has a type [bindings.NickNameUpdate] to [bindings.MessageDeleted]
-// and json data that is the callback information.
-type eventUpdateCallback func(eventType int64, jsonData []byte)
-
 // NewWASMEventModelBuilder returns an EventModelBuilder which allows
 // the channel manager to define the path but the callback is the same
 // across the board.
@@ -53,7 +48,7 @@ type NewWASMEventModelMessage struct {
 // NewWASMEventModel returns a [channels.EventModel] backed by a wasmModel.
 // The name should be a base64 encoding of the users public key.
 func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher,
-	channelCbs bindings.ChannelUICallbacks) (channels.EventModel, error) {
+	cbs bindings.ChannelUICallbacks) (channels.EventModel, error) {
 	databaseName := path + databaseSuffix
 
 	wm, err := worker.NewManager(wasmJsPath, "channelsIndexedDb", true)
@@ -62,8 +57,7 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher,
 	}
 
 	// Register handler to manage messages for the EventUpdate
-	wm.RegisterCallback(EventUpdateCallbackTag,
-		messageReceivedCallbackHandler(channelCbs.EventUpdate))
+	wm.RegisterCallback(EventUpdateCallbackTag, eventUpdateCallbackHandler(cbs))
 
 	// Create MessageChannel between worker and logger so that the worker logs
 	// are saved
@@ -114,25 +108,25 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher,
 }
 
 // EventUpdateCallbackMessage is JSON marshalled and received from the worker
-// for the [EventUpdate] callback.
+// for the EventUpdate callback.
 type EventUpdateCallbackMessage struct {
 	EventType int64  `json:"eventType"`
 	JsonData  []byte `json:"jsonData"`
 }
 
-// messageReceivedCallbackHandler returns a handler to manage messages for the
-// MessageReceivedCallback.
-func messageReceivedCallbackHandler(cb eventUpdateCallback) worker.ReceiverCallback {
+// eventUpdateCallbackHandler returns a handler to manage messages for the
+// [bindings.ChannelUICallbacks.EventUpdate] callback.
+func eventUpdateCallbackHandler(
+	cbs bindings.ChannelUICallbacks) worker.ReceiverCallback {
 	return func(message []byte, _ func([]byte)) {
 		var msg EventUpdateCallbackMessage
-		err := json.Unmarshal(message, &msg)
-		if err != nil {
+		if err := json.Unmarshal(message, &msg); err != nil {
 			jww.ERROR.Printf(
 				"Failed to JSON unmarshal %T from worker: %+v", msg, err)
 			return
 		}
 
-		cb(msg.EventType, msg.JsonData)
+		cbs.EventUpdate(msg.EventType, msg.JsonData)
 	}
 }
 
diff --git a/indexedDb/worker/dm/implementation.go b/indexedDb/worker/dm/implementation.go
index ed021462504dd35816c20839ee0cfbd61babef54..3104eb48ae12a78afb0ae654230f1c2ac85584a1 100644
--- a/indexedDb/worker/dm/implementation.go
+++ b/indexedDb/worker/dm/implementation.go
@@ -216,7 +216,7 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID,
 	}
 
 	if err = w.wh.SendNoResponse(UpdateSentStatusTag, data); err != nil {
-		jww.FATAL.Panicf("[CH] Failed to send to %q: %+v", UpdateSentStatusTag, err)
+		jww.FATAL.Panicf("[DM] Failed to send to %q: %+v", UpdateSentStatusTag, err)
 	}
 }
 
diff --git a/indexedDb/worker/dm/init.go b/indexedDb/worker/dm/init.go
index 7ad5eca9a52a5facb6087a949f89c858a3d1043b..4e084aa29f92f71d296ae85ee39187f38aacc3b8 100644
--- a/indexedDb/worker/dm/init.go
+++ b/indexedDb/worker/dm/init.go
@@ -53,8 +53,7 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher,
 	}
 
 	// Register handler to manage messages for the MessageReceivedCallback
-	wh.RegisterCallback(
-		MessageReceivedCallbackTag, messageReceivedCallbackHandler(cbs))
+	wh.RegisterCallback(EventUpdateCallbackTag, eventUpdateCallbackHandler(cbs))
 
 	// Create MessageChannel between worker and logger so that the worker logs
 	// are saved
@@ -104,11 +103,26 @@ func NewWASMEventModel(path, wasmJsPath string, encryption idbCrypto.Cipher,
 	return &wasmModel{wh}, nil
 }
 
-// messageReceivedCallbackHandler returns a handler to manage messages for the
-// MessageReceivedCallback.
-func messageReceivedCallbackHandler(cbs bindings.DmCallbacks) worker.ReceiverCallback {
+// EventUpdateCallbackMessage is JSON marshalled and received from the worker
+// for the EventUpdate callback.
+type EventUpdateCallbackMessage struct {
+	EventType int64  `json:"eventType"`
+	JsonData  []byte `json:"jsonData"`
+}
+
+// eventUpdateCallbackHandler returns a handler to manage messages for the
+// [bindings.DmCallbacks.EventUpdate] callback.
+func eventUpdateCallbackHandler(
+	cbs bindings.DmCallbacks) worker.ReceiverCallback {
 	return func(message []byte, _ func([]byte)) {
-		cbs.EventUpdate(bindings.DmMessageReceived, message)
+		var msg EventUpdateCallbackMessage
+		if err := json.Unmarshal(message, &msg); err != nil {
+			jww.ERROR.Printf(
+				"Failed to JSON unmarshal %T from worker: %+v", msg, err)
+			return
+		}
+
+		cbs.EventUpdate(msg.EventType, msg.JsonData)
 	}
 }
 
diff --git a/indexedDb/worker/dm/tags.go b/indexedDb/worker/dm/tags.go
index 19e18afc537eb7686693e58e83b0e9ec5b3606ed..6679c9be4bd72026a8baf432fb43347dccc7bb53 100644
--- a/indexedDb/worker/dm/tags.go
+++ b/indexedDb/worker/dm/tags.go
@@ -14,8 +14,8 @@ import "gitlab.com/elixxir/xxdk-wasm/worker"
 // List of tags that can be used when sending a message or registering a handler
 // to receive a message.
 const (
-	NewWASMEventModelTag       worker.Tag = "NewWASMEventModel"
-	MessageReceivedCallbackTag worker.Tag = "MessageReceivedCallback"
+	NewWASMEventModelTag   worker.Tag = "NewWASMEventModel"
+	EventUpdateCallbackTag worker.Tag = "EventUpdateCallback"
 
 	ReceiveReplyTag     worker.Tag = "ReceiveReply"
 	ReceiveReactionTag  worker.Tag = "ReceiveReaction"