diff --git a/interfaces/params/E2E.go b/interfaces/params/E2E.go
index 5eda69cda9cddfb5ce2581bb552fc679a7bd006a..3e0aa95f80803aa138849101d6ae06b4559c20e8 100644
--- a/interfaces/params/E2E.go
+++ b/interfaces/params/E2E.go
@@ -14,13 +14,16 @@ import (
 )
 
 type E2E struct {
-	Type SendType
+	Type       SendType
+	RetryCount int
 	CMIX
 }
 
 func GetDefaultE2E() E2E {
-	return E2E{Type: Standard,
-		CMIX: GetDefaultCMIX(),
+	return E2E{
+		Type:       Standard,
+		CMIX:       GetDefaultCMIX(),
+		RetryCount: 10,
 	}
 }
 func (e E2E) Marshal() ([]byte, error) {
diff --git a/network/message/handler.go b/network/message/handler.go
index c47f9aea2ab6044df252d3eae488460b7f7b4ce2..b181c0596043f370157540a3c3bdae44d8927287 100644
--- a/network/message/handler.go
+++ b/network/message/handler.go
@@ -50,7 +50,7 @@ func (m *Manager) handleMessage(ecrMsg format.Message, identity reception.Identi
 	forMe, err := fingerprint2.CheckIdentityFP(ecrMsg.GetIdentityFP(),
 		ecrMsg.GetContents(), identity.Source)
 	if err != nil {
-		jww.FATAL.Panicf("Could not check IdentityFIngerprint: %+v", err)
+		jww.FATAL.Panicf("Could not check IdentityFingerprint: %+v", err)
 	}
 	if !forMe {
 		return
@@ -104,7 +104,7 @@ func (m *Manager) handleMessage(ecrMsg format.Message, identity reception.Identi
 		return
 	}
 
-	jww.INFO.Printf("Received message of type %s from %s," +
+	jww.INFO.Printf("Received message of type %s from %s,"+
 		" msgDigest: %s", encTy, sender, ecrMsg.Digest())
 
 	// Process the decrypted/unencrypted message partition, to see if
diff --git a/network/message/sendE2E.go b/network/message/sendE2E.go
index 15be25b2288d0bf16f77f59b15173c3b351e732b..4c4f2eab94f54b453c75f8ce6af936cd23d5a24f 100644
--- a/network/message/sendE2E.go
+++ b/network/message/sendE2E.go
@@ -9,6 +9,7 @@ package message
 
 import (
 	"github.com/pkg/errors"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/keyExchange"
@@ -17,7 +18,6 @@ import (
 	"gitlab.com/xx_network/primitives/id"
 	"sync"
 	"time"
-	jww "github.com/spf13/jwalterweatherman"
 )
 
 func (m *Manager) SendE2E(msg message.Send, param params.E2E) ([]id.Round, e2e.MessageID, error) {
@@ -51,7 +51,6 @@ func (m *Manager) SendE2E(msg message.Send, param params.E2E) ([]id.Round, e2e.M
 	jww.INFO.Printf("E2E sending %d messages to %s",
 		len(partitions), msg.Recipient)
 
-
 	for i, p := range partitions {
 		//create the cmix message
 		msgCmix := format.NewMessage(m.Session.Cmix().GetGroup().GetP().ByteLen())
@@ -59,6 +58,18 @@ func (m *Manager) SendE2E(msg message.Send, param params.E2E) ([]id.Round, e2e.M
 
 		//get a key to end to end encrypt
 		key, err := partner.GetKeyForSending(param.Type)
+		keyTries := 0
+		for err != nil && keyTries < param.RetryCount {
+			jww.WARN.Printf("Out of sending keys for %s "+
+				"(msgDigest: %s, partition: %d), this can "+
+				"happen when sending messages faster than "+
+				"the client can negotiate keys. Please "+
+				"adjust your e2e key parameters",
+				msg.Recipient, msgCmix.Digest(), i)
+			keyTries++
+			time.Sleep(param.RetryDelay)
+			key, err = partner.GetKeyForSending(param.Type)
+		}
 		if err != nil {
 			return nil, e2e.MessageID{}, errors.WithMessagef(err, "Failed to get key "+
 				"for end to end encryption")
@@ -96,7 +107,7 @@ func (m *Manager) SendE2E(msg message.Send, param params.E2E) ([]id.Round, e2e.M
 			numFail, len(partitions), msg.Recipient)
 		return nil, e2e.MessageID{}, errors.Errorf("Failed to E2E send %v/%v sub payloads:"+
 			" %s", numFail, len(partitions), errRtn)
-	}else{
+	} else {
 		jww.INFO.Printf("Sucesfully E2E sent %d/%d to %s",
 			numFail, len(partitions), msg.Recipient)
 	}