From 6020be630f0cbbb137033953c74e7d081a257775 Mon Sep 17 00:00:00 2001
From: Benjamin Wenger <ben@elixxir.ioo>
Date: Sat, 24 Sep 2022 10:14:09 -0700
Subject: [PATCH] all tests pass in channels

---
 channels/adminListener_test.go |   6 +-
 channels/eventModel_test.go    | 245 +++++++++++++++++++++------------
 channels/joinedChannel_test.go | 194 +++++++++++++++++++++-----
 channels/manager_test.go       |  34 ++++-
 channels/messages_test.go      |  15 +-
 channels/sendTracker_test.go   | 105 ++++++++++----
 channels/send_test.go          | 139 ++++++++++++++-----
 channels/userListener_test.go  | 172 +++--------------------
 8 files changed, 553 insertions(+), 357 deletions(-)

diff --git a/channels/adminListener_test.go b/channels/adminListener_test.go
index e32f7b0eb..f52e8fbec 100644
--- a/channels/adminListener_test.go
+++ b/channels/adminListener_test.go
@@ -32,9 +32,9 @@ type triggerAdminEventDummy struct {
 }
 
 func (taed *triggerAdminEventDummy) triggerAdminEvent(chID *id.ID,
-	cm *ChannelMessage, messageID cryptoChannel.MessageID,
+	cm *ChannelMessage, ts time.Time, messageID cryptoChannel.MessageID,
 	receptionID receptionID.EphemeralIdentity, round rounds.Round,
-	status SentStatus) {
+	status SentStatus) (uint64, error) {
 	taed.gotData = true
 
 	taed.chID = chID
@@ -42,6 +42,8 @@ func (taed *triggerAdminEventDummy) triggerAdminEvent(chID *id.ID,
 	taed.msgID = messageID
 	taed.receptionID = receptionID
 	taed.round = round
+
+	return 0, nil
 }
 
 // Tests the happy path.
diff --git a/channels/eventModel_test.go b/channels/eventModel_test.go
index ef1b635a9..5739d93db 100644
--- a/channels/eventModel_test.go
+++ b/channels/eventModel_test.go
@@ -17,6 +17,7 @@ import (
 	cryptoChannel "gitlab.com/elixxir/crypto/channel"
 	"gitlab.com/elixxir/primitives/states"
 	"gitlab.com/xx_network/primitives/id"
+	"math/rand"
 	"reflect"
 	"runtime"
 	"testing"
@@ -24,22 +25,29 @@ import (
 )
 
 type eventReceive struct {
-	channelID      *id.ID
-	messageID      cryptoChannel.MessageID
-	reactionTo     cryptoChannel.MessageID
-	senderUsername string
-	content        []byte
-	timestamp      time.Time
-	lease          time.Duration
-	round          rounds.Round
+	channelID  *id.ID
+	messageID  cryptoChannel.MessageID
+	reactionTo cryptoChannel.MessageID
+	nickname   string
+	content    []byte
+	timestamp  time.Time
+	lease      time.Duration
+	round      rounds.Round
 }
 
 type MockEvent struct {
+	uuid uint64
 	eventReceive
 }
 
-func (m *MockEvent) UpdateSentStatus(messageID cryptoChannel.MessageID,
-	status SentStatus) {
+func (m *MockEvent) getUUID() uint64 {
+	old := m.uuid
+	m.uuid++
+	return old
+}
+
+func (m *MockEvent) UpdateSentStatus(uuid uint64, messageID cryptoChannel.MessageID,
+	timestamp time.Time, round rounds.Round, status SentStatus) {
 	//TODO implement me
 	panic("implement me")
 }
@@ -47,49 +55,53 @@ func (m *MockEvent) UpdateSentStatus(messageID cryptoChannel.MessageID,
 func (*MockEvent) JoinChannel(channel *cryptoBroadcast.Channel) {}
 func (*MockEvent) LeaveChannel(channelID *id.ID)                {}
 func (m *MockEvent) ReceiveMessage(channelID *id.ID, messageID cryptoChannel.MessageID,
-	senderUsername string, text string,
-	timestamp time.Time, lease time.Duration, round rounds.Round, status SentStatus) {
+	nickname, text string, identity cryptoChannel.Identity,
+	timestamp time.Time, lease time.Duration, round rounds.Round,
+	status SentStatus) uint64 {
 	m.eventReceive = eventReceive{
-		channelID:      channelID,
-		messageID:      messageID,
-		reactionTo:     cryptoChannel.MessageID{},
-		senderUsername: senderUsername,
-		content:        []byte(text),
-		timestamp:      timestamp,
-		lease:          lease,
-		round:          round,
-	}
+		channelID:  channelID,
+		messageID:  messageID,
+		reactionTo: cryptoChannel.MessageID{},
+		nickname:   nickname,
+		content:    []byte(text),
+		timestamp:  timestamp,
+		lease:      lease,
+		round:      round,
+	}
+	return m.getUUID()
 }
 func (m *MockEvent) ReceiveReply(channelID *id.ID, messageID cryptoChannel.MessageID,
-	replyTo cryptoChannel.MessageID, senderUsername string,
-	text string, timestamp time.Time, lease time.Duration,
-	round rounds.Round, status SentStatus) {
-	fmt.Println(replyTo)
+	reactionTo cryptoChannel.MessageID, nickname, text string,
+	identity cryptoChannel.Identity, timestamp time.Time,
+	lease time.Duration, round rounds.Round, status SentStatus) uint64 {
+	fmt.Println(reactionTo)
 	m.eventReceive = eventReceive{
-		channelID:      channelID,
-		messageID:      messageID,
-		reactionTo:     replyTo,
-		senderUsername: senderUsername,
-		content:        []byte(text),
-		timestamp:      timestamp,
-		lease:          lease,
-		round:          round,
-	}
+		channelID:  channelID,
+		messageID:  messageID,
+		reactionTo: reactionTo,
+		nickname:   nickname,
+		content:    []byte(text),
+		timestamp:  timestamp,
+		lease:      lease,
+		round:      round,
+	}
+	return m.getUUID()
 }
 func (m *MockEvent) ReceiveReaction(channelID *id.ID, messageID cryptoChannel.MessageID,
-	reactionTo cryptoChannel.MessageID, senderUsername string,
-	reaction string, timestamp time.Time, lease time.Duration,
-	round rounds.Round, status SentStatus) {
+	reactionTo cryptoChannel.MessageID, nickname, reaction string,
+	identity cryptoChannel.Identity, timestamp time.Time,
+	lease time.Duration, round rounds.Round, status SentStatus) uint64 {
 	m.eventReceive = eventReceive{
-		channelID:      channelID,
-		messageID:      messageID,
-		reactionTo:     reactionTo,
-		senderUsername: senderUsername,
-		content:        []byte(reaction),
-		timestamp:      timestamp,
-		lease:          lease,
-		round:          round,
-	}
+		channelID:  channelID,
+		messageID:  messageID,
+		reactionTo: reactionTo,
+		nickname:   nickname,
+		content:    []byte(reaction),
+		timestamp:  timestamp,
+		lease:      lease,
+		round:      round,
+	}
+	return m.getUUID()
 }
 
 func Test_initEvents(t *testing.T) {
@@ -181,31 +193,32 @@ func TestEvents_RegisterReceiveHandler(t *testing.T) {
 }
 
 type dummyMessageTypeHandler struct {
-	triggered      bool
-	channelID      *id.ID
-	messageID      cryptoChannel.MessageID
-	messageType    MessageType
-	senderUsername string
-	content        []byte
-	timestamp      time.Time
-	lease          time.Duration
-	round          rounds.Round
+	triggered   bool
+	channelID   *id.ID
+	messageID   cryptoChannel.MessageID
+	messageType MessageType
+	nickname    string
+	content     []byte
+	timestamp   time.Time
+	lease       time.Duration
+	round       rounds.Round
 }
 
-func (dmth *dummyMessageTypeHandler) dummyMessageTypeReceiveMessage(
-	channelID *id.ID, messageID cryptoChannel.MessageID,
-	messageType MessageType, senderUsername string, content []byte,
+func (dmth *dummyMessageTypeHandler) dummyMessageTypeReceiveMessage(channelID *id.ID,
+	messageID cryptoChannel.MessageID, messageType MessageType,
+	nickname string, content []byte, identity cryptoChannel.Identity,
 	timestamp time.Time, lease time.Duration, round rounds.Round,
-	status SentStatus) {
+	status SentStatus) uint64 {
 	dmth.triggered = true
 	dmth.channelID = channelID
 	dmth.messageID = messageID
 	dmth.messageType = messageType
-	dmth.senderUsername = senderUsername
+	dmth.nickname = nickname
 	dmth.content = content
 	dmth.timestamp = timestamp
 	dmth.lease = lease
 	dmth.round = round
+	return rand.Uint64()
 }
 
 func TestEvents_triggerEvents(t *testing.T) {
@@ -233,8 +246,10 @@ func TestEvents_triggerEvents(t *testing.T) {
 	r.Timestamps[states.QUEUED] = time.Now()
 
 	//call the trigger
-	e.triggerEvent(chID, umi, receptionID.EphemeralIdentity{}, r, Delivered)
-
+	_, err = e.triggerEvent(chID, umi, time.Now(), receptionID.EphemeralIdentity{}, r, Delivered)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 	//check that the event was triggered
 	if !dummy.triggered {
 		t.Errorf("The event was not triggered")
@@ -256,9 +271,9 @@ func TestEvents_triggerEvents(t *testing.T) {
 			dummy.messageType, mt)
 	}
 
-	if dummy.senderUsername != umi.GetUserMessage().Username {
+	if dummy.nickname != umi.channelMessage.Nickname {
 		t.Errorf("The usernames do not match %s vs %s",
-			dummy.senderUsername, umi.GetUserMessage().Username)
+			dummy.nickname, umi.channelMessage.Nickname)
 	}
 
 	if !bytes.Equal(dummy.content, umi.GetChannelMessage().Payload) {
@@ -290,7 +305,7 @@ func TestEvents_triggerEvents_noChannel(t *testing.T) {
 	dummy := &dummyMessageTypeHandler{}
 
 	//skip handler registration
-	mt := MessageType(42)
+	mt := MessageType(1)
 
 	//craft the input for the event
 	chID := &id.ID{}
@@ -302,7 +317,10 @@ func TestEvents_triggerEvents_noChannel(t *testing.T) {
 	r.Timestamps[states.QUEUED] = time.Now()
 
 	//call the trigger
-	e.triggerEvent(chID, umi, receptionID.EphemeralIdentity{}, r, Delivered)
+	_, err := e.triggerEvent(chID, umi, time.Now(), receptionID.EphemeralIdentity{}, r, Delivered)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	//check that the event was triggered
 	if dummy.triggered {
@@ -337,8 +355,11 @@ func TestEvents_triggerAdminEvents(t *testing.T) {
 	msgID := cryptoChannel.MakeMessageID(u.userMessage.Message)
 
 	//call the trigger
-	e.triggerAdminEvent(chID, cm, msgID, receptionID.EphemeralIdentity{}, r,
+	_, err = e.triggerAdminEvent(chID, cm, time.Now(), msgID, receptionID.EphemeralIdentity{}, r,
 		Delivered)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	//check that the event was triggered
 	if !dummy.triggered {
@@ -361,14 +382,14 @@ func TestEvents_triggerAdminEvents(t *testing.T) {
 			dummy.messageType, mt)
 	}
 
-	if dummy.senderUsername != AdminUsername {
+	if dummy.nickname != AdminUsername {
 		t.Errorf("The usernames do not match %s vs %s",
-			dummy.senderUsername, AdminUsername)
+			dummy.nickname, AdminUsername)
 	}
 
 	if !bytes.Equal(dummy.content, cm.Payload) {
 		t.Errorf("The payloads do not match %s vs %s",
-			dummy.senderUsername, cm.Payload)
+			dummy.content, cm.Payload)
 	}
 
 	if !withinMutationWindow(r.Timestamps[states.QUEUED], dummy.timestamp) {
@@ -394,7 +415,7 @@ func TestEvents_triggerAdminEvents_noChannel(t *testing.T) {
 
 	dummy := &dummyMessageTypeHandler{}
 
-	mt := MessageType(42)
+	mt := MessageType(1)
 	//skip handler registration
 
 	//craft the input for the event
@@ -409,8 +430,11 @@ func TestEvents_triggerAdminEvents_noChannel(t *testing.T) {
 	msgID := cryptoChannel.MakeMessageID(u.userMessage.Message)
 
 	//call the trigger
-	e.triggerAdminEvent(chID, cm, msgID, receptionID.EphemeralIdentity{}, r,
+	_, err := e.triggerAdminEvent(chID, cm, time.Now(), msgID, receptionID.EphemeralIdentity{}, r,
 		Delivered)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	//check that the event was triggered
 	if dummy.triggered {
@@ -440,7 +464,14 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) {
 
 	msgID := cryptoChannel.MakeMessageID(textMarshaled)
 
-	senderUsername := "Alice"
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	senderNickname := "Alice"
 	ts := time.Now()
 
 	lease := 69 * time.Minute
@@ -449,8 +480,8 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) {
 	r.Timestamps[states.QUEUED] = time.Now()
 
 	//call the handler
-	e.receiveTextMessage(chID, msgID, 0, senderUsername,
-		textMarshaled, ts, lease, r, Delivered)
+	e.receiveTextMessage(chID, msgID, 0, senderNickname,
+		textMarshaled, pi.Identity, ts, lease, r, Delivered)
 
 	//check the results on the model
 	if !me.eventReceive.channelID.Cmp(chID) {
@@ -468,9 +499,9 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) {
 			me.eventReceive.reactionTo)
 	}
 
-	if me.eventReceive.senderUsername != senderUsername {
+	if me.eventReceive.nickname != senderNickname {
 		t.Errorf("SenderID propogate correctly, %s vs %s",
-			me.eventReceive.senderUsername, senderUsername)
+			me.eventReceive.nickname, senderNickname)
 	}
 
 	if me.eventReceive.timestamp != ts {
@@ -521,9 +552,16 @@ func TestEvents_receiveTextMessage_Reply(t *testing.T) {
 	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
 	r.Timestamps[states.QUEUED] = time.Now()
 
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
 	//call the handler
 	e.receiveTextMessage(chID, msgID, Text, senderUsername,
-		textMarshaled, ts, lease, r, Delivered)
+		textMarshaled, pi.Identity, ts, lease, r, Delivered)
 
 	//check the results on the model
 	if !me.eventReceive.channelID.Cmp(chID) {
@@ -541,9 +579,9 @@ func TestEvents_receiveTextMessage_Reply(t *testing.T) {
 			"%s vs %s", me.eventReceive.reactionTo, replyMsgId)
 	}
 
-	if me.eventReceive.senderUsername != senderUsername {
+	if me.eventReceive.nickname != senderUsername {
 		t.Errorf("SenderID propogate correctly, %s vs %s",
-			me.eventReceive.senderUsername, senderUsername)
+			me.eventReceive.nickname, senderUsername)
 	}
 
 	if me.eventReceive.timestamp != ts {
@@ -594,9 +632,16 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) {
 	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
 	r.Timestamps[states.QUEUED] = time.Now()
 
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
 	//call the handler
 	e.receiveTextMessage(chID, msgID, 0, senderUsername,
-		textMarshaled, ts, lease, r, Delivered)
+		textMarshaled, pi.Identity, ts, lease, r, Delivered)
 
 	//check the results on the model
 	if !me.eventReceive.channelID.Cmp(chID) {
@@ -614,9 +659,9 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) {
 			me.eventReceive.reactionTo)
 	}
 
-	if me.eventReceive.senderUsername != senderUsername {
+	if me.eventReceive.nickname != senderUsername {
 		t.Errorf("SenderID propogate correctly, %s vs %s",
-			me.eventReceive.senderUsername, senderUsername)
+			me.eventReceive.nickname, senderUsername)
 	}
 
 	if me.eventReceive.timestamp != ts {
@@ -667,9 +712,16 @@ func TestEvents_receiveReaction(t *testing.T) {
 	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
 	r.Timestamps[states.QUEUED] = time.Now()
 
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
 	//call the handler
 	e.receiveReaction(chID, msgID, 0, senderUsername,
-		textMarshaled, ts, lease, r, Delivered)
+		textMarshaled, pi.Identity, ts, lease, r, Delivered)
 
 	//check the results on the model
 	if !me.eventReceive.channelID.Cmp(chID) {
@@ -687,9 +739,9 @@ func TestEvents_receiveReaction(t *testing.T) {
 			"%s vs %s", me.eventReceive.reactionTo, replyMsgId)
 	}
 
-	if me.eventReceive.senderUsername != senderUsername {
+	if me.eventReceive.nickname != senderUsername {
 		t.Errorf("SenderID propogate correctly, %s vs %s",
-			me.eventReceive.senderUsername, senderUsername)
+			me.eventReceive.nickname, senderUsername)
 	}
 
 	if me.eventReceive.timestamp != ts {
@@ -740,9 +792,16 @@ func TestEvents_receiveReaction_InvalidReactionMessageID(t *testing.T) {
 	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
 	r.Timestamps[states.QUEUED] = time.Now()
 
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
 	//call the handler
 	e.receiveReaction(chID, msgID, 0, senderUsername,
-		textMarshaled, ts, lease, r, Delivered)
+		textMarshaled, pi.Identity, ts, lease, r, Delivered)
 
 	//check the results on the model
 	if me.eventReceive.channelID != nil {
@@ -760,7 +819,7 @@ func TestEvents_receiveReaction_InvalidReactionMessageID(t *testing.T) {
 			"is bad")
 	}
 
-	if me.eventReceive.senderUsername != "" {
+	if me.eventReceive.nickname != "" {
 		t.Errorf("SenderID propogated correctly when the reaction " +
 			"is bad")
 	}
@@ -803,9 +862,15 @@ func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) {
 	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
 	r.Timestamps[states.QUEUED] = time.Now()
 
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 	//call the handler
 	e.receiveReaction(chID, msgID, 0, senderUsername,
-		textMarshaled, ts, lease, r, Delivered)
+		textMarshaled, pi.Identity, ts, lease, r, Delivered)
 
 	//check the results on the model
 	if me.eventReceive.channelID != nil {
@@ -823,7 +888,7 @@ func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) {
 			"is bad")
 	}
 
-	if me.eventReceive.senderUsername != "" {
+	if me.eventReceive.nickname != "" {
 		t.Errorf("SenderID propogated correctly when the reaction " +
 			"is bad")
 	}
diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go
index 2da31d171..262b3036c 100644
--- a/channels/joinedChannel_test.go
+++ b/channels/joinedChannel_test.go
@@ -23,6 +23,7 @@ import (
 	"gitlab.com/xx_network/crypto/csprng"
 	"gitlab.com/xx_network/primitives/id"
 	"gitlab.com/xx_network/primitives/id/ephemeral"
+	"math/rand"
 	"reflect"
 	"sort"
 	"strconv"
@@ -32,10 +33,22 @@ import (
 
 // Tests that manager.store stores the channel list in the ekv.
 func Test_manager_store(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	for i := 0; i < 10; i++ {
 		ch, _, err := newTestChannel("name_"+strconv.Itoa(i),
@@ -52,7 +65,7 @@ func Test_manager_store(t *testing.T) {
 		m.channels[*ch.ReceptionID] = &joinedChannel{b}
 	}
 
-	err := m.store()
+	err = m.store()
 	if err != nil {
 		t.Errorf("Error storing channels: %+v", err)
 	}
@@ -66,10 +79,22 @@ func Test_manager_store(t *testing.T) {
 // Tests that the manager.loadChannels loads all the expected channels from the
 // ekv.
 func Test_manager_loadChannels(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	expected := make([]*joinedChannel, 10)
 
@@ -95,7 +120,7 @@ func Test_manager_loadChannels(t *testing.T) {
 		expected[i] = jc
 	}
 
-	err := m.store()
+	err = m.store()
 	if err != nil {
 		t.Errorf("Error storing channels: %+v", err)
 	}
@@ -126,10 +151,22 @@ func Test_manager_loadChannels(t *testing.T) {
 // Tests that manager.addChannel adds the channel to the map and stores it in
 // the kv.
 func Test_manager_addChannel(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -159,10 +196,22 @@ func Test_manager_addChannel(t *testing.T) {
 // Error path: tests that manager.addChannel returns ChannelAlreadyExistsErr
 // when the channel was already added.
 func Test_manager_addChannel_ChannelAlreadyExistsErr(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -183,10 +232,22 @@ func Test_manager_addChannel_ChannelAlreadyExistsErr(t *testing.T) {
 
 // Tests the manager.removeChannel deletes the channel from the map.
 func Test_manager_removeChannel(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -216,10 +277,22 @@ func Test_manager_removeChannel(t *testing.T) {
 // Error path: tests that manager.removeChannel returns ChannelDoesNotExistsErr
 // when the channel was never added.
 func Test_manager_removeChannel_ChannelDoesNotExistsErr(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -236,10 +309,22 @@ func Test_manager_removeChannel_ChannelDoesNotExistsErr(t *testing.T) {
 
 // Tests the manager.getChannel returns the expected channel.
 func Test_manager_getChannel(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -265,10 +350,22 @@ func Test_manager_getChannel(t *testing.T) {
 // Error path: tests that manager.getChannel returns ChannelDoesNotExistsErr
 // when the channel was never added.
 func Test_manager_getChannel_ChannelDoesNotExistsErr(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -286,10 +383,22 @@ func Test_manager_getChannel_ChannelDoesNotExistsErr(t *testing.T) {
 // Tests that manager.getChannels returns all the channels that were added to
 // the map.
 func Test_manager_getChannels(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	expected := make([]*id.ID, 10)
 
@@ -353,10 +462,22 @@ func Test_joinedChannel_Store(t *testing.T) {
 // Tests that loadJoinedChannel returns a joinedChannel from storage that
 // matches the original.
 func Test_loadJoinedChannel(t *testing.T) {
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), new(mockEventModel)).(*manager)
+		new(mockEventModel))
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -369,7 +490,7 @@ func Test_loadJoinedChannel(t *testing.T) {
 	}
 
 	loadedJc, err := loadJoinedChannel(ch.ReceptionID, m.kv, m.net, m.rng,
-		m.name, m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID) bool {
+		m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID) bool {
 			return false
 		})
 	if err != nil {
@@ -486,8 +607,8 @@ type mockEventModel struct {
 	leftCh   *id.ID
 }
 
-func (m *mockEventModel) UpdateSentStatus(messageID cryptoChannel.MessageID,
-	status SentStatus) {
+func (m *mockEventModel) UpdateSentStatus(uuid uint64, messageID cryptoChannel.MessageID,
+	timestamp time.Time, round rounds.Round, status SentStatus) {
 	//TODO implement me
 	panic("implement me")
 }
@@ -498,14 +619,21 @@ func (m *mockEventModel) JoinChannel(c *cryptoBroadcast.Channel) {
 func (m *mockEventModel) LeaveChannel(c *id.ID) {
 	m.leftCh = c
 }
-func (m *mockEventModel) ReceiveMessage(*id.ID, cryptoChannel.MessageID, string,
-	string, time.Time, time.Duration, rounds.Round, SentStatus) {
+func (m *mockEventModel) ReceiveMessage(channelID *id.ID, messageID cryptoChannel.MessageID,
+	nickname, text string, identity cryptoChannel.Identity,
+	timestamp time.Time, lease time.Duration, round rounds.Round,
+	status SentStatus) uint64 {
+	return 0
 }
-func (m *mockEventModel) ReceiveReply(*id.ID, cryptoChannel.MessageID,
-	cryptoChannel.MessageID, string, string, time.Time, time.Duration,
-	rounds.Round, SentStatus) {
+func (m *mockEventModel) ReceiveReply(channelID *id.ID, messageID cryptoChannel.MessageID,
+	reactionTo cryptoChannel.MessageID, nickname, text string,
+	identity cryptoChannel.Identity, timestamp time.Time,
+	lease time.Duration, round rounds.Round, status SentStatus) uint64 {
+	return 0
 }
-func (m *mockEventModel) ReceiveReaction(*id.ID, cryptoChannel.MessageID,
-	cryptoChannel.MessageID, string, string, time.Time, time.Duration,
-	rounds.Round, SentStatus) {
+func (m *mockEventModel) ReceiveReaction(channelID *id.ID, messageID cryptoChannel.MessageID,
+	reactionTo cryptoChannel.MessageID, nickname, reaction string,
+	identity cryptoChannel.Identity, timestamp time.Time,
+	lease time.Duration, round rounds.Round, status SentStatus) uint64 {
+	return 0
 }
diff --git a/channels/manager_test.go b/channels/manager_test.go
index 29d283f4b..3aa460df1 100644
--- a/channels/manager_test.go
+++ b/channels/manager_test.go
@@ -11,10 +11,12 @@ import (
 	"fmt"
 	"gitlab.com/elixxir/client/broadcast"
 	"gitlab.com/elixxir/client/storage/versioned"
+	cryptoChannel "gitlab.com/elixxir/crypto/channel"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/crypto/csprng"
 	"gitlab.com/xx_network/primitives/id"
+	"math/rand"
 	"os"
 	"sync"
 	"testing"
@@ -33,10 +35,22 @@ func TestMain(m *testing.M) {
 func TestManager_JoinChannel(t *testing.T) {
 	mem := &mockEventModel{}
 
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), mem).(*manager)
+		mem)
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
@@ -64,10 +78,22 @@ func TestManager_JoinChannel(t *testing.T) {
 func TestManager_LeaveChannel(t *testing.T) {
 	mem := &mockEventModel{}
 
-	m := NewManager(versioned.NewKV(ekv.MakeMemstore()),
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()),
 		new(mockBroadcastClient),
 		fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG),
-		new(mockNameService), mem).(*manager)
+		mem)
+	if err != nil {
+		t.Errorf(err.Error())
+	}
+
+	m := mFace.(*manager)
 
 	ch, _, err := newTestChannel("name", "description", m.rng.GetStream())
 	if err != nil {
diff --git a/channels/messages_test.go b/channels/messages_test.go
index cdd9a43fa..5bd10e15b 100644
--- a/channels/messages_test.go
+++ b/channels/messages_test.go
@@ -89,10 +89,7 @@ func TestUserMessageInternal_GetUserMessage(t *testing.T) {
 	received := internal.GetUserMessage()
 
 	if !reflect.DeepEqual(received.Message, usrMsg.Message) ||
-		received.Username != usrMsg.Username ||
-		received.UsernameLease != usrMsg.UsernameLease ||
 		!reflect.DeepEqual(received.Signature, usrMsg.Signature) ||
-		!reflect.DeepEqual(received.ValidationSignature, usrMsg.ValidationSignature) ||
 		!reflect.DeepEqual(received.ECCPublicKey, usrMsg.ECCPublicKey) {
 		t.Fatalf("GetUserMessage did not return expected data."+
 			"\nExpected: %v"+
@@ -118,7 +115,7 @@ func TestUserMessageInternal_GetMessageID(t *testing.T) {
 // it would be good to know when this changes. If this test breaks, report it,
 // but it should be safe to update the expected
 func TestUserMessageInternal_GetMessageID_Consistency(t *testing.T) {
-	expected := "ChMsgID-cfw4O6M47N9pqdtTcQjm/SSVqehTPGQd7cAMrNP9bcc="
+	expected := "ChMsgID-s425CTIAcKxvhUEZNr6Dk1g6rrOOpzKOS9L97OzLJ2w="
 
 	internal, _, _ := builtTestUMI(t, 7)
 
@@ -137,6 +134,7 @@ func builtTestUMI(t *testing.T, mt MessageType) (*userMessageInternal, *UserMess
 		RoundID:     42,
 		PayloadType: uint32(mt),
 		Payload:     []byte("ban_badUSer"),
+		Nickname:    "paul",
 	}
 
 	serialized, err := proto.Marshal(channelMsg)
@@ -145,12 +143,9 @@ func builtTestUMI(t *testing.T, mt MessageType) (*userMessageInternal, *UserMess
 	}
 
 	usrMsg := &UserMessage{
-		Message:             serialized,
-		ValidationSignature: []byte("sig"),
-		Signature:           []byte("sig2"),
-		Username:            "hunter2",
-		ECCPublicKey:        []byte("key"),
-		UsernameLease:       666,
+		Message:      serialized,
+		Signature:    []byte("sig2"),
+		ECCPublicKey: []byte("key"),
 	}
 
 	internal, _ := newUserMessageInternal(usrMsg)
diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go
index 0c8823952..fdcd9f86c 100644
--- a/channels/sendTracker_test.go
+++ b/channels/sendTracker_test.go
@@ -43,11 +43,20 @@ func (mc *mockClient) RemoveHealthCallback(uint64) {}
 // Test MessageReceive basic logic
 func TestSendTracker_MessageReceive(t *testing.T) {
 	kv := versioned.NewKV(ekv.MakeMemstore())
-	trigger := func(chID *id.ID, umi *userMessageInternal,
-		receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) {
+	uuidNum := uint64(0)
+	trigger := func(chID *id.ID, umi *userMessageInternal, ts time.Time,
+		receptionID receptionID.EphemeralIdentity, round rounds.Round,
+		status SentStatus) (uint64, error) {
+		oldUUID := uuidNum
+		uuidNum++
+		return oldUUID, nil
 	}
 
-	st := loadSendTracker(&mockClient{}, kv, trigger, nil, nil)
+	updateStatus := func(uuid uint64, messageID cryptoChannel.MessageID,
+		timestamp time.Time, round rounds.Round, status SentStatus) {
+	}
+
+	st := loadSendTracker(&mockClient{}, kv, trigger, nil, updateStatus)
 
 	mid := cryptoChannel.MakeMessageID([]byte("hello"))
 	process := st.MessageReceive(mid)
@@ -57,35 +66,44 @@ func TestSendTracker_MessageReceive(t *testing.T) {
 
 	cid := id.NewIdFromString("channel", id.User, t)
 	rid := id.Round(2)
-	st.send(cid, &userMessageInternal{
+	uuid, err := st.denotePendingSend(cid, &userMessageInternal{
 		userMessage: &UserMessage{},
 		channelMessage: &ChannelMessage{
 			Lease:       time.Now().UnixNano(),
 			RoundID:     uint64(rid),
 			PayloadType: 0,
 			Payload:     []byte("hello"),
-		},
-		messageID: mid,
-	}, rounds.Round{
+		}})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	err = st.send(uuid, mid, rounds.Round{
 		ID:    rid,
 		State: 1,
 	})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 	process = st.MessageReceive(mid)
 	if !process {
 		t.Fatalf("Did not receive expected result from MessageReceive")
 	}
 
 	cid2 := id.NewIdFromString("channel two", id.User, t)
-	st.send(cid2, &userMessageInternal{
+	uuid2, err := st.denotePendingSend(cid2, &userMessageInternal{
 		userMessage: &UserMessage{},
 		channelMessage: &ChannelMessage{
 			Lease:       time.Now().UnixNano(),
 			RoundID:     uint64(rid),
 			PayloadType: 0,
 			Payload:     []byte("hello again"),
-		},
-		messageID: mid,
-	}, rounds.Round{
+		}})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	err = st.send(uuid2, mid, rounds.Round{
 		ID:    rid,
 		State: 1,
 	})
@@ -102,26 +120,39 @@ func TestSendTracker_sendAdmin(t *testing.T) {
 
 	kv := versioned.NewKV(ekv.MakeMemstore())
 
-	adminTrigger := func(chID *id.ID, cm *ChannelMessage,
+	adminTrigger := func(chID *id.ID, cm *ChannelMessage, ts time.Time,
 		messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
-		round rounds.Round, status SentStatus) {
+		round rounds.Round, status SentStatus) (uint64, error) {
+		return 0, nil
+	}
+
+	updateStatus := func(uuid uint64, messageID cryptoChannel.MessageID,
+		timestamp time.Time, round rounds.Round, status SentStatus) {
 		triggerCh <- true
 	}
 
-	st := loadSendTracker(&mockClient{}, kv, nil, adminTrigger, nil)
+	st := loadSendTracker(&mockClient{}, kv, nil, adminTrigger, updateStatus)
 
 	cid := id.NewIdFromString("channel", id.User, t)
 	mid := cryptoChannel.MakeMessageID([]byte("hello"))
 	rid := id.Round(2)
-	st.sendAdmin(cid, &ChannelMessage{
+	uuid, err := st.denotePendingAdminSend(cid, &ChannelMessage{
 		Lease:       0,
 		RoundID:     uint64(rid),
 		PayloadType: 0,
 		Payload:     []byte("hello"),
-	}, mid, rounds.Round{
+	})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	err = st.sendAdmin(uuid, mid, rounds.Round{
 		ID:    rid,
 		State: 2,
 	})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	timeout := time.NewTicker(time.Second * 5)
 	select {
@@ -157,17 +188,22 @@ func TestSendTracker_send(t *testing.T) {
 	triggerCh := make(chan bool)
 
 	kv := versioned.NewKV(ekv.MakeMemstore())
-	trigger := func(chID *id.ID, umi *userMessageInternal,
-		receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) {
+	trigger := func(chID *id.ID, umi *userMessageInternal, ts time.Time,
+		receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) (uint64, error) {
+		return 0, nil
+	}
+
+	updateStatus := func(uuid uint64, messageID cryptoChannel.MessageID,
+		timestamp time.Time, round rounds.Round, status SentStatus) {
 		triggerCh <- true
 	}
 
-	st := loadSendTracker(&mockClient{}, kv, trigger, nil, nil)
+	st := loadSendTracker(&mockClient{}, kv, trigger, nil, updateStatus)
 
 	cid := id.NewIdFromString("channel", id.User, t)
 	mid := cryptoChannel.MakeMessageID([]byte("hello"))
 	rid := id.Round(2)
-	st.send(cid, &userMessageInternal{
+	uuid, err := st.denotePendingSend(cid, &userMessageInternal{
 		userMessage: &UserMessage{},
 		channelMessage: &ChannelMessage{
 			Lease:       0,
@@ -176,10 +212,18 @@ func TestSendTracker_send(t *testing.T) {
 			Payload:     []byte("hello"),
 		},
 		messageID: mid,
-	}, rounds.Round{
+	})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	err = st.send(uuid, mid, rounds.Round{
 		ID:    rid,
 		State: 2,
 	})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	timeout := time.NewTicker(time.Second * 5)
 	select {
@@ -232,18 +276,22 @@ func TestSendTracker_load_store(t *testing.T) {
 func TestRoundResult_callback(t *testing.T) {
 	kv := versioned.NewKV(ekv.MakeMemstore())
 	triggerCh := make(chan bool)
-	update := func(messageID cryptoChannel.MessageID, status SentStatus) {
+	update := func(uuid uint64, messageID cryptoChannel.MessageID,
+		timestamp time.Time, round rounds.Round, status SentStatus) {
 		triggerCh <- true
 	}
-	trigger := func(chID *id.ID, umi *userMessageInternal,
-		receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) {
+	trigger := func(chID *id.ID, umi *userMessageInternal, ts time.Time,
+		receptionID receptionID.EphemeralIdentity, round rounds.Round,
+		status SentStatus) (uint64, error) {
+		return 0, nil
 	}
+
 	st := loadSendTracker(&mockClient{}, kv, trigger, nil, update)
 
 	cid := id.NewIdFromString("channel", id.User, t)
 	mid := cryptoChannel.MakeMessageID([]byte("hello"))
 	rid := id.Round(2)
-	st.send(cid, &userMessageInternal{
+	uuid, err := st.denotePendingSend(cid, &userMessageInternal{
 		userMessage: &UserMessage{},
 		channelMessage: &ChannelMessage{
 			Lease:       0,
@@ -252,7 +300,12 @@ func TestRoundResult_callback(t *testing.T) {
 			Payload:     []byte("hello"),
 		},
 		messageID: mid,
-	}, rounds.Round{
+	})
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	err = st.send(uuid, mid, rounds.Round{
 		ID:    rid,
 		State: 2,
 	})
diff --git a/channels/send_test.go b/channels/send_test.go
index 5a6e1999c..4312a7a16 100644
--- a/channels/send_test.go
+++ b/channels/send_test.go
@@ -18,6 +18,7 @@ import (
 	"gitlab.com/elixxir/crypto/rsa"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/crypto/csprng"
+	"math/rand"
 	"testing"
 	"time"
 
@@ -141,18 +142,33 @@ func TestSendGeneric(t *testing.T) {
 	nameService := new(mockNameService)
 	nameService.validChMsg = true
 
+	rng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(rng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
 	m := &manager{
+		me:       pi,
 		channels: make(map[id.ID]*joinedChannel),
-		name:     nameService,
+		nicknameManager: &nicknameManager{
+			byChannel: make(map[id.ID]string),
+			kv:        nil,
+		},
 		st: loadSendTracker(&mockBroadcastClient{},
 			versioned.NewKV(ekv.MakeMemstore()), func(chID *id.ID,
-				umi *userMessageInternal,
+				umi *userMessageInternal, ts time.Time,
 				receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(chID *id.ID, cm *ChannelMessage,
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(chID *id.ID, cm *ChannelMessage, ts time.Time,
 				messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(messageID cryptoChannel.MessageID, status SentStatus) {}),
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(uuid uint64, messageID cryptoChannel.MessageID,
+				timestamp time.Time, round rounds.Round, status SentStatus) {
+			}),
 	}
 
 	channelID := new(id.ID)
@@ -212,21 +228,33 @@ func TestSendGeneric(t *testing.T) {
 
 func TestAdminGeneric(t *testing.T) {
 
-	nameService := new(mockNameService)
-	nameService.validChMsg = true
+	prng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(prng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	m := &manager{
 		channels: make(map[id.ID]*joinedChannel),
-		name:     nameService,
+		nicknameManager: &nicknameManager{
+			byChannel: make(map[id.ID]string),
+			kv:        nil,
+		},
+		me: pi,
 		st: loadSendTracker(&mockBroadcastClient{},
 			versioned.NewKV(ekv.MakeMemstore()), func(chID *id.ID,
-				umi *userMessageInternal,
+				umi *userMessageInternal, ts time.Time,
 				receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(chID *id.ID, cm *ChannelMessage,
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(chID *id.ID, cm *ChannelMessage, ts time.Time,
 				messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(messageID cryptoChannel.MessageID, status SentStatus) {}),
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(uuid uint64, messageID cryptoChannel.MessageID,
+				timestamp time.Time, round rounds.Round, status SentStatus) {
+			}),
 	}
 
 	messageType := Text
@@ -289,18 +317,33 @@ func TestSendMessage(t *testing.T) {
 	nameService := new(mockNameService)
 	nameService.validChMsg = true
 
+	prng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(prng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
 	m := &manager{
+		me:       pi,
 		channels: make(map[id.ID]*joinedChannel),
-		name:     nameService,
+		nicknameManager: &nicknameManager{
+			byChannel: make(map[id.ID]string),
+			kv:        nil,
+		},
 		st: loadSendTracker(&mockBroadcastClient{},
 			versioned.NewKV(ekv.MakeMemstore()), func(chID *id.ID,
-				umi *userMessageInternal,
+				umi *userMessageInternal, ts time.Time,
 				receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(chID *id.ID, cm *ChannelMessage,
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(chID *id.ID, cm *ChannelMessage, ts time.Time,
 				messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(messageID cryptoChannel.MessageID, status SentStatus) {}),
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(uuid uint64, messageID cryptoChannel.MessageID,
+				timestamp time.Time, round rounds.Round, status SentStatus) {
+			}),
 	}
 
 	channelID := new(id.ID)
@@ -368,21 +411,33 @@ func TestSendMessage(t *testing.T) {
 
 func TestSendReply(t *testing.T) {
 
-	nameService := new(mockNameService)
-	nameService.validChMsg = true
+	prng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(prng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	m := &manager{
+		me:       pi,
 		channels: make(map[id.ID]*joinedChannel),
-		name:     nameService,
+		nicknameManager: &nicknameManager{
+			byChannel: make(map[id.ID]string),
+			kv:        nil,
+		},
 		st: loadSendTracker(&mockBroadcastClient{},
 			versioned.NewKV(ekv.MakeMemstore()), func(chID *id.ID,
-				umi *userMessageInternal,
+				umi *userMessageInternal, ts time.Time,
 				receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(chID *id.ID, cm *ChannelMessage,
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(chID *id.ID, cm *ChannelMessage, ts time.Time,
 				messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(messageID cryptoChannel.MessageID, status SentStatus) {}),
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(uuid uint64, messageID cryptoChannel.MessageID,
+				timestamp time.Time, round rounds.Round, status SentStatus) {
+			}),
 	}
 
 	channelID := new(id.ID)
@@ -450,21 +505,33 @@ func TestSendReply(t *testing.T) {
 
 func TestSendReaction(t *testing.T) {
 
-	nameService := new(mockNameService)
-	nameService.validChMsg = true
+	prng := rand.New(rand.NewSource(64))
+
+	pi, err := cryptoChannel.GenerateIdentity(prng)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
 
 	m := &manager{
+		me: pi,
+		nicknameManager: &nicknameManager{
+			byChannel: make(map[id.ID]string),
+			kv:        nil,
+		},
 		channels: make(map[id.ID]*joinedChannel),
-		name:     nameService,
 		st: loadSendTracker(&mockBroadcastClient{},
 			versioned.NewKV(ekv.MakeMemstore()), func(chID *id.ID,
-				umi *userMessageInternal,
+				umi *userMessageInternal, ts time.Time,
 				receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(chID *id.ID, cm *ChannelMessage,
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(chID *id.ID, cm *ChannelMessage, ts time.Time,
 				messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
-				round rounds.Round, status SentStatus) {
-			}, func(messageID cryptoChannel.MessageID, status SentStatus) {}),
+				round rounds.Round, status SentStatus) (uint64, error) {
+				return 0, nil
+			}, func(uuid uint64, messageID cryptoChannel.MessageID,
+				timestamp time.Time, round rounds.Round, status SentStatus) {
+			}),
 	}
 
 	channelID := new(id.ID)
diff --git a/channels/userListener_test.go b/channels/userListener_test.go
index d58d540ff..143ebfeb4 100644
--- a/channels/userListener_test.go
+++ b/channels/userListener_test.go
@@ -34,7 +34,8 @@ type triggerEventDummy struct {
 }
 
 func (ted *triggerEventDummy) triggerEvent(chID *id.ID, umi *userMessageInternal,
-	receptionID receptionID.EphemeralIdentity, round rounds.Round, sent SentStatus) {
+	ts time.Time, receptionID receptionID.EphemeralIdentity, round rounds.Round,
+	sent SentStatus) (uint64, error) {
 	ted.gotData = true
 
 	ted.chID = chID
@@ -42,6 +43,8 @@ func (ted *triggerEventDummy) triggerEvent(chID *id.ID, umi *userMessageInternal
 	ted.receptionID = receptionID
 	ted.round = round
 	ted.msgID = umi.GetMessageID()
+
+	return 0, nil
 }
 
 // Tests the happy path
@@ -78,12 +81,9 @@ func TestUserListener_Listen(t *testing.T) {
 	ns := &mockNameService{validChMsg: true}
 
 	um := &UserMessage{
-		Message:             cmSerial,
-		ValidationSignature: []byte("Not checked in test"),
-		Signature:           sig,
-		Username:            ns.GetUsername(),
-		ECCPublicKey:        pub,
-		UsernameLease:       time.Now().Add(time.Hour).UnixNano(),
+		Message:      cmSerial,
+		Signature:    sig,
+		ECCPublicKey: pub,
 	}
 
 	umSerial, err := proto.Marshal(um)
@@ -166,143 +166,9 @@ func TestUserListener_Listen_BadUserSig(t *testing.T) {
 	ns := &mockNameService{validChMsg: true}
 
 	um := &UserMessage{
-		Message:             cmSerial,
-		ValidationSignature: []byte("Not checked in test"),
-		Signature:           sig,
-		Username:            ns.GetUsername(),
-		ECCPublicKey:        pub,
-		UsernameLease:       time.Now().Add(time.Hour).UnixNano(),
-	}
-
-	umSerial, err := proto.Marshal(um)
-	if err != nil {
-		t.Fatalf("Failed to marshal proto: %+v", err)
-	}
-
-	//build the listener
-	dummy := &triggerEventDummy{}
-
-	al := userListener{
-		chID:      chID,
-		name:      ns,
-		trigger:   dummy.triggerEvent,
-		checkSent: func(messageID cryptoChannel.MessageID) bool { return false },
-	}
-
-	//call the listener
-	al.Listen(umSerial, receptionID.EphemeralIdentity{}, r)
-
-	//check the results
-	if dummy.gotData {
-		t.Fatalf("Data returned after invalid listen")
-	}
-}
-
-//tests that the message is rejected when the validation signature cannot be
-//validated
-func TestUserListener_Listen_BadValidSig(t *testing.T) {
-
-	//build inputs
-	chID := &id.ID{}
-	chID[0] = 1
-
-	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
-	r.Timestamps[states.QUEUED] = time.Now()
-
-	rng := rand.New(rand.NewSource(42))
-	pub, priv, err := ed25519.GenerateKey(rng)
-	if err != nil {
-		t.Fatalf("failed to generate ed25519 keypair, cant run test")
-	}
-
-	cm := &ChannelMessage{
-		Lease:       int64(time.Hour),
-		RoundID:     uint64(r.ID),
-		PayloadType: 42,
-		Payload:     []byte("blarg"),
-	}
-
-	cmSerial, err := proto.Marshal(cm)
-	if err != nil {
-		t.Fatalf("Failed to marshal proto: %+v", err)
-	}
-
-	sig := ed25519.Sign(priv, cmSerial)
-	//make the signature not validate
-	ns := &mockNameService{validChMsg: false}
-
-	um := &UserMessage{
-		Message:             cmSerial,
-		ValidationSignature: []byte("Not checked in test"),
-		Signature:           sig,
-		Username:            ns.GetUsername(),
-		ECCPublicKey:        pub,
-		UsernameLease:       time.Now().Add(time.Hour).UnixNano(),
-	}
-
-	umSerial, err := proto.Marshal(um)
-	if err != nil {
-		t.Fatalf("Failed to marshal proto: %+v", err)
-	}
-
-	//build the listener
-	dummy := &triggerEventDummy{}
-
-	al := userListener{
-		chID:      chID,
-		name:      ns,
-		trigger:   dummy.triggerEvent,
-		checkSent: func(messageID cryptoChannel.MessageID) bool { return false },
-	}
-
-	//call the listener
-	al.Listen(umSerial, receptionID.EphemeralIdentity{}, r)
-
-	//check the results
-	if dummy.gotData {
-		t.Fatalf("Data returned after invalid listen")
-	}
-}
-
-//tests that the message is rejected when the username timestamp is not valid
-func TestUserListener_Listen_BadUnameTs(t *testing.T) {
-
-	//build inputs
-	chID := &id.ID{}
-	chID[0] = 1
-
-	r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
-	r.Timestamps[states.QUEUED] = time.Now()
-
-	rng := rand.New(rand.NewSource(42))
-	pub, priv, err := ed25519.GenerateKey(rng)
-	if err != nil {
-		t.Fatalf("failed to generate ed25519 keypair, cant run test")
-	}
-
-	cm := &ChannelMessage{
-		Lease:       int64(time.Hour),
-		RoundID:     uint64(r.ID),
-		PayloadType: 42,
-		Payload:     []byte("blarg"),
-	}
-
-	cmSerial, err := proto.Marshal(cm)
-	if err != nil {
-		t.Fatalf("Failed to marshal proto: %+v", err)
-	}
-
-	sig := ed25519.Sign(priv, cmSerial)
-	ns := &mockNameService{validChMsg: true}
-
-	um := &UserMessage{
-		Message:             cmSerial,
-		ValidationSignature: []byte("Not checked in test"),
-		Signature:           sig,
-		Username:            ns.GetUsername(),
-		ECCPublicKey:        pub,
-		//make the username lease invalid
-		UsernameLease: 42,
+		Message:      cmSerial,
+		Signature:    sig,
+		ECCPublicKey: pub,
 	}
 
 	umSerial, err := proto.Marshal(um)
@@ -363,12 +229,9 @@ func TestUserListener_Listen_BadRound(t *testing.T) {
 	ns := &mockNameService{validChMsg: true}
 
 	um := &UserMessage{
-		Message:             cmSerial,
-		ValidationSignature: []byte("Not checked in test"),
-		Signature:           sig,
-		Username:            ns.GetUsername(),
-		ECCPublicKey:        pub,
-		UsernameLease:       time.Now().Add(time.Hour).UnixNano(),
+		Message:      cmSerial,
+		Signature:    sig,
+		ECCPublicKey: pub,
 	}
 
 	umSerial, err := proto.Marshal(um)
@@ -461,12 +324,9 @@ func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) {
 	ns := &mockNameService{validChMsg: true}
 
 	um := &UserMessage{
-		Message:             cmSerial,
-		ValidationSignature: []byte("Not checked in test"),
-		Signature:           sig,
-		Username:            ns.GetUsername(),
-		ECCPublicKey:        pub,
-		UsernameLease:       time.Now().Add(time.Hour).UnixNano(),
+		Message:      cmSerial,
+		Signature:    sig,
+		ECCPublicKey: pub,
 	}
 
 	umSerial, err := proto.Marshal(um)
-- 
GitLab