diff --git a/indexedDb/impl/dm/implementation.go b/indexedDb/impl/dm/implementation.go
index b5da9e09272fe43bfae0195ef9e8b7988955a414..5651ed9c27cbd7469c06f3f6229c2f4370bc8b34 100644
--- a/indexedDb/impl/dm/implementation.go
+++ b/indexedDb/impl/dm/implementation.go
@@ -99,209 +99,63 @@ func buildMessage(messageID, parentID, text []byte, partnerKey, senderKey ed2551
 func (w *wasmModel) Receive(messageID message.ID, nickname string, text []byte,
 	partnerKey, senderKey ed25519.PublicKey, dmToken uint32, codeset uint8, timestamp time.Time,
 	round rounds.Round, mType dm.MessageType, status dm.Status) uint64 {
-	parentErr := errors.New("failed to Receive")
+	parentErr := "[DM indexedDB] failed to Receive"
 	jww.TRACE.Printf("[DM indexedDB] Receive(%s)", messageID)
 
-	// If there is no extant Conversation, create one.
-	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(partnerKey))
+	uuid, err := w.receiveWrapper(messageID, nil, nickname, string(text),
+		partnerKey, senderKey, dmToken, codeset, timestamp, round, mType, status)
 	if err != nil {
-		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, partnerKey, dmToken,
-				codeset)
-			if err != nil {
-				jww.ERROR.Printf("[DM indexedDB] %+v", err)
-				return 0
-			}
-		} else {
-			jww.ERROR.Printf("[DM indexedDB] %+v", errors.WithMessagef(
-				parentErr, "Unable to get Conversation: %+v", err))
-			return 0
-		}
-	} else {
-		jww.DEBUG.Printf(
-			"[DM indexedDB] Conversation with %s already joined", nickname)
-	}
-
-	// Handle encryption, if it is present
-	if w.cipher != nil {
-		text, err = w.cipher.Encrypt(text)
-		if err != nil {
-			jww.ERROR.Printf(
-				"[DM indexedDB] Failed to encrypt Message: %+v", err)
-			return 0
-		}
-	}
-
-	msgToInsert := buildMessage(messageID.Bytes(), nil, text, partnerKey,
-		senderKey, timestamp, round.ID, mType, codeset, status)
-	uuid, err := w.receiveHelper(msgToInsert, false)
-	if err != nil {
-		jww.ERROR.Printf("[DM indexedDB] Failed to receive Message: %+v", err)
+		jww.ERROR.Printf("%+v", errors.WithMessagef(err, parentErr))
 		return 0
 	}
-
-	jww.TRACE.Printf(
-		"[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f)", uuid, partnerKey)
-	go w.receivedMessageCB(uuid, partnerKey, false)
 	return uuid
 }
 
 func (w *wasmModel) ReceiveText(messageID message.ID, nickname, text string,
 	partnerKey, senderKey ed25519.PublicKey, dmToken uint32, codeset uint8,
 	timestamp time.Time, round rounds.Round, status dm.Status) uint64 {
-	parentErr := errors.New("failed to ReceiveText")
+	parentErr := "[DM indexedDB] failed to ReceiveText"
 	jww.TRACE.Printf("[DM indexedDB] ReceiveText(%s)", messageID)
 
-	// If there is no extant Conversation, create one.
-	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(partnerKey))
-	if err != nil {
-		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, partnerKey, dmToken,
-				codeset)
-			if err != nil {
-				jww.ERROR.Printf("[DM indexedDB] %+v", err)
-				return 0
-			}
-		} else {
-			jww.ERROR.Printf("[DM indexedDB] %+v", errors.WithMessagef(
-				parentErr, "Unable to get Conversation: %+v", err))
-			return 0
-		}
-	} else {
-		jww.DEBUG.Printf(
-			"[DM indexedDB] Conversation with %s already joined", nickname)
-		return 0
-	}
-
-	// Handle encryption, if it is present
-	textBytes := []byte(text)
-	if w.cipher != nil {
-		textBytes, err = w.cipher.Encrypt(textBytes)
-		if err != nil {
-			jww.ERROR.Printf(
-				"[DM indexedDB] Failed to encrypt Message: %+v", err)
-			return 0
-		}
-	}
-
-	msgToInsert := buildMessage(messageID.Bytes(), nil, textBytes,
-		partnerKey, senderKey, timestamp, round.ID,
-		dm.TextType, codeset, status)
-
-	uuid, err := w.receiveHelper(msgToInsert, false)
+	uuid, err := w.receiveWrapper(messageID, nil, nickname, text,
+		partnerKey, senderKey, dmToken, codeset, timestamp, round,
+		dm.TextType, status)
 	if err != nil {
-		jww.ERROR.Printf("[DM indexedDB] Failed to receive Message: %+v", err)
+		jww.ERROR.Printf("%+v", errors.WithMessagef(err, parentErr))
 		return 0
 	}
