diff --git a/indexedDb/channels/implementation_test.go b/indexedDb/channels/implementation_test.go
index 6e7ca8630d8cf6597efc3f03ca544b43691a87f4..8f240d9f5f5f949f9501a7c8c05e3249f78f5b5f 100644
--- a/indexedDb/channels/implementation_test.go
+++ b/indexedDb/channels/implementation_test.go
@@ -20,12 +20,14 @@ import (
 	"github.com/hack-pad/go-indexeddb/idb"
 	"gitlab.com/elixxir/xxdk-wasm/indexedDb"
 	"gitlab.com/elixxir/xxdk-wasm/storage"
+	"gitlab.com/xx_network/crypto/csprng"
 	"gitlab.com/xx_network/primitives/netTime"
 
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/v4/channels"
 	"gitlab.com/elixxir/client/v4/cmix/rounds"
 	cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast"
+	cryptoChannel "gitlab.com/elixxir/crypto/channel"
 	"gitlab.com/elixxir/crypto/message"
 	"gitlab.com/xx_network/primitives/id"
 )
@@ -39,330 +41,418 @@ func dummyCallback(uint64, *id.ID, bool) {}
 
 // Happy path, insert message and look it up
 func TestWasmModel_msgIDLookup(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	testString := "test"
-	testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0,
-		[]byte(testString))
-	eventModel, err := newWASMModel(testString, nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatalf("%+v", err)
+		t.Fatalf("Failed to create cipher")
 	}
+	for _, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
+		}
+		t.Run(fmt.Sprintf("TestWasmModel_msgIDLookup%s", cs), func(t *testing.T) {
+
+			storage.GetLocalStorage().Clear()
+			testString := "test"
+			testMsgId := message.DeriveChannelMessageID(&id.ID{1},
+				0, []byte(testString))
+			eventModel, err := newWASMModel(testString, c, dummyCallback)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	testMsg := buildMessage([]byte(testString), testMsgId.Bytes(), nil,
-		testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
-		time.Second, 0, 0, channels.Sent)
-	_, err = eventModel.receiveHelper(testMsg, false)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
+			testMsg := buildMessage([]byte(testString), testMsgId.Bytes(), nil,
+				testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
+				time.Second, 0, 0, channels.Sent)
+			_, err = eventModel.receiveHelper(testMsg, false)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	uuid, err := eventModel.msgIDLookup(testMsgId)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if uuid == 0 {
-		t.Fatalf("Expected to get a UUID!")
+			uuid, err := eventModel.msgIDLookup(testMsgId)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if uuid == 0 {
+				t.Fatalf("Expected to get a UUID!")
+			}
+		})
 	}
 }
 
 // Test wasmModel.UpdateSentStatus happy path and ensure fields don't change.
 func Test_wasmModel_UpdateSentStatus(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	testString := "test"
-	testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0,
-		[]byte(testString))
-	eventModel, err := newWASMModel(testString, nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatalf("%+v", err)
+		t.Fatalf("Failed to create cipher")
 	}
