diff --git a/groupChat/group.go b/groupChat/group.go
index 8878a62cdf750823bd4c886fbfbfdca1ac81c13d..c9c408e0d9afe2dfe8bf5be22b3e86eea15730ed 100644
--- a/groupChat/group.go
+++ b/groupChat/group.go
@@ -20,6 +20,7 @@
 package groupChat
 
 import (
+	"gitlab.com/elixxir/client/cmix/message"
 	gs "gitlab.com/elixxir/client/groupChat/groupStore"
 	"gitlab.com/xx_network/primitives/id"
 	"time"
@@ -63,6 +64,15 @@ type GroupChat interface {
 
 	// NumGroups returns the number of groups the user is a part of.
 	NumGroups() int
+
+	/* ===== Services ======================================================= */
+
+	// AddService adds a service for all group chat partners of the given tag,
+	// which will call back on the given processor.
+	AddService(tag string, processor message.Processor) error
+
+	// RemoveService removes all services for the given tag.
+	RemoveService(tag string) error
 }
 
 // RequestCallback is called when a GroupChat request is received.
diff --git a/groupChat/groupStore/group.go b/groupChat/groupStore/group.go
index 28b9555e367cf7f761dd437de792bac97fc6789b..2c7d3e91739af0494f74316fac517b937cd86e86 100644
--- a/groupChat/groupStore/group.go
+++ b/groupChat/groupStore/group.go
@@ -244,17 +244,17 @@ func (g Group) GoString() string {
 		idString = g.ID.String()
 	}
 
-	str := make([]string, 9)
-
-	str[0] = "Name:" + fmt.Sprintf("%q", g.Name)
-	str[1] = "ID:" + idString
-	str[2] = "Key:" + g.Key.String()
-	str[3] = "IdPreimage:" + g.IdPreimage.String()
-	str[4] = "KeyPreimage:" + g.KeyPreimage.String()
-	str[5] = "InitMessage:" + fmt.Sprintf("%q", g.InitMessage)
-	str[6] = "Created:" + g.Created.String()
-	str[7] = "Members:" + g.Members.String()
-	str[8] = "DhKeys:" + g.DhKeys.GoString()
+	str := []string{
+		"Name:" + fmt.Sprintf("%q", g.Name),
+		"ID:" + idString,
+		"Key:" + g.Key.String(),
+		"IdPreimage:" + g.IdPreimage.String(),
+		"KeyPreimage:" + g.KeyPreimage.String(),
+		"InitMessage:" + fmt.Sprintf("%q", g.InitMessage),
+		"Created:" + g.Created.String(),
+		"Members:" + g.Members.String(),
+		"DhKeys:" + g.DhKeys.GoString(),
+	}
 
 	return "{" + strings.Join(str, ", ") + "}"
 }