-
-	jww.TRACE.Printf(
-		"[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f)", uuid, partnerKey)
-	go w.receivedMessageCB(uuid, partnerKey, false)
 	return uuid
 }
 
 func (w *wasmModel) ReceiveReply(messageID, reactionTo message.ID, nickname,
 	text string, partnerKey, senderKey ed25519.PublicKey, dmToken uint32, codeset uint8,
 	timestamp time.Time, round rounds.Round, status dm.Status) uint64 {
-	parentErr := errors.New("failed to ReceiveReply")
+	parentErr := "[DM indexedDB] failed to ReceiveReply"
 	jww.TRACE.Printf("[DM indexedDB] ReceiveReply(%s)", messageID)
 
-	// If there is no extant Conversation, create one.
-	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(partnerKey))
-	if err != nil {
-		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, partnerKey, dmToken,
-				codeset)
-			if err != nil {
-				jww.ERROR.Printf("[DM indexedDB] %+v", err)
-				return 0
-			}
-		} else {
-			jww.ERROR.Printf("[DM indexedDB] %+v", errors.WithMessagef(
-				parentErr, "Unable to get Conversation: %+v", err))
-			return 0
-		}
-	} else {
-		jww.DEBUG.Printf("[DM indexedDB] Conversation with %s already joined",
-			nickname)
-	}
-
-	// Handle encryption, if it is present
-	textBytes := []byte(text)
-	if w.cipher != nil {
-		textBytes, err = w.cipher.Encrypt(textBytes)
-		if err != nil {
-			jww.ERROR.Printf(
-				"[DM indexedDB] Failed to encrypt Message: %+v", err)
-			return 0
-		}
-	}
-
-	msgToInsert := buildMessage(messageID.Bytes(), reactionTo.Marshal(),
-		textBytes, partnerKey, senderKey, timestamp, round.ID,
-		dm.TextType, codeset, status)
-
-	uuid, err := w.receiveHelper(msgToInsert, false)
+	uuid, err := w.receiveWrapper(messageID, &reactionTo, nickname, text,
+		partnerKey, senderKey, dmToken, codeset, timestamp, round,
+		dm.TextType, status)
 	if err != nil {
-		jww.ERROR.Printf("[DM indexedDB] Failed to receive Message: %+v", err)
+		jww.ERROR.Printf("%+v", errors.WithMessagef(err, parentErr))
 		return 0
 	}
-
-	jww.TRACE.Printf(
-		"[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f)", uuid, partnerKey)
-	go w.receivedMessageCB(uuid, partnerKey, false)
 	return uuid
 }
 
