diff --git a/groupChat/e2eManager_test.go b/groupChat/e2eManager_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..cc66b2b7dfd6e0c6b4d489fd4a710974250ddd57
--- /dev/null
+++ b/groupChat/e2eManager_test.go
@@ -0,0 +1,191 @@
+package groupChat
+
+import (
+	"github.com/cloudflare/circl/dh/sidh"
+	"github.com/pkg/errors"
+	"gitlab.com/elixxir/client/catalog"
+	"gitlab.com/elixxir/client/cmix/message"
+	clientE2E "gitlab.com/elixxir/client/e2e"
+	"gitlab.com/elixxir/client/e2e/ratchet/partner"
+	sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session"
+	"gitlab.com/elixxir/client/e2e/receive"
+	"gitlab.com/elixxir/client/stoppable"
+	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/crypto/e2e"
+	"gitlab.com/xx_network/primitives/id"
+	"sync"
+	"testing"
+	"time"
+)
+
+// testE2eManager is a test implementation of NetworkManager interface.
+type testE2eManager struct {
+	e2eMessages []testE2eMessage
+	partners    map[id.ID]partner.Manager
+	errSkip     int
+	sendErr     int
+	dhPubKey    *cyclic.Int
+	grp         *cyclic.Group
+	sync.RWMutex
+}
+
+type testE2eMessage struct {
+	Recipient *id.ID
+	Payload   []byte
+}
+
+func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey,
+	myPrivKey *cyclic.Int, _ *sidh.PublicKey, _ *sidh.PrivateKey,
+	_, _ sessionImport.Params) (partner.Manager, error) {
+
+	testPartner := partner.NewTestManager(partnerID, partnerPubKey, myPrivKey, &testing.T{})
+	tnm.partners[*partnerID] = testPartner
+	return testPartner, nil
+}
+
+func (tnm *testE2eManager) GetPartner(partnerID *id.ID) (partner.Manager, error) {
+	if p, ok := tnm.partners[*partnerID]; ok {
+		return p, nil
+	}
+	return nil, errors.New("Unable to find partner")
+}
+
+func (tnm *testE2eManager) GetHistoricalDHPubkey() *cyclic.Int {
+	return tnm.dhPubKey
+}
+
+func (tnm *testE2eManager) GetHistoricalDHPrivkey() *cyclic.Int {
+	return tnm.dhPubKey
+}
+
+func (tnm *testE2eManager) GetE2eMsg(i int) testE2eMessage {
+	tnm.RLock()
+	defer tnm.RUnlock()
+	return tnm.e2eMessages[i]
+}
+
+func (tnm *testE2eManager) SendE2E(_ catalog.MessageType, recipient *id.ID,
+	payload []byte, _ clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time,
+	error) {
+	tnm.Lock()
+	defer tnm.Unlock()
+
+	tnm.errSkip++
+	if tnm.sendErr == 1 {
+		return nil, e2e.MessageID{}, time.Time{}, errors.New("SendE2E error")
+	} else if tnm.sendErr == 2 && tnm.errSkip%2 == 0 {
+		return nil, e2e.MessageID{}, time.Time{}, errors.New("SendE2E error")
+	}
+
+	tnm.e2eMessages = append(tnm.e2eMessages, testE2eMessage{
+		Recipient: recipient,
+		Payload:   payload,
+	})
+
+	return []id.Round{0, 1, 2, 3}, e2e.MessageID{}, time.Time{}, nil
+}
+
+func (*testE2eManager) RegisterListener(*id.ID, catalog.MessageType, receive.Listener) receive.ListenerID {
+	return receive.ListenerID{}
+}
+
+func (*testE2eManager) AddService(string, message.Processor) error {
+	return nil
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+// Unused & unimplemented methods of the test object ////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////
+
+func (*testE2eManager) GetDefaultHistoricalDHPubkey() *cyclic.Int {
+	panic("implement me")
+}
+
+func (*testE2eManager) GetDefaultHistoricalDHPrivkey() *cyclic.Int {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) StartProcesses() (stoppable.Stoppable, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) RegisterFunc(name string, senderID *id.ID, messageType catalog.MessageType, newListener receive.ListenerFunc) receive.ListenerID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) RegisterChannel(name string, senderID *id.ID, messageType catalog.MessageType, newListener chan receive.Message) receive.ListenerID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) Unregister(listenerID receive.ListenerID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) UnregisterUserListeners(userID *id.ID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) DeletePartner(partnerId *id.ID) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetAllPartnerIDs() []*id.ID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) HasAuthenticatedChannel(partner *id.ID) bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) RemoveService(tag string) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) SendUnsafe(mt catalog.MessageType, recipient *id.ID, payload []byte, params clientE2E.Params) ([]id.Round, time.Time, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) EnableUnsafeReception() {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetGroup() *cyclic.Group {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetReceptionID() *id.ID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) FirstPartitionSize() uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) SecondPartitionSize() uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) PartitionSize(payloadIndex uint) uint {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) PayloadSize() uint {
+	//TODO implement me
+	panic("implement me")
+}
diff --git a/groupChat/interface.go b/groupChat/interface.go
index 68c9d209ece228c7e979cc15397e86a9a2818d1e..967f98ebe6eccda4ada8ee291b41691f239b6d66 100644
--- a/groupChat/interface.go
+++ b/groupChat/interface.go
@@ -29,7 +29,7 @@ import (
 	sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session"
 	"gitlab.com/elixxir/client/e2e/receive"
 	gs "gitlab.com/elixxir/client/groupChat/groupStore"
-	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/client/storage"
 	"gitlab.com/elixxir/client/xxdk"
 	"gitlab.com/elixxir/crypto/cyclic"
 	crypto "gitlab.com/elixxir/crypto/e2e"
@@ -100,6 +100,16 @@ type ReceiveCallback func(msg MessageReceive)
 // Sub-interfaces from other packages //////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////
 
+// messenger is a sub-interface mocking the xxdk.E2e object.
+// This contains methods specific for this package.
+type messenger interface {
+	GetCmix() cmix.Client
+	GetE2E() e2e.Handler
+	GetReceptionIdentity() xxdk.ReceptionIdentity
+	GetRng() *fastRNG.StreamGenerator
+	GetStorage() storage.Session
+}
+
 // groupCmix is a subset of the cmix.Client interface containing only the
 // methods needed by GroupChat
 type groupCmix interface {
@@ -127,20 +137,3 @@ type e2eHandler interface {
 	GetHistoricalDHPubkey() *cyclic.Int
 	GetHistoricalDHPrivkey() *cyclic.Int
 }
-
-// messenger is a sub-interface mocking the xxdk.E2e object.
-// This contains methods specific for this package.
-type messenger interface {
-	GetCmix() groupCmix
-	GetE2E() e2eHandler
-	GetReceptionIdentity() xxdk.ReceptionIdentity
-	GetRng() *fastRNG.StreamGenerator
-	GetStorage() session
-}
-
-// session is a sub-interface of the storage.Session interface.
-// This contains the methods specific for this package.
-type session interface {
-	GetE2EGroup() *cyclic.Group
-	GetKV() *versioned.KV
-}
diff --git a/groupChat/messenger_test.go b/groupChat/messenger_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..7cc66585b05a8262a0454ef59e27439dbef5b6df
--- /dev/null
+++ b/groupChat/messenger_test.go
@@ -0,0 +1,95 @@
+package groupChat
+
+import (
+	"gitlab.com/elixxir/client/cmix"
+	clientE2E "gitlab.com/elixxir/client/e2e"
+	"gitlab.com/elixxir/client/e2e/ratchet/partner"
+	"gitlab.com/elixxir/client/storage"
+	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/client/xxdk"
+	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/crypto/fastRNG"
+	"gitlab.com/xx_network/crypto/csprng"
+	"gitlab.com/xx_network/primitives/id"
+	"math/rand"
+	"testing"
+)
+
+// mockMessenger implementation for messenger interface
+type mockMessenger struct {
+	receptionId *id.ID
+	net         cmix.Client
+	e2e         clientE2E.Handler
+	e2eGroup    *cyclic.Group
+	rng         *fastRNG.StreamGenerator
+	storage     storage.Session
+}
+
+func newMockMessenger(t testing.TB, kv *versioned.KV) messenger {
+	receptionId := id.NewIdFromString("test", id.User, t)
+	mockCmix := newTestNetworkManager(0)
+	prng := rand.New(rand.NewSource(42))
+	e2eHandler := newTestE2eManager(randCycInt(prng), t)
+	grp := getGroup()
+	rng := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
+	mockSession := newMockSesion(kv)
+
+	return mockMessenger{
+		receptionId: receptionId,
+		net:         mockCmix,
+		e2e:         e2eHandler,
+		e2eGroup:    grp,
+		rng:         rng,
+		storage:     mockSession,
+	}
+}
+
+func newMockMessengerWithStore(t testing.TB, sendErr int) messenger {
+	receptionId := id.NewIdFromString("test", id.User, t)
+	mockCmix := newTestNetworkManager(sendErr)
+	prng := rand.New(rand.NewSource(42))
+	grp := getGroup()
+	rng := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
+	mockSession := newMockSesion(nil)
+
+	return mockMessenger{
+		receptionId: receptionId,
+		net:         mockCmix,
+		e2e: &testE2eManager{
+			e2eMessages: []testE2eMessage{},
+			sendErr:     sendErr,
+			grp:         getGroup(),
+			dhPubKey:    randCycInt(prng),
+			partners:    make(map[id.ID]partner.Manager),
+		},
+		e2eGroup: grp,
+		rng:      rng,
+		storage:  mockSession,
+	}
+}
+
+func (m mockMessenger) GetCmix() cmix.Client {
+	return m.net
+}
+
+func (m mockMessenger) GetE2E() clientE2E.Handler {
+	return m.e2e
+}
+
+func (m mockMessenger) GetReceptionIdentity() xxdk.ReceptionIdentity {
+	keyData, _ := m.e2e.GetHistoricalDHPrivkey().MarshalJSON()
+	groupData, _ := getGroup().MarshalJSON()
+	return xxdk.ReceptionIdentity{
+		ID:           m.receptionId,
+		DHKeyPrivate: keyData,
+		E2eGrp:       groupData,
+	}
+}
+
+func (m mockMessenger) GetRng() *fastRNG.StreamGenerator {
+	return m.rng
+}
+
+func (m mockMessenger) GetStorage() storage.Session {
+	return m.storage
+}
diff --git a/groupChat/networkManager_test.go b/groupChat/networkManager_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..a6df5a6427d976a21a652d89db81e8941348f34e
--- /dev/null
+++ b/groupChat/networkManager_test.go
@@ -0,0 +1,216 @@
+package groupChat
+
+import (
+	"github.com/pkg/errors"
+	"gitlab.com/elixxir/client/cmix"
+	"gitlab.com/elixxir/client/cmix/gateway"
+	"gitlab.com/elixxir/client/cmix/identity"
+	"gitlab.com/elixxir/client/cmix/message"
+	"gitlab.com/elixxir/client/cmix/rounds"
+	"gitlab.com/elixxir/client/stoppable"
+	"gitlab.com/elixxir/comms/network"
+	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/primitives/format"
+	"gitlab.com/xx_network/comms/connect"
+	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/xx_network/primitives/id/ephemeral"
+	"sync"
+	"time"
+)
+
+// testNetworkManager is a test implementation of NetworkManager interface.
+type testNetworkManager struct {
+	receptionMessages [][]format.Message
+	sendMessages      [][]cmix.TargetedCmixMessage
+	errSkip           int
+	sendErr           int
+	grp               *cyclic.Group
+	sync.RWMutex
+}
+
+func newTestNetworkManager(sendErr int) cmix.Client {
+	return &testNetworkManager{
+		receptionMessages: [][]format.Message{},
+		sendMessages:      [][]cmix.TargetedCmixMessage{},
+		grp:               getGroup(),
+		sendErr:           sendErr,
+	}
+}
+
+func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) {
+	if tnm.sendErr == 1 {
+		return 0, nil, errors.New("SendManyCMIX error")
+	}
+
+	tnm.Lock()
+	defer tnm.Unlock()
+
+	tnm.sendMessages = append(tnm.sendMessages, messages)
+
+	var receiveMessages []format.Message
+	for _, msg := range messages {
+		receiveMsg := format.NewMessage(tnm.grp.GetP().ByteLen())
+		receiveMsg.SetMac(msg.Mac)
+		receiveMsg.SetContents(msg.Payload)
+		receiveMsg.SetKeyFP(msg.Fingerprint)
+		receiveMessages = append(receiveMessages, receiveMsg)
+	}
+	tnm.receptionMessages = append(tnm.receptionMessages, receiveMessages)
+	return 0, nil, nil
+}
+
+func (*testNetworkManager) AddService(*id.ID, message.Service, message.Processor)    {}
+func (*testNetworkManager) DeleteService(*id.ID, message.Service, message.Processor) {}
+
+/////////////////////////////////////////////////////////////////////////////////////
+// Unused & unimplemented methods of the test object ////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////
+
+func (tnm *testNetworkManager) Follow(report cmix.ClientErrorReport) (stoppable.Stoppable, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) Send(recipient *id.ID, fingerprint format.Fingerprint, service message.Service, payload, mac []byte, cmixParams cmix.CMIXParams) (id.Round, ephemeral.Id, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) RemoveIdentity(id *id.ID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetIdentity(get *id.ID) (identity.TrackedID, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint, mp message.Processor) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) DeleteFingerprint(identity *id.ID, fingerprint format.Fingerprint) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) DeleteClientFingerprints(identity *id.ID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) DeleteClientService(clientID *id.ID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) TrackServices(tracker message.ServicesTracker) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) CheckInProgressMessages() {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) IsHealthy() bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) WasHealthy() bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) AddHealthCallback(f func(bool)) uint64 {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) RemoveHealthCallback(u uint64) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) HasNode(nid *id.ID) bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) NumRegisteredNodes() int {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) TriggerNodeRegistration(nid *id.ID) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetRoundResults(timeout time.Duration, roundCallback cmix.RoundEventCallback, roundList ...id.Round) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) LookupHistoricalRound(rid id.Round, callback rounds.RoundResultCallback) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) SendToAny(sendFunc func(host *connect.Host) (interface{}, error), stop *stoppable.Single) (interface{}, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) SendToPreferred(targets []*id.ID, sendFunc gateway.SendToPreferredFunc, stop *stoppable.Single, timeout time.Duration) (interface{}, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) SetGatewayFilter(f gateway.Filter) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetHostParams() connect.HostParams {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetAddressSpace() uint8 {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) RegisterAddressSpaceNotification(tag string) (chan uint8, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) UnregisterAddressSpaceNotification(tag string) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetInstance() *network.Instance {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetVerboseRounds() string {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetMaxMessageLength() int {
+	return format.NewMessage(tnm.grp.GetP().ByteLen()).ContentsSize()
+}
diff --git a/groupChat/session_test.go b/groupChat/session_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..15877e7af4c0afcb9a7b8276810ebdd21b91eb26
--- /dev/null
+++ b/groupChat/session_test.go
@@ -0,0 +1,174 @@
+package groupChat
+
+import (
+	"gitlab.com/elixxir/client/storage"
+	"gitlab.com/elixxir/client/storage/user"
+	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/crypto/cyclic"
+	"gitlab.com/elixxir/ekv"
+	"gitlab.com/elixxir/primitives/version"
+	"gitlab.com/xx_network/crypto/signature/rsa"
+	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/xx_network/primitives/ndf"
+	"time"
+)
+
+// mockSession is a storage.Session implementation for testing.
+type mockSession struct {
+	kv *versioned.KV
+}
+
+func newMockSesion(kv *versioned.KV) storage.Session {
+	return mockSession{kv: kv}
+}
+
+func (m mockSession) GetE2EGroup() *cyclic.Group {
+	return getGroup()
+}
+
+func (m mockSession) GetKV() *versioned.KV {
+	if m.kv != nil {
+		return m.kv
+	}
+
+	return versioned.NewKV(ekv.MakeMemstore())
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+// Unused & unimplemented methods of the test object ////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////
+
+func (m mockSession) GetClientVersion() version.Version {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) Get(key string) (*versioned.Object, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) Set(key string, object *versioned.Object) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) Delete(key string) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetCmixGroup() *cyclic.Group {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) ForwardRegistrationStatus(regStatus storage.RegistrationStatus) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetRegistrationStatus() storage.RegistrationStatus {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) SetRegCode(regCode string) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetRegCode() (string, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) SetNDF(def *ndf.NetworkDefinition) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetNDF() *ndf.NetworkDefinition {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetTransmissionID() *id.ID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetTransmissionSalt() []byte {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetReceptionID() *id.ID {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetReceptionSalt() []byte {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetReceptionRSA() *rsa.PrivateKey {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetTransmissionRSA() *rsa.PrivateKey {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) IsPrecanned() bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) SetUsername(username string) error {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetUsername() (string, error) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) PortableUserInfo() user.Info {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetTransmissionRegistrationValidationSignature() []byte {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetReceptionRegistrationValidationSignature() []byte {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) GetRegistrationTimestamp() time.Time {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) SetTransmissionRegistrationValidationSignature(b []byte) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) SetReceptionRegistrationValidationSignature(b []byte) {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (m mockSession) SetRegistrationTimestamp(tsNano int64) {
+	//TODO implement me
+	panic("implement me")
+}
diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go
index 04d1760e8e4023d36d1e9b28ab4fd94d48c51d25..8e833258023bd68dce01316cd58ca0f7a1e05165 100644
--- a/groupChat/utils_test.go
+++ b/groupChat/utils_test.go
@@ -9,24 +9,7 @@ package groupChat
 
 import (
 	"encoding/base64"
-	"gitlab.com/elixxir/client/xxdk"
-	"gitlab.com/elixxir/crypto/e2e"
-	"gitlab.com/elixxir/crypto/fastRNG"
-	"gitlab.com/xx_network/crypto/csprng"
-	"math/rand"
-	"sync"
-	"testing"
-	"time"
-
-	"github.com/cloudflare/circl/dh/sidh"
-	"github.com/pkg/errors"
-	"gitlab.com/elixxir/client/catalog"
-	"gitlab.com/elixxir/client/cmix"
-	"gitlab.com/elixxir/client/cmix/message"
-	clientE2E "gitlab.com/elixxir/client/e2e"
 	"gitlab.com/elixxir/client/e2e/ratchet/partner"
-	sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session"
-	"gitlab.com/elixxir/client/e2e/receive"
 	"gitlab.com/elixxir/client/event"
 	gs "gitlab.com/elixxir/client/groupChat/groupStore"
 	"gitlab.com/elixxir/client/storage/versioned"
@@ -34,116 +17,14 @@ import (
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/group"
 	"gitlab.com/elixxir/ekv"
-	"gitlab.com/elixxir/primitives/format"
 	"gitlab.com/xx_network/crypto/large"
 	"gitlab.com/xx_network/primitives/id"
-	"gitlab.com/xx_network/primitives/id/ephemeral"
 	"gitlab.com/xx_network/primitives/ndf"
 	"gitlab.com/xx_network/primitives/netTime"
+	"math/rand"
+	"testing"
 )
 
-/////////////////////////////////////////////////////////////////////////////////////////
-// mockMessenger implementation for messenger interface /////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////////////////
-
-type mockMessenger struct {
-	receptionId *id.ID
-	net         groupCmix
-	e2e         e2eHandler
-	e2eGroup    *cyclic.Group
-	rng         *fastRNG.StreamGenerator
-	storage     session
-}
-
-func newMockMessenger(t testing.TB, kv *versioned.KV) messenger {
-	receptionId := id.NewIdFromString("test", id.User, t)
-	mockCmix := newTestNetworkManager(0)
-	prng := rand.New(rand.NewSource(42))
-	e2eHandler := newTestE2eManager(randCycInt(prng), t)
-	grp := getGroup()
-	rng := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
-	mockSession := newMockSesion(kv)
-
-	return mockMessenger{
-		receptionId: receptionId,
-		net:         mockCmix,
-		e2e:         e2eHandler,
-		e2eGroup:    grp,
-		rng:         rng,
-		storage:     mockSession,
-	}
-}
-
-func newMockMessengerWithStore(t testing.TB, sendErr int) messenger {
-	receptionId := id.NewIdFromString("test", id.User, t)
-	mockCmix := newTestNetworkManager(sendErr)
-	prng := rand.New(rand.NewSource(42))
-	grp := getGroup()
-	rng := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
-	mockSession := newMockSesion(nil)
-
-	return mockMessenger{
-		receptionId: receptionId,
-		net:         mockCmix,
-		e2e: &testE2eManager{
-			e2eMessages: []testE2eMessage{},
-			sendErr:     sendErr,
-			grp:         getGroup(),
-			dhPubKey:    randCycInt(prng),
-			partners:    make(map[id.ID]partner.Manager),
-		},
-		e2eGroup: grp,
-		rng:      rng,
-		storage:  mockSession,
-	}
-}
-
-func (m mockMessenger) GetCmix() groupCmix {
-	return m.net
-}
-
-func (m mockMessenger) GetE2E() e2eHandler {
-	return m.e2e
-}
-
-func (m mockMessenger) GetReceptionIdentity() xxdk.ReceptionIdentity {
-	keyData, _ := m.e2e.GetHistoricalDHPrivkey().MarshalJSON()
-	groupData, _ := getGroup().MarshalJSON()
-	return xxdk.ReceptionIdentity{
-		ID:           m.receptionId,
-		DHKeyPrivate: keyData,
-		E2eGrp:       groupData,
-	}
-}
-
-func (m mockMessenger) GetRng() *fastRNG.StreamGenerator {
-	return m.rng
-}
-
-func (m mockMessenger) GetStorage() session {
-	return m.storage
-}
-
-type mockSession struct {
-	kv *versioned.KV
-}
-
-func newMockSesion(kv *versioned.KV) session {
-	return mockSession{kv: kv}
-}
-
-func (m mockSession) GetE2EGroup() *cyclic.Group {
-	return getGroup()
-}
-
-func (m mockSession) GetKV() *versioned.KV {
-	if m.kv != nil {
-		return m.kv
-	}
-
-	return versioned.NewKV(ekv.MakeMemstore())
-}
-
 /////////////////////////////////////////////////////////////////////////////////////////
 // mock manager implementation //////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////////////////
@@ -319,137 +200,6 @@ func getGroup() *cyclic.Group {
 		large.NewIntFromString(getNDF().E2E.Generator, 16))
 }
 
-func newTestNetworkManager(sendErr int) groupCmix {
-	return &testNetworkManager{
-		receptionMessages: [][]format.Message{},
-		sendMessages:      [][]cmix.TargetedCmixMessage{},
-		grp:               getGroup(),
-		sendErr:           sendErr,
-	}
-}
-
-// testE2eManager is a test implementation of NetworkManager interface.
-type testE2eManager struct {
-	e2eMessages []testE2eMessage
-	partners    map[id.ID]partner.Manager
-	errSkip     int
-	sendErr     int
-	dhPubKey    *cyclic.Int
-	grp         *cyclic.Group
-	sync.RWMutex
-}
-
-type testE2eMessage struct {
-	Recipient *id.ID
-	Payload   []byte
-}
-
-func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey,
-	myPrivKey *cyclic.Int, _ *sidh.PublicKey, _ *sidh.PrivateKey,
-	_, _ sessionImport.Params) (partner.Manager, error) {
-
-	testPartner := partner.NewTestManager(partnerID, partnerPubKey, myPrivKey, &testing.T{})
-	tnm.partners[*partnerID] = testPartner
-	return testPartner, nil
-}
-
-func (tnm *testE2eManager) GetPartner(partnerID *id.ID) (partner.Manager, error) {
-	if p, ok := tnm.partners[*partnerID]; ok {
-		return p, nil
-	}
-	return nil, errors.New("Unable to find partner")
-}
-
-func (tnm *testE2eManager) GetHistoricalDHPubkey() *cyclic.Int {
-	return tnm.dhPubKey
-}
-
-func (tnm *testE2eManager) GetHistoricalDHPrivkey() *cyclic.Int {
-	return tnm.dhPubKey
-}
-
-func (tnm *testE2eManager) SendE2E(_ catalog.MessageType, recipient *id.ID,
-	payload []byte, _ clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time,
-	error) {
-	tnm.Lock()
-	defer tnm.Unlock()
-
-	tnm.errSkip++
-	if tnm.sendErr == 1 {
-		return nil, e2e.MessageID{}, time.Time{}, errors.New("SendE2E error")
-	} else if tnm.sendErr == 2 && tnm.errSkip%2 == 0 {
-		return nil, e2e.MessageID{}, time.Time{}, errors.New("SendE2E error")
-	}
-
-	tnm.e2eMessages = append(tnm.e2eMessages, testE2eMessage{
-		Recipient: recipient,
-		Payload:   payload,
-	})
-
-	return []id.Round{0, 1, 2, 3}, e2e.MessageID{}, time.Time{}, nil
-}
-
-func (*testE2eManager) RegisterListener(*id.ID, catalog.MessageType, receive.Listener) receive.ListenerID {
-	return receive.ListenerID{}
-}
-
-func (*testE2eManager) AddService(string, message.Processor) error {
-	return nil
-}
-
-func (*testE2eManager) GetDefaultHistoricalDHPubkey() *cyclic.Int {
-	panic("implement me")
-}
-
-func (*testE2eManager) GetDefaultHistoricalDHPrivkey() *cyclic.Int {
-	panic("implement me")
-}
-
-func (tnm *testE2eManager) GetE2eMsg(i int) testE2eMessage {
-	tnm.RLock()
-	defer tnm.RUnlock()
-	return tnm.e2eMessages[i]
-}
-
-// testNetworkManager is a test implementation of NetworkManager interface.
-type testNetworkManager struct {
-	receptionMessages [][]format.Message
-	sendMessages      [][]cmix.TargetedCmixMessage
-	errSkip           int
-	sendErr           int
-	grp               *cyclic.Group
-	sync.RWMutex
-}
-
-func (tnm *testNetworkManager) GetMaxMessageLength() int {
-	return format.NewMessage(tnm.grp.GetP().ByteLen()).ContentsSize()
-}
-
-func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) {
-	if tnm.sendErr == 1 {
-		return 0, nil, errors.New("SendManyCMIX error")
-	}
-
-	tnm.Lock()
-	defer tnm.Unlock()
-
-	tnm.sendMessages = append(tnm.sendMessages, messages)
-
-	var receiveMessages []format.Message
-	for _, msg := range messages {
-		receiveMsg := format.NewMessage(tnm.grp.GetP().ByteLen())
-		receiveMsg.SetMac(msg.Mac)
-		receiveMsg.SetContents(msg.Payload)
-		receiveMsg.SetKeyFP(msg.Fingerprint)
-		receiveMessages = append(receiveMessages, receiveMsg)
-	}
-	tnm.receptionMessages = append(tnm.receptionMessages, receiveMessages)
-	return 0, nil, nil
-}
-
-func (*testNetworkManager) AddService(*id.ID, message.Service, message.Processor)    {}
-func (*testNetworkManager) DeleteService(*id.ID, message.Service, message.Processor) {}
-
 type dummyEventMgr struct{}
 
 func (d *dummyEventMgr) Report(int, string, string, string) {}