diff --git a/groupChat/groupStore/group_test.go b/groupChat/groupStore/group_test.go
index 2da1e2868991259142ec74cef049f9e9acd1035f..047df74bc3981ef0b3f7b107c5c57fe87dac3ed6 100644
--- a/groupChat/groupStore/group_test.go
+++ b/groupChat/groupStore/group_test.go
@@ -104,7 +104,7 @@ func TestGroup_DeepCopy(t *testing.T) {
 
 // Unit test of Group.store.
 func TestGroup_store(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	g := createTestGroup(rand.New(rand.NewSource(42)), t)
 
 	err := g.store(kv)
@@ -130,7 +130,7 @@ func TestGroup_store(t *testing.T) {
 
 // Unit test of Group.loadGroup.
 func Test_loadGroup(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	g := createTestGroup(rand.New(rand.NewSource(42)), t)
 
 	err := g.store(kv)
@@ -151,7 +151,7 @@ func Test_loadGroup(t *testing.T) {
 
 // Error path: an error is returned when no group with the ID exists in storage.
 func Test_loadGroup_InvalidGroupIdError(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	g := createTestGroup(rand.New(rand.NewSource(42)), t)
 	expectedErr := strings.SplitN(kvGetGroupErr, "%", 2)[0]
 
@@ -164,7 +164,7 @@ func Test_loadGroup_InvalidGroupIdError(t *testing.T) {
 
 // Unit test of Group.removeGroup.
 func Test_removeGroup(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	g := createTestGroup(rand.New(rand.NewSource(42)), t)
 
 	err := g.store(kv)
diff --git a/groupChat/groupStore/store_test.go b/groupChat/groupStore/store_test.go
index e19b3928bd26eeffa17c040b973965f64927dfa5..2f52d9a3106b9b032f48bee5815ca422241cac3a 100644
--- a/groupChat/groupStore/store_test.go
+++ b/groupChat/groupStore/store_test.go
@@ -24,7 +24,7 @@ import (
 // Unit test of NewStore.
 func TestNewStore(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	expectedStore := &Store{
@@ -90,7 +90,7 @@ func TestNewStore(t *testing.T) {
 
 func TestNewOrLoadStore(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewOrLoadStore(kv, user)
@@ -126,7 +126,7 @@ func TestNewOrLoadStore(t *testing.T) {
 // Unit test of LoadStore.
 func TestLoadStore(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewStore(kv, user)
@@ -162,7 +162,7 @@ func TestLoadStore(t *testing.T) {
 // Error path: show that LoadStore returns an error when no group store can be
 // found in storage.
 func TestLoadStore_GetError(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(rand.New(rand.NewSource(42)))
 	expectedErr := strings.SplitN(kvGetGroupListErr, "%", 2)[0]
 
@@ -177,7 +177,7 @@ func TestLoadStore_GetError(t *testing.T) {
 // Error path: show that loadStore returns an error when no group can be found
 // in storage.
 func Test_loadStore_GetGroupError(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(rand.New(rand.NewSource(42)))
 	var idList []byte
 	for i := 0; i < 10; i++ {
@@ -249,7 +249,7 @@ func TestStore_Len(t *testing.T) {
 // Unit test of Store.Add.
 func TestStore_Add(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewStore(kv, user)
@@ -281,7 +281,7 @@ func TestStore_Add(t *testing.T) {
 // groups.
 func TestStore_Add_MapFullError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 	expectedErr := strings.SplitN(maxGroupsErr, "%", 2)[0]
 
@@ -309,7 +309,7 @@ func TestStore_Add_MapFullError(t *testing.T) {
 // that is already in the map.
 func TestStore_Add_GroupExistsError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 	expectedErr := strings.SplitN(groupExistsErr, "%", 2)[0]
 
@@ -334,7 +334,7 @@ func TestStore_Add_GroupExistsError(t *testing.T) {
 // Unit test of Store.Remove.
 func TestStore_Remove(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewStore(kv, user)
@@ -374,7 +374,7 @@ func TestStore_Remove(t *testing.T) {
 // given ID is found in the map.
 func TestStore_Remove_RemoveGroupNotInMemoryError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 	expectedErr := strings.SplitN(groupRemoveErr, "%", 2)[0]
 
@@ -423,7 +423,7 @@ func TestStore_GroupIDs(t *testing.T) {
 // Unit test of Store.Get.
 func TestStore_Get(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewStore(kv, user)
@@ -451,7 +451,7 @@ func TestStore_Get(t *testing.T) {
 
 // Error path: shows that Store.Get return false if no group is found.
 func TestStore_Get_NoGroupError(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(rand.New(rand.NewSource(42)))
 
 	store, err := NewStore(kv, user)
@@ -469,7 +469,7 @@ func TestStore_Get_NoGroupError(t *testing.T) {
 // Unit test of Store.GetByKeyFp.
 func TestStore_GetByKeyFp(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewStore(kv, user)
@@ -502,7 +502,7 @@ func TestStore_GetByKeyFp(t *testing.T) {
 // Error path: shows that Store.GetByKeyFp return false if no group is found.
 func TestStore_GetByKeyFp_NoGroupError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(prng)
 
 	store, err := NewStore(kv, user)
@@ -523,7 +523,7 @@ func TestStore_GetByKeyFp_NoGroupError(t *testing.T) {
 
 // Unit test of Store.GetUser.
 func TestStore_GetUser(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := randMember(rand.New(rand.NewSource(42)))
 
 	store, err := NewStore(kv, user)
@@ -539,7 +539,7 @@ func TestStore_GetUser(t *testing.T) {
 
 // Unit test of Store.SetUser.
 func TestStore_SetUser(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	prng := rand.New(rand.NewSource(42))
 	oldUser := randMember(prng)
 	newUser := randMember(prng)
diff --git a/groupChat/makeGroup.go b/groupChat/makeGroup.go
index 32be2b8318562da54cf0841cdda018aa411db58d..dbf78d21d2b2286f2fa290c370d6693506d6393e 100644
--- a/groupChat/makeGroup.go
+++ b/groupChat/makeGroup.go
@@ -81,7 +81,7 @@ func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group,
 	g := gs.NewGroup(
 		name, groupID, groupKey, idPreimage, keyPreimage, msg, created, mem, dkl)
 
-	jww.DEBUG.Printf("Created new group %q with ID %s and %d members %s",
+	jww.DEBUG.Printf("[GC] Created new group %q with ID %s and %d members %s",
 		g.Name, g.ID, len(g.Members), g.Members)
 
 	// Send all group requests
diff --git a/groupChat/manager.go b/groupChat/manager.go
index 19c4de8bbca37c62fb7284e9c52701b865f7abba..a2572b0f9e9362a1a7e1698d783b1b71ba9972de 100644
--- a/groupChat/manager.go
+++ b/groupChat/manager.go
@@ -104,7 +104,8 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID,
 	}
 
 	// Register listener for incoming e2e group chat requests
-	e2e.RegisterListener(&id.ZeroUser, catalog.GroupCreationRequest, &requestListener{m: m})
+	e2e.RegisterListener(
+		&id.ZeroUser, catalog.GroupCreationRequest, &requestListener{m})
 
 	// Register notifications listener for incoming e2e group chat requests
 	err = e2e.AddService(catalog.GroupRq, nil)
@@ -116,7 +117,7 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID,
 	for _, gId := range m.GetGroups() {
 		g, exists := m.GetGroup(gId)
 		if !exists {
-			jww.WARN.Printf("Unexpected failure to locate GroupID %s", gId.String())
+			jww.WARN.Printf("[GC] Unexpected failure to locate GroupID %s", gId)
 			continue
 		}
 
@@ -135,7 +136,7 @@ func (m Manager) JoinGroup(g gs.Group) error {
 	}
 
 	m.joinGroup(g)
-	jww.DEBUG.Printf("Joined group %q with ID %s.", g.Name, g.ID)
+	jww.INFO.Printf("[GC] Joined group %q with ID %s.", g.Name, g.ID)
 	return nil
 }
 
@@ -146,7 +147,7 @@ func (m Manager) joinGroup(g gs.Group) {
 		Tag:        catalog.Group,
 		Metadata:   g.ID[:],
 	}
-	m.services.AddService(m.receptionId, newService, &receptionProcessor{m: &m, g: g})
+	m.services.AddService(m.receptionId, newService, &receptionProcessor{&m, g})
 }
 
 // LeaveGroup removes a group from a list of groups the user is a part of.
@@ -161,20 +162,20 @@ func (m Manager) LeaveGroup(groupID *id.ID) error {
 	}
 	m.services.DeleteService(m.receptionId, delService, nil)
 
-	jww.DEBUG.Printf("Left group with ID %s.", groupID)
+	jww.INFO.Printf("[GC] Left group with ID %s.", groupID)
 	return nil
 }
 
 // GetGroups returns a list of all registered groupChat IDs.
 func (m Manager) GetGroups() []*id.ID {
-	jww.DEBUG.Print("Getting list of all groups.")
+	jww.DEBUG.Print("[GC] Getting list of all groups.")
 	return m.gs.GroupIDs()
 }
 
 // GetGroup returns the group with the matching ID or returns false if none
 // exist.
 func (m Manager) GetGroup(groupID *id.ID) (gs.Group, bool) {
-	jww.DEBUG.Printf("Getting group with ID %s.", groupID)
+	jww.DEBUG.Printf("[GC] Getting group with ID %s.", groupID)
 	return m.gs.Get(groupID)
 }
 
diff --git a/groupChat/manager_test.go b/groupChat/manager_test.go
index db891b387280540bf2d27b2a4f4c7e25da41d98e..95eb620337bc040dd53543c809b2d005211b4490 100644
--- a/groupChat/manager_test.go
+++ b/groupChat/manager_test.go
@@ -22,7 +22,7 @@ import (
 
 // Unit test of Manager.newManager.
 func Test_newManager(t *testing.T) {
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := group.Member{
 		ID:    id.NewIdFromString("userID", id.User, t),
 		DhKey: randCycInt(rand.New(rand.NewSource(42))),
@@ -66,7 +66,7 @@ func Test_newManager(t *testing.T) {
 // Tests that Manager.newManager loads a group storage when it exists.
 func Test_newManager_LoadStorage(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := group.Member{
 		ID:    id.NewIdFromString("userID", id.User, t),
 		DhKey: randCycInt(rand.New(rand.NewSource(42))),
@@ -98,7 +98,7 @@ func Test_newManager_LoadStorage(t *testing.T) {
 // Error path: an error is returned when a group cannot be loaded from storage.
 func Test_newManager_LoadError(t *testing.T) {
 	prng := rand.New(rand.NewSource(42))
-	kv := versioned.NewKV(make(ekv.Memstore))
+	kv := versioned.NewKV(ekv.MakeMemstore())
 	user := group.Member{
 		ID:    id.NewIdFromString("userID", id.User, t),
 		DhKey: randCycInt(rand.New(rand.NewSource(42))),
diff --git a/groupChat/messageReceive.go b/groupChat/messageReceive.go
index e607e7f01fcd1aa2e6bb4cee11356e3ea71814f5..fa883e73e052ea5c54d9ce0d9af5082073debe95 100644
--- a/groupChat/messageReceive.go
+++ b/groupChat/messageReceive.go
@@ -31,7 +31,7 @@ type MessageReceive struct {
 	RoundTimestamp time.Time
 }
 
-// String returns the MessageReceive as readable text. This functions satisfies
+// String returns the MessageReceive as readable text. This functions adheres to
 // the fmt.Stringer interface.
 func (mr MessageReceive) String() string {
 	groupID := "<nil>"
@@ -54,16 +54,17 @@ func (mr MessageReceive) String() string {
 		recipientID = mr.RecipientID.String()
 	}
 
-	str := make([]string, 0, 9)
-	str = append(str, "GroupID:"+groupID)
-	str = append(str, "ID:"+mr.ID.String())
-	str = append(str, "Payload:"+payload)
-	str = append(str, "SenderID:"+senderID)
-	str = append(str, "RecipientID:"+recipientID)
-	str = append(str, "EphemeralID:"+strconv.FormatInt(mr.EphemeralID.Int64(), 10))
-	str = append(str, "Timestamp:"+mr.Timestamp.String())
-	str = append(str, "RoundID:"+strconv.FormatUint(uint64(mr.RoundID), 10))
-	str = append(str, "RoundTimestamp:"+mr.RoundTimestamp.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/receive.go b/groupChat/receive.go
index 244883cc33dd95d2164196adeaffaf6f03b71833..e9682b119b72b9f25c67358323a051cafe1d7835 100644
--- a/groupChat/receive.go
+++ b/groupChat/receive.go
@@ -26,7 +26,7 @@ const (
 	newDecryptKeyErr        = "failed to generate key for decrypting group payload: %+v"
 	unmarshalInternalMsgErr = "failed to unmarshal group internal message: %+v"
 	unmarshalSenderIdErr    = "failed to unmarshal sender ID: %+v"
-	unmarshalPublicMsgErr   = "failed to unmarshal group cMix message contents: %+v"
+	unmarshalPublicMsgErr   = "[GC] Failed to unmarshal group cMix message contents: %+v"
 	genCryptKeyMacErr       = "failed to generate encryption key for group " +
 		"cMix message because MAC verification failed (epoch %d could be off)"
 )
@@ -38,29 +38,30 @@ type receptionProcessor struct {
 }
 
 // Process incoming group chat messages
-func (p *receptionProcessor) Process(message format.Message, receptionID receptionID.EphemeralIdentity, round rounds.Round) {
-	jww.TRACE.Print("Group message reception received cMix message.")
+func (p *receptionProcessor) Process(message format.Message,
+	receptionID receptionID.EphemeralIdentity, round rounds.Round) {
+	jww.TRACE.Print("[GC] Group message reception received cMix message.")
 	// Attempt to read the message
 	roundTimestamp := round.Timestamps[states.QUEUED]
 
 	// Unmarshal cMix message contents to get public message format
 	pubMsg, err := unmarshalPublicMsg(message.GetContents())
 	if err != nil {
-		jww.WARN.Printf("Failed to unmarshal: %+v", errors.Errorf(unmarshalPublicMsgErr, err))
+		jww.WARN.Printf(unmarshalPublicMsgErr, err)
 	}
 
 	// Obtain the cryptKey for the public message
 	key, err := getCryptKey(p.g.Key, pubMsg.GetSalt(), message.GetMac(),
 		pubMsg.GetPayload(), p.g.DhKeys, roundTimestamp)
 	if err != nil {
-		jww.WARN.Printf("Unable to getCryptKey: %+v", err)
+		jww.WARN.Printf("[GC] Unable to getCryptKey: %+v", err)
 		return
 	}
 
 	// Decrypt the message payload using the cryptKey
 	result, err := decryptMessage(p.g, message.GetKeyFP(), key, pubMsg.GetPayload())
 	if err != nil {
-		jww.WARN.Printf("Group message reception failed to read "+
+		jww.WARN.Printf("[GC] Group message reception failed to read "+
 			"cMix message: %+v", err)
 		return
 	}
@@ -71,9 +72,9 @@ func (p *receptionProcessor) Process(message format.Message, receptionID recepti
 	result.RoundID = round.ID
 	result.RoundTimestamp = roundTimestamp
 
-	jww.DEBUG.Printf("Received group message with ID %s from sender "+
-		"%s in group %s with ID %s at %s.", result.ID, result.SenderID, p.g.Name,
-		p.g.ID, result.Timestamp)
+	jww.DEBUG.Printf("[GC] Received group message with ID %s from sender "+
+		"%s in group %s with ID %s at %s.", result.ID, result.SenderID,
+		p.g.Name, p.g.ID, result.Timestamp)
 
 	// If the message was read correctly, send it to the callback
 	p.m.receiveFunc(result)
@@ -85,8 +86,8 @@ func (p *receptionProcessor) String() string {
 
 // decryptMessage decrypts the group message payload and returns its message ID,
 // timestamp, sender ID, and message contents.
-func decryptMessage(g gs.Group, fingerprint format.Fingerprint, key group.CryptKey, payload []byte) (
-	MessageReceive, error) {
+func decryptMessage(g gs.Group, fingerprint format.Fingerprint,
+	key group.CryptKey, payload []byte) (MessageReceive, error) {
 
 	// Decrypt internal message
 	decryptedPayload := group.Decrypt(key, fingerprint, payload)
diff --git a/groupChat/receiveRequest.go b/groupChat/receiveRequest.go
index 0d2224cbbcba375da4f440224c16b9d03e507eb5..a2e648d8befc6ecb242743828cd374c99b67fd20 100644
--- a/groupChat/receiveRequest.go
+++ b/groupChat/receiveRequest.go
@@ -32,20 +32,21 @@ type requestListener struct {
 
 // Hear waits for new group requests to arrive
 func (l *requestListener) Hear(item receive.Message) {
-	jww.DEBUG.Print("Group message request received message.")
+	jww.DEBUG.Print("[GC] Group message request received message.")
 
 	// Generate the group from the request message
 	g, err := l.m.readRequest(item)
 	if err != nil {
-		jww.WARN.Printf("Failed to read message as group request: %+v", err)
+		jww.WARN.Printf(
+			"[GC] Failed to read message as group request: %+v", err)
 		return
 	}
 
 	// Call request callback with the new group if it does not already
 	// exist
 	if _, exists := l.m.GetGroup(g.ID); !exists {
-		jww.DEBUG.Printf("Received group request for "+
-			"group %s with ID %s.", g.Name, g.ID)
+		jww.INFO.Printf(
+			"[GC] Received group request for group %s with ID %s.", g.Name, g.ID)
 
 		l.m.requestFunc(g)
 	}
diff --git a/groupChat/send.go b/groupChat/send.go
index 64796dd35111424ff438b5ce2b6d7f721cb2083d..95dc2bb2b9f9c690c004c6f5780ecfedd685d2f2 100644
--- a/groupChat/send.go
+++ b/groupChat/send.go
@@ -36,9 +36,10 @@ const (
 	saltReadLengthErr = "length of generated salt %d != %d required"
 )
 
-// Send sends a message to all group members using Client.SendManyCMIX.
+// Send sends a message to all group members using Client.SendMany.
 // The send fails if the message is too long.
-func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, group.MessageID, error) {
+func (m *Manager) Send(groupID *id.ID, message []byte) (
+	id.Round, time.Time, group.MessageID, error) {
 
 	// Get the relevant group
 	g, exists := m.GetGroup(groupID)
@@ -47,17 +48,19 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, gro
 			errors.Errorf(newNoGroupErr, groupID)
 	}
 
-	// get the current time stripped of the monotonic clock
+	// Get the current time stripped of the monotonic clock
 	timeNow := netTime.Now().Round(0)
 
 	// Create a cMix message for each group member
 	groupMessages, err := m.newMessages(g, message, timeNow)
 	if err != nil {
-		return 0, time.Time{}, group.MessageID{}, errors.Errorf(newCmixMsgErr, err)
+		return 0, time.Time{}, group.MessageID{},
+			errors.Errorf(newCmixMsgErr, err)
 	}
 
 	// Obtain message ID
-	msgId, err := getGroupMessageId(m.grp, groupID, m.receptionId, timeNow, message)
+	msgId, err := getGroupMessageId(
+		m.grp, groupID, m.receptionId, timeNow, message)
 	if err != nil {
 		return 0, time.Time{}, group.MessageID{}, err
 	}
@@ -71,12 +74,13 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, gro
 			errors.Errorf(sendManyCmixErr, m.receptionId, groupID, err)
 	}
 
-	jww.DEBUG.Printf("Sent message to %d members in group %s at %s.",
+	jww.DEBUG.Printf("[GC] Sent message to %d members in group %s at %s.",
 		len(groupMessages), groupID, timeNow)
 	return rid, timeNow, msgId, nil
 }
 
-// newMessages quickly builds messages for all group chat members in multiple threads
+// newMessages quickly builds messages for all group chat members in multiple
+// threads.
 func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) (
 	[]cmix.TargetedCmixMessage, error) {
 
@@ -93,7 +97,8 @@ func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) (
 		}
 
 		// Add cMix message to list
-		cMixMsg, err := newCmixMsg(g, msg, timestamp, member, rng, m.receptionId, m.services.GetMaxMessageLength())
+		cMixMsg, err := newCmixMsg(g, msg, timestamp, member, rng,
+			m.receptionId, m.services.GetMaxMessageLength())
 		if err != nil {
 			return nil, err
 		}
@@ -104,8 +109,9 @@ func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) (
 }
 
 // newCmixMsg generates a new cMix message to be sent to a group member.
-func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time,
-	mem group.Member, rng io.Reader, senderId *id.ID, maxCmixMessageSize int) (cmix.TargetedCmixMessage, error) {
+func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, mem group.Member,
+	rng io.Reader, senderId *id.ID, maxCmixMessageSize int) (
+	cmix.TargetedCmixMessage, error) {
 
 	// Initialize targeted message
 	cmixMsg := cmix.TargetedCmixMessage{
@@ -160,13 +166,16 @@ func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time,
 }
 
 // Build the group message ID
-func getGroupMessageId(grp *cyclic.Group, groupId, senderId *id.ID, timestamp time.Time, msg []byte) (group.MessageID, error) {
+func getGroupMessageId(grp *cyclic.Group, groupId, senderId *id.ID,
+	timestamp time.Time, msg []byte) (group.MessageID, error) {
 	cmixMsg := format.NewMessage(grp.GetP().ByteLen())
 	_, intlMsg, err := newMessageParts(cmixMsg.ContentsSize())
 	if err != nil {
-		return group.MessageID{}, errors.WithMessage(err, "Failed to make message parts for message ID")
+		return group.MessageID{}, errors.WithMessage(err,
+			"Failed to make message parts for message ID")
 	}
-	return group.NewMessageID(groupId, setInternalPayload(intlMsg, timestamp, senderId, msg)), nil
+	return group.NewMessageID(groupId,
+		setInternalPayload(intlMsg, timestamp, senderId, msg)), nil
 }
 
 // newMessageParts generates a public payload message and the internal payload
diff --git a/groupChat/sendRequests.go b/groupChat/sendRequests.go
index dba1231cde58c38d7159daadce4f7589369c2a0a..1d31cf837ff179f24bad6a7c31e3db3b9300e76b 100644
--- a/groupChat/sendRequests.go
+++ b/groupChat/sendRequests.go
@@ -36,7 +36,7 @@ func (m Manager) ResendRequest(groupID *id.ID) ([]id.Round, RequestStatus, error
 		return nil, NotSent, errors.Errorf(resendGroupIdErr, groupID)
 	}
 
-	jww.DEBUG.Printf("Resending group requests for group %s.", groupID)
+	jww.INFO.Printf("[GC] Resending group requests for group %s.", groupID)
 
 	return m.sendRequests(g)
 }
@@ -106,7 +106,8 @@ func (m Manager) sendRequests(g gs.Group) ([]id.Round, RequestStatus, error) {
 				strings.Join(errs, "\n"))
 	}
 
-	jww.DEBUG.Printf("Sent group request to %d members in group %q with ID %s.",
+	jww.DEBUG.Printf(
+		"[GC] Sent group request to %d members in group %q with ID %s.",
 		len(g.Members), g.Name, g.ID)
 
 	// If all sends succeeded, return a list of roundIDs
@@ -119,7 +120,8 @@ func (m Manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error
 	p.LastServiceTag = catalog.GroupRq
 	p.DebugTag = "group.Request"
 
-	rounds, _, _, err := m.e2e.SendE2E(catalog.GroupCreationRequest, memberID, request, p)
+	rounds, _, _, err := m.e2e.SendE2E(
+		catalog.GroupCreationRequest, memberID, request, p)
 	if err != nil {
 		return nil, errors.Errorf(sendE2eErr, memberID, err)
 	}
diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go
index 002dbb17f28fb5170d511b66126b926280beeb53..371d03ba3d87adbbbab9be9b64d12be99006ef7c 100644
--- a/groupChat/utils_test.go
+++ b/groupChat/utils_test.go
@@ -57,7 +57,7 @@ func newTestManager(rng *rand.Rand, t *testing.T) (*Manager, gs.Group) {
 
 	g := newTestGroupWithUser(m.grp, user.ID, user.DhKey,
 		m.e2e.GetHistoricalDHPrivkey(), rng, t)
-	gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user)
+	gStore, err := gs.NewStore(versioned.NewKV(ekv.MakeMemstore()), user)
 	if err != nil {
 		t.Fatalf("Failed to create new group store: %+v", err)
 	}
@@ -92,7 +92,7 @@ func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int,
 		DhKey: m.e2e.GetHistoricalDHPubkey(),
 	}
 
-	gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user)
+	gStore, err := gs.NewStore(versioned.NewKV(ekv.MakeMemstore()), user)
 	if err != nil {
 		t.Fatalf("Failed to create new group store: %+v", err)
 	}