+	for _, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
+		}
+		t.Run(fmt.Sprintf("Test_wasmModel_UpdateSentStatus%s", cs), func(t *testing.T) {
+			storage.GetLocalStorage().Clear()
+			testString := "test"
+			testMsgId := message.DeriveChannelMessageID(&id.ID{1},
+				0, []byte(testString))
+			eventModel, err := newWASMModel(testString, c, dummyCallback)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	// Store a test message
-	testMsg := buildMessage([]byte(testString), testMsgId.Bytes(), nil,
-		testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
-		time.Second, 0, 0, channels.Sent)
-	uuid, err := eventModel.receiveHelper(testMsg, false)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
+			// Store a test message
+			testMsg := buildMessage([]byte(testString), testMsgId.Bytes(), nil,
+				testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
+				time.Second, 0, 0, channels.Sent)
+			uuid, err := eventModel.receiveHelper(testMsg, false)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	// Ensure one message is stored
-	results, err := indexedDb.Dump(eventModel.db, messageStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(results) != 1 {
-		t.Fatalf("Expected 1 message to exist")
-	}
+			// Ensure one message is stored
+			results, err := indexedDb.Dump(eventModel.db, messageStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(results) != 1 {
+				t.Fatalf("Expected 1 message to exist")
+			}
 
-	// Update the sentStatus
-	expectedStatus := channels.Failed
-	eventModel.UpdateSentStatus(uuid, testMsgId, netTime.Now(),
-		rounds.Round{ID: 8675309}, expectedStatus)
+			// Update the sentStatus
+			expectedStatus := channels.Failed
+			eventModel.UpdateSentStatus(uuid, testMsgId, netTime.Now(),
+				rounds.Round{ID: 8675309}, expectedStatus)
 
-	// Check the resulting status
-	results, err = indexedDb.Dump(eventModel.db, messageStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(results) != 1 {
-		t.Fatalf("Expected 1 message to exist")
-	}
-	resultMsg := &Message{}
-	err = json.Unmarshal([]byte(results[0]), resultMsg)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if resultMsg.Status != uint8(expectedStatus) {
-		t.Fatalf("Unexpected Status: %v", resultMsg.Status)
-	}
+			// Check the resulting status
+			results, err = indexedDb.Dump(eventModel.db, messageStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(results) != 1 {
+				t.Fatalf("Expected 1 message to exist")
+			}
+			resultMsg := &Message{}
+			err = json.Unmarshal([]byte(results[0]), resultMsg)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if resultMsg.Status != uint8(expectedStatus) {
+				t.Fatalf("Unexpected Status: %v", resultMsg.Status)
+			}
 
-	// Make sure other fields didn't change
-	if resultMsg.Nickname != testString {
-		t.Fatalf("Unexpected Nickname: %v", resultMsg.Nickname)
+			// Make sure other fields didn't change
+			if resultMsg.Nickname != testString {
+				t.Fatalf("Unexpected Nickname: %v", resultMsg.Nickname)
+			}
+		})
 	}
 }
 
 // Smoke test wasmModel.JoinChannel/wasmModel.LeaveChannel happy paths.
 func Test_wasmModel_JoinChannel_LeaveChannel(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	eventModel, err := newWASMModel("test", nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatalf("%+v", err)
+		t.Fatalf("Failed to create cipher")
 	}
+	for _, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
+		}
+		t.Run(fmt.Sprintf("Test_wasmModel_JoinChannel_LeaveChannel%s", cs), func(t *testing.T) {
+			storage.GetLocalStorage().Clear()
+			eventModel, err := newWASMModel("test", c, dummyCallback)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	testChannel := &cryptoBroadcast.Channel{
-		ReceptionID: id.NewIdFromString("test", id.Generic, t),
-		Name:        "test",
-		Description: "test",
-		Salt:        nil,
-	}
-	testChannel2 := &cryptoBroadcast.Channel{
-		ReceptionID: id.NewIdFromString("test2", id.Generic, t),
-		Name:        "test2",
-		Description: "test2",
-		Salt:        nil,
-	}
-	eventModel.JoinChannel(testChannel)
-	eventModel.JoinChannel(testChannel2)
-	results, err := indexedDb.Dump(eventModel.db, channelsStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(results) != 2 {
-		t.Fatalf("Expected 2 channels to exist")
-	}
-	eventModel.LeaveChannel(testChannel.ReceptionID)
-	results, err = indexedDb.Dump(eventModel.db, channelsStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(results) != 1 {
-		t.Fatalf("Expected 1 channels to exist")
+			testChannel := &cryptoBroadcast.Channel{
+				ReceptionID: id.NewIdFromString("test", id.Generic, t),
+				Name:        "test",
+				Description: "test",
+				Salt:        nil,
+			}
+			testChannel2 := &cryptoBroadcast.Channel{
+				ReceptionID: id.NewIdFromString("test2", id.Generic, t),
+				Name:        "test2",
+				Description: "test2",
+				Salt:        nil,
+			}
+			eventModel.JoinChannel(testChannel)
+			eventModel.JoinChannel(testChannel2)
+			results, err := indexedDb.Dump(eventModel.db, channelsStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(results) != 2 {
+				t.Fatalf("Expected 2 channels to exist")
+			}
+			eventModel.LeaveChannel(testChannel.ReceptionID)
+			results, err = indexedDb.Dump(eventModel.db, channelsStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(results) != 1 {
+				t.Fatalf("Expected 1 channels to exist")
+			}
+		})
 	}
 }
 
 // Test UUID gets returned when different messages are added.
 func Test_wasmModel_UUIDTest(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	testString := "testHello"
-	eventModel, err := newWASMModel(testString, nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatalf("%+v", err)
+		t.Fatalf("Failed to create cipher")
 	}
+	for _, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
+		}
+		t.Run(fmt.Sprintf("Test_wasmModel_UUIDTest%s", cs), func(t *testing.T) {
+			storage.GetLocalStorage().Clear()
+			testString := "testHello"
+			eventModel, err := newWASMModel(testString, c, dummyCallback)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	uuids := make([]uint64, 10)
-
-	for i := 0; i < 10; i++ {
-		// Store a test message
-		channelID := id.NewIdFromBytes([]byte(testString), t)
-		msgID := message.ID{}
-		copy(msgID[:], testString+fmt.Sprintf("%d", i))
-		rnd := rounds.Round{ID: id.Round(42)}
-		uuid := eventModel.ReceiveMessage(channelID, msgID, "test",
-			testString+fmt.Sprintf("%d", i), []byte{8, 6, 7, 5}, 0, 0,
-			netTime.Now(), time.Hour, rnd, 0, channels.Sent)
-		uuids[i] = uuid
-	}
+			uuids := make([]uint64, 10)
+
+			for i := 0; i < 10; i++ {
+				// Store a test message
+				channelID := id.NewIdFromBytes([]byte(testString), t)
+				msgID := message.ID{}
+				copy(msgID[:], testString+fmt.Sprintf("%d", i))
+				rnd := rounds.Round{ID: id.Round(42)}
+				uuid := eventModel.ReceiveMessage(channelID, msgID, "test",
+					testString+fmt.Sprintf("%d", i), []byte{8, 6, 7, 5}, 0, 0,
+					netTime.Now(), time.Hour, rnd, 0, channels.Sent)
+				uuids[i] = uuid
+			}
 
-	for i := 0; i < 10; i++ {
-		for j := i + 1; j < 10; j++ {
-			if uuids[i] == uuids[j] {
-				t.Fatalf("uuid failed: %d[%d] == %d[%d]",
-					uuids[i], i, uuids[j], j)
+			for i := 0; i < 10; i++ {
+				for j := i + 1; j < 10; j++ {
+					if uuids[i] == uuids[j] {
+						t.Fatalf("uuid failed: %d[%d] == %d[%d]",
+							uuids[i], i, uuids[j], j)
+					}
+				}
 			}
-		}
+		})
 	}
 }
 
 // Tests if the same message ID being sent always returns the same UUID.
 func Test_wasmModel_DuplicateReceives(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	testString := "testHello"
-	eventModel, err := newWASMModel(testString, nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatalf("%+v", err)
+		t.Fatalf("Failed to create cipher")
 	}
+	for _, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
+		}
+		t.Run(fmt.Sprintf("Test_wasmModel_DuplicateReceives%s", cs), func(t *testing.T) {
+			storage.GetLocalStorage().Clear()
+			testString := "testHello"
+			eventModel, err := newWASMModel(testString, c, dummyCallback)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-	uuids := make([]uint64, 10)
-
-	msgID := message.ID{}
-	copy(msgID[:], testString)
-	for i := 0; i < 10; i++ {
-		// Store a test message
-		channelID := id.NewIdFromBytes([]byte(testString), t)
-		rnd := rounds.Round{ID: id.Round(42)}
-		uuid := eventModel.ReceiveMessage(channelID, msgID, "test",
-			testString+fmt.Sprintf("%d", i), []byte{8, 6, 7, 5}, 0, 0,
-			netTime.Now(), time.Hour, rnd, 0, channels.Sent)
-		uuids[i] = uuid
-	}
+			uuids := make([]uint64, 10)
+
+			msgID := message.ID{}
+			copy(msgID[:], testString)
+			for i := 0; i < 10; i++ {
+				// Store a test message
+				channelID := id.NewIdFromBytes([]byte(testString), t)
+				rnd := rounds.Round{ID: id.Round(42)}
+				uuid := eventModel.ReceiveMessage(channelID, msgID, "test",
+					testString+fmt.Sprintf("%d", i), []byte{8, 6, 7, 5}, 0, 0,
+					netTime.Now(), time.Hour, rnd, 0, channels.Sent)
+				uuids[i] = uuid
+			}
 
-	for i := 0; i < 10; i++ {
-		for j := i + 1; j < 10; j++ {
-			if uuids[i] != uuids[j] {
-				t.Fatalf("uuid failed: %d[%d] != %d[%d]",
-					uuids[i], i, uuids[j], j)
+			for i := 0; i < 10; i++ {
+				for j := i + 1; j < 10; j++ {
+					if uuids[i] != uuids[j] {
+						t.Fatalf("uuid failed: %d[%d] != %d[%d]",
+							uuids[i], i, uuids[j], j)
+					}
+				}
 			}
-		}
+		})
 	}
+
 }
 
 // Happy path: Inserts many messages, deletes some, and checks that the final
 // result is as expected.
 func Test_wasmModel_deleteMsgByChannel(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	testString := "test_deleteMsgByChannel"
-	totalMessages := 10
-	expectedMessages := 5
-	eventModel, err := newWASMModel(testString, nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatalf("%+v", err)
+		t.Fatalf("Failed to create cipher")
 	}
-
-	// Create a test channel id
-	deleteChannel := id.NewIdFromString("deleteMe", id.Generic, t)
-	keepChannel := id.NewIdFromString("dontDeleteMe", id.Generic, t)
-
-	// Store some test messages
-	for i := 0; i < totalMessages; i++ {
-		testStr := testString + strconv.Itoa(i)
-
-		// Interleave the channel id to ensure cursor is behaving intelligently
-		thisChannel := deleteChannel
-		if i%2 == 0 {
-			thisChannel = keepChannel
+	for _, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
 		}
+		t.Run(fmt.Sprintf("Test_wasmModel_deleteMsgByChannel%s", cs), func(t *testing.T) {
+			storage.GetLocalStorage().Clear()
+			testString := "test_deleteMsgByChannel"
+			totalMessages := 10
+			expectedMessages := 5
+			eventModel, err := newWASMModel(testString, c, dummyCallback)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
 
-		testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0, []byte(testStr))
-		eventModel.ReceiveMessage(thisChannel, testMsgId, testStr, testStr,
-			[]byte{8, 6, 7, 5}, 0, 0, netTime.Now(), time.Second,
-			rounds.Round{ID: id.Round(0)}, 0, channels.Sent)
-	}
+			// Create a test channel id
+			deleteChannel := id.NewIdFromString("deleteMe", id.Generic, t)
+			keepChannel := id.NewIdFromString("dontDeleteMe", id.Generic, t)
+
+			// Store some test messages
+			for i := 0; i < totalMessages; i++ {
+				testStr := testString + strconv.Itoa(i)
+
+				// Interleave the channel id to ensure cursor is behaving intelligently
+				thisChannel := deleteChannel
+				if i%2 == 0 {
+					thisChannel = keepChannel
+				}
+
+				testMsgId := message.DeriveChannelMessageID(
+					&id.ID{1}, 0, []byte(testStr))
+				eventModel.ReceiveMessage(thisChannel, testMsgId, testStr, testStr,
+					[]byte{8, 6, 7, 5}, 0, 0, netTime.Now(), time.Second,
+					rounds.Round{ID: id.Round(0)}, 0, channels.Sent)
+			}
 
-	// Check pre-results
-	result, err := indexedDb.Dump(eventModel.db, messageStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(result) != totalMessages {
-		t.Errorf("Expected %d messages, got %d", totalMessages, len(result))
-	}
+			// Check pre-results
+			result, err := indexedDb.Dump(eventModel.db, messageStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(result) != totalMessages {
+				t.Errorf("Expected %d messages, got %d", totalMessages, len(result))
+			}
 
-	// Do delete
-	err = eventModel.deleteMsgByChannel(deleteChannel)
-	if err != nil {
-		t.Error(err)
-	}
+			// Do delete
+			err = eventModel.deleteMsgByChannel(deleteChannel)
+			if err != nil {
+				t.Error(err)
+			}
 
-	// Check final results
-	result, err = indexedDb.Dump(eventModel.db, messageStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(result) != expectedMessages {
-		t.Errorf("Expected %d messages, got %d", expectedMessages, len(result))
+			// Check final results
+			result, err = indexedDb.Dump(eventModel.db, messageStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(result) != expectedMessages {
+				t.Errorf("Expected %d messages, got %d", expectedMessages, len(result))
+			}
+		})
 	}
 }
 
 // This test is designed to prove the behavior of unique indexes.
 // Inserts will not fail, they simply will not happen.
 func TestWasmModel_receiveHelper_UniqueIndex(t *testing.T) {
-	storage.GetLocalStorage().Clear()
-	testString := "test_receiveHelper_UniqueIndex"
-	eventModel, err := newWASMModel(testString, nil, dummyCallback)
+	cipher, err := cryptoChannel.NewCipher([]byte("testpass"), []byte("testsalt"), 128, csprng.NewSystemRNG())
 	if err != nil {
-		t.Fatal(err)
+		t.Fatalf("Failed to create cipher")
 	}
+	for i, c := range []cryptoChannel.Cipher{nil, cipher} {
+		cs := ""
+		if cipher != nil {
+			cs = "_withCipher"
+		}
+		t.Run(fmt.Sprintf("TestWasmModel_receiveHelper_UniqueIndex%s", cs), func(t *testing.T) {
+			storage.GetLocalStorage().Clear()
+			testString := fmt.Sprintf("test_receiveHelper_UniqueIndex_%d", i)
+			eventModel, err := newWASMModel(testString, c, dummyCallback)
+			if err != nil {
+				t.Fatal(err)
+			}
 
-	// Ensure index is unique
-	txn, err := eventModel.db.Transaction(
-		idb.TransactionReadOnly, messageStoreName)
-	if err != nil {
-		t.Fatal(err)
-	}
-	store, err := txn.ObjectStore(messageStoreName)
-	if err != nil {
-		t.Fatal(err)
-	}
-	idx, err := store.Index(messageStoreMessageIndex)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if isUnique, err2 := idx.Unique(); !isUnique {
-		t.Fatalf("Index is not unique!")
-	} else if err2 != nil {
-		t.Fatal(err2)
-	}
+			// Ensure index is unique
+			txn, err := eventModel.db.Transaction(
+				idb.TransactionReadOnly, messageStoreName)
+			if err != nil {
+				t.Fatal(err)
+			}
+			store, err := txn.ObjectStore(messageStoreName)
+			if err != nil {
+				t.Fatal(err)
+			}
+			idx, err := store.Index(messageStoreMessageIndex)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if isUnique, err2 := idx.Unique(); !isUnique {
+				t.Fatalf("Index is not unique!")
+			} else if err2 != nil {
+				t.Fatal(err2)
+			}
 
-	// First message insert should succeed
-	testMsgId := message.DeriveChannelMessageID(&id.ID{1}, 0,
-		[]byte(testString))
-	testMsg := buildMessage([]byte(testString), testMsgId.Bytes(), nil,
-		testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
-		time.Second, 0, 0, channels.Sent)
-	_, err = eventModel.receiveHelper(testMsg, false)
-	if err != nil {
-		t.Fatal(err)
-	}
+			// First message insert should succeed
+			testMsgId := message.DeriveChannelMessageID(&id.ID{1},
+				0, []byte(testString))
+			testMsg := buildMessage([]byte(testString), testMsgId.Bytes(), nil,
+				testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
+				time.Second, 0, 0, channels.Sent)
+			_, err = eventModel.receiveHelper(testMsg, false)
+			if err != nil {
+				t.Fatal(err)
+			}
 
-	// The duplicate entry won't fail, but it just silently shouldn't happen
-	_, err = eventModel.receiveHelper(testMsg, false)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	results, err := indexedDb.Dump(eventModel.db, messageStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
-	}
-	if len(results) != 1 {
-		t.Fatalf("Expected only a single message, got %d", len(results))
-	}
+			// The duplicate entry won't fail, but it just silently shouldn't happen
+			_, err = eventModel.receiveHelper(testMsg, false)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			results, err := indexedDb.Dump(eventModel.db, messageStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			if len(results) != 1 {
+				t.Fatalf("Expected only a single message, got %d", len(results))
+			}
 
-	// Now insert a message with a different message ID from the first
-	testMsgId2 := message.DeriveChannelMessageID(&id.ID{2}, 0,
-		[]byte(testString))
-	testMsg = buildMessage([]byte(testString), testMsgId2.Bytes(), nil,
-		testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
-		time.Second, 0, 0, channels.Sent)
-	primaryKey, err := eventModel.receiveHelper(testMsg, false)
-	if err != nil {
-		t.Fatal(err)
-	}
+			// Now insert a message with a different message ID from the first
+			testMsgId2 := message.DeriveChannelMessageID(&id.ID{1},
+				0, []byte(testString))
+			testMsg = buildMessage([]byte(testString), testMsgId2.Bytes(), nil,
+				testString, []byte(testString), []byte{8, 6, 7, 5}, 0, 0, netTime.Now(),
+				time.Second, 0, 0, channels.Sent)
+			primaryKey, err := eventModel.receiveHelper(testMsg, false)
+			if err != nil {
+				t.Fatal(err)
+			}
 
-	// Except this time, we update the second entry to have the same
-	// message ID as the first
-	testMsg.ID = primaryKey
-	testMsg.MessageID = testMsgId.Bytes()
-	_, err = eventModel.receiveHelper(testMsg, true)
-	if err != nil {
-		t.Fatal(err)
-	}
+			// Except this time, we update the second entry to have the same
+			// message ID as the first
+			testMsg.ID = primaryKey
+			testMsg.MessageID = testMsgId.Bytes()
+			_, err = eventModel.receiveHelper(testMsg, true)
+			if err != nil {
+				t.Fatal(err)
+			}
 
-	// The update to duplicate message ID won't fail,
-	// but it just silently shouldn't happen
-	results, err = indexedDb.Dump(eventModel.db, messageStoreName)
-	if err != nil {
-		t.Fatalf("%+v", err)
+			// The update to duplicate message ID won't fail,
+			// but it just silently shouldn't happen
+			results, err = indexedDb.Dump(eventModel.db, messageStoreName)
+			if err != nil {
+				t.Fatalf("%+v", err)
+			}
+			// TODO: Convert JSON to Message, ensure Message ID fields differ
+
+		})
 	}
-	// TODO: Convert JSON to Message, ensure Message ID fields differ
 }
diff --git a/indexedDb/dm/implementation.go b/indexedDb/dm/implementation.go
index a94c0aad6c96ade151892b15ce285027ae89a477..6324aecfa8d38e463496e95213b5dba89b9e18ab 100644
--- a/indexedDb/dm/implementation.go
+++ b/indexedDb/dm/implementation.go
@@ -12,6 +12,7 @@ package channelEventModel
 import (
 	"crypto/ed25519"
 	"encoding/json"
+	"strings"
 	"sync"
 	"syscall/js"
 	"time"
@@ -101,14 +102,16 @@ func (w *wasmModel) Receive(messageID message.ID, nickname string, text []byte,
 	var err error
 
 	// If there is no extant Conversation, create one.
-	if result, err := indexedDb.Get(w.db, conversationStoreName,
-		utils.CopyBytesToJS(pubKey)); err != nil {
-		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
-			"Unable to get Conversation: %+v", err))
-		return 0
-	} else if len(result.String()) == 0 {
-		err = w.joinConversation(nickname, pubKey, dmToken, codeset)
-		jww.ERROR.Printf("%+v", err)
+	if _, err := indexedDb.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey)); err != nil {
+		if strings.Contains(err.Error(), indexedDb.ErrDoesNotExist) {
+			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			if err != nil {
+				jww.ERROR.Printf("%+v", err)
+			}
+		} else {
+			jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
+				"Unable to get Conversation: %+v", err))
+		}
 		return 0
 	} else {
 		jww.DEBUG.Printf("Conversation with %s already joined", nickname)
@@ -141,14 +144,16 @@ func (w *wasmModel) ReceiveText(messageID message.ID, nickname, text string,
 	var err error
 
 	// If there is no extant Conversation, create one.
-	if result, err := indexedDb.Get(w.db, conversationStoreName,
-		utils.CopyBytesToJS(pubKey)); err != nil {
-		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
-			"Unable to get Conversation: %+v", err))
-		return 0
-	} else if len(result.String()) == 0 {
-		err = w.joinConversation(nickname, pubKey, dmToken, codeset)
-		jww.ERROR.Printf("%+v", err)
+	if _, err := indexedDb.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey)); err != nil {
+		if strings.Contains(err.Error(), indexedDb.ErrDoesNotExist) {
+			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			if err != nil {
+				jww.ERROR.Printf("%+v", err)
+			}
+		} else {
+			jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
+				"Unable to get Conversation: %+v", err))
+		}
 		return 0
 	} else {
 		jww.DEBUG.Printf("Conversation with %s already joined", nickname)
@@ -183,14 +188,16 @@ func (w *wasmModel) ReceiveReply(messageID message.ID, reactionTo message.ID,
 	var err error
 
 	// If there is no extant Conversation, create one.
-	if result, err := indexedDb.Get(w.db, conversationStoreName,
-		utils.CopyBytesToJS(pubKey)); err != nil {
-		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
-			"Unable to get Conversation: %+v", err))
-		return 0
-	} else if len(result.String()) == 0 {
-		err = w.joinConversation(nickname, pubKey, dmToken, codeset)
-		jww.ERROR.Printf("%+v", err)
+	if _, err := indexedDb.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey)); err != nil {
+		if strings.Contains(err.Error(), indexedDb.ErrDoesNotExist) {
+			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			if err != nil {
+				jww.ERROR.Printf("%+v", err)
+			}
+		} else {
+			jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
+				"Unable to get Conversation: %+v", err))
+		}
 		return 0
 	} else {
 		jww.DEBUG.Printf("Conversation with %s already joined", nickname)
@@ -225,14 +232,16 @@ func (w *wasmModel) ReceiveReaction(messageID message.ID, reactionTo message.ID,
 	var err error
 
 	// If there is no extant Conversation, create one.
-	if result, err := indexedDb.Get(w.db, conversationStoreName,
-		utils.CopyBytesToJS(pubKey)); err != nil {
-		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
-			"Unable to get Conversation: %+v", err))
-		return 0
-	} else if len(result.String()) == 0 {
-		err = w.joinConversation(nickname, pubKey, dmToken, codeset)
-		jww.ERROR.Printf("%+v", err)
+	if _, err := indexedDb.Get(w.db, conversationStoreName, utils.CopyBytesToJS(pubKey)); err != nil {
+		if strings.Contains(err.Error(), indexedDb.ErrDoesNotExist) {
+			err = w.joinConversation(nickname, pubKey, dmToken, codeset)
+			if err != nil {
+				jww.ERROR.Printf("%+v", err)
+			}
+		} else {
+			jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
+				"Unable to get Conversation: %+v", err))
+		}
 		return 0
 	} else {
 		jww.DEBUG.Printf("Conversation with %s already joined", nickname)
@@ -260,8 +269,9 @@ func (w *wasmModel) ReceiveReaction(messageID message.ID, reactionTo message.ID,
 	return uuid
 }
 
-func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID,
-	timestamp time.Time, round rounds.Round, status dm.Status) {
+func (w *wasmModel) UpdateSentStatus(uuid uint64,
+	messageID message.ID, timestamp time.Time, round rounds.Round,
+	status dm.Status) {
 	parentErr := errors.New("failed to UpdateSentStatus")
 
 	// FIXME: this is a bit of race condition without the mux.
@@ -276,15 +286,20 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID,
 	// Use the key to get the existing Message
 	currentMsg, err := indexedDb.Get(w.db, messageStoreName, key)
 	if err != nil {
+		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
+			"Unable to get message: %+v", err))
 		return
 	}
 
 	// Extract the existing Message and update the Status
 	newMessage := &Message{}
-	err = json.Unmarshal([]byte(currentMsg.String()), newMessage)
+	err = json.Unmarshal([]byte(utils.JsToJson(currentMsg)), newMessage)
 	if err != nil {
+		jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr,
+			"Could not JSON unmarshal message: %+v", err))
 		return
 	}
