diff --git a/channels/sendTracker.go b/channels/sendTracker.go
index 437340a518d723591701fcf9296af96576b10c75..f75819fe2ccea74308cce60ee9087a3b1fc40320 100644
--- a/channels/sendTracker.go
+++ b/channels/sendTracker.go
@@ -47,12 +47,17 @@ type tracked struct {
 	UUID      uint64
 }
 
+type trackedList struct {
+	List           []*tracked
+	RoundCompleted bool
+}
+
 // the sendTracker tracks outbound messages and denotes when they are delivered
 // to the event model. It also captures incoming messages and in the event they
 // were sent by this user diverts them as status updates on the previously sent
 // messages
 type sendTracker struct {
-	byRound map[id.Round][]*tracked
+	byRound map[id.Round]trackedList
 
 	byMessageID map[cryptoChannel.MessageID]*tracked
 
@@ -82,7 +87,7 @@ func loadSendTracker(net Client, kv *versioned.KV, trigger triggerEventFunc,
 	adminTrigger triggerAdminEventFunc, updateStatus updateStatusFunc,
 	rngSource *fastRNG.StreamGenerator) *sendTracker {
 	st := &sendTracker{
-		byRound:      make(map[id.Round][]*tracked),
+		byRound:      make(map[id.Round]trackedList),
 		byMessageID:  make(map[cryptoChannel.MessageID]*tracked),
 		unsent:       make(map[uint64]*tracked),
 		trigger:      trigger,
@@ -112,7 +117,11 @@ func loadSendTracker(net Client, kv *versioned.KV, trigger triggerEventFunc,
 			return
 		}
 		net.RemoveHealthCallback(callBackID)
-		for rid := range st.byRound {
+		for rid, oldTracked := range st.byRound {
+
+			if oldTracked.RoundCompleted {
+				continue
+			}
 
 			rr := &roundResults{
 				round: rid,
@@ -178,7 +187,7 @@ func (st *sendTracker) load() error {
 	}
 
 	for rid := range st.byRound {
-		roundList := st.byRound[rid]
+		roundList := st.byRound[rid].List
 		for j := range roundList {
 			st.byMessageID[roundList[j].MsgID] = roundList[j]
 		}
@@ -338,7 +347,8 @@ func (st *sendTracker) handleSend(uuid uint64,
 
 	//add the roundID
 	roundsList, existsRound := st.byRound[round.ID]
-	st.byRound[round.ID] = append(roundsList, t)
+	roundsList.List = append(roundsList.List, t)
+	st.byRound[round.ID] = roundsList
 
 	//add the round
 	st.byMessageID[messageID] = t
@@ -408,16 +418,19 @@ func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID, round r
 	delete(st.byMessageID, messageID)
 
 	roundList := st.byRound[msgData.RoundID]
-	if len(roundList) == 1 {
+	if len(roundList.List) == 1 {
 		delete(st.byRound, msgData.RoundID)
 	} else {
-		newRoundList := make([]*tracked, 0, len(roundList)-1)
-		for i := range roundList {
-			if !roundList[i].MsgID.Equals(messageID) {
-				newRoundList = append(newRoundList, roundList[i])
+		newRoundList := make([]*tracked, 0, len(roundList.List)-1)
+		for i := range roundList.List {
+			if !roundList.List[i].MsgID.Equals(messageID) {
+				newRoundList = append(newRoundList, roundList.List[i])
 			}
 		}
-		st.byRound[msgData.RoundID] = newRoundList
+		st.byRound[msgData.RoundID] = trackedList{
+			List:           newRoundList,
+			RoundCompleted: roundList.RoundCompleted,
+		}
 	}
 
 	ts := mutateTimestamp(round.Timestamps[states.QUEUED], messageID)
@@ -474,12 +487,8 @@ func (rr *roundResults) callback(allRoundsSucceeded, timedOut bool, results map[
 
 	}
 
-	delete(rr.st.byRound, rr.round)
-
-	for i := range registered {
-		delete(rr.st.byMessageID, registered[i].MsgID)
-	}
-
+	registered.RoundCompleted = true
+	rr.st.byRound[rr.round] = registered
 	if err := rr.st.store(); err != nil {
 		jww.FATAL.Panicf("failed to store update after "+
 			"finalizing delivery of sent messages: %+v", err)
@@ -487,9 +496,9 @@ func (rr *roundResults) callback(allRoundsSucceeded, timedOut bool, results map[
 
 	rr.st.mux.Unlock()
 	if status == Failed {
-		for i := range registered {
+		for i := range registered.List {
 			round := results[rr.round].Round
-			go rr.st.updateStatus(registered[i].UUID, registered[i].MsgID, time.Time{},
+			go rr.st.updateStatus(registered.List[i].UUID, registered.List[i].MsgID, time.Time{},
 				round, Failed)
 		}
 	}
diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go
index c2062c6d8c514983b2ab8950fb7b7dc41567a0f6..6948df3beee69e5ffeed5a119bda3a9240972131 100644
--- a/channels/sendTracker_test.go
+++ b/channels/sendTracker_test.go
@@ -181,7 +181,7 @@ func TestSendTracker_failedSend(t *testing.T) {
 	if ok {
 		t.Fatal("Should not have found a tracked round")
 	}
-	if len(trackedRound) != 0 {
+	if len(trackedRound.List) != 0 {
 		t.Fatal("Did not find expected number of trackedRounds")
 	}
 
@@ -253,10 +253,10 @@ func TestSendTracker_send(t *testing.T) {
 	if !ok {
 		t.Fatal("Should have found a tracked round")
 	}
-	if len(trackedRound) != 1 {
+	if len(trackedRound.List) != 1 {
 		t.Fatal("Did not find expected number of trackedRounds")
 	}
-	if trackedRound[0].MsgID != mid {
+	if trackedRound.List[0].MsgID != mid {
 		t.Fatalf("Did not find expected message ID in trackedRounds")
 	}
 
@@ -279,7 +279,10 @@ func TestSendTracker_load_store(t *testing.T) {
 	cid := id.NewIdFromString("channel", id.User, t)
 	mid := cryptoChannel.MakeMessageID([]byte("hello"), cid)
 	rid := id.Round(2)
-	st.byRound[rid] = []*tracked{{MsgID: mid, ChannelID: cid, RoundID: rid}}
+	st.byRound[rid] = trackedList{
+		List:           []*tracked{{MsgID: mid, ChannelID: cid, RoundID: rid}},
+		RoundCompleted: false,
+	}
 	err := st.store()
 	if err != nil {
 		t.Fatalf("Failed to store byRound: %+v", err)
diff --git a/cmix/attempts/histrogram.go b/cmix/attempts/histrogram.go
new file mode 100644
index 0000000000000000000000000000000000000000..52bf207a48345818f0f1900d5c69b45e0259d7d8
--- /dev/null
+++ b/cmix/attempts/histrogram.go
@@ -0,0 +1,84 @@
+package attempts
+
+import (
+	"sort"
+	"sync"
+	"sync/atomic"
+)
+
+const maxHistogramSize = 100
+const minElements = 3
+const percentileNumerator = 66
+const percentileDenominator = 99
+const percentileDenominatorOffset = 49
+
+type SendAttemptTracker interface {
+	SubmitProbeAttempt(numAttemptsUntilSuccessful int)
+	GetOptimalNumAttempts() (attempts int, ready bool)
+}
+
+type sendAttempts struct {
+	lock         sync.Mutex
+	numAttempts  []int
+	currentIndex int
+	isFull       bool
+
+	optimalAttempts *int32
+}
+
+func NewSendAttempts() SendAttemptTracker {
+	optimalAttempts := int32(-1)
+
+	sa := &sendAttempts{
+		numAttempts:     make([]int, maxHistogramSize),
+		currentIndex:    0,
+		isFull:          false,
+		optimalAttempts: &optimalAttempts,
+	}
+	return sa
+}
+
+func (sa *sendAttempts) SubmitProbeAttempt(a int) {
+	sa.lock.Lock()
+	defer sa.lock.Unlock()
+
+	sa.numAttempts[sa.currentIndex] = a
+	sa.currentIndex += 1
+	if sa.currentIndex == len(sa.numAttempts) {
+		sa.currentIndex = 0
+		sa.isFull = true
+	}
+
+	sa.computeOptimalUnsafe()
+}
+
+func (sa *sendAttempts) GetOptimalNumAttempts() (attempts int, ready bool) {
+	optimalAttempts := atomic.LoadInt32(sa.optimalAttempts)
+
+	if optimalAttempts == -1 {
+		return 0, false
+	}
+
+	return int(optimalAttempts), true
+}
+
+func (sa *sendAttempts) computeOptimalUnsafe() {
+	toCopy := maxHistogramSize
+	if !sa.isFull {
+		if sa.currentIndex < minElements {
+			return
+		}
+		toCopy = sa.currentIndex
+
+	}
+
+	histoCopy := make([]int, toCopy)
+	copy(histoCopy, sa.numAttempts[:toCopy])
+
+	sort.Slice(histoCopy, func(i, j int) bool {
+		return histoCopy[i] < histoCopy[j]
+	})
+
+	optimal := histoCopy[((toCopy*percentileNumerator)+percentileDenominatorOffset)/percentileDenominator]
+	atomic.StoreInt32(sa.optimalAttempts, int32(optimal))
+}
diff --git a/cmix/client.go b/cmix/client.go
index 406fe0181350274152195b540978d73744f9a81b..bc7eaeaecc7a6a8fdb28f189e2d9ad9488870f2d 100644
--- a/cmix/client.go
+++ b/cmix/client.go
@@ -11,6 +11,7 @@ package cmix
 // and intra-client state are accessible through the context object.
 
 import (
+	"gitlab.com/elixxir/client/cmix/attempts"
 	"gitlab.com/elixxir/client/cmix/clockSkew"
 	"gitlab.com/xx_network/primitives/netTime"
 	"math"
@@ -74,7 +75,8 @@ type client struct {
 	address.Space
 	identity.Tracker
 	health.Monitor
-	crit *critical
+	crit           *critical
+	attemptTracker attempts.SendAttemptTracker
 
 	// Earliest tracked round
 	earliestRound *uint64
@@ -105,15 +107,16 @@ func NewClient(params Params, comms *commClient.Comms, session storage.Session,
 
 	// Create client object
 	c := &client{
-		param:         params,
-		tracker:       &tracker,
-		events:        events,
-		earliestRound: &earliest,
-		session:       session,
-		rng:           rng,
-		comms:         comms,
-		maxMsgLen:     tmpMsg.ContentsSize(),
-		skewTracker:   clockSkew.New(params.ClockSkewClamp),
+		param:          params,
+		tracker:        &tracker,
+		events:         events,
+		earliestRound:  &earliest,
+		session:        session,
+		rng:            rng,
+		comms:          comms,
+		maxMsgLen:      tmpMsg.ContentsSize(),
+		skewTracker:    clockSkew.New(params.ClockSkewClamp),
+		attemptTracker: attempts.NewSendAttempts(),
 	}
 
 	if params.VerboseRoundTracking {
@@ -201,7 +204,7 @@ func (c *client) initialize(ndf *ndf.NetworkDefinition) error {
 		}
 		r, eid, _, sendErr := sendCmixHelper(c.Sender, compiler, recipient, params, c.instance,
 			c.session.GetCmixGroup(), c.Registrar, c.rng, c.events,
-			c.session.GetTransmissionID(), c.comms)
+			c.session.GetTransmissionID(), c.comms, c.attemptTracker)
 		return r, eid, sendErr
 
 	}
diff --git a/cmix/gateway/defaults.go b/cmix/gateway/defaults.go
new file mode 100644
index 0000000000000000000000000000000000000000..9e19c49cf3577888da2c31daf5bed9d8eabf52fd
--- /dev/null
+++ b/cmix/gateway/defaults.go
@@ -0,0 +1,9 @@
+//go:build !js || !wasm
+// +build !js !wasm
+
+// This file is compiled for all architectures except WebAssembly.
+package gateway
+
+const (
+	MaxPoolSize = 20
+)
diff --git a/cmix/gateway/defaults_js.go b/cmix/gateway/defaults_js.go
new file mode 100644
index 0000000000000000000000000000000000000000..8eb93858dc95aefd6506ab7bed520f83ab274632
--- /dev/null
+++ b/cmix/gateway/defaults_js.go
@@ -0,0 +1,5 @@
+package gateway
+
+const (
+	MaxPoolSize = 7
+)
diff --git a/cmix/gateway/hostPool.go b/cmix/gateway/hostPool.go
index d39e71596ef644a444f5cd6056e97e9a10ea3f39..31f9ba3ca400705a2ddf82268bc6e0b5f4d1c266 100644
--- a/cmix/gateway/hostPool.go
+++ b/cmix/gateway/hostPool.go
@@ -128,7 +128,7 @@ type poolParamsDisk struct {
 // DefaultPoolParams returns a default set of PoolParams.
 func DefaultPoolParams() PoolParams {
 	p := PoolParams{
-		MaxPoolSize:     5,
+		MaxPoolSize:     MaxPoolSize,
 		ProxyAttempts:   5,
 		PoolSize:        0,
 		MaxPings:        0,
diff --git a/cmix/params.go b/cmix/params.go
index d933dbc9df696105de2cccc9aba8bae98f78625d..ff6418328203b2b728b62c0a96bf4101e9b6d686 100644
--- a/cmix/params.go
+++ b/cmix/params.go
@@ -219,6 +219,10 @@ type CMIXParams struct {
 	// should only be used in cases where repeats cannot be different. Only used
 	// in sendCmix, not sendManyCmix.
 	Critical bool
+
+	// Probe tells the client that this send can be used to test network performance,
+	// that outgoing latency is not important
+	Probe bool
 }
 
 // cMixParamsDisk will be the marshal-able and umarshal-able object.
@@ -241,7 +245,8 @@ func GetDefaultCMIXParams() CMIXParams {
 		DebugTag:    DefaultDebugTag,
 		// Unused stoppable so components that require one have a channel to
 		// wait on
-		Stop: stoppable.NewSingle("cmixParamsDefault"),
+		Stop:  stoppable.NewSingle("cmixParamsDefault"),
+		Probe: false,
 	}
 }
 
diff --git a/cmix/sendCmix.go b/cmix/sendCmix.go
index bc9891a4abfea507ebe4f18672fbd72ab8270a3c..7cb72ec57262a9e6a84e7e39b508b67e06543e4d 100644
--- a/cmix/sendCmix.go
+++ b/cmix/sendCmix.go
@@ -9,7 +9,9 @@ package cmix
 
 import (
 	"fmt"
+	"gitlab.com/elixxir/client/cmix/attempts"
 	"gitlab.com/elixxir/client/cmix/rounds"
+	"gitlab.com/elixxir/primitives/states"
 	"strings"
 	"time"
 
@@ -131,7 +133,7 @@ func (c *client) sendWithAssembler(recipient *id.ID, assembler MessageAssembler,
 
 	r, ephID, msg, rtnErr := sendCmixHelper(c.Sender, assemblerFunc, recipient, cmixParams,
 		c.instance, c.session.GetCmixGroup(), c.Registrar, c.rng, c.events,
-		c.session.GetTransmissionID(), c.comms)
+		c.session.GetTransmissionID(), c.comms, c.attemptTracker)
 
 	if cmixParams.Critical {
 		c.crit.handle(msg, recipient, r.ID, rtnErr)
@@ -153,7 +155,7 @@ func (c *client) sendWithAssembler(recipient *id.ID, assembler MessageAssembler,
 func sendCmixHelper(sender gateway.Sender, assembler messageAssembler, recipient *id.ID,
 	cmixParams CMIXParams, instance *network.Instance, grp *cyclic.Group,
 	nodes nodes.Registrar, rng *fastRNG.StreamGenerator, events event.Reporter,
-	senderId *id.ID, comms SendCmixCommsInterface) (rounds.Round, ephemeral.Id, format.Message, error) {
+	senderId *id.ID, comms SendCmixCommsInterface, attemptTracker attempts.SendAttemptTracker) (rounds.Round, ephemeral.Id, format.Message, error) {
 
 	if cmixParams.RoundTries == 0 {
 		return rounds.Round{}, ephemeral.Id{}, format.Message{},
@@ -171,14 +173,33 @@ func sendCmixHelper(sender gateway.Sender, assembler messageAssembler, recipient
 		attempted = excludedRounds.NewSet()
 	}
 
-	jww.INFO.Printf("[Send-%s] Looking for round to send cMix message to "+
-		"%s", cmixParams.DebugTag, recipient)
-
 	stream := rng.GetStream()
 	defer stream.Close()
 
-	for numRoundTries := uint(
-		0); numRoundTries < cmixParams.RoundTries; numRoundTries++ {
+	numAttempts := 0
+	if !cmixParams.Probe {
+		optimalAttempts, ready := attemptTracker.GetOptimalNumAttempts()
+		if ready {
+			numAttempts = optimalAttempts
+			jww.INFO.Printf("[Send-%s] Looking for round to send cMix message to "+
+				"%s, sending non probe with %d optimalAttempts", cmixParams.DebugTag, recipient, numAttempts)
+		} else {
+			numAttempts = 4
+			jww.INFO.Printf("[Send-%s] Looking for round to send cMix message to "+
+				"%s, sending non probe with %d non optimalAttempts, insufficient data",
+				cmixParams.DebugTag, recipient, numAttempts)
+		}
+	} else {
+		jww.INFO.Printf("[Send-%s] Looking for round to send cMix message to "+
+			"%s, sending probe with %d Attempts, insufficient data",
+			cmixParams.DebugTag, recipient, numAttempts)
+		defer attemptTracker.SubmitProbeAttempt(numAttempts)
+	}
+
+	jww.INFO.Printf("")
+
+	for numRoundTries := uint(0); numRoundTries < cmixParams.RoundTries; numRoundTries,
+		numAttempts = numRoundTries+1, numAttempts+1 {
 		elapsed := netTime.Since(timeStart)
 		jww.TRACE.Printf("[Send-%s] try %d, elapsed: %s",
 			cmixParams.DebugTag, numRoundTries, elapsed)
@@ -196,11 +217,12 @@ func sendCmixHelper(sender gateway.Sender, assembler messageAssembler, recipient
 				numRoundTries+1, recipient)
 		}
 
+		startSearch := netTime.Now()
 		// Find the best round to send to, excluding attempted rounds
 		remainingTime := cmixParams.Timeout - elapsed
 		waitingRounds := instance.GetWaitingRounds()
-		bestRound, err := waitingRounds.GetUpcomingRealtime(
-			remainingTime, attempted, sendTimeBuffer)
+		bestRound, _, err := waitingRounds.GetUpcomingRealtime(
+			remainingTime, attempted, numAttempts, sendTimeBuffer)
 		if err != nil {
 			jww.WARN.Printf("[Send-%s] failed to GetUpcomingRealtime: "+
 				"%+v", cmixParams.DebugTag, err)
@@ -213,8 +235,8 @@ func sendCmixHelper(sender gateway.Sender, assembler messageAssembler, recipient
 			continue
 		}
 
-		jww.TRACE.Printf("[Send-%s] Best round found: %+v",
-			cmixParams.DebugTag, bestRound)
+		jww.DEBUG.Printf("[Send-%s] Best round found, took %s: %d",
+			cmixParams.DebugTag, netTime.Since(startSearch), bestRound.ID)
 
 		// Determine whether the selected round contains any
 		// nodes that are blacklisted by the CMIXParams object
@@ -269,10 +291,13 @@ func sendCmixHelper(sender gateway.Sender, assembler messageAssembler, recipient
 			return rounds.Round{}, ephemeral.Id{}, format.Message{}, err
 		}
 
+		timeRoundStart := time.Unix(0, int64(bestRound.Timestamps[states.QUEUED]))
+
 		jww.INFO.Printf("[Send-%s] Sending to EphID %d (%s), on round %d "+
-			"(msgDigest: %s, ecrMsgDigest: %s) via gateway %s",
-			cmixParams.DebugTag, ephID.Int64(), recipient, bestRound.ID,
-			msg.Digest(), encMsg.Digest(), firstGateway.String())
+			"(msgDigest: %s, ecrMsgDigest: %s) via gateway %s starting "+
+			"at %s (%s in the future)", cmixParams.DebugTag, ephID.Int64(),
+			recipient, bestRound.ID, msg.Digest(), encMsg.Digest(),
+			firstGateway.String(), timeRoundStart, netTime.Until(timeRoundStart))
 
 		// Send the payload
 		sendFunc := func(host *connect.Host, target *id.ID,
diff --git a/cmix/sendCmixUtils.go b/cmix/sendCmixUtils.go
index 146e63117d5cde18c1ee8d9dc794156eded72ad1..e2d8ea178920d52c3fd3dcfbd78b4386896d5b75 100644
--- a/cmix/sendCmixUtils.go
+++ b/cmix/sendCmixUtils.go
@@ -41,7 +41,7 @@ type SendCmixCommsInterface interface {
 }
 
 // How much in the future a round needs to be to send to it
-const sendTimeBuffer = 1000 * time.Millisecond
+const sendTimeBuffer = 150 * time.Millisecond
 const unrecoverableError = "failed with an unrecoverable error"
 
 // handlePutMessageError handles errors received from a PutMessage or a
diff --git a/cmix/sendManyCmix.go b/cmix/sendManyCmix.go
index b9700c0d813a15754713a322b96422e484c24f3e..aaca9e031bb04ceb9f8e62509ac76470f1b00128 100644
--- a/cmix/sendManyCmix.go
+++ b/cmix/sendManyCmix.go
@@ -161,8 +161,8 @@ func sendManyCmixHelper(sender gateway.Sender,
 		remainingTime := param.Timeout - elapsed
 
 		// Find the best round to send to, excluding attempted rounds
-		bestRound, _ := instance.GetWaitingRounds().GetUpcomingRealtime(
-			remainingTime, attempted, sendTimeBuffer)
+		bestRound, _, _ := instance.GetWaitingRounds().GetUpcomingRealtime(
+			remainingTime, attempted, int(numRoundTries), sendTimeBuffer)
 		if bestRound == nil {
 			continue
 		}
diff --git a/dummy/mockCmix_test.go b/dummy/mockCmix_test.go
index 96bab83384e0d57d84d50c5cac95ce71bc9fb7df..2aca679d0702225c69d01e7449c028ddd57cd7ee 100644
--- a/dummy/mockCmix_test.go
+++ b/dummy/mockCmix_test.go
@@ -78,8 +78,7 @@ func (m mockCmix) Follow(report cmix.ClientErrorReport) (stoppable.Stoppable, er
 }
 
 func (m mockCmix) GetMaxMessageLength() int {
-	//TODO implement me
-	panic("implement me")
+	return 100
 }
 
 func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) {
diff --git a/dummy/random.go b/dummy/random.go
index 2a41d8243decc43ae56ae93068c5106a8f9371e7..2f1abc73ec290ead86c142f527e85e8db176a136 100644
--- a/dummy/random.go
+++ b/dummy/random.go
@@ -49,7 +49,7 @@ func (m *Manager) newRandomCmixMessage(rng csprng.Source) (
 	}
 
 	// Generate random message payload
-	payloadSize := m.store.GetCmixGroup().GetP().ByteLen()
+	payloadSize := m.net.GetMaxMessageLength()
 	payload, err = newRandomPayload(payloadSize, rng)
 	if err != nil {
 		return nil, format.Fingerprint{}, message.Service{}, nil, nil,
@@ -79,13 +79,8 @@ func (m *Manager) newRandomCmixMessage(rng csprng.Source) (
 // newRandomPayload generates a random payload of a random length
 // within the maxPayloadSize.
 func newRandomPayload(maxPayloadSize int, rng csprng.Source) ([]byte, error) {
-	// Generate random payload size
-	randomPayloadSize, err := randomInt(maxPayloadSize, rng)
-	if err != nil {
-		return nil, errors.Errorf(payloadSizeRngErr, err)
-	}
 
-	randomMsg, err := csprng.Generate(randomPayloadSize, rng)
+	randomMsg, err := csprng.Generate(maxPayloadSize, rng)
 	if err != nil {
 		return nil, err
 	}
diff --git a/dummy/random_test.go b/dummy/random_test.go
index fab84c22fc0e552931026ec0f27cc0c07e511b32..a4336983df79a8a33e3f95e56763d85728962d6c 100644
--- a/dummy/random_test.go
+++ b/dummy/random_test.go
@@ -75,16 +75,16 @@ func Test_durationRng_Consistency(t *testing.T) {
 // when using a PRNG and that the result is not larger than the max payload.
 func Test_newRandomPayload_Consistency(t *testing.T) {
 	expectedPayloads := []string{
-		"l7ufS7Ry6J9bFITyUgnJ",
-		"Ut/Xm012Qpthegyfnw07pVsMwNYUTIiFNQ==",
-		"CD9h",
-		"GSnh",
-		"joE=",
-		"uoQ+6NY+jE/+HOvqVG2PrBPdGqwEzi6ih3xVec+ix44bC6+uiBuCpw==",
-		"qkNGWnhiBhaXiu0M48bE8657w+BJW1cS/v2+DBAoh+EA2s0tiF9pLLYH2gChHBxwcec=",
-		"suEpcF4nPwXJIyaCjisFbg==",
-		"R/3zREEO1MEWAj+o41drb+0n/4l0usDK/ZrQVpKxNhnnOJZN/ceejVNDc2Yc/WbXTw==",
-		"bkt1IQ==",
+		"U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVLf15tNdkKbYXoMn58NO6VbDMDWFEyIhTWEGsvgcJsHWA==",
+		"CD9h03W8ArQd9PkZKeGP2p5vguVOdI6B555LvW/jTNy6hD7o1j6MT/4c6+pUbY+sE90arATOLqKHfFV5z6LHjg==",
+		"GwuvrogbgqdREIpC7TyQPKpDRlp4YgYWl4rtDOPGxPOue8PgSVtXEv79vgwQKIfhANrNLYhfaSy2B9oAoRwccA==",
+		"ceeWotwtwlpbdLLhKXBeJz8FySMmgo4rBW44F2WOEGFJiUf980RBDtTBFgI/qONXa2/tJ/+JdLrAyv2a0FaSsQ==",
+		"NhnnOJZN/ceejVNDc2Yc/WbXT+weG4lJGrcjbkt1IWKQzyvrQsPKJzKFYPGqwGfOpui/RtSrK0aAQCxfsoIOiA==",
+		"XTJg8d6XgoPUoJo2+WwglBdG4+1NpkaprotPp7T8OiC6+hp17TJ6hriww5rxz9KztRIZ6nlTOr9EjSxHnTJgdQ==",
+		"M5BZFMjMHPCdo54Okp0CSry8sWk5e7c05+8KbgHxhU3rX+Qk/vesIQiR9ZdeKSqiuKoEfGHNszNz6+csJ6CYwA==",
+		"IZfa5rcyw1HfZo+HTiyfHOCcqGAX5+IXSDA/9BwbI+EcSO0XU51oX3byp5i8ZN4OXbKGSyrTwmzmOCNCdloT1g==",
+		"luUt92D2w0ZeKaDcpGrDoNVwEzvCFXH19UpkMQVRP9hCmxlK4bqfKoOGrnKzZh/oLCrGTb9GFRgk4jBTEmN8mQ==",
+		"wrh9bfDdXvKDZxkHLWcvYfqgvob0V5Iew3wORgzw1wPQfcX1ZhpFATNAmnEramar17plIkyiaXjZpc5i/rEagw==",
 	}
 
 	prng := NewPrng(42)
diff --git a/dummy/send.go b/dummy/send.go
index ac6b39796add64bbfed8be9ed8c3e3f8687904f8..77b0f4e7de569e36b985c60521c6083b40006ee3 100644
--- a/dummy/send.go
+++ b/dummy/send.go
@@ -125,6 +125,7 @@ func (m *Manager) sendMessage(index, totalMessages int, rng csprng.Source) error
 
 	// Send message
 	p := cmix.GetDefaultCMIXParams()
+	p.Probe = true
 	_, _, err = m.net.Send(recipient, fp, service, payload, mac, p)
 	if err != nil {
 		return errors.Errorf("Failed to send message: %+v", err)
diff --git a/go.mod b/go.mod
index 93c725381b1893a1929c179ade479613ecb73dce..84763a587f505360a7d5060638c6d864861a030d 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.20221017173926-4eaa6061dfaa
-	gitlab.com/elixxir/crypto v0.0.7-0.20221022003355-d8a6158b32a7
+	gitlab.com/elixxir/comms v0.0.4-0.20221024050701-bced94c1b026
+	gitlab.com/elixxir/crypto v0.0.7-0.20221024012326-cf941c375c1f
 	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 8514c15d109db684ab1bd8a4a276ef897135b40d..87c84117eb84016d562b5d837059578cec993216 100644
--- a/go.sum
+++ b/go.sum
@@ -633,11 +633,23 @@ gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f h1:yXGvNBqzZwA
 gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k=
 gitlab.com/elixxir/comms v0.0.4-0.20221017173926-4eaa6061dfaa h1:/FEpu0N0rAyq74FkvO3uY8BcQoWLSbVPhj/s5QfscZw=
 gitlab.com/elixxir/comms v0.0.4-0.20221017173926-4eaa6061dfaa/go.mod h1:rW7xdbHntP2MoF3q+2+f+IR8OHol94MRyviotfR5rXg=
+gitlab.com/elixxir/comms v0.0.4-0.20221021234520-a4f94f752e3e h1:Go3Ec+LOm8t6j8wVgI4GqTfuy+PQkyblZCYQU7yGB2E=
+gitlab.com/elixxir/comms v0.0.4-0.20221021234520-a4f94f752e3e/go.mod h1:rW7xdbHntP2MoF3q+2+f+IR8OHol94MRyviotfR5rXg=
+gitlab.com/elixxir/comms v0.0.4-0.20221023173239-c75420d94293 h1:QIiZYjdtwjBCYaO7dZI6K8cEaA73wtd/YKIWD1oeDWw=
+gitlab.com/elixxir/comms v0.0.4-0.20221023173239-c75420d94293/go.mod h1:rW7xdbHntP2MoF3q+2+f+IR8OHol94MRyviotfR5rXg=
+gitlab.com/elixxir/comms v0.0.4-0.20221023190124-3441c3fdc3de h1:1YnKkJn3a7xiftFBRqLK5os7C6uF4okMtDXZyLrzIuY=
+gitlab.com/elixxir/comms v0.0.4-0.20221023190124-3441c3fdc3de/go.mod h1:rW7xdbHntP2MoF3q+2+f+IR8OHol94MRyviotfR5rXg=
+gitlab.com/elixxir/comms v0.0.4-0.20221024012811-e6754f7740db h1:LQUde8pjIfQpVdg7trANu6o5uzZv9ADK13S8bkMgkBw=
+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/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=
 gitlab.com/elixxir/crypto v0.0.7-0.20221022003355-d8a6158b32a7 h1:+8DHBxZxJcmJSmcUFK4ZjjXgwV3wSo9O4+4NCaLdO4c=
 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/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=