diff --git a/e2e/sendE2E.go b/e2e/sendE2E.go
index 4aa825cc033a20b131bcc10a1f59af595bd3fd16..7f6547555fb76b6245be9fffd8a9c11ed758aae5 100644
--- a/e2e/sendE2E.go
+++ b/e2e/sendE2E.go
@@ -157,7 +157,7 @@ func (m *manager) sendE2E(mt catalog.MessageType, recipient *id.ID,
 	return roundIds, msgID, ts, nil
 }
 
-// waitForKey waits the designated ammount of time for a
+// waitForKey waits the designated amount of time for a
 func waitForKey(keyGetter func() (*session.Cypher, error), numAttempts uint,
 	wait time.Duration, stop *stoppable.Single, recipient *id.ID,
 	digest string, partition int) (*session.Cypher, error) {
diff --git a/go.mod b/go.mod
index 9ab45bff77e2beb8302467bb1c38ffd6e7230b46..276521a57d4678dbc98cc161ba0218cd55c38370 100644
--- a/go.mod
+++ b/go.mod
@@ -13,7 +13,7 @@ require (
 	github.com/spf13/viper v1.7.1
 	gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228
 	gitlab.com/elixxir/comms v0.0.4-0.20220308183624-c2183e687a03
-	gitlab.com/elixxir/crypto v0.0.7-0.20220331001626-1829e71edf56
+	gitlab.com/elixxir/crypto v0.0.7-0.20220406193349-d25222ea3c6e
 	gitlab.com/elixxir/ekv v0.1.6
 	gitlab.com/elixxir/primitives v0.0.3-0.20220330212736-cce83b5f948f
 	gitlab.com/xx_network/comms v0.0.4-0.20220311192415-d95fe8906580
diff --git a/go.sum b/go.sum
index 2fa579cae8672c0e1e60c00501032730dc42e15a..428a24b569408319d2adbf1839eb006b8056d1f8 100644
--- a/go.sum
+++ b/go.sum
@@ -291,6 +291,8 @@ gitlab.com/elixxir/crypto v0.0.7-0.20220330235853-295c470e0e62 h1:t0cy5vu9m32Vq/
 gitlab.com/elixxir/crypto v0.0.7-0.20220330235853-295c470e0e62/go.mod h1:JkByWX/TXCjdu6pRJsx+jwttbBGvlAljYSJMImDmt+4=
 gitlab.com/elixxir/crypto v0.0.7-0.20220331001626-1829e71edf56 h1:1HJHlRwh3dDbvw3qIK17jK5R6W87S4tz/gkJT8aMLKQ=
 gitlab.com/elixxir/crypto v0.0.7-0.20220331001626-1829e71edf56/go.mod h1:JkByWX/TXCjdu6pRJsx+jwttbBGvlAljYSJMImDmt+4=
+gitlab.com/elixxir/crypto v0.0.7-0.20220406193349-d25222ea3c6e h1:P+E0+AdevTNWBdqf4+covcmTrRfe6rKPLtevFrjbKQA=
+gitlab.com/elixxir/crypto v0.0.7-0.20220406193349-d25222ea3c6e/go.mod h1:JkByWX/TXCjdu6pRJsx+jwttbBGvlAljYSJMImDmt+4=
 gitlab.com/elixxir/ekv v0.1.6 h1:M2hUSNhH/ChxDd+s8xBqSEKgoPtmE6hOEBqQ73KbN6A=
 gitlab.com/elixxir/ekv v0.1.6/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=
diff --git a/groupChat/receiveRequest.go b/groupChat/receiveRequest.go
index 4adbdb96f92e5eb1c24710942245c786ff60c858..127cd9a37ad2297d931974936dc74e279fcf9a53 100644
--- a/groupChat/receiveRequest.go
+++ b/groupChat/receiveRequest.go
@@ -78,7 +78,7 @@ func (m *Manager) readRequest(msg receive.Message) (gs.Group, error) {
 	}
 
 	// get the relationship with the group leader
-	partner, err := m.e2e.GetPartner(membership[0].ID, m.receptionId)
+	partner, err := m.e2e.GetPartner(membership[0].ID)
 	if err != nil {
 		return gs.Group{}, errors.Errorf(getPrivKeyErr, err)
 	}
diff --git a/groupChat/receiveRequest_test.go b/groupChat/receiveRequest_test.go
index 294198f92544d49353e6e6a2f3244cb6742b6737..30b1dc975b48972132c5b5a13fe6e6c128dac44e 100644
--- a/groupChat/receiveRequest_test.go
+++ b/groupChat/receiveRequest_test.go
@@ -10,6 +10,7 @@ package groupChat
 import (
 	"github.com/cloudflare/circl/dh/sidh"
 	"github.com/golang/protobuf/proto"
+	"gitlab.com/elixxir/client/cmix"
 	"gitlab.com/elixxir/client/e2e/ratchet/partner/session"
 	gs "gitlab.com/elixxir/client/groupChat/groupStore"
 	"gitlab.com/elixxir/client/stoppable"
@@ -43,7 +44,7 @@ func TestManager_receiveRequest(t *testing.T) {
 		t.Errorf("Failed to marshal proto message: %+v", err)
 	}
 
-	msg := message.Receive{
+	msg := cmix.TargetedCmixMessage{
 		Sender:      g.Members[0].ID,
 		Payload:     requestMarshaled,
 		MessageType: message.GroupCreationRequest,
@@ -61,7 +62,7 @@ func TestManager_receiveRequest(t *testing.T) {
 	theirSIDHPrivKey.Generate(prng)
 	theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey)
 
-	_, _ = m.e2e.AddPartner(m.receptionId,
+	_, _ = m.e2e.AddPartner(
 		g.Members[0].ID,
 		g.Members[0].DhKey,
 		m.grp.NewInt(2),
diff --git a/groupChat/send.go b/groupChat/send.go
index f11237aae00b5b8f818378bfbc77eaaf93ae7047..dfcc522ef11627cd3ccb32648e8b7549f1a45858 100644
--- a/groupChat/send.go
+++ b/groupChat/send.go
@@ -66,7 +66,7 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, gro
 	// Send all the groupMessages
 	param := cmix.GetDefaultCMIXParams()
 	param.DebugTag = "group.Message"
-	rid, _, err := m.services.SendManyCMIX(groupMessages, param)
+	rid, _, err := m.services.SendMany(groupMessages, param)
 	if err != nil {
 		return 0, time.Time{}, group.MessageID{},
 			errors.Errorf(sendManyCmixErr, m.receptionId, groupID, err)
diff --git a/groupChat/sendRequests_test.go b/groupChat/sendRequests_test.go
index 14e5cb62404d4eea137068254b14984df0066a63..6951f49b12ee258a59a120bdfadd507300bd109b 100644
--- a/groupChat/sendRequests_test.go
+++ b/groupChat/sendRequests_test.go
@@ -47,7 +47,7 @@ func TestManager_ResendRequest(t *testing.T) {
 			sidh.KeyVariantSidhA, rng)
 		theirSidhPub, _ := util.GenerateSIDHKeyPair(
 			sidh.KeyVariantSidhB, rng)
-		_, err := m.e2e.AddPartner(m.receptionId, g.Members[i].ID, pubKey, dhKey,
+		_, err := m.e2e.AddPartner(g.Members[i].ID, pubKey, dhKey,
 			mySidhPriv, theirSidhPub, p, p)
 		if err != nil {
 			t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
@@ -64,14 +64,14 @@ func TestManager_ResendRequest(t *testing.T) {
 			"\nexpected: %s\nreceived: %s", AllSent, status)
 	}
 
-	if len(m.net.(*testNetworkManager).e2eMessages) < len(g.Members)-1 {
+	if len(m.e2e.(*testE2eManager).e2eMessages) < len(g.Members)-1 {
 		t.Errorf("ResendRequest() failed to send the correct number of requests."+
 			"\nexpected: %d\nreceived: %d", len(g.Members)-1,
-			len(m.net.(*testNetworkManager).e2eMessages))
+			len(m.e2e.(*testE2eManager).e2eMessages))
 	}
 
-	for i := 0; i < len(m.net.(*testNetworkManager).e2eMessages); i++ {
-		msg := m.net.(*testNetworkManager).GetE2eMsg(i)
+	for i := 0; i < len(m.e2e.(*testE2eManager).e2eMessages); i++ {
+		msg := m.e2e.(*testE2eManager).GetE2eMsg(i)
 
 		// Check if the message recipient is a member in the group
 		matchesMember := false
@@ -143,7 +143,7 @@ func TestManager_sendRequests(t *testing.T) {
 			sidh.KeyVariantSidhA, rng)
 		theirSidhPub, _ := util.GenerateSIDHKeyPair(
 			sidh.KeyVariantSidhB, rng)
-		_, err := m.e2e.AddPartner(m.receptionId, g.Members[i].ID, pubKey, dhKey,
+		_, err := m.e2e.AddPartner(g.Members[i].ID, pubKey, dhKey,
 			mySidhPriv, theirSidhPub, p, p)
 		if err != nil {
 			t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
@@ -160,14 +160,14 @@ func TestManager_sendRequests(t *testing.T) {
 			"\nexpected: %s\nreceived: %s", AllSent, status)
 	}
 
-	if len(m.net.(*testNetworkManager).e2eMessages) < len(g.Members)-1 {
+	if len(m.e2e.(*testE2eManager).e2eMessages) < len(g.Members)-1 {
 		t.Errorf("sendRequests() failed to send the correct number of requests."+
 			"\nexpected: %d\nreceived: %d", len(g.Members)-1,
-			len(m.net.(*testNetworkManager).e2eMessages))
+			len(m.e2e.(*testE2eManager).e2eMessages))
 	}
 
-	for i := 0; i < len(m.net.(*testNetworkManager).e2eMessages); i++ {
-		msg := m.net.(*testNetworkManager).GetE2eMsg(i)
+	for i := 0; i < len(m.e2e.(*testE2eManager).e2eMessages); i++ {
+		msg := m.e2e.(*testE2eManager).GetE2eMsg(i)
 
 		// Check if the message recipient is a member in the group
 		matchesMember := false
@@ -219,9 +219,9 @@ func TestManager_sendRequests_SendAllFail(t *testing.T) {
 			"\nexpected: %v\nreceived: %v", nil, rounds)
 	}
 
-	if len(m.net.(*testNetworkManager).e2eMessages) != 0 {
+	if len(m.e2e.(*testE2eManager).e2eMessages) != 0 {
 		t.Errorf("sendRequests() sent %d messages when sending should have failed.",
-			len(m.net.(*testNetworkManager).e2eMessages))
+			len(m.e2e.(*testE2eManager).e2eMessages))
 	}
 }
 
@@ -243,7 +243,7 @@ func TestManager_sendRequests_SendPartialSent(t *testing.T) {
 			sidh.KeyVariantSidhA, rng)
 		theirSidhPub, _ := util.GenerateSIDHKeyPair(
 			sidh.KeyVariantSidhB, rng)
-		_, err := m.e2e.AddPartner(m.receptionId, g.Members[i].ID, pubKey, dhKey,
+		_, err := m.e2e.AddPartner(g.Members[i].ID, pubKey, dhKey,
 			mySidhPriv, theirSidhPub, p, p)
 		if err != nil {
 			t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
@@ -261,9 +261,9 @@ func TestManager_sendRequests_SendPartialSent(t *testing.T) {
 			"\nexpected: %s\nreceived: %s", PartialSent, status)
 	}
 
-	if len(m.net.(*testNetworkManager).e2eMessages) != (len(g.Members)-1)/2+1 {
+	if len(m.e2e.(*testE2eManager).e2eMessages) != (len(g.Members)-1)/2+1 {
 		t.Errorf("sendRequests() sent %d out of %d expected messages.",
-			len(m.net.(*testNetworkManager).e2eMessages), (len(g.Members)-1)/2+1)
+			len(m.e2e.(*testE2eManager).e2eMessages), (len(g.Members)-1)/2+1)
 	}
 }
 
@@ -282,7 +282,7 @@ func TestManager_sendRequest(t *testing.T) {
 			sidh.KeyVariantSidhA, rng)
 		theirSidhPub, _ := util.GenerateSIDHKeyPair(
 			sidh.KeyVariantSidhB, rng)
-		_, err := m.e2e.AddPartner(m.receptionId, g.Members[i].ID, pubKey, dhKey,
+		_, err := m.e2e.AddPartner(g.Members[i].ID, pubKey, dhKey,
 			mySidhPriv, theirSidhPub, p, p)
 		if err != nil {
 			t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
@@ -293,8 +293,12 @@ func TestManager_sendRequest(t *testing.T) {
 	if err != nil {
 		t.Errorf("sendRequest() returned an error: %+v", err)
 	}
+	expected := testE2eMessage{
+		Recipient: g.Members[0].ID,
+		Payload:   []byte("request message"),
+	}
 
-	received := m.net.(*testNetworkManager).GetE2eMsg(0)
+	received := m.e2e.(*testE2eManager).GetE2eMsg(0)
 
 	if !reflect.DeepEqual(expected, received) {
 		t.Errorf("sendRequest() did not send the correct message."+
@@ -319,7 +323,7 @@ func TestManager_sendRequest_SendE2eError(t *testing.T) {
 		sidh.KeyVariantSidhA, rng)
 	theirSidhPub, _ := util.GenerateSIDHKeyPair(
 		sidh.KeyVariantSidhB, rng)
-	_, err := m.e2e.AddPartner(m.receptionId, recipientID, pubKey, dhKey,
+	_, err := m.e2e.AddPartner(recipientID, pubKey, dhKey,
 		mySidhPriv, theirSidhPub, p, p)
 	if err != nil {
 		t.Errorf("Failed to add partner %s: %+v", recipientID, err)
diff --git a/groupChat/send_test.go b/groupChat/send_test.go
index 662c76ecee77b1a348815678ab6cb48356f03973..298e421770ac5d0f3469280504e7f650b148062a 100644
--- a/groupChat/send_test.go
+++ b/groupChat/send_test.go
@@ -10,8 +10,8 @@ package groupChat
 import (
 	"bytes"
 	"encoding/base64"
+	"gitlab.com/elixxir/client/cmix"
 	gs "gitlab.com/elixxir/client/groupChat/groupStore"
-	"gitlab.com/elixxir/client/storage"
 	"gitlab.com/elixxir/crypto/group"
 	"gitlab.com/elixxir/primitives/format"
 	"gitlab.com/xx_network/primitives/id"
@@ -35,9 +35,9 @@ func TestManager_Send(t *testing.T) {
 	}
 
 	// get messages sent with or return an error if no messages were sent
-	var messages []message.TargetedCmixMessage
-	if len(m.net.(*testNetworkManager).messages) > 0 {
-		messages = m.net.(*testNetworkManager).GetMsgList(0)
+	var messages []cmix.TargetedCmixMessage
+	if len(m.services.(*testNetworkManager).messages) > 0 {
+		messages = m.services.(*testNetworkManager).GetMsgList(0)
 	} else {
 		t.Error("No group cMix messages received.")
 	}
@@ -62,12 +62,12 @@ func TestManager_Send(t *testing.T) {
 			continue
 		}
 
-		publicMessage, err := unmarshalPublicMsg(msg.Message.GetContents())
+		publicMessage, err := unmarshalPublicMsg(msg.GetContents())
 		if err != nil {
 			t.Errorf("Failed to unmarshal publicMsg: %+v", err)
 		}
 		// Attempt to read the message
-		messageID, timestamp, senderID, readMsg, err := m.decryptMessage(
+		result, err := decryptMessage(
 			g, msg.Message, publicMessage, timeNow)
 		if err != nil {
 			t.Errorf("Failed to read message for %s: %+v", msg.Recipient, err)
@@ -131,7 +131,7 @@ func TestManager_Send_SendManyCMIXError(t *testing.T) {
 	}
 
 	// If messages were added, then error
-	if len(m.net.(*testNetworkManager).messages) > 0 {
+	if len(m.services.(*testNetworkManager).messages) > 0 {
 		t.Error("Group cMix messages received when SendManyCMIX errors.")
 	}
 }
@@ -239,7 +239,7 @@ func TestGroup_newMessages(t *testing.T) {
 				t.Errorf("Failed to unmarshal publicMsg: %+v", err)
 			}
 
-			messageID, testTimestamp, testSender, testMessage, err := m.decryptMessage(
+			result, err := decryptMessage(
 				g, msg.Message, publicMessage, netTime.Now())
 			if err != nil {
 				t.Errorf("Failed to find member to read message %d.", i)
@@ -301,7 +301,7 @@ func TestGroup_newCmixMsg(t *testing.T) {
 
 	// Create cMix message
 	prng = rand.New(rand.NewSource(42))
-	msg, err := m.newCmixMsg(g, testMsg, timeNow, mem, prng)
+	msg, err := newCmixMsg(g, testMsg, timeNow, mem, prng, m.receptionId, m.grp)
 	if err != nil {
 		t.Errorf("newCmixMsg() returned an error: %+v", err)
 	}
@@ -373,10 +373,10 @@ func TestGroup_newCmixMsg(t *testing.T) {
 // Error path: reader returns an error.
 func TestGroup_newCmixMsg_SaltReaderError(t *testing.T) {
 	expectedErr := strings.SplitN(saltReadErr, "%", 2)[0]
-	m := &Manager{store: storage.InitTestingSession(t)}
+	m := &Manager{}
 
-	_, err := m.newCmixMsg(gs.Group{},
-		[]byte{}, time.Time{}, group.Member{}, strings.NewReader(""))
+	_, err := newCmixMsg(gs.Group{},
+		[]byte{}, time.Time{}, group.Member{}, strings.NewReader(""), m.receptionId, m.grp)
 	if err == nil || !strings.Contains(err.Error(), expectedErr) {
 		t.Errorf("newCmixMsg() failed to return the expected error"+
 			"\nexpected: %s\nreceived: %+v", expectedErr, err)
@@ -397,7 +397,7 @@ func TestGroup_newCmixMsg_InternalMsgSizeError(t *testing.T) {
 
 	// Create cMix message
 	prng = rand.New(rand.NewSource(42))
-	_, err := m.newCmixMsg(g, testMsg, netTime.Now(), mem, prng)
+	_, err := newCmixMsg(g, testMsg, netTime.Now(), mem, prng, m.receptionId, m.grp)
 	if err == nil || !strings.Contains(err.Error(), expectedErr) {
 		t.Errorf("newCmixMsg() failed to return the expected error"+
 			"\nexpected: %s\nreceived: %+v", expectedErr, err)
diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go
index 6e76d66e1522f04c882d356d8fe38f4802732e3e..d3d1c1599573f34315aec4b256de615d356f1415 100644
--- a/groupChat/utils_test.go
+++ b/groupChat/utils_test.go
@@ -9,18 +9,23 @@ package groupChat
 
 import (
 	"encoding/base64"
+	"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/gateway"
+	"gitlab.com/elixxir/client/cmix/historical"
+	"gitlab.com/elixxir/client/cmix/identity"
+	"gitlab.com/elixxir/client/cmix/message"
+	clientE2E "gitlab.com/elixxir/client/e2e"
+	"gitlab.com/elixxir/client/e2e/ratchet/partner"
+	"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/interfaces"
-	"gitlab.com/elixxir/client/interfaces/message"
-	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/stoppable"
-	"gitlab.com/elixxir/client/storage"
 	"gitlab.com/elixxir/client/storage/versioned"
-	"gitlab.com/elixxir/client/switchboard"
-	"gitlab.com/elixxir/comms/network"
+	net "gitlab.com/elixxir/comms/network"
 	"gitlab.com/elixxir/crypto/contact"
 	"gitlab.com/elixxir/crypto/cyclic"
 	"gitlab.com/elixxir/crypto/e2e"
@@ -43,23 +48,30 @@ import (
 
 // newTestManager creates a new Manager for testing.
 func newTestManager(rng *rand.Rand, t *testing.T) (*Manager, gs.Group) {
-	store := storage.InitTestingSession(t)
+	m := &Manager{
+		receptionId: id.NewIdFromString("test", id.User, t),
+		rng:         fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG),
+		grp:         getGroup(),
+		services:    newTestNetworkManager(0, t),
+		e2e: &testE2eManager{
+			e2eMessages: []testE2eMessage{},
+			errSkip:     0,
+			sendErr:     0,
+		},
+	}
 	user := group.Member{
-		ID:    store.GetUser().ReceptionID,
-		DhKey: store.GetUser().E2eDhPublicKey,
+		ID:    m.receptionId,
+		DhKey: randCycInt(rng),
 	}
 
-	g := newTestGroupWithUser(store.E2e().GetGroup(), user.ID, user.DhKey,
-		store.GetUser().E2eDhPrivateKey, rng, t)
+	g := newTestGroupWithUser(m.grp, user.ID, user.DhKey,
+		randCycInt(rng), rng, t)
 	gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user)
 	if err != nil {
 		t.Fatalf("Failed to create new group store: %+v", err)
 	}
-	m := &Manager{
-		store: store,
-		rng:   fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG),
-		gs:    gStore,
-	}
+
+	m.gs = gStore
 	return m, g
 }
 
@@ -69,36 +81,39 @@ func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int,
 	requestFunc RequestCallback, receiveFunc ReceiveCallback,
 	t *testing.T) (*Manager, gs.Group) {
 
-	store := storage.InitTestingSession(t)
+	m := &Manager{
+		receptionId: id.NewIdFromString("test", id.User, t),
+		rng:         fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG),
+		grp:         getGroup(),
+		requestFunc: requestFunc,
+		receiveFunc: receiveFunc,
+		services:    newTestNetworkManager(sendErr, t),
+		e2e: &testE2eManager{
+			e2eMessages: []testE2eMessage{},
+			errSkip:     0,
+			sendErr:     sendErr,
+		},
+	}
 
 	user := group.Member{
-		ID:    store.GetUser().ReceptionID,
-		DhKey: store.GetUser().E2eDhPublicKey,
+		ID:    m.receptionId,
+		DhKey: randCycInt(rng),
 	}
 
 	gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user)
 	if err != nil {
 		t.Fatalf("Failed to create new group store: %+v", err)
 	}
+	m.gs = gStore
 
 	var g gs.Group
 	for i := 0; i < numGroups; i++ {
-		g = newTestGroupWithUser(store.E2e().GetGroup(), user.ID, user.DhKey,
-			store.GetUser().E2eDhPrivateKey, rng, t)
+		g = newTestGroupWithUser(m.grp, user.ID, user.DhKey,
+			randCycInt(rng), rng, t)
 		if err = gStore.Add(g); err != nil {
 			t.Fatalf("Failed to add group %d to group store: %+v", i, err)
 		}
 	}
-
-	m := &Manager{
-		store:       store,
-		swb:         switchboard.New(),
-		net:         newTestNetworkManager(sendErr, t),
-		rng:         fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG),
-		gs:          gStore,
-		requestFunc: requestFunc,
-		receiveFunc: receiveFunc,
-	}
 	return m, g
 }
 
@@ -206,48 +221,209 @@ func getGroup() *cyclic.Group {
 		large.NewIntFromString(getNDF().E2E.Generator, 16))
 }
 
-func newTestNetworkManager(sendErr int, t *testing.T) interfaces.NetworkManager {
-	instanceComms := &connect.ProtoComms{
-		Manager: connect.NewManagerTesting(t),
-	}
-
-	thisInstance, err := network.NewInstanceTesting(instanceComms, getNDF(),
-		getNDF(), nil, nil, t)
-	if err != nil {
-		t.Fatalf("Failed to create new test instance: %v", err)
-	}
-
+func newTestNetworkManager(sendErr int, t *testing.T) cmix.Client {
 	return &testNetworkManager{
-		instance: thisInstance,
-		messages: [][]message.TargetedCmixMessage{},
+		messages: [][]cmix.TargetedCmixMessage{},
 		sendErr:  sendErr,
 	}
 }
 
-// testNetworkManager is a test implementation of NetworkManager interface.
-type testNetworkManager struct {
-	instance    *network.Instance
-	messages    [][]message.TargetedCmixMessage
-	e2eMessages []message.Send
+// testE2eManager is a test implementation of NetworkManager interface.
+type testE2eManager struct {
+	e2eMessages []testE2eMessage
 	errSkip     int
 	sendErr     int
 	sync.RWMutex
 }
 
-func (tnm *testNetworkManager) GetMsgList(i int) []message.TargetedCmixMessage {
-	tnm.RLock()
-	defer tnm.RUnlock()
-	return tnm.messages[i]
+type testE2eMessage struct {
+	Recipient *id.ID
+	Payload   []byte
 }
 
-func (tnm *testNetworkManager) GetE2eMsg(i int) message.Send {
-	tnm.RLock()
-	defer tnm.RUnlock()
-	return tnm.e2eMessages[i]
+func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, sendParams, receiveParams session.Params) (*partner.Manager, error) {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetPartner(partnerID *id.ID) (*partner.Manager, error) {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) DeletePartner(partnerId *id.ID) error {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetAllPartnerIDs() []*id.ID {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetHistoricalDHPubkey() *cyclic.Int {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetHistoricalDHPrivkey() *cyclic.Int {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) GetReceptionID() *id.ID {
+	panic("implement me")
+}
+
+// testNetworkManager is a test implementation of NetworkManager interface.
+type testNetworkManager struct {
+	messages [][]cmix.TargetedCmixMessage
+	errSkip  int
+	sendErr  int
+	sync.RWMutex
+}
+
+func (tnm *testNetworkManager) Send(recipient *id.ID, fingerprint format.Fingerprint, service message.Service, payload, mac []byte, cmixParams cmix.CMIXParams) (id.Round, ephemeral.Id, error) {
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (id.Round, []ephemeral.Id, error) {
+	if tnm.sendErr == 1 {
+		return 0, nil, errors.New("SendManyCMIX error")
+	}
+
+	tnm.Lock()
+	defer tnm.Unlock()
+
+	tnm.messages = append(tnm.messages, messages)
+
+	return 0, nil, nil
+}
+
+func (tnm *testNetworkManager) GetIdentity(get *id.ID) (identity.TrackedID, error) {
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetInstance() *net.Instance {
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetVerboseRounds() string {
+	panic("implement me")
+}
+
+func (*testNetworkManager) Follow(report cmix.ClientErrorReport) (stoppable.Stoppable, error) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) GetMaxMessageLength() int {
+	panic("implement me")
+}
+
+func (*testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) RemoveIdentity(id *id.ID) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint, mp message.Processor) error {
+	panic("implement me")
+}
+
+func (*testNetworkManager) DeleteFingerprint(identity *id.ID, fingerprint format.Fingerprint) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) DeleteClientFingerprints(identity *id.ID) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) AddService(clientID *id.ID, newService message.Service, response message.Processor) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Service, processor message.Processor) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) DeleteClientService(clientID *id.ID) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) TrackServices(tracker message.ServicesTracker) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) CheckInProgressMessages() {
+	panic("implement me")
+}
+
+func (*testNetworkManager) IsHealthy() bool {
+	panic("implement me")
+}
+
+func (*testNetworkManager) WasHealthy() bool {
+	//TODO implement me
+	panic("implement me")
+}
+
+func (*testNetworkManager) AddHealthCallback(f func(bool)) uint64 {
+	panic("implement me")
+}
+
+func (*testNetworkManager) RemoveHealthCallback(u uint64) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) HasNode(nid *id.ID) bool {
+	panic("implement me")
+}
+
+func (*testNetworkManager) NumRegisteredNodes() int {
+	panic("implement me")
+}
+
+func (*testNetworkManager) TriggerNodeRegistration(nid *id.ID) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) GetRoundResults(timeout time.Duration, roundCallback cmix.RoundEventCallback, roundList ...id.Round) error {
+	panic("implement me")
+}
+
+func (*testNetworkManager) LookupHistoricalRound(rid id.Round, callback historical.RoundResultCallback) error {
+	panic("implement me")
+}
+
+func (*testNetworkManager) SendToAny(sendFunc func(host *connect.Host) (interface{}, error), stop *stoppable.Single) (interface{}, error) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) SendToPreferred(targets []*id.ID, sendFunc gateway.SendToPreferredFunc, stop *stoppable.Single, timeout time.Duration) (interface{}, error) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) SetGatewayFilter(f gateway.Filter) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) GetHostParams() connect.HostParams {
+	panic("implement me")
+}
+
+func (*testNetworkManager) GetAddressSpace() uint8 {
+	panic("implement me")
 }
 
-func (tnm *testNetworkManager) SendE2E(msg message.Send, _ params.E2E,
-	_ *stoppable.Single) ([]id.Round, e2e.MessageID, time.Time, error) {
+func (*testNetworkManager) RegisterAddressSpaceNotification(tag string) (chan uint8, error) {
+	panic("implement me")
+}
+
+func (*testNetworkManager) UnregisterAddressSpaceNotification(tag string) {
+	panic("implement me")
+}
+
+func (*testE2eManager) StartProcesses() (stoppable.Stoppable, error) {
+	panic("implement me")
+}
+
+func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time, error) {
 	tnm.Lock()
 	defer tnm.Unlock()
 
@@ -258,36 +434,72 @@ func (tnm *testNetworkManager) SendE2E(msg message.Send, _ params.E2E,
 		return nil, e2e.MessageID{}, time.Time{}, errors.New("SendE2E error")
 	}
 
-	tnm.e2eMessages = append(tnm.e2eMessages, msg)
+	tnm.e2eMessages = append(tnm.e2eMessages, testE2eMessage{
+		Recipient: recipient,
+		Payload:   payload,
+	})
 
 	return []id.Round{0, 1, 2, 3}, e2e.MessageID{}, time.Time{}, nil
 }
 
-func (tnm *testNetworkManager) SendUnsafe(message.Send, params.Unsafe) ([]id.Round, error) {
-	return []id.Round{}, nil
+func (*testE2eManager) RegisterListener(user *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID {
+	panic("implement me")
 }
 
-func (tnm *testNetworkManager) GetVerboseRounds() string {
-	return ""
+func (*testE2eManager) RegisterFunc(name string, user *id.ID, messageType catalog.MessageType, newListener receive.ListenerFunc) receive.ListenerID {
+	panic("implement me")
 }
 
-func (tnm *testNetworkManager) SendCMIX(format.Message, *id.ID, params.CMIX) (id.Round, ephemeral.Id, error) {
-	return 0, ephemeral.Id{}, nil
+func (*testE2eManager) RegisterChannel(name string, user *id.ID, messageType catalog.MessageType, newListener chan receive.Message) receive.ListenerID {
+	panic("implement me")
 }
 
-func (tnm *testNetworkManager) SendManyCMIX(
-	messages []message.TargetedCmixMessage, _ params.CMIX) (id.Round,
-	[]ephemeral.Id, error) {
-	if tnm.sendErr == 1 {
-		return 0, nil, errors.New("SendManyCMIX error")
-	}
+func (*testE2eManager) Unregister(listenerID receive.ListenerID) {
+	panic("implement me")
+}
 
-	tnm.Lock()
-	defer tnm.Unlock()
+func (*testE2eManager) AddService(tag string, processor message.Processor) error {
+	panic("implement me")
+}
 
-	tnm.messages = append(tnm.messages, messages)
+func (*testE2eManager) RemoveService(tag string) error {
+	panic("implement me")
+}
 
-	return 0, nil, nil
+func (*testE2eManager) SendUnsafe(mt catalog.MessageType, recipient *id.ID, payload []byte, params clientE2E.Params) ([]id.Round, time.Time, error) {
+	panic("implement me")
+}
+
+func (*testE2eManager) EnableUnsafeReception() {
+	panic("implement me")
+}
+
+func (*testE2eManager) GetGroup() *cyclic.Group {
+	panic("implement me")
+}
+
+func (*testE2eManager) GetDefaultHistoricalDHPubkey() *cyclic.Int {
+	panic("implement me")
+}
+
+func (*testE2eManager) GetDefaultHistoricalDHPrivkey() *cyclic.Int {
+	panic("implement me")
+}
+
+func (*testE2eManager) GetDefaultID() *id.ID {
+	panic("implement me")
+}
+
+func (tnm *testNetworkManager) GetMsgList(i int) []cmix.TargetedCmixMessage {
+	tnm.RLock()
+	defer tnm.RUnlock()
+	return tnm.messages[i]
+}
+
+func (tnm *testE2eManager) GetE2eMsg(i int) testE2eMessage {
+	tnm.RLock()
+	defer tnm.RUnlock()
+	return tnm.e2eMessages[i]
 }
 
 type dummyEventMgr struct{}
@@ -297,21 +509,6 @@ func (tnm *testNetworkManager) GetEventManager() event.Manager {
 	return &dummyEventMgr{}
 }
 
-func (tnm *testNetworkManager) GetInstance() *network.Instance             { return tnm.instance }
-func (tnm *testNetworkManager) GetHealthTracker() interfaces.HealthTracker { return nil }
-func (tnm *testNetworkManager) Follow(interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
-	return nil, nil
-}
-func (tnm *testNetworkManager) CheckGarbledMessages()        {}
-func (tnm *testNetworkManager) InProgressRegistrations() int { return 0 }
-func (tnm *testNetworkManager) GetSender() *gateway.Sender   { return nil }
-func (tnm *testNetworkManager) GetAddressSize() uint8        { return 0 }
-func (tnm *testNetworkManager) RegisterAddressSizeNotification(string) (chan uint8, error) {
-	return nil, nil
-}
-func (tnm *testNetworkManager) UnregisterAddressSizeNotification(string) {}
-func (tnm *testNetworkManager) SetPoolFilter(gateway.Filter)             {}
-
 func getNDF() *ndf.NetworkDefinition {
 	return &ndf.NetworkDefinition{
 		E2E: ndf.Group{