+
 	newMessage.Status = uint8(status)
 	if !messageID.Equals(message.ID{}) {
 		newMessage.MessageID = messageID.Bytes()
diff --git a/indexedDb/utils.go b/indexedDb/utils.go
index 1aa6ff45805c1c65b9ad27e51a8b0590e7b8201d..a8e7fd8e528a185cef11f65baa351bc602a9a745 100644
--- a/indexedDb/utils.go
+++ b/indexedDb/utils.go
@@ -22,9 +22,13 @@ import (
 	"time"
 )
 
-// dbTimeout is the global timeout for operations with the storage
-// [context.Context].
-const dbTimeout = time.Second
+const (
+	// dbTimeout is the global timeout for operations with the storage
+	// [context.Context].
+	dbTimeout = time.Second
+	// ErrDoesNotExist is an error string for got undefined on Get operations.
+	ErrDoesNotExist = "result is undefined"
+)
 
 // NewContext builds a context for indexedDb operations.
 func NewContext() (context.Context, context.CancelFunc) {
@@ -62,8 +66,8 @@ func Get(db *idb.Database, objectStoreName string, key js.Value) (js.Value, erro
 		return js.Undefined(), errors.WithMessagef(parentErr,
 			"Unable to get from ObjectStore: %+v", err)
 	} else if resultObj.IsUndefined() {
-		return js.Undefined(), errors.WithMessage(parentErr,
-			"Unable to get from ObjectStore: result is undefined")
+		return js.Undefined(), errors.WithMessagef(parentErr,
+			"Unable to get from ObjectStore: %s", ErrDoesNotExist)
 	}
 
 	// Process result into string
@@ -111,8 +115,8 @@ func GetIndex(db *idb.Database, objectStoreName string,
 		return js.Undefined(), errors.WithMessagef(parentErr,
 			"Unable to get from ObjectStore: %+v", err)
 	} else if resultObj.IsUndefined() {
-		return js.Undefined(), errors.WithMessage(parentErr,
-			"Unable to get from ObjectStore: result is undefined")
+		return js.Undefined(), errors.WithMessagef(parentErr,
+			"Unable to get from ObjectStore: %s", ErrDoesNotExist)
 	}
 
 	// Process result into string