-func (w *wasmModel) ReceiveReaction(messageID, _ message.ID, nickname,
+func (w *wasmModel) ReceiveReaction(messageID, reactionTo message.ID, nickname,
 	reaction string, partnerKey, senderKey ed25519.PublicKey, dmToken uint32, codeset uint8,
 	timestamp time.Time, round rounds.Round, status dm.Status) uint64 {
-	parentErr := errors.New("failed to ReceiveText")
+	parentErr := "[DM indexedDB] failed to ReceiveReaction"
 	jww.TRACE.Printf("[DM indexedDB] ReceiveReaction(%s)", messageID)
 
-	// If there is no extant Conversation, create one.
-	_, err := impl.Get(w.db, conversationStoreName, utils.CopyBytesToJS(partnerKey))
+	uuid, err := w.receiveWrapper(messageID, &reactionTo, nickname, reaction,
+		partnerKey, senderKey, dmToken, codeset, timestamp, round,
+		dm.ReactionType, status)
 	if err != nil {
-		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
-			err = w.joinConversation(nickname, partnerKey, dmToken,
-				codeset)
-			if err != nil {
-				jww.ERROR.Printf("[DM indexedDB] %+v", err)
-				return 0
-			}
-		} else {
-			jww.ERROR.Printf("[DM indexedDB] %+v", errors.WithMessagef(
-				parentErr, "Unable to get Conversation: %+v", err))
-			return 0
-		}
-	} else {
-		jww.DEBUG.Printf(
-			"[DM indexedDB] Conversation with %s already joined", nickname)
-	}
-
-	// Handle encryption, if it is present
-	textBytes := []byte(reaction)
-	if w.cipher != nil {
-		textBytes, err = w.cipher.Encrypt(textBytes)
-		if err != nil {
-			jww.ERROR.Printf("[DM indexedDB] Failed to encrypt Message: %+v", err)
-			return 0
-		}
-	}
-
-	msgToInsert := buildMessage(messageID.Bytes(), nil, textBytes,
-		partnerKey, senderKey, timestamp, round.ID, dm.ReactionType,
-		codeset, status)
-
-	uuid, err := w.receiveHelper(msgToInsert, false)
-	if err != nil {
-		jww.ERROR.Printf("[DM indexedDB] Failed to receive Message: %+v", err)
+		jww.ERROR.Printf("%+v", errors.WithMessagef(err, parentErr))
 		return 0
 	}
-
-	jww.TRACE.Printf("[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f)",
-		uuid, partnerKey)
-	go w.receivedMessageCB(uuid, partnerKey, false)
 	return uuid
 }
 
@@ -363,6 +217,56 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID message.ID,
 	go w.receivedMessageCB(uuid, newMessage.ConversationPubKey, true)
 }
 
+// receiveWrapper is a higher-level wrapper of receiveHelper.
+func (w *wasmModel) receiveWrapper(messageID message.ID, parentID *message.ID, nickname,
+	data string, partnerKey, senderKey ed25519.PublicKey, dmToken uint32, codeset uint8,
+	timestamp time.Time, round rounds.Round, mType dm.MessageType, status dm.Status) (uint64, error) {
+
+	// If there is no extant Conversation, create one.
+	_, err := impl.Get(w.db, conversationStoreName, js.ValueOf(partnerKey))
+	if err != nil {
+		if strings.Contains(err.Error(), impl.ErrDoesNotExist) {
+			err = w.joinConversation(nickname, partnerKey, dmToken,
+				codeset)
+			if err != nil {
+				return 0, err
+			}
+		} else {
+			return 0, err
+		}
+	} else {
+		jww.DEBUG.Printf(
+			"[DM indexedDB] Conversation with %s already joined", nickname)
+	}
+
+	// Handle encryption, if it is present
+	textBytes := []byte(data)
+	if w.cipher != nil {
+		textBytes, err = w.cipher.Encrypt(textBytes)
+		if err != nil {
+			return 0, err
+		}
+	}
+
+	var parentIdBytes []byte
+	if parentID != nil {
+		parentIdBytes = parentID.Marshal()
+	}
+
+	msgToInsert := buildMessage(messageID.Bytes(), parentIdBytes, textBytes,
+		senderKey, timestamp, round.ID, mType, codeset, status)
+
+	uuid, err := w.receiveHelper(msgToInsert, false)
+	if err != nil {
+		return 0, err
+	}
+
+	jww.TRACE.Printf("[DM indexedDB] Calling ReceiveMessageCB(%v, %v, f)",
+		uuid, partnerKey)
+	go w.receivedMessageCB(uuid, partnerKey, false)
+	return uuid, nil
+}
+
 // receiveHelper is a private helper for receiving any sort of message.
 func (w *wasmModel) receiveHelper(
 	newMessage *Message, isUpdate bool) (uint64, error) {