diff --git a/fileTransfer2/e2e/listener.go b/fileTransfer2/e2e/listener.go
index 342b39c9501143ac118e3cea3234d654e5bea915..4a07ed9d0682bc9e3af37d67e9e4dcc8902971dc 100644
--- a/fileTransfer2/e2e/listener.go
+++ b/fileTransfer2/e2e/listener.go
@@ -10,14 +10,12 @@ package e2e
 import (
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/e2e/receive"
-	ft "gitlab.com/elixxir/client/fileTransfer2"
 )
 
 // Error messages.
 const (
 	// listener.Hear
-	errProtoUnmarshal      = "[FT] Failed to proto unmarshal new file transfer request: %+v"
-	errNewReceivedTransfer = "[FT] Failed to add new received transfer for %q: %+v"
+	errNewReceivedTransfer = "[FT] Failed to add new received transfer: %+v"
 )
 
 // Name of listener (used for debugging)
@@ -33,18 +31,10 @@ type listener struct {
 // internal received file transfer and starts waiting to receive file part
 // messages.
 func (l *listener) Hear(msg receive.Message) {
-	// Unmarshal the request message
-	info, err := ft.UnmarshalTransferInfo(msg.Payload)
-	if err != nil {
-		jww.ERROR.Printf(errProtoUnmarshal, err)
-		return
-	}
-
 	// Add new transfer to start receiving parts
-	tid, err := l.m.ft.HandleIncomingTransfer(info.FileName, &info.Key, info.Mac,
-		info.NumParts, info.Size, info.Retry, nil, 0)
+	tid, info, err := l.m.ft.HandleIncomingTransfer(msg.Payload, nil, 0)
 	if err != nil {
-		jww.ERROR.Printf(errNewReceivedTransfer, info.FileName, err)
+		jww.ERROR.Printf(errNewReceivedTransfer, err)
 		return
 	}
 
diff --git a/fileTransfer2/e2e/send.go b/fileTransfer2/e2e/send.go
index 8529ecf4e79367d4f2b192f96589894d28969749..54deb4e7e13990d48c9ac775f47cc27986556c23 100644
--- a/fileTransfer2/e2e/send.go
+++ b/fileTransfer2/e2e/send.go
@@ -19,7 +19,6 @@ import (
 // Error messages.
 const (
 	// sendNewFileTransferMessage
-	errMarshalInfo  = "failed to marshal new transfer info: %+v"
 	errNewFtSendE2e = "failed to send initial file transfer message via E2E: %+v"
 
 	// sendEndFileTransferMessage
@@ -39,13 +38,7 @@ const (
 // sendNewFileTransferMessage sends an E2E message to the recipient informing
 // them of the incoming file transfer.
 func sendNewFileTransferMessage(
-	recipient *id.ID, info *ft.TransferInfo, e2eHandler E2e) error {
-
-	// Marshal the message
-	payload, err := info.Marshal()
-	if err != nil {
-		return errors.Errorf(errMarshalInfo, err)
-	}
+	recipient *id.ID, transferInfo []byte, e2eHandler E2e) error {
 
 	// Get E2E parameters
 	params := e2e.GetDefaultParams()
@@ -53,8 +46,8 @@ func sendNewFileTransferMessage(
 	params.LastServiceTag = catalog.Silent
 	params.DebugTag = initialMessageDebugTag
 
-	_, _, _, err = e2eHandler.SendE2E(
-		catalog.NewFileTransfer, recipient, payload, params)
+	_, _, _, err := e2eHandler.SendE2E(
+		catalog.NewFileTransfer, recipient, transferInfo, params)
 	if err != nil {
 		return errors.Errorf(errNewFtSendE2e, err)
 	}
diff --git a/fileTransfer2/e2e/wrapper.go b/fileTransfer2/e2e/wrapper.go
index d361dd052df0da6bbc177a88bf0d7054013ebd5a..c03debdac07b9518a38445dab2fb2e1228889738 100644
--- a/fileTransfer2/e2e/wrapper.go
+++ b/fileTransfer2/e2e/wrapper.go
@@ -90,8 +90,8 @@ func (w *Wrapper) Send(recipient *id.ID, fileName, fileType string,
 	progressCB ft.SentProgressCallback, period time.Duration) (
 	*ftCrypto.TransferID, error) {
 
-	sendNew := func(info *ft.TransferInfo) error {
-		return sendNewFileTransferMessage(recipient, info, w.e2e)
+	sendNew := func(transferInfo []byte) error {
+		return sendNewFileTransferMessage(recipient, transferInfo, w.e2e)
 	}
 
 	modifiedProgressCB := w.addEndMessageToCallback(progressCB)
diff --git a/fileTransfer2/groupChat/processor.go b/fileTransfer2/groupChat/processor.go
index 0aa7d2b231dce264ea22227d0f0e4022c30d84ce..bccc2a6d3f1ff684be8b23fda776e65c71a2e41c 100644
--- a/fileTransfer2/groupChat/processor.go
+++ b/fileTransfer2/groupChat/processor.go
@@ -11,7 +11,6 @@ import (
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/cmix/identity/receptionID"
 	"gitlab.com/elixxir/client/cmix/rounds"
-	ft "gitlab.com/elixxir/client/fileTransfer2"
 	"gitlab.com/elixxir/client/groupChat"
 	"gitlab.com/elixxir/primitives/format"
 )
@@ -19,8 +18,7 @@ import (
 // Error messages.
 const (
 	// processor.Process
-	errProtoUnmarshal      = "[FT] Failed to proto unmarshal new file transfer request: %+v"
-	errNewReceivedTransfer = "[FT] Failed to add new received transfer for %q: %+v"
+	errNewReceivedTransfer = "[FT] Failed to add new received transfer: %+v"
 )
 
 // processor processes the incoming E2E new file transfer messages to start
@@ -35,18 +33,10 @@ type processor struct {
 // progress callback.
 func (p *processor) Process(decryptedMsg groupChat.MessageReceive,
 	_ format.Message, _ receptionID.EphemeralIdentity, _ rounds.Round) {
-	// Unmarshal the request message
-	info, err := ft.UnmarshalTransferInfo(decryptedMsg.Payload)
-	if err != nil {
-		jww.ERROR.Printf(errProtoUnmarshal, err)
-		return
-	}
-
 	// Add new transfer to start receiving parts
-	tid, err := p.ft.HandleIncomingTransfer(info.FileName, &info.Key, info.Mac,
-		info.NumParts, info.Size, info.Retry, nil, 0)
+	tid, info, err := p.ft.HandleIncomingTransfer(decryptedMsg.Payload, nil, 0)
 	if err != nil {
-		jww.ERROR.Printf(errNewReceivedTransfer, info.FileName, err)
+		jww.ERROR.Printf(errNewReceivedTransfer, err)
 		return
 	}
 
diff --git a/fileTransfer2/groupChat/send.go b/fileTransfer2/groupChat/send.go
index 980aad7eed71e59c635fbb67c0b544df38dfbdd5..e85190cba9f2e8352e8a040cc5f29c67787e8007 100644
--- a/fileTransfer2/groupChat/send.go
+++ b/fileTransfer2/groupChat/send.go
@@ -9,30 +9,22 @@ package groupChat
 
 import (
 	"github.com/pkg/errors"
-	ft "gitlab.com/elixxir/client/fileTransfer2"
 	"gitlab.com/xx_network/primitives/id"
 )
 
 // Error messages.
 const (
 	// sendNewFileTransferMessage
-	errMarshalInfo        = "failed to marshal new transfer info: %+v"
 	errNewFtSendGroupChat = "failed to send initial file transfer message via group chat: %+v"
 )
 
 // sendNewFileTransferMessage sends a group chat message to the group ID
 // informing them of the incoming file transfer.
 func sendNewFileTransferMessage(
-	groupID *id.ID, info *ft.TransferInfo, gc GroupChat) error {
-
-	// Marshal the message
-	payload, err := info.Marshal()
-	if err != nil {
-		return errors.Errorf(errMarshalInfo, err)
-	}
+	groupID *id.ID, transferInfo []byte, gc GroupChat) error {
 
 	// Send the message via group chat
-	_, _, _, err = gc.Send(groupID, newFileTransferTag, payload)
+	_, _, _, err := gc.Send(groupID, newFileTransferTag, transferInfo)
 	if err != nil {
 		return errors.Errorf(errNewFtSendGroupChat, err)
 	}
diff --git a/fileTransfer2/groupChat/wrapper.go b/fileTransfer2/groupChat/wrapper.go
index 09fff399edd90d50d5c40d310d2aae3cc7fccc17..176e247bd900d0eb60b03e936c525e77f9ecc69d 100644
--- a/fileTransfer2/groupChat/wrapper.go
+++ b/fileTransfer2/groupChat/wrapper.go
@@ -91,8 +91,8 @@ func (w *Wrapper) Send(groupID *id.ID, fileName, fileType string,
 	fileData []byte, retry float32, preview []byte,
 	progressCB ft.SentProgressCallback, period time.Duration) (
 	*ftCrypto.TransferID, error) {
-	sendNew := func(info *ft.TransferInfo) error {
-		return sendNewFileTransferMessage(groupID, info, w.gc)
+	sendNew := func(transferInfo []byte) error {
+		return sendNewFileTransferMessage(groupID, transferInfo, w.gc)
 	}
 
 	return w.ft.Send(groupID, fileName, fileType, fileData, retry, preview,
diff --git a/fileTransfer2/interface.go b/fileTransfer2/interface.go
index 566e0166abe7dd10e6c4215147589d84e91e5704..b8e2f8ba08f66692b6bb45ae3f9afafcd5bca88f 100644
--- a/fileTransfer2/interface.go
+++ b/fileTransfer2/interface.go
@@ -33,7 +33,7 @@ type ReceiveCallback func(tid *ftCrypto.TransferID, fileName, fileType string,
 // SendNew handles the sending of the initial message informing the recipient
 // of the incoming file transfer parts. SendNew should block until the send
 // completes and return an error only on failed sends.
-type SendNew func(info *TransferInfo) error
+type SendNew func(transferInfo []byte) error
 
 // FileTransfer facilities the sending and receiving of large file transfers.
 // It allows for progress tracking of both inbound and outbound transfers.
@@ -151,8 +151,9 @@ type FileTransfer interface {
 	*/
 
 	// HandleIncomingTransfer starts tracking the received file parts for the
-	// given file information and returns a transfer ID that uniquely identifies
-	// this file transfer.
+	// given payload that contains the file transfer information and returns a
+	// transfer ID that uniquely identifies this file transfer along with the
+	// transfer information
 	//
 	// This function should be called once for every new file received on the
 	// registered SendNew callback.
@@ -160,15 +161,15 @@ type FileTransfer interface {
 	// In-progress transfers are restored when closing and reopening; however, a
 	// ReceivedProgressCallback must be registered again.
 	//
+	//   payload - A marshalled payload container the file transfer information.
 	//   progressCB - A callback that reports the progress of the file transfer.
 	//      The callback is called once on initialization, on every progress
 	//      update (or less if restricted by the period), or on fatal error.
 	//   period - A progress callback will be limited from triggering only once
 	//      per period.
-	HandleIncomingTransfer(fileName string, key *ftCrypto.TransferKey,
-		transferMAC []byte, numParts uint16, size uint32, retry float32,
+	HandleIncomingTransfer(transferInfo []byte,
 		progressCB ReceivedProgressCallback, period time.Duration) (
-		*ftCrypto.TransferID, error)
+		*ftCrypto.TransferID, *TransferInfo, error)
 
 	// RegisterReceivedProgressCallback allows for the registration of a
 	// callback to track the progress of an individual received file transfer.
@@ -198,15 +199,20 @@ type FileTransfer interface {
 	Receive(tid *ftCrypto.TransferID) ([]byte, error)
 }
 
+// SentTransfer tracks the information and individual parts of a sent file
+// transfer.
 type SentTransfer interface {
 	Recipient() *id.ID
 	Transfer
 }
 
+// ReceivedTransfer tracks the information and individual parts of a received
+// file transfer.
 type ReceivedTransfer interface {
 	Transfer
 }
 
+// Transfer is the generic structure for a file transfer.
 type Transfer interface {
 	TransferID() *ftCrypto.TransferID
 	FileName() string
diff --git a/fileTransfer2/manager.go b/fileTransfer2/manager.go
index 704ad22a2bd8814a2601791d02bf441de77bec9b..9e3ab112ba5ffb1f2ed26606decd58851011f68b 100644
--- a/fileTransfer2/manager.go
+++ b/fileTransfer2/manager.go
@@ -80,6 +80,7 @@ const (
 	errSendNetworkHealth = "cannot initiate file transfer of %q when network is not healthy."
 	errNewKey            = "could not generate new transfer key: %+v"
 	errNewID             = "could not generate new transfer ID: %+v"
+	errMarshalInfo       = "could not marshal transfer info: %+v"
 	errSendNewMsg        = "failed to send initial file transfer message: %+v"
 	errAddSentTransfer   = "failed to add transfer: %+v"
 
@@ -285,7 +286,11 @@ func (m *manager) Send(recipient *id.ID, fileName, fileType string,
 	// Send the initial file transfer message over E2E
 	info := &TransferInfo{
 		fileName, fileType, key, mac, numParts, fileSize, retry, preview}
-	err = sendNew(info)
+	transferInfo, err := info.Marshal()
+	if err != nil {
+		return nil, errors.Errorf(errMarshalInfo, err)
+	}
+	err = sendNew(transferInfo)
 	if err != nil {
 		return nil, errors.Errorf(errSendNewMsg, err)
 	}
@@ -385,31 +390,38 @@ func (m *manager) CloseSend(tid *ftCrypto.TransferID) error {
 
 /* === Receiving ============================================================ */
 
+const errUnmarshalInfo = "failed to unmarshal incoming transfer info: %+v"
+
 // HandleIncomingTransfer starts tracking the received file parts for the given
 // file information and returns a transfer ID that uniquely identifies this file
 // transfer.
-func (m *manager) HandleIncomingTransfer(fileName string,
-	key *ftCrypto.TransferKey, transferMAC []byte, numParts uint16, size uint32,
-	retry float32, progressCB ReceivedProgressCallback, period time.Duration) (
-	*ftCrypto.TransferID, error) {
+func (m *manager) HandleIncomingTransfer(transferInfo []byte,
+	progressCB ReceivedProgressCallback, period time.Duration) (
+	*ftCrypto.TransferID, *TransferInfo, error) {
+
+	// Unmarshal the payload
+	t, err := UnmarshalTransferInfo(transferInfo)
+	if err != nil {
+		return nil, nil, errors.Errorf(errUnmarshalInfo, err)
+	}
 
 	// Generate new transfer ID
 	rng := m.rng.GetStream()
 	tid, err := ftCrypto.NewTransferID(rng)
 	if err != nil {
 		rng.Close()
-		return nil, errors.Errorf(errNewRtTransferID, fileName, err)
+		return nil, nil, errors.Errorf(errNewRtTransferID, t.FileName, err)
 	}
 	rng.Close()
 
 	// Calculate the number of fingerprints based on the retry rate
-	numFps := calcNumberOfFingerprints(int(numParts), retry)
+	numFps := calcNumberOfFingerprints(int(t.NumParts), t.Retry)
 
 	// Store the transfer
 	rt, err := m.received.AddTransfer(
-		key, &tid, fileName, transferMAC, size, numParts, numFps)
+		&t.Key, &tid, t.FileName, t.Mac, t.Size, t.NumParts, numFps)
 	if err != nil {
-		return nil, errors.Errorf(errAddNewRt, tid, fileName, err)
+		return nil, nil, errors.Errorf(errAddNewRt, tid, t.FileName, err)
 	}
 
 	// Start tracking fingerprints for each file part
@@ -418,7 +430,7 @@ func (m *manager) HandleIncomingTransfer(fileName string,
 	// Register the progress callback
 	m.registerReceivedProgressCallback(rt, progressCB, period)
 
-	return &tid, nil
+	return &tid, t, nil
 }
 
 // Receive concatenates the received file and returns it. Only returns the file
diff --git a/fileTransfer2/manager_test.go b/fileTransfer2/manager_test.go
index 748c4f7ab9921f538f158a447f2befb78f0e0699..73d20143c4f47ebb0856c7cbf92df08dc9dd9e35 100644
--- a/fileTransfer2/manager_test.go
+++ b/fileTransfer2/manager_test.go
@@ -114,9 +114,9 @@ func Test_FileTransfer_Smoke(t *testing.T) {
 		t.Errorf("Failed to start processes for manager 2: %+v", err)
 	}
 
-	sendNewCbChan1 := make(chan *TransferInfo)
-	sendNewCb1 := func(info *TransferInfo) error {
-		sendNewCbChan1 <- info
+	sendNewCbChan1 := make(chan []byte)
+	sendNewCb1 := func(transferInfo []byte) error {
+		sendNewCbChan1 <- transferInfo
 		return nil
 	}
 
@@ -139,8 +139,7 @@ func Test_FileTransfer_Smoke(t *testing.T) {
 	go func() {
 		select {
 		case r := <-sendNewCbChan1:
-			tid, err := m2.HandleIncomingTransfer(
-				r.FileName, &r.Key, r.Mac, r.NumParts, r.Size, r.Retry, nil, 0)
+			tid, _, err := m2.HandleIncomingTransfer(r, nil, 0)
 			if err != nil {
 				t.Errorf("Failed to add transfer: %+v", err)
 			}
diff --git a/groupChat/groupStore/store.go b/groupChat/groupStore/store.go
index a49f763ab06732776deff80dd34e60c79ba288bc..f2372be86f92e454dcd06320658d4beb11d69e4e 100644
--- a/groupChat/groupStore/store.go
+++ b/groupChat/groupStore/store.go
@@ -251,7 +251,6 @@ func (s *Store) GroupIDs() []*id.ID {
 }
 
 // Groups returns a list of all groups.
-// TODO: add test
 func (s *Store) Groups() []Group {
 	s.mux.RLock()
 	defer s.mux.RUnlock()
diff --git a/groupChat/groupStore/store_test.go b/groupChat/groupStore/store_test.go
index 2f52d9a3106b9b032f48bee5815ca422241cac3a..a41439b730f46285f39f9a960e6fe6bd94bbce77 100644
--- a/groupChat/groupStore/store_test.go
+++ b/groupChat/groupStore/store_test.go
@@ -420,6 +420,32 @@ func TestStore_GroupIDs(t *testing.T) {
 	}
 }
 
+// Tests that Store.Groups returns a list with all the groups.
+func TestStore_Groups(t *testing.T) {
+	prng := rand.New(rand.NewSource(42))
+	store := Store{list: make(map[id.ID]Group, 10)}
+	expected := make([]Group, len(store.list))
+	for i := range expected {
+		grp := createTestGroup(prng, t)
+		expected[i] = grp
+		store.list[*grp.ID] = grp
+	}
+
+	groups := store.Groups()
+
+	sort.Slice(expected, func(i, j int) bool {
+		return bytes.Compare(expected[i].ID[:], expected[j].ID[:]) == -1
+	})
+	sort.Slice(groups, func(i, j int) bool {
+		return bytes.Compare(groups[i].ID[:], groups[j].ID[:]) == -1
+	})
+
+	if !reflect.DeepEqual(expected, groups) {
+		t.Errorf("List of Groups does not match expected."+
+			"\nexpected: %+v\nreceived: %+v", expected, groups)
+	}
+}
+
 // Unit test of Store.Get.
 func TestStore_Get(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
diff --git a/groupChat/makeGroup_test.go b/groupChat/makeGroup_test.go
index 7ccccf4fadd8996fa147107f0f65bf037c5e39ee..b08b9766a3f8397bb37e3c8f896f05c236849bc0 100644
--- a/groupChat/makeGroup_test.go
+++ b/groupChat/makeGroup_test.go
@@ -28,7 +28,7 @@ import (
 // Tests that manager.MakeGroup adds a group and returns the expected status.
 func Test_manager_MakeGroup(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 	memberIDs, members, dkl := addPartners(m, t)
 	name := []byte("groupName")
 	message := []byte("Invite message.")
@@ -78,7 +78,7 @@ func Test_manager_MakeGroup(t *testing.T) {
 // message is too large.
 func Test_manager_MakeGroup_MaxMessageSizeError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 	expectedErr := fmt.Sprintf(
 		maxInitMsgSizeErr, MaxInitMessageSize+1, MaxInitMessageSize)
 
@@ -98,7 +98,7 @@ func Test_manager_MakeGroup_MaxMessageSizeError(t *testing.T) {
 // membership list is too small.
 func Test_manager_MakeGroup_MembershipSizeError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 	expectedErr := fmt.Sprintf(
 		maxMembersErr, group.MaxParticipants+1, group.MaxParticipants)
 
@@ -119,7 +119,7 @@ func Test_manager_MakeGroup_MembershipSizeError(t *testing.T) {
 // a group failed because the user is a part of too many groups already.
 func Test_manager_MakeGroup_AddGroupError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, gs.MaxGroupChats, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, gs.MaxGroupChats, 0, nil, t)
 	memberIDs, _, _ := addPartners(m, t)
 	expectedErr := strings.SplitN(joinGroupErr, "%", 2)[0]
 
@@ -296,13 +296,13 @@ func addPartners(m *manager, t *testing.T) ([]*id.ID, group.Membership,
 		prng := rand.New(rand.NewSource(int64(i + 42)))
 		mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant)
 		mySIDHPubKey := util.NewSIDHPublicKey(myVariant)
-		mySIDHPrivKey.Generate(prng)
+		_ = mySIDHPrivKey.Generate(prng)
 		mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey)
 
 		theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB)
 		theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant)
 		theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant)
-		theirSIDHPrivKey.Generate(prng)
+		_ = theirSIDHPrivKey.Generate(prng)
 		theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey)
 
 		// Add to lists
diff --git a/groupChat/manager.go b/groupChat/manager.go
index ec194a1c52e8e7c42eea5074d45b5d112880f4ea..cdc8729065e8e90627b80a6d4d2bee151d9d2c82 100644
--- a/groupChat/manager.go
+++ b/groupChat/manager.go
@@ -13,9 +13,7 @@ import (
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/catalog"
 	"gitlab.com/elixxir/client/cmix"
-	"gitlab.com/elixxir/client/cmix/identity/receptionID"
 	"gitlab.com/elixxir/client/cmix/message"
-	"gitlab.com/elixxir/client/cmix/rounds"
 	"gitlab.com/elixxir/client/e2e"
 	"gitlab.com/elixxir/client/e2e/ratchet/partner"
 	"gitlab.com/elixxir/client/e2e/ratchet/partner/session"
@@ -26,7 +24,6 @@ import (
 	crypto "gitlab.com/elixxir/crypto/e2e"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/elixxir/crypto/group"
-	"gitlab.com/elixxir/primitives/format"
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
 	"sync"
@@ -88,9 +85,6 @@ type manager struct {
 	// Callback that is called when a new group request is received
 	requestFunc RequestCallback
 
-	// Callback that is called when a new group message is received
-	receiveFunc ReceiveCallback
-
 	receptionId *id.ID
 	net         GroupCmix
 	e2e         GroupE2e
@@ -101,7 +95,7 @@ type manager struct {
 // NewManager creates a new group chat manager
 func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID,
 	rng *fastRNG.StreamGenerator, grp *cyclic.Group, kv *versioned.KV,
-	requestFunc RequestCallback, receiveFunc ReceiveCallback) (GroupChat, error) {
+	requestFunc RequestCallback, receiveFunc Processor) (GroupChat, error) {
 
 	// Load the group chat storage or create one if one does not exist
 	gStore, err := gs.NewOrLoadStore(
@@ -115,7 +109,6 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID,
 		gs:          gStore,
 		services:    make(map[string]Processor),
 		requestFunc: requestFunc,
-		receiveFunc: receiveFunc,
 		receptionId: receptionId,
 		net:         services,
 		e2e:         e2e,
@@ -133,7 +126,7 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID,
 		return nil, err
 	}
 
-	err = m.AddService(defaultServiceTag, defaultService{m.receiveFunc})
+	err = m.AddService(defaultServiceTag, receiveFunc)
 	if err != nil {
 		return nil, errors.Errorf(errAddDefaultService, err)
 	}
@@ -197,17 +190,3 @@ func (m *manager) GetGroup(groupID *id.ID) (gs.Group, bool) {
 func (m *manager) NumGroups() int {
 	return m.gs.Len()
 }
-
-type defaultService struct {
-	// Callback that is called when a new group message is received
-	receiveFunc ReceiveCallback
-}
-
-func (d defaultService) Process(decryptedMsg MessageReceive, _ format.Message,
-	_ receptionID.EphemeralIdentity, _ rounds.Round) {
-	go d.receiveFunc(decryptedMsg)
-}
-
-func (d defaultService) String() string {
-	return defaultServiceTag
-}
diff --git a/groupChat/manager_test.go b/groupChat/manager_test.go
index 098bba443c78c9973eb207fd8df09e23b2883e36..374062ea83700854b222aaea55d70483304c8d30 100644
--- a/groupChat/manager_test.go
+++ b/groupChat/manager_test.go
@@ -9,11 +9,14 @@ package groupChat
 
 import (
 	"gitlab.com/elixxir/client/cmix"
+	"gitlab.com/elixxir/client/cmix/identity/receptionID"
+	"gitlab.com/elixxir/client/cmix/rounds"
 	"gitlab.com/elixxir/client/e2e"
 	gs "gitlab.com/elixxir/client/groupChat/groupStore"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/crypto/group"
 	"gitlab.com/elixxir/ekv"
+	"gitlab.com/elixxir/primitives/format"
 	"gitlab.com/xx_network/primitives/id"
 	"math/rand"
 	"reflect"
@@ -31,6 +34,14 @@ var _ GroupCmix = (cmix.Client)(nil)
 // Tests that GroupE2e adheres to the e2e.Handler interface.
 var _ GroupE2e = (e2e.Handler)(nil)
 
+type mockProcessor struct{ receiveChan chan MessageReceive }
+
+func (m mockProcessor) Process(msg MessageReceive, _ format.Message,
+	_ receptionID.EphemeralIdentity, _ rounds.Round) {
+	m.receiveChan <- msg
+}
+func (m mockProcessor) String() string { return "mockProcessor" }
+
 // Unit test of NewManager.
 func TestNewManager(t *testing.T) {
 	kv := versioned.NewKV(ekv.MakeMemstore())
@@ -41,9 +52,8 @@ func TestNewManager(t *testing.T) {
 	requestChan := make(chan gs.Group)
 	requestFunc := func(g gs.Group) { requestChan <- g }
 	receiveChan := make(chan MessageReceive)
-	receiveFunc := func(msg MessageReceive) { receiveChan <- msg }
-	gcInt, err := NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil, nil,
-		kv, requestFunc, receiveFunc)
+	gcInt, err := NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil,
+		nil, kv, requestFunc, mockProcessor{receiveChan})
 	if err != nil {
 		t.Errorf("NewManager returned an error: %+v", err)
 	}
@@ -67,14 +77,6 @@ func TestNewManager(t *testing.T) {
 	case <-time.NewTimer(5 * time.Millisecond).C:
 		t.Errorf("Timed out waiting for requestFunc to be called.")
 	}
-
-	// Check if receiveFunc works
-	go m.receiveFunc(MessageReceive{})
-	select {
-	case <-receiveChan:
-	case <-time.NewTimer(5 * time.Millisecond).C:
-		t.Errorf("Timed out waiting for receiveFunc to be called.")
-	}
 }
 
 // Tests that NewManager loads a group storage when it exists.
@@ -291,7 +293,7 @@ func TestNewManager_LoadError(t *testing.T) {
 // Unit test of manager.JoinGroup.
 func Test_manager_JoinGroup(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 	g := newTestGroup(m.grp, m.e2e.GetHistoricalDHPubkey(), prng, t)
 
 	err := m.JoinGroup(g)
@@ -307,7 +309,7 @@ func Test_manager_JoinGroup(t *testing.T) {
 // Error path: an error is returned when a group is joined twice.
 func Test_manager_JoinGroup_AddError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 	expectedErr := strings.SplitN(joinGroupErr, "%", 2)[0]
 
 	err := m.JoinGroup(g)
@@ -320,7 +322,7 @@ func Test_manager_JoinGroup_AddError(t *testing.T) {
 // Unit test of manager.LeaveGroup.
 func Test_manager_LeaveGroup(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	err := m.LeaveGroup(g.ID)
 	if err != nil {
@@ -335,7 +337,7 @@ func Test_manager_LeaveGroup(t *testing.T) {
 // Error path: an error is returned when no group with the ID exists.
 func Test_manager_LeaveGroup_NoGroupError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 	expectedErr := strings.SplitN(leaveGroupErr, "%", 2)[0]
 
 	err := m.LeaveGroup(id.NewIdFromString("invalidID", id.Group, t))
@@ -348,7 +350,7 @@ func Test_manager_LeaveGroup_NoGroupError(t *testing.T) {
 // Unit test of manager.GetGroups.
 func Test_manager_GetGroups(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	list := m.GetGroups()
 	for i, gid := range list {
@@ -366,7 +368,7 @@ func Test_manager_GetGroups(t *testing.T) {
 // Unit test of manager.GetGroup.
 func Test_manager_GetGroup(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	testGrp, exists := m.GetGroup(g.ID)
 	if !exists {
@@ -389,8 +391,7 @@ func Test_manager_GetGroup(t *testing.T) {
 // leaving each until the number left is 0.
 func Test_manager_NumGroups(t *testing.T) {
 	expectedNum := 10
-	m, _ := newTestManagerWithStore(rand.New(rand.NewSource(42)), expectedNum,
-		0, nil, nil, t)
+	m, _ := newTestManagerWithStore(rand.New(rand.NewSource(42)), expectedNum, 0, nil, t)
 
 	groups := append([]*id.ID{{}}, m.GetGroups()...)
 
diff --git a/groupChat/messageReceive.go b/groupChat/messageReceive.go
index fa883e73e052ea5c54d9ce0d9af5082073debe95..c605d7860b096d82411ef5d1ba2b3c9e1604968e 100644
--- a/groupChat/messageReceive.go
+++ b/groupChat/messageReceive.go
@@ -11,8 +11,6 @@ import (
 	"fmt"
 	"gitlab.com/elixxir/crypto/group"
 	"gitlab.com/xx_network/primitives/id"
-	"gitlab.com/xx_network/primitives/id/ephemeral"
-	"strconv"
 	"strings"
 	"time"
 )
@@ -20,15 +18,11 @@ import (
 // MessageReceive contains the GroupChat message and associated data that a user
 // receives when getting a group message.
 type MessageReceive struct {
-	GroupID        *id.ID
-	ID             group.MessageID
-	Payload        []byte
-	SenderID       *id.ID
-	RecipientID    *id.ID
-	EphemeralID    ephemeral.Id
-	Timestamp      time.Time
-	RoundID        id.Round
-	RoundTimestamp time.Time
+	GroupID   *id.ID
+	ID        group.MessageID
+	Payload   []byte
+	SenderID  *id.ID
+	Timestamp time.Time
 }
 
 // String returns the MessageReceive as readable text. This functions adheres to
@@ -49,21 +43,12 @@ func (mr MessageReceive) String() string {
 		senderID = mr.SenderID.String()
 	}
 
-	recipientID := "<nil>"
-	if mr.RecipientID != nil {
-		recipientID = mr.RecipientID.String()
-	}
-
 	str := []string{
 		"GroupID:" + groupID,
 		"ID:" + mr.ID.String(),
 		"Payload:" + payload,
 		"SenderID:" + senderID,
-		"RecipientID:" + recipientID,
-		"EphemeralID:" + strconv.FormatInt(mr.EphemeralID.Int64(), 10),
 		"Timestamp:" + mr.Timestamp.String(),
-		"RoundID:" + strconv.FormatUint(uint64(mr.RoundID), 10),
-		"RoundTimestamp:" + mr.RoundTimestamp.String(),
 	}
 
 	return "{" + strings.Join(str, " ") + "}"
diff --git a/groupChat/messageReceive_test.go b/groupChat/messageReceive_test.go
index 343f53774a08e59caed53a37d31a1a35f7047cd7..701890bcedd5476d529f3dd1d2e42a31e0e979ce 100644
--- a/groupChat/messageReceive_test.go
+++ b/groupChat/messageReceive_test.go
@@ -9,7 +9,6 @@ package groupChat
 import (
 	"gitlab.com/elixxir/crypto/group"
 	"gitlab.com/xx_network/primitives/id"
-	"gitlab.com/xx_network/primitives/id/ephemeral"
 	"testing"
 	"time"
 )
@@ -17,15 +16,11 @@ import (
 // Unit test of MessageReceive.String.
 func TestMessageReceive_String(t *testing.T) {
 	msg := MessageReceive{
-		GroupID:        id.NewIdFromString("GroupID", id.Group, t),
-		ID:             group.MessageID{0, 1, 2, 3},
-		Payload:        []byte("Group message."),
-		SenderID:       id.NewIdFromString("SenderID", id.User, t),
-		RecipientID:    id.NewIdFromString("RecipientID", id.User, t),
-		EphemeralID:    ephemeral.Id{0, 1, 2, 3},
-		Timestamp:      time.Date(1955, 11, 5, 12, 0, 0, 0, time.UTC),
-		RoundID:        42,
-		RoundTimestamp: time.Date(1955, 11, 5, 12, 1, 0, 0, time.UTC),
+		GroupID:   id.NewIdFromString("GroupID", id.Group, t),
+		ID:        group.MessageID{0, 1, 2, 3},
+		Payload:   []byte("Group message."),
+		SenderID:  id.NewIdFromString("SenderID", id.User, t),
+		Timestamp: time.Date(1955, 11, 5, 12, 0, 0, 0, time.UTC),
 	}
 
 	expected := "{" +
@@ -33,11 +28,7 @@ func TestMessageReceive_String(t *testing.T) {
 		"ID:AAECAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= " +
 		"Payload:\"Group message.\" " +
 		"SenderID:U2VuZGVySUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD " +
-		"RecipientID:UmVjaXBpZW50SUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD " +
-		"EphemeralID:141843442434048 " +
-		"Timestamp:" + msg.Timestamp.String() + " " +
-		"RoundID:42 " +
-		"RoundTimestamp:" + msg.RoundTimestamp.String() +
+		"Timestamp:" + msg.Timestamp.String() +
 		"}"
 
 	if msg.String() != expected {
@@ -56,11 +47,7 @@ func TestMessageReceive_String_NilMessageReceive(t *testing.T) {
 		"ID:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= " +
 		"Payload:<nil> " +
 		"SenderID:<nil> " +
-		"RecipientID:<nil> " +
-		"EphemeralID:0 " +
-		"Timestamp:0001-01-01 00:00:00 +0000 UTC " +
-		"RoundID:0 " +
-		"RoundTimestamp:0001-01-01 00:00:00 +0000 UTC" +
+		"Timestamp:0001-01-01 00:00:00 +0000 UTC" +
 		"}"
 
 	if msg.String() != expected {
diff --git a/groupChat/receive.go b/groupChat/receive.go
index ac25d9cf6891578e72ebc04cf1860238ec28298b..56f8d56fd76cb2461b0612ee3492812596463e89 100644
--- a/groupChat/receive.go
+++ b/groupChat/receive.go
@@ -72,23 +72,13 @@ func (p *receptionProcessor) Process(message format.Message,
 
 	// Populate remaining fields from the top level
 	result.GroupID = p.g.ID
-	result.RecipientID = receptionID.Source
-	result.EphemeralID = receptionID.EphId
-	result.RoundID = round.ID
-	result.RoundTimestamp = round.Timestamps[states.QUEUED]
 
 	jww.DEBUG.Printf("[GC] Received group message with ID %s from sender "+
 		"%s in group %q with ID %s at %s.", result.ID, result.SenderID,
 		p.g.Name, p.g.ID, result.Timestamp)
 
-	// Send the received message on the callback
-	go p.m.receiveFunc(result)
-
-	// Send the decrypted message and original message to the processor, if one
-	// is registered
-	if p.p != nil {
-		p.p.Process(result, message, receptionID, round)
-	}
+	// Send the decrypted message and original message to the processor
+	p.p.Process(result, message, receptionID, round)
 }
 
 func (p *receptionProcessor) String() string {
diff --git a/groupChat/receiveRequest_test.go b/groupChat/receiveRequest_test.go
index 3dc1f7232e5698c526a89363ee88f0aca23661fe..04ba441bf308d2e68ab20985630b36c2a65a4b00 100644
--- a/groupChat/receiveRequest_test.go
+++ b/groupChat/receiveRequest_test.go
@@ -27,7 +27,7 @@ func TestRequestListener_Hear(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
 	requestChan := make(chan gs.Group)
 	requestFunc := func(g gs.Group) { requestChan <- g }
-	m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, t)
 	g := newTestGroupWithUser(m.grp,
 		m.receptionId, m.e2e.GetHistoricalDHPubkey(),
 		m.e2e.GetHistoricalDHPrivkey(), prng, t)
@@ -54,13 +54,13 @@ func TestRequestListener_Hear(t *testing.T) {
 	myVariant := sidh.KeyVariantSidhA
 	mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant)
 	mySIDHPubKey := util.NewSIDHPublicKey(myVariant)
-	mySIDHPrivKey.Generate(prng)
+	_ = mySIDHPrivKey.Generate(prng)
 	mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey)
 
 	theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB)
 	theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant)
 	theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant)
-	theirSIDHPrivKey.Generate(prng)
+	_ = theirSIDHPrivKey.Generate(prng)
 	theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey)
 
 	_, _ = m.e2e.AddPartner(
@@ -91,7 +91,7 @@ func TestRequestListener_Hear_GroupExists(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
 	requestChan := make(chan gs.Group)
 	requestFunc := func(g gs.Group) { requestChan <- g }
-	m, g := newTestManagerWithStore(prng, 10, 0, requestFunc, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, requestFunc, t)
 
 	requestMarshaled, err := proto.Marshal(&Request{
 		Name:        g.Name,
@@ -127,7 +127,7 @@ func TestRequestListener_Hear_BadMessageType(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
 	requestChan := make(chan gs.Group)
 	requestFunc := func(g gs.Group) { requestChan <- g }
-	m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, t)
 
 	msg := receive.Message{
 		MessageType: catalog.NoType,
@@ -153,13 +153,13 @@ func Test_manager_readRequest(t *testing.T) {
 	myVariant := sidh.KeyVariantSidhA
 	mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant)
 	mySIDHPubKey := util.NewSIDHPublicKey(myVariant)
-	mySIDHPrivKey.Generate(prng)
+	_ = mySIDHPrivKey.Generate(prng)
 	mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey)
 
 	theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB)
 	theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant)
 	theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant)
-	theirSIDHPrivKey.Generate(prng)
+	_ = theirSIDHPrivKey.Generate(prng)
 	theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey)
 
 	_, _ = m.e2e.AddPartner(
diff --git a/groupChat/sendRequests_test.go b/groupChat/sendRequests_test.go
index 07d2ee5459db766450f63cc7f61195a8c9616643..b87e70adbe46899862a6f7ebd304df42076e50b2 100644
--- a/groupChat/sendRequests_test.go
+++ b/groupChat/sendRequests_test.go
@@ -26,7 +26,7 @@ import (
 // Tests that manager.ResendRequest sends all expected requests successfully.
 func Test_manager_ResendRequest(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	expected := &Request{
 		Name:        g.Name,
@@ -104,7 +104,7 @@ func Test_manager_ResendRequest(t *testing.T) {
 // ID exists.
 func Test_manager_ResendRequest_GetGroupError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 0, nil, t)
 	expectedErr := strings.SplitN(resendGroupIdErr, "%", 2)[0]
 
 	_, status, err := m.ResendRequest(id.NewIdFromString("invalidID", id.Group, t))
@@ -122,7 +122,7 @@ func Test_manager_ResendRequest_GetGroupError(t *testing.T) {
 // Tests that manager.sendRequests sends all expected requests successfully.
 func Test_manager_sendRequests(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	expected := &Request{
 		Name:        g.Name,
@@ -200,7 +200,7 @@ func Test_manager_sendRequests(t *testing.T) {
 // fail.
 func Test_manager_sendRequests_SendAllFail(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 1, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 1, nil, t)
 	expectedErr := fmt.Sprintf(sendRequestAllErr, len(g.Members)-1, "")
 
 	rounds, status, err := m.sendRequests(g)
@@ -229,7 +229,7 @@ func Test_manager_sendRequests_SendAllFail(t *testing.T) {
 // fail.
 func Test_manager_sendRequests_SendPartialSent(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 2, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 2, nil, t)
 	expectedErr := fmt.Sprintf(sendRequestPartialErr, (len(g.Members)-1)/2,
 		len(g.Members)-1, "")
 
@@ -270,7 +270,7 @@ func Test_manager_sendRequests_SendPartialSent(t *testing.T) {
 // Unit test of manager.sendRequest.
 func Test_manager_sendRequest(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	for i := range g.Members {
 		grp := m.grp
@@ -309,7 +309,7 @@ func Test_manager_sendRequest(t *testing.T) {
 // Error path: an error is returned when SendE2E fails
 func Test_manager_sendRequest_SendE2eError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	m, _ := newTestManagerWithStore(prng, 10, 1, nil, nil, t)
+	m, _ := newTestManagerWithStore(prng, 10, 1, nil, t)
 	expectedErr := strings.SplitN(sendE2eErr, "%", 2)[0]
 
 	recipientID := id.NewIdFromString("memberID", id.User, t)
diff --git a/groupChat/send_test.go b/groupChat/send_test.go
index c4551c3148438749a01b723832a727322759bc3c..bad4858985f742c681d090d92d5137b4e5bfd66f 100644
--- a/groupChat/send_test.go
+++ b/groupChat/send_test.go
@@ -26,14 +26,10 @@ import (
 )
 
 func Test_manager_Send(t *testing.T) {
-	receiveChan := make(chan MessageReceive, 100)
-	receiveFunc := func(msg MessageReceive) {
-		receiveChan <- msg
-	}
 	msgChan := make(chan MessageReceive, 10)
 
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 1, 0, nil, receiveFunc, t)
+	m, g := newTestManagerWithStore(prng, 1, 0, nil, t)
 	messageBytes := []byte("Group chat message.")
 	reception := &receptionProcessor{
 		m: m,
@@ -72,9 +68,6 @@ func Test_manager_Send(t *testing.T) {
 			if !bytes.Equal(result.Payload, messageBytes) {
 				t.Errorf("Payload mismatch")
 			}
-			if result.RoundID != roundId {
-				t.Errorf("Round mismatch")
-			}
 		}
 	}
 }
@@ -100,7 +93,7 @@ func TestGroup_newCmixMsg_InternalMsgSizeError(t *testing.T) {
 
 	// Create new test manager and Group
 	prng := rand.New(rand.NewSource(42))
-	m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
+	m, g := newTestManagerWithStore(prng, 10, 0, nil, t)
 
 	// Create test parameters
 	testMsg := make([]byte, 1500)
diff --git a/groupChat/service.go b/groupChat/service.go
index fd38102a3803a7f50df38cff5867882adc33789e..49513df68ebe46270edd6a1e8ae2f6b4cb3397b2 100644
--- a/groupChat/service.go
+++ b/groupChat/service.go
@@ -28,10 +28,11 @@ func (m *manager) AddService(tag string, p Processor) error {
 	m.servicesMux.Lock()
 	defer m.servicesMux.Unlock()
 
-	// Add the service to the list
 	if _, exists := m.services[tag]; exists {
+		// Return an error if the service already exists
 		return errors.Errorf(errServiceExists, tag)
 	} else {
+		// Add the service to the list
 		m.services[tag] = p
 	}
 
diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go
index 94d909dcfcbb2e46a06b0f2ba2ae510bc1c287bb..7b9778e10938f4d626594543ad7f609c704702f5 100644
--- a/groupChat/utils_test.go
+++ b/groupChat/utils_test.go
@@ -69,13 +69,11 @@ func newTestManager(rng *rand.Rand, t *testing.T) (*manager, gs.Group) {
 // newTestManager creates a new manager that has groups stored for testing. One
 // of the groups in the list is also returned.
 func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int,
-	requestFunc RequestCallback, receiveFunc ReceiveCallback,
-	t *testing.T) (*manager, gs.Group) {
+	requestFunc RequestCallback, t *testing.T) (*manager, gs.Group) {
 
 	m := &manager{
 		services:    make(map[string]Processor),
 		requestFunc: requestFunc,
-		receiveFunc: receiveFunc,
 		receptionId: id.NewIdFromString("test", id.User, t),
 		net:         newTestNetworkManager(sendErr, t),
 		e2e: &testE2eManager{
@@ -224,7 +222,7 @@ func getGroup() *cyclic.Group {
 		large.NewIntFromString(getNDF().E2E.Generator, 16))
 }
 
-func newTestNetworkManager(sendErr int, t *testing.T) GroupCmix {
+func newTestNetworkManager(sendErr int, _ *testing.T) GroupCmix {
 	return &testNetworkManager{
 		receptionMessages: [][]format.Message{},
 		sendMessages:      [][]cmix.TargetedCmixMessage{},
@@ -249,9 +247,9 @@ type testE2eMessage struct {
 	Payload   []byte
 }
 
-func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int,
-	partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey,
-	sendParams, receiveParams session.Params) (partner.Manager, error) {
+func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey,
+	myPrivKey *cyclic.Int, _ *sidh.PublicKey, _ *sidh.PrivateKey,
+	_, _ session.Params) (partner.Manager, error) {
 
 	testPartner := partner.NewTestManager(partnerID, partnerPubKey, myPrivKey, &testing.T{})
 	tnm.partners[*partnerID] = testPartner
@@ -259,8 +257,8 @@ func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey
 }
 
 func (tnm *testE2eManager) GetPartner(partnerID *id.ID) (partner.Manager, error) {
-	if partner, ok := tnm.partners[*partnerID]; ok {
-		return partner, nil
+	if p, ok := tnm.partners[*partnerID]; ok {
+		return p, nil
 	}
 	return nil, errors.New("Unable to find partner")
 }
@@ -273,7 +271,9 @@ func (tnm *testE2eManager) GetHistoricalDHPrivkey() *cyclic.Int {
 	return tnm.dhPubKey
 }
 
-func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time, error) {
+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()
 
@@ -292,11 +292,11 @@ func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, pay
 	return []id.Round{0, 1, 2, 3}, e2e.MessageID{}, time.Time{}, nil
 }
 
-func (*testE2eManager) RegisterListener(user *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID {
+func (*testE2eManager) RegisterListener(*id.ID, catalog.MessageType, receive.Listener) receive.ListenerID {
 	return receive.ListenerID{}
 }
 
-func (*testE2eManager) AddService(tag string, processor message.Processor) error {
+func (*testE2eManager) AddService(string, message.Processor) error {
 	return nil
 }
 
@@ -328,7 +328,7 @@ func (tnm *testNetworkManager) GetMaxMessageLength() int {
 	return format.NewMessage(tnm.grp.GetP().ByteLen()).ContentsSize()
 }
 
-func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (id.Round, []ephemeral.Id, error) {
+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")
 	}
@@ -338,7 +338,7 @@ func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p c
 
 	tnm.sendMessages = append(tnm.sendMessages, messages)
 
-	receiveMessages := []format.Message{}
+	var receiveMessages []format.Message
 	for _, msg := range messages {
 		receiveMsg := format.NewMessage(tnm.grp.GetP().ByteLen())
 		receiveMsg.SetMac(msg.Mac)
@@ -350,13 +350,8 @@ func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p c
 	return 0, nil, nil
 }
 
-func (*testNetworkManager) AddService(clientID *id.ID, newService message.Service, response message.Processor) {
-	return
-}
-
-func (*testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Service, processor message.Processor) {
-	return
-}
+func (*testNetworkManager) AddService(*id.ID, message.Service, message.Processor)    {}
+func (*testNetworkManager) DeleteService(*id.ID, message.Service, message.Processor) {}
 
 type dummyEventMgr struct{}