diff --git a/cmix/interface.go b/cmix/interface.go
index a232d41674ccfca262545ee1357ba47c8a4b8de5..c8673e02b8b74efe0e50521dfeb52ab599f2f970 100644
--- a/cmix/interface.go
+++ b/cmix/interface.go
@@ -84,7 +84,7 @@ type Client interface {
 	// Will return an error if the network is unhealthy or if it fails to send
 	// (along with the reason). Blocks until successful send or err.
 	// WARNING: Do not roll your own crypto.
-	SendMany(recipients []*id.ID, messages []TargetedCmixMessage,
+	SendMany(messages []TargetedCmixMessage,
 		params CMIXParams) (rounds.Round, []ephemeral.Id, error)
 
 	// SendWithAssembler sends a variable cmix payload to the provided recipient.
diff --git a/cmix/sendCmixUtils.go b/cmix/sendCmixUtils.go
index 748b6eee3a8073b39d06ed42b98f7844b343169a..e0d32153955435d39ab9cb4167b1d239953ba48b 100644
--- a/cmix/sendCmixUtils.go
+++ b/cmix/sendCmixUtils.go
@@ -219,7 +219,17 @@ func recipientsToStrings(recipients []*id.ID) string {
 	}
 
 	return strings.Join(idStrings, ", ")
+}
+
+// recipientsFromTargetedMessage extracts the list of recipients from a
+// list of TargetedCmixMessage.
+func recipientsFromTargetedMessage(msgs []TargetedCmixMessage) []*id.ID {
+	idStrings := make([]*id.ID, 0, len(msgs))
+	for _, msg := range msgs {
+		idStrings = append(idStrings, msg.Recipient)
+	}
 
+	return idStrings
 }
 
 // messagesToDigestString serializes a list of cMix messages into a string of
diff --git a/cmix/sendManyCmix.go b/cmix/sendManyCmix.go
index cd84cb156259d906db7f82dc27c4da7070cdc0c0..0b2fc3dac65824ebd65668ce774f734b5df2272a 100644
--- a/cmix/sendManyCmix.go
+++ b/cmix/sendManyCmix.go
@@ -70,14 +70,14 @@ type TargetedCmixMessage struct {
 // Will return an error if the network is unhealthy or if it fails to send
 // (along with the reason). Blocks until successful send or err.
 // WARNING: Do not roll your own crypto
-func (c *client) SendMany(recipients []*id.ID,
-	messages []TargetedCmixMessage,
+func (c *client) SendMany(messages []TargetedCmixMessage,
 	params CMIXParams) (rounds.Round, []ephemeral.Id, error) {
 	if !c.Monitor.IsHealthy() {
 		return rounds.Round{}, []ephemeral.Id{}, errors.New(
 			"Cannot send cMix message when the network is not healthy")
 	}
 
+	recipients := recipientsFromTargetedMessage(messages)
 	assembler := func(rid id.Round) ([]TargetedCmixMessage, error) {
 		return messages, nil
 	}
diff --git a/fileTransfer/manager.go b/fileTransfer/manager.go
index 3d8b56f5acd7298e75fda418de3b8136c5f0866b..dc65222b3730a23e0364ef77510925b32d505886 100644
--- a/fileTransfer/manager.go
+++ b/fileTransfer/manager.go
@@ -146,7 +146,7 @@ type FtE2e interface {
 // transfer manager for easier testing.
 type Cmix interface {
 	GetMaxMessageLength() int
-	SendMany(recipients []*id.ID, messages []cmix.TargetedCmixMessage,
+	SendMany(messages []cmix.TargetedCmixMessage,
 		p cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error)
 	AddFingerprint(identity *id.ID, fingerprint format.Fingerprint,
 		mp message.Processor) error
diff --git a/fileTransfer/send.go b/fileTransfer/send.go
index 8066259d8f34f55a34138f4ff96ef0c8e5db526e..3237754159f63ea15cee9d1fe5479794a833fd42 100644
--- a/fileTransfer/send.go
+++ b/fileTransfer/send.go
@@ -156,7 +156,7 @@ func (m *manager) sendCmix(packet []store.Part) {
 	jww.DEBUG.Printf("[FT] Sending %d file parts via SendManyCMIX",
 		len(messages))
 
-	rid, _, err := m.cmix.SendMany(recipients, messages, m.params.Cmix)
+	rid, _, err := m.cmix.SendMany(messages, m.params.Cmix)
 	if err != nil {
 		jww.WARN.Printf("[FT] Failed to send %d file parts via "+
 			"SendManyCMIX: %+v", len(messages), err)
diff --git a/groupChat/interface.go b/groupChat/interface.go
index a84c4e34a6eeaed563148bc1017a44ddb7e6e43a..563efdc08583cb7051ecbc52d6dcec58582635ed 100644
--- a/groupChat/interface.go
+++ b/groupChat/interface.go
@@ -114,7 +114,7 @@ type groupE2e interface {
 // groupCmix is a subset of the cmix.Client interface containing only the
 // methods needed by GroupChat
 type groupCmix interface {
-	SendMany(recipients []*id.ID, messages []cmix.TargetedCmixMessage,
+	SendMany(messages []cmix.TargetedCmixMessage,
 		p cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error)
 	AddService(
 		clientID *id.ID, newService message.Service, response message.Processor)
diff --git a/groupChat/send.go b/groupChat/send.go
index 1f716bbf9c3593e6808306bd8d2c83d7bbcc2c96..0e49a1aebf5678c18c9d96eeae9a4f21e1fe59d2 100644
--- a/groupChat/send.go
+++ b/groupChat/send.go
@@ -62,7 +62,7 @@ func (m *manager) Send(groupID *id.ID, tag string, message []byte) (
 	timeNow := netTime.Now().Round(0)
 
 	// Create a cMix message for each group member
-	groupMessages, recipients, msgId, err := m.newMessages(g, tag, message, timeNow)
+	groupMessages, msgId, err := m.newMessages(g, tag, message, timeNow)
 	if err != nil {
 		return rounds.Round{}, time.Time{}, group.MessageID{},
 			errors.Errorf(newCmixMsgErr, g.Name, g.ID, err)
@@ -71,7 +71,7 @@ func (m *manager) Send(groupID *id.ID, tag string, message []byte) (
 	// Send all the groupMessages
 	param := cmix.GetDefaultCMIXParams()
 	param.DebugTag = "group.Message"
-	rid, _, err := m.getCMix().SendMany(recipients, groupMessages, param)
+	rid, _, err := m.getCMix().SendMany(groupMessages, param)
 	if err != nil {
 		return rounds.Round{}, time.Time{}, group.MessageID{},
 			errors.Errorf(sendManyCmixErr, m.getReceptionIdentity().ID, g.Name,
@@ -85,8 +85,7 @@ func (m *manager) Send(groupID *id.ID, tag string, message []byte) (
 
 // newMessages builds a list of messages, one for each group chat member.
 func (m *manager) newMessages(g gs.Group, tag string, msg []byte,
-	timestamp time.Time) ([]cmix.TargetedCmixMessage, []*id.ID,
-	group.MessageID, error) {
+	timestamp time.Time) ([]cmix.TargetedCmixMessage, group.MessageID, error) {
 
 	rng := m.getRng().GetStream()
 	defer rng.Close()
@@ -97,18 +96,18 @@ func (m *manager) newMessages(g gs.Group, tag string, msg []byte,
 	// Generate public message to determine what length internal message can be
 	pubMsg, err := newPublicMsg(maxCmixMessageLength)
 	if err != nil {
-		return nil, nil, group.MessageID{}, errors.Errorf(newPublicMsgErr, err)
+		return nil, group.MessageID{}, errors.Errorf(newPublicMsgErr, err)
 	}
 
 	// Generate internal message
 	intlMsg, err := newInternalMsg(pubMsg.GetPayloadSize())
 	if err != nil {
-		return nil, nil, group.MessageID{}, errors.Errorf(newInternalMsgErr, err)
+		return nil, group.MessageID{}, errors.Errorf(newInternalMsgErr, err)
 	}
 
 	// Return an error if the message is too large to fit in the payload
 	if intlMsg.GetPayloadMaxSize() < len(msg) {
-		return nil, nil, group.MessageID{}, errors.Errorf(
+		return nil, group.MessageID{}, errors.Errorf(
 			messageLenErr, len(msg), intlMsg.GetPayloadMaxSize())
 	}
 
@@ -118,7 +117,6 @@ func (m *manager) newMessages(g gs.Group, tag string, msg []byte,
 
 	// Create cMix messages
 	messages := make([]cmix.TargetedCmixMessage, len(g.Members))
-	recipients := make([]*id.ID, len(g.Members))
 	for i, member := range g.Members {
 		// Do not send to the sender
 		if m.getReceptionIdentity().ID.Cmp(member.ID) {
@@ -129,14 +127,12 @@ func (m *manager) newMessages(g gs.Group, tag string, msg []byte,
 		cMixMsg, err := newCmixMsg(g, tag, timestamp, member, rng,
 			maxCmixMessageLength, internalMessagePayload)
 		if err != nil {
-			return nil, nil, group.MessageID{}, err
+			return nil, group.MessageID{}, err
 		}
 		messages[i] = cMixMsg
-		recipients[i] = g.ID
 	}
 
-	return messages, recipients,
-		group.NewMessageID(g.ID, internalMessagePayload), nil
+	return messages, group.NewMessageID(g.ID, internalMessagePayload), nil
 }
 
 // newCmixMsg generates a new cmix.TargetedCmixMessage for the given group