diff --git a/bindings/channels.go b/bindings/channels.go
index 8fc4fd24fd0c8644df7a75098619bf24e3cb5f60..0a6014332ec077516bc7e57d7ae36a2c58bc2f23 100644
--- a/bindings/channels.go
+++ b/bindings/channels.go
@@ -11,6 +11,9 @@ import (
 	"crypto/ed25519"
 	"encoding/base64"
 	"encoding/json"
+	"sync"
+	"time"
+
 	"github.com/pkg/errors"
 	"gitlab.com/elixxir/client/channels"
 	"gitlab.com/elixxir/client/cmix/rounds"
@@ -23,8 +26,6 @@ import (
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
 	"gitlab.com/xx_network/primitives/netTime"
-	"sync"
-	"time"
 )
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -843,10 +844,12 @@ func (cm *ChannelsManager) SendGeneric(marshalledChanId []byte,
 		return nil, err
 	}
 
+	msgTy := channels.MessageType(messageType)
+
 	// Send message
 	chanMsgId, rnd, ephId, err := cm.api.SendGeneric(chanId,
-		channels.MessageType(messageType), message,
-		time.Duration(leaseTimeMS), params.CMIX)
+		msgTy, message, time.Duration(leaseTimeMS),
+		params.CMIX)
 	if err != nil {
 		return nil, err
 	}
@@ -897,10 +900,12 @@ func (cm *ChannelsManager) SendAdminGeneric(adminPrivateKey,
 		return nil, err
 	}
 
+	msgTy := channels.MessageType(messageType)
+
 	// Send admin message
 	chanMsgId, rnd, ephId, err := cm.api.SendAdminGeneric(rsaPrivKey,
-		chanId, channels.MessageType(messageType), message,
-		time.Duration(leaseTimeMS), params.CMIX)
+		chanId, msgTy, message, time.Duration(leaseTimeMS),
+		params.CMIX)
 
 	// Construct send report
 	return constructChannelSendReport(chanMsgId, rnd.ID, ephId)
diff --git a/channels/eventModel.go b/channels/eventModel.go
index 05e31b5366c5a5adfba730381eedbe16a8fd1f04..153a6bd68df07144219fc249332c5c3f0f316db2 100644
--- a/channels/eventModel.go
+++ b/channels/eventModel.go
@@ -9,6 +9,7 @@ package channels
 
 import (
 	"crypto/ed25519"
+	"encoding/base64"
 	"errors"
 	"fmt"
 	"github.com/golang/protobuf/proto"
@@ -297,6 +298,11 @@ func (e *events) receiveTextMessage(channelID *id.ID,
 		if len(txt.ReplyMessageID) == cryptoChannel.MessageIDLen {
 			var replyTo cryptoChannel.MessageID
 			copy(replyTo[:], txt.ReplyMessageID)
+			tag := makeChaDebugTag(channelID, pubKey, content, SendReplyTag)
+			jww.INFO.Printf("[%s]Channels - Received reply from %s "+
+				"to %s on %s", tag, base64.StdEncoding.EncodeToString(pubKey),
+				base64.StdEncoding.EncodeToString(txt.ReplyMessageID),
+				channelID)
 			return e.model.ReceiveReply(channelID, messageID, replyTo,
 				nickname, txt.Text, pubKey, codeset, timestamp, lease, round, Text, status)
 
@@ -311,6 +317,12 @@ func (e *events) receiveTextMessage(channelID *id.ID,
 		}
 	}
 
+	tag := makeChaDebugTag(channelID, pubKey, content, SendMessageTag)
+	jww.INFO.Printf("[%s]Channels - Received message from %s "+
+		"to %s on %s", tag, base64.StdEncoding.EncodeToString(pubKey),
+		base64.StdEncoding.EncodeToString(txt.ReplyMessageID),
+		channelID)
+
 	return e.model.ReceiveMessage(channelID, messageID, nickname, txt.Text, pubKey, codeset,
 		timestamp, lease, round, Text, status)
 }
@@ -349,6 +361,13 @@ func (e *events) receiveReaction(channelID *id.ID,
 	if react.ReactionMessageID != nil && len(react.ReactionMessageID) == cryptoChannel.MessageIDLen {
 		var reactTo cryptoChannel.MessageID
 		copy(reactTo[:], react.ReactionMessageID)
+
+		tag := makeChaDebugTag(channelID, pubKey, content, SendReactionTag)
+		jww.INFO.Printf("[%s]Channels - Received reaction from %s "+
+			"to %s on %s", tag, base64.StdEncoding.EncodeToString(pubKey),
+			base64.StdEncoding.EncodeToString(react.ReactionMessageID),
+			channelID)
+
 		return e.model.ReceiveReaction(channelID, messageID, reactTo, nickname,
 			react.Reaction, pubKey, codeset, timestamp, lease, round, Reaction, status)
 	} else {
diff --git a/channels/interface.go b/channels/interface.go
index b7def830340c4eea3aff959d0909f9f7b21962b5..b7d5445ced2690ef80a77ca0b30f087f814de43f 100644
--- a/channels/interface.go
+++ b/channels/interface.go
@@ -8,6 +8,9 @@
 package channels
 
 import (
+	"math"
+	"time"
+
 	"gitlab.com/elixxir/client/cmix"
 	"gitlab.com/elixxir/client/cmix/rounds"
 	cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast"
@@ -15,8 +18,6 @@ import (
 	"gitlab.com/elixxir/crypto/rsa"
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
-	"math"
-	"time"
 )
 
 // ValidForever is used as a validUntil lease when sending to denote the
@@ -64,8 +65,8 @@ type Manager interface {
 	// return an error. The message must be at most 510 bytes long.
 	SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
 		messageType MessageType, msg []byte, validUntil time.Duration,
-		params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round,
-		ephemeral.Id, error)
+		params cmix.CMIXParams) (cryptoChannel.MessageID,
+		rounds.Round, ephemeral.Id, error)
 
 	// SendMessage is used to send a formatted message over a channel.
 	// Due to the underlying encoding using compression, it isn't
diff --git a/channels/manager.go b/channels/manager.go
index 5517ffa9bb147bb403a8b6a02e9afe3ed2e35fb7..b6a474e2fff2f874a12fbbcb2d6333f3eeb4db9e 100644
--- a/channels/manager.go
+++ b/channels/manager.go
@@ -89,6 +89,8 @@ func NewManager(identity cryptoChannel.PrivateIdentity, kv *versioned.KV,
 
 	// Prefix the kv with the username so multiple can be run
 	storageTag := getStorageTag(identity.PubKey)
+	jww.INFO.Printf("NewManager(ID:%s-%s, tag:%s)", identity.Codename,
+		identity.PubKey, storageTag)
 	kv = kv.Prefix(storageTag)
 
 	if err := storeIdentity(kv, identity); err != nil {
@@ -110,6 +112,8 @@ func NewManager(identity cryptoChannel.PrivateIdentity, kv *versioned.KV,
 func LoadManager(storageTag string, kv *versioned.KV, net Client,
 	rng *fastRNG.StreamGenerator, modelBuilder EventModelBuilder) (Manager, error) {
 
+	jww.INFO.Printf("LoadManager(tag:%s)", storageTag)
+
 	// Prefix the kv with the username so multiple can be run
 	kv = kv.Prefix(storageTag)
 
@@ -155,6 +159,7 @@ func setupManager(identity cryptoChannel.PrivateIdentity, kv *versioned.KV,
 // JoinChannel joins the given channel. It will fail if the channel has already
 // been joined.
 func (m *manager) JoinChannel(channel *cryptoBroadcast.Channel) error {
+	jww.INFO.Printf("JoinChannel(%s[%s])", channel.Name, channel.ReceptionID)
 	err := m.addChannel(channel)
 	if err != nil {
 		return err
@@ -168,6 +173,7 @@ func (m *manager) JoinChannel(channel *cryptoBroadcast.Channel) error {
 // LeaveChannel leaves the given channel. It will return an error if the channel
 // was not previously joined.
 func (m *manager) LeaveChannel(channelID *id.ID) error {
+	jww.INFO.Printf("LeaveChannel(%s)", channelID)
 	err := m.removeChannel(channelID)
 	if err != nil {
 		return err
@@ -181,6 +187,7 @@ func (m *manager) LeaveChannel(channelID *id.ID) error {
 // GetChannels returns the IDs of all channels that have been joined. Use
 // getChannelsUnsafe if you already have taken the mux.
 func (m *manager) GetChannels() []*id.ID {
+	jww.INFO.Printf("GetChannels")
 	m.mux.Lock()
 	defer m.mux.Unlock()
 	return m.getChannelsUnsafe()
@@ -188,6 +195,7 @@ func (m *manager) GetChannels() []*id.ID {
 
 // GetChannel returns the underlying cryptographic structure for a given channel.
 func (m *manager) GetChannel(chID *id.ID) (*cryptoBroadcast.Channel, error) {
+	jww.INFO.Printf("GetChannel(%s)", chID)
 	jc, err := m.getChannel(chID)
 	if err != nil {
 		return nil, err
@@ -202,7 +210,7 @@ func (m *manager) GetChannel(chID *id.ID) (*cryptoBroadcast.Channel, error) {
 // underlying state tracking for message pickup for the channel, causing all
 // messages to be re-retrieved from the network
 func (m *manager) ReplayChannel(chID *id.ID) error {
-	jww.INFO.Printf("Replaying messages on channel %s", chID)
+	jww.INFO.Printf("ReplayChannel(%s)", chID)
 	m.mux.RLock()
 	defer m.mux.RUnlock()
 
@@ -243,6 +251,7 @@ func (m *manager) GetIdentity() cryptoChannel.Identity {
 // ExportPrivateIdentity encrypts and exports the private identity to a portable
 // string.
 func (m *manager) ExportPrivateIdentity(password string) ([]byte, error) {
+	jww.INFO.Printf("ExportPrivateIdentity()")
 	rng := m.rng.GetStream()
 	defer rng.Close()
 	return m.me.Export(password, rng)
diff --git a/channels/send.go b/channels/send.go
index 0f8cfd7d5e4bab5a355732bb80f6e908c79e8219..0e508d4cc6d6c952554d90849541ba6514f46463 100644
--- a/channels/send.go
+++ b/channels/send.go
@@ -9,6 +9,10 @@ package channels
 
 import (
 	"crypto/ed25519"
+	"encoding/base64"
+	"fmt"
+	"time"
+
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/cmix"
@@ -18,13 +22,16 @@ import (
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
 	"gitlab.com/xx_network/primitives/netTime"
+	"golang.org/x/crypto/blake2b"
 	"google.golang.org/protobuf/proto"
-	"time"
 )
 
 const (
 	cmixChannelTextVersion     = 0
 	cmixChannelReactionVersion = 0
+	SendMessageTag             = "ChMessage"
+	SendReplyTag               = "ChReply"
+	SendReactionTag            = "ChReaction"
 )
 
 // The size of the nonce used in the message ID.
@@ -40,13 +47,21 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
 	msg []byte, validUntil time.Duration, params cmix.CMIXParams) (
 	cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) {
 
+	// Note: We log sends on exit, and append what happened to the message
+	// this cuts down on clutter in the log.
+	sendPrint := fmt.Sprintf("[%s] Sending ch %s type %d at %s",
+		params.DebugTag, channelID, messageType,
+		netTime.Now())
+	defer jww.INFO.Println(sendPrint)
+
 	//find the channel
 	ch, err := m.getChannel(channelID)
 	if err != nil {
-		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
+		return cryptoChannel.MessageID{}, rounds.Round{},
+			ephemeral.Id{}, err
 	}
 
-	nickname, _ := m.nicknameManager.GetNickname(channelID)
+	nickname, _ := m.GetNickname(channelID)
 
 	var msgId cryptoChannel.MessageID
 
@@ -59,18 +74,25 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
 		LocalTimestamp: netTime.Now().UnixNano(),
 	}
 
-	// Generate random nonce to be used for message ID generation. This makes it
-	// so two identical messages sent on the same round have different message IDs
+	// Generate random nonce to be used for message ID
+	// generation. This makes it so two identical messages sent on
+	// the same round have different message IDs
 	rng := m.rng.GetStream()
 	n, err := rng.Read(chMsg.Nonce)
 	rng.Close()
 	if err != nil {
-		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{},
+		sendPrint += fmt.Sprintf(", failed to generate nonce: %+v", err)
+		return cryptoChannel.MessageID{}, rounds.Round{},
+			ephemeral.Id{},
 			errors.Errorf("Failed to generate nonce: %+v", err)
 	} else if n != messageNonceSize {
-		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{},
+		sendPrint += fmt.Sprintf(", got %d bytes for %d-byte nonce", n,
+			messageNonceSize)
+		return cryptoChannel.MessageID{}, rounds.Round{},
+			ephemeral.Id{},
 			errors.Errorf(
-				"Generated %d bytes for %-byte nonce", n, messageNonceSize)
+				"Generated %d bytes for %d-byte nonce", n,
+				messageNonceSize)
 	}
 
 	usrMsg := &UserMessage{
@@ -110,22 +132,38 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
 		return usrMsgSerial, nil
 	}
 
+	sendPrint += fmt.Sprintf(", pending send %s", netTime.Now())
 	uuid, err := m.st.denotePendingSend(channelID, &userMessageInternal{
 		userMessage:    usrMsg,
 		channelMessage: chMsg,
 		messageID:      msgId,
 	})
+	if err != nil {
+		sendPrint += fmt.Sprintf(", pending send failed %s",
+			err.Error())
+		return cryptoChannel.MessageID{}, rounds.Round{},
+			ephemeral.Id{}, err
+	}
 
+	sendPrint += fmt.Sprintf(", broadcasting message %s", netTime.Now())
 	r, ephid, err := ch.broadcast.BroadcastWithAssembler(assemble, params)
 	if err != nil {
+		sendPrint += fmt.Sprintf(", broadcast failed %s, %s",
+			netTime.Now(), err.Error())
 		errDenote := m.st.failedSend(uuid)
 		if errDenote != nil {
-			jww.ERROR.Printf("Failed to update for a failed send to "+
-				"%s: %+v", channelID, err)
+			sendPrint += fmt.Sprintf(", failed to denote failed "+
+				"broadcast: %s", err.Error())
 		}
-		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
+		return cryptoChannel.MessageID{}, rounds.Round{},
+			ephemeral.Id{}, err
 	}
+	sendPrint += fmt.Sprintf(", broadcast succeeded %s, success!",
+		netTime.Now())
 	err = m.st.send(uuid, msgId, r)
+	if err != nil {
+		sendPrint += fmt.Sprintf(", broadcast failed: %s ", err.Error())
+	}
 	return msgId, r, ephid, err
 }
 
@@ -136,8 +174,15 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
 // return an error. The message must be at most 510 bytes long.
 func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
 	messageType MessageType, msg []byte, validUntil time.Duration,
-	params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round, ephemeral.Id,
-	error) {
+	params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round,
+	ephemeral.Id, error) {
+
+	// Note: We log sends on exit, and append what happened to the message
+	// this cuts down on clutter in the log.
+	sendPrint := fmt.Sprintf("[%s] Admin sending ch %s type %d at %s",
+		params.DebugTag, channelID, messageType,
+		netTime.Now())
+	defer jww.INFO.Println(sendPrint)
 
 	//find the channel
 	ch, err := m.getChannel(channelID)
@@ -194,25 +239,34 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
 		return chMsgSerial, nil
 	}
 
+	sendPrint += fmt.Sprintf(", pending send %s", netTime.Now())
 	uuid, err := m.st.denotePendingAdminSend(channelID, chMsg)
 	if err != nil {
+		sendPrint += fmt.Sprintf(", pending send failed %s",
+			err.Error())
 		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
 	}
 
+	sendPrint += fmt.Sprintf(", broadcasting message %s", netTime.Now())
 	r, ephid, err := ch.broadcast.BroadcastRSAToPublicWithAssembler(privKey,
 		assemble, params)
 	if err != nil {
+		sendPrint += fmt.Sprintf(", broadcast failed %s, %s",
+			netTime.Now(), err.Error())
 		errDenote := m.st.failedSend(uuid)
 		if errDenote != nil {
+			sendPrint += fmt.Sprintf(", failed to denote failed "+
+				"broadcast: %s", err.Error())
 			jww.ERROR.Printf("Failed to update for a failed send to "+
 				"%s: %+v", channelID, err)
 		}
 		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
 	}
-
+	sendPrint += fmt.Sprintf(", broadcast succeeded %s, success!",
+		netTime.Now())
 	err = m.st.send(uuid, msgId, r)
 	if err != nil {
-		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
+		sendPrint += fmt.Sprintf(", broadcast failed: %s ", err.Error())
 	}
 	return msgId, r, ephid, err
 }
@@ -224,18 +278,24 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
 func (m *manager) SendMessage(channelID *id.ID, msg string,
 	validUntil time.Duration, params cmix.CMIXParams) (
 	cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) {
+	tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(msg), SendMessageTag)
+	jww.INFO.Printf("[%s]SendMessage(%s)", tag, channelID)
+
 	txt := &CMIXChannelText{
 		Version:        cmixChannelTextVersion,
 		Text:           msg,
 		ReplyMessageID: nil,
 	}
 
+	params = params.SetDebugTag(tag)
+
 	txtMarshaled, err := proto.Marshal(txt)
 	if err != nil {
 		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
 	}
 
-	return m.SendGeneric(channelID, Text, txtMarshaled, validUntil, params)
+	return m.SendGeneric(channelID, Text, txtMarshaled, validUntil,
+		params)
 }
 
 // SendReply is used to send a formatted message over a channel.
@@ -248,18 +308,23 @@ func (m *manager) SendReply(channelID *id.ID, msg string,
 	replyTo cryptoChannel.MessageID, validUntil time.Duration,
 	params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round,
 	ephemeral.Id, error) {
+	tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(msg), SendReplyTag)
+	jww.INFO.Printf("[%s]SendReply(%s, to %s)", tag, channelID, replyTo)
 	txt := &CMIXChannelText{
 		Version:        cmixChannelTextVersion,
 		Text:           msg,
 		ReplyMessageID: replyTo[:],
 	}
 
+	params = params.SetDebugTag(tag)
+
 	txtMarshaled, err := proto.Marshal(txt)
 	if err != nil {
 		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
 	}
 
-	return m.SendGeneric(channelID, Text, txtMarshaled, validUntil, params)
+	return m.SendGeneric(channelID, Text, txtMarshaled, validUntil,
+		params)
 }
 
 // SendReaction is used to send a reaction to a message over a channel.
@@ -269,6 +334,8 @@ func (m *manager) SendReply(channelID *id.ID, msg string,
 func (m *manager) SendReaction(channelID *id.ID, reaction string,
 	reactTo cryptoChannel.MessageID, params cmix.CMIXParams) (
 	cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) {
+	tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(reaction), SendReactionTag)
+	jww.INFO.Printf("[%s]SendReply(%s, to %s)", tag, channelID, reactTo)
 
 	if err := ValidateReaction(reaction); err != nil {
 		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
@@ -280,6 +347,8 @@ func (m *manager) SendReaction(channelID *id.ID, reaction string,
 		ReactionMessageID: reactTo[:],
 	}
 
+	params = params.SetDebugTag(tag)
+
 	reactMarshaled, err := proto.Marshal(react)
 	if err != nil {
 		return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
@@ -288,3 +357,18 @@ func (m *manager) SendReaction(channelID *id.ID, reaction string,
 	return m.SendGeneric(channelID, Reaction, reactMarshaled, ValidForever,
 		params)
 }
+
+// makeChaDebugTag is a debug helper that creates non-unique msg identifier
+// This is set as the debug tag on messages and enables some level
+// of tracing a message (if it's contents/chan/type are unique)
+func makeChaDebugTag(channelID *id.ID, id ed25519.PublicKey,
+	msg []byte, baseTag string) string {
+
+	h, _ := blake2b.New256(nil)
+	h.Write(channelID[:])
+	h.Write(msg)
+	h.Write(id)
+
+	tripcode := base64.RawStdEncoding.EncodeToString(h.Sum(nil))[:12]
+	return fmt.Sprintf("%s-%s", baseTag, tripcode)
+}
diff --git a/channels/send_test.go b/channels/send_test.go
index 6886519a42dbd95431dcb927ada369c46bb7c94a..7c3205115a1947cf3f5a20b81d79f794959d57dd 100644
--- a/channels/send_test.go
+++ b/channels/send_test.go
@@ -10,6 +10,11 @@ package channels
 import (
 	"bytes"
 	"crypto/ed25519"
+	"math/rand"
+	"sync"
+	"testing"
+	"time"
+
 	"github.com/golang/protobuf/proto"
 	"gitlab.com/elixxir/client/cmix/identity/receptionID"
 	"gitlab.com/elixxir/client/cmix/rounds"
@@ -20,10 +25,6 @@ import (
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/crypto/csprng"
 	"gitlab.com/xx_network/primitives/netTime"
-	"math/rand"
-	"sync"
-	"testing"
-	"time"
 
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
@@ -285,7 +286,8 @@ func TestAdminGeneric(t *testing.T) {
 	}
 
 	messageId, roundId, ephemeralId, err := m.SendAdminGeneric(priv,
-		ch.ReceptionID, messageType, msg, validUntil, cmix.GetDefaultCMIXParams())
+		ch.ReceptionID, messageType, msg, validUntil,
+		cmix.GetDefaultCMIXParams())
 	if err != nil {
 		t.Fatalf("Failed to SendAdminGeneric: %v", err)
 	}
diff --git a/cmix/follow.go b/cmix/follow.go
index 8e4dd03080c757aeca1d482d0e34660b65ab7924..051438d4f5e5456bce0f3338169ac855b99a3f29 100644
--- a/cmix/follow.go
+++ b/cmix/follow.go
@@ -115,7 +115,10 @@ func (c *client) followNetwork(report ClientErrorReport,
 				return nil
 			}
 
-			// get the list of identities to track
+			//denote the execution
+			atomic.AddUint64(c.tracker, 1)
+
+			// track the message on every identity
 			stream := c.rng.GetStream()
 			err := c.Tracker.ForEach(
 				int(c.param.MaxParallelIdentityTracks),
@@ -174,8 +177,6 @@ func (c *client) follow(identity receptionID.IdentityUse,
 		identity.ER = fakeEr
 	}
 
-	atomic.AddUint64(c.tracker, 1)
-
 	// Get client version for poll
 	version := c.session.GetClientVersion()
 
diff --git a/cmix/params.go b/cmix/params.go
index ff6418328203b2b728b62c0a96bf4101e9b6d686..3ef813f0d9ca6e7903696f83cb6fea72e62a7962 100644
--- a/cmix/params.go
+++ b/cmix/params.go
@@ -10,6 +10,7 @@ package cmix
 import (
 	"encoding/base64"
 	"encoding/json"
+	"fmt"
 	"time"
 
 	"gitlab.com/elixxir/client/cmix/message"
@@ -300,6 +301,18 @@ func (p *CMIXParams) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
+// SetDebugTag appends the debug tag if one already exists,
+// otherwise it just used the new debug tag
+func (p CMIXParams) SetDebugTag(newTag string) CMIXParams {
+	if p.DebugTag != DefaultDebugTag {
+		p.DebugTag = fmt.Sprintf("%s-%s", p.DebugTag, newTag)
+	} else {
+		p.DebugTag = newTag
+	}
+
+	return p
+}
+
 // NodeMap represents a map of nodes and whether they have been
 // blacklisted. This is designed for use with CMIXParams.BlacklistedNodes
 type NodeMap map[id.ID]bool
diff --git a/go.mod b/go.mod
index 84763a587f505360a7d5060638c6d864861a030d..13f55b334e9e8a2f31d1bcc842f14bc4140a548f 100644
--- a/go.mod
+++ b/go.mod
@@ -14,8 +14,8 @@ require (
 	github.com/spf13/viper v1.12.0
 	github.com/stretchr/testify v1.8.0
 	gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f
-	gitlab.com/elixxir/comms v0.0.4-0.20221024050701-bced94c1b026
-	gitlab.com/elixxir/crypto v0.0.7-0.20221024012326-cf941c375c1f
+	gitlab.com/elixxir/comms v0.0.4-0.20221024232930-61a6369c1f68
+	gitlab.com/elixxir/crypto v0.0.7-0.20221024215625-33315c3de43e
 	gitlab.com/elixxir/ekv v0.2.1
 	gitlab.com/elixxir/primitives v0.0.3-0.20221017172918-6176818d1aba
 	gitlab.com/xx_network/comms v0.0.4-0.20221017172508-09e33697dc15
diff --git a/go.sum b/go.sum
index 87c84117eb84016d562b5d837059578cec993216..31dcefda3e6f7209aa7a43976c0c2c65890427bd 100644
--- a/go.sum
+++ b/go.sum
@@ -643,6 +643,8 @@ gitlab.com/elixxir/comms v0.0.4-0.20221024012811-e6754f7740db h1:LQUde8pjIfQpVdg
 gitlab.com/elixxir/comms v0.0.4-0.20221024012811-e6754f7740db/go.mod h1:NevrBdsi5wJvitUeMsid3xI1FrzzuzfxKy4Bapnhzao=
 gitlab.com/elixxir/comms v0.0.4-0.20221024050701-bced94c1b026 h1:CdqvzyM91wN6u4MmGj0n+gKO/0tJabWPN3EQ4SFsZsg=
 gitlab.com/elixxir/comms v0.0.4-0.20221024050701-bced94c1b026/go.mod h1:NevrBdsi5wJvitUeMsid3xI1FrzzuzfxKy4Bapnhzao=
+gitlab.com/elixxir/comms v0.0.4-0.20221024232930-61a6369c1f68 h1:DKsCIo15pFed5QGVIw/sJ+5bwoR4Tyaq//hBiJUOWfs=
+gitlab.com/elixxir/comms v0.0.4-0.20221024232930-61a6369c1f68/go.mod h1:NevrBdsi5wJvitUeMsid3xI1FrzzuzfxKy4Bapnhzao=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c=
 gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/crypto v0.0.7-0.20221017173452-565da4101a3b/go.mod h1:1rftbwSVdy49LkBIkPr+w+P2mDOerYeBKoZuB3r0yqI=
@@ -650,6 +652,8 @@ gitlab.com/elixxir/crypto v0.0.7-0.20221022003355-d8a6158b32a7 h1:+8DHBxZxJcmJSm
 gitlab.com/elixxir/crypto v0.0.7-0.20221022003355-d8a6158b32a7/go.mod h1:P/S3pEPYl7fuHQ1m4mL2pIaCxAjYIXrJml/pnfofI+U=
 gitlab.com/elixxir/crypto v0.0.7-0.20221024012326-cf941c375c1f h1:ku5gWZnvgs8TPHfGIOfKO5QPnRJl5fsSAic5H1Y/QRg=
 gitlab.com/elixxir/crypto v0.0.7-0.20221024012326-cf941c375c1f/go.mod h1:P/S3pEPYl7fuHQ1m4mL2pIaCxAjYIXrJml/pnfofI+U=
+gitlab.com/elixxir/crypto v0.0.7-0.20221024215625-33315c3de43e h1:CIb5XdBTSUf9U/MDWv9DrjRicSYPDLudETMUkxzNVjQ=
+gitlab.com/elixxir/crypto v0.0.7-0.20221024215625-33315c3de43e/go.mod h1:P/S3pEPYl7fuHQ1m4mL2pIaCxAjYIXrJml/pnfofI+U=
 gitlab.com/elixxir/ekv v0.2.1 h1:dtwbt6KmAXG2Tik5d60iDz2fLhoFBgWwST03p7T+9Is=
 gitlab.com/elixxir/ekv v0.2.1/go.mod h1:USLD7xeDnuZEavygdrgzNEwZXeLQJK/w1a+htpN+JEU=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=