diff --git a/broadcast/client.go b/broadcast/client.go
index 1b4891a00bdf4d8ae9ce6bf31c2b020b356fa114..678c7e9dccf7ef0322aea6369a92d6dcfde032ca 100644
--- a/broadcast/client.go
+++ b/broadcast/client.go
@@ -42,7 +42,8 @@ func NewBroadcastChannel(channel *crypto.Channel, net Client,
 	}
 
 	// Add channel's identity
-	net.AddIdentity(channel.ReceptionID, identity.Forever, true)
+	net.AddIdentityWithHistory(channel.ReceptionID, identity.Forever,
+		channel.Created, true)
 
 	jww.INFO.Printf("New broadcast channel client created for channel %q (%s)",
 		channel.Name, channel.ReceptionID)
diff --git a/broadcast/interface.go b/broadcast/interface.go
index 3c674c0db3438862296e8980afcb8177eb3d2a9a..4c390995abaf0b942e5d17ae03b14064fd7fac0d 100644
--- a/broadcast/interface.go
+++ b/broadcast/interface.go
@@ -92,7 +92,7 @@ type Client interface {
 	SendWithAssembler(recipient *id.ID, assembler cmix.MessageAssembler,
 		cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error)
 	IsHealthy() bool
-	AddIdentity(id *id.ID, validUntil time.Time, persistent bool)
+	AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool)
 	AddService(clientID *id.ID, newService message.Service,
 		response message.Processor)
 	DeleteClientService(clientID *id.ID)
diff --git a/broadcast/utils_test.go b/broadcast/utils_test.go
index ee1dfebc264c208e037bcbd45385bac6160fa154..299a2f663d387ea0f911f58bf2a18623e1d7f8c2 100644
--- a/broadcast/utils_test.go
+++ b/broadcast/utils_test.go
@@ -110,6 +110,17 @@ func (m *mockCmix) AddIdentity(id *id.ID, _ time.Time, _ bool) {
 	m.handler.processorMap[*id] = make(map[string][]message.Processor)
 }
 
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, _, _ time.Time, _ bool) {
+	m.handler.Lock()
+	defer m.handler.Unlock()
+
+	if _, exists := m.handler.processorMap[*id]; exists {
+		return
+	}
+
+	m.handler.processorMap[*id] = make(map[string][]message.Processor)
+}
+
 func (m *mockCmix) AddService(clientID *id.ID, newService message.Service,
 	response message.Processor) {
 	m.handler.Lock()
diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go
index ca0ba9ba8319bb246c05f33e816bfbbb9f8b8b39..5b77b6a0114cfcf715e98b9cb071ef746efb5dd1 100644
--- a/channels/joinedChannel_test.go
+++ b/channels/joinedChannel_test.go
@@ -11,6 +11,13 @@ import (
 	"bytes"
 	"crypto/ed25519"
 	"encoding/binary"
+	"math/rand"
+	"reflect"
+	"sort"
+	"strconv"
+	"testing"
+	"time"
+
 	"gitlab.com/elixxir/client/broadcast"
 	clientCmix "gitlab.com/elixxir/client/cmix"
 	"gitlab.com/elixxir/client/cmix/message"
@@ -24,12 +31,6 @@ 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"
-	"testing"
-	"time"
 )
 
 // Tests that manager.store stores the channel list in the ekv.
@@ -143,9 +144,19 @@ func Test_manager_loadChannels(t *testing.T) {
 			t.Errorf("Channel %s does not exist.", &chID)
 		}
 
-		if !reflect.DeepEqual(ch.broadcast, loadedCh.broadcast) {
+		expected := ch.broadcast.Get()
+		received := loadedCh.broadcast.Get()
+
+		// NOTE: Times don't compare properly after
+		// marshalling due to the monotonic counter
+		if expected.Created.Equal(received.Created) {
+			expected.Created = received.Created
+		}
+
+		if !reflect.DeepEqual(expected, received) {
 			t.Errorf("Channel %s does not match loaded channel."+
-				"\nexpected: %+v\nreceived: %+v", &chID, ch.broadcast, loadedCh.broadcast)
+				"\nexpected: %+v\nreceived: %+v", &chID,
+				expected, received)
 		}
 	}
 }
@@ -507,9 +518,17 @@ func Test_loadJoinedChannel(t *testing.T) {
 		t.Errorf("Failed to load joinedChannel: %+v", err)
 	}
 
-	if !reflect.DeepEqual(ch, loadedJc.broadcast.Get()) {
+	expected := *ch
+	received := *loadedJc.broadcast.Get()
+	// NOTE: Times don't compare properly after marshalling due to the
+	// monotonic counter
+	if expected.Created.Equal(received.Created) {
+		expected.Created = received.Created
+	}
+
+	if !reflect.DeepEqual(expected, received) {
 		t.Errorf("Loaded joinedChannel does not match original."+
-			"\nexpected: %+v\nreceived: %+v", ch, loadedJc.broadcast.Get())
+			"\nexpected: %+v\nreceived: %+v", expected, received)
 	}
 }
 
@@ -580,7 +599,7 @@ func newTestChannel(name, description string, rng csprng.Source,
 	level cryptoBroadcast.PrivacyLevel) (
 	*cryptoBroadcast.Channel, rsa.PrivateKey, error) {
 	c, pk, err := cryptoBroadcast.NewChannelVariableKeyUnsafe(
-		name, description, level, 1000, 512, rng)
+		name, description, level, time.Now(), 1000, 512, rng)
 	return c, pk, err
 }
 
@@ -599,8 +618,10 @@ func (m *mockBroadcastClient) SendWithAssembler(*id.ID,
 	return rounds.Round{ID: id.Round(567)}, ephemeral.Id{}, nil
 }
 
-func (m *mockBroadcastClient) IsHealthy() bool                                       { return true }
-func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool)                   {}
+func (m *mockBroadcastClient) IsHealthy() bool                     { return true }
+func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool) {}
+func (m *mockBroadcastClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
 func (m *mockBroadcastClient) AddService(*id.ID, message.Service, message.Processor) {}
 func (m *mockBroadcastClient) DeleteClientService(*id.ID)                            {}
 func (m *mockBroadcastClient) RemoveIdentity(*id.ID)                                 {}
diff --git a/channels/manager.go b/channels/manager.go
index b6a474e2fff2f874a12fbbcb2d6333f3eeb4db9e..56926aa1a474c992b48eae10cccedb9a1fd3bb6b 100644
--- a/channels/manager.go
+++ b/channels/manager.go
@@ -67,6 +67,7 @@ type Client interface {
 		cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error)
 	IsHealthy() bool
 	AddIdentity(id *id.ID, validUntil time.Time, persistent bool)
+	AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool)
 	AddService(clientID *id.ID, newService message.Service,
 		response message.Processor)
 	DeleteClientService(clientID *id.ID)
diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go
index 6948df3beee69e5ffeed5a119bda3a9240972131..2f564b88cd7f0d2468f1009c2f478de0c2f6a277 100644
--- a/channels/sendTracker_test.go
+++ b/channels/sendTracker_test.go
@@ -31,6 +31,8 @@ func (mc *mockClient) IsHealthy() bool {
 	return true
 }
 func (mc *mockClient) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {}
+func (mc *mockClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
 func (mc *mockClient) AddService(clientID *id.ID, newService message.Service,
 	response message.Processor) {
 }
diff --git a/cmix/identity/receptionID/fake_test.go b/cmix/identity/receptionID/fake_test.go
index 14940f7f60c8e057273f2f2559e346505fe89690..dcc5ba2d654b2bd72375129f55df0c880e37df62 100644
--- a/cmix/identity/receptionID/fake_test.go
+++ b/cmix/identity/receptionID/fake_test.go
@@ -31,7 +31,7 @@ func Test_generateFakeIdentity(t *testing.T) {
 		`"End":` + string(end) + `,"ExtraChecks":0,` +
 		`"StartValid":` + string(startValid) + `,` +
 		`"EndValid":` + string(endValid) + `,` +
-		`"Ephemeral":true,` +
+		`"Ephemeral":true,"ProcessNext":null,` +
 		`"Fake":true,"UR":null,"ER":null,"CR":null}`
 
 	timestamp := time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC)
diff --git a/cmix/identity/receptionID/identity.go b/cmix/identity/receptionID/identity.go
index bba7823789480636710b520d79d4deeadbfa1dbd..e8126015c290ab86ef44bc317b5bf65d727c0ddd 100644
--- a/cmix/identity/receptionID/identity.go
+++ b/cmix/identity/receptionID/identity.go
@@ -48,6 +48,11 @@ type Identity struct {
 
 	// Makes the identity not store on disk
 	Ephemeral bool
+
+	// When this identity expired, it will auto add processNext to the identity list
+	// to be processed. In practice this is a reverse ordered list and is added whenever
+	// many identities are added at once in order to pick up sequentially
+	ProcessNext *Identity
 }
 
 func loadIdentity(kv *versioned.KV) (Identity, error) {
diff --git a/cmix/identity/receptionID/store.go b/cmix/identity/receptionID/store.go
index 967c22e034270d726b2c4e216d460dc767e0dbd2..bfd11eece56e01726cfed7bbbfa33e80ab03053f 100644
--- a/cmix/identity/receptionID/store.go
+++ b/cmix/identity/receptionID/store.go
@@ -203,9 +203,29 @@ func (s *Store) ForEach(n int, rng io.Reader,
 }
 
 func (s *Store) AddIdentity(identity Identity) error {
-	idH := makeIdHash(identity.EphId, identity.Source)
+
 	s.mux.Lock()
 	defer s.mux.Unlock()
+	return s.addIdentity(identity)
+}
+
+func (s *Store) addIdentity(identity Identity) error {
+	err := s.addIdentityNoSave(identity)
+	if err != nil {
+		return err
+	}
+	if !identity.Ephemeral {
+		if err = s.save(); err != nil {
+			jww.FATAL.Panicf("Failed to save reception store after identity "+
+				"addition: %+v", err)
+		}
+	}
+
+	return nil
+}
+
+func (s *Store) addIdentityNoSave(identity Identity) error {
+	idH := makeIdHash(identity.EphId, identity.Source)
 
 	// Do not make duplicates of IDs
 	if _, ok := s.present[idH]; ok {
@@ -228,13 +248,6 @@ func (s *Store) AddIdentity(identity Identity) error {
 
 	s.active = append(s.active, reg)
 	s.present[idH] = struct{}{}
-	if !identity.Ephemeral {
-		if err = s.save(); err != nil {
-			jww.FATAL.Panicf("Failed to save reception store after identity "+
-				"addition: %+v", err)
-		}
-	}
-
 	return nil
 }
 
@@ -313,12 +326,18 @@ func (s *Store) SetToExpire(addressSize uint8) {
 }
 
 func (s *Store) prune(now time.Time) {
-	lengthBefore := len(s.active)
-	var pruned []int64
+	pruned := make([]int64, 0, len(s.active))
+	added := make([]int64, 0, len(s.active))
 	// Prune the list
+	toAdd := make([]Identity, 0, len(s.active))
 	for i := 0; i < len(s.active); i++ {
 		inQuestion := s.active[i]
 		if now.After(inQuestion.End) && inQuestion.ExtraChecks == 0 {
+			if inQuestion.ProcessNext != nil {
+				toAdd = append(toAdd, *inQuestion.ProcessNext)
+				added = append(added, inQuestion.ProcessNext.EphId.Int64())
+
+			}
 			if err := inQuestion.Delete(); err != nil {
 				jww.ERROR.Printf("Failed to delete Identity for %s: %+v",
 					inQuestion, err)
@@ -331,11 +350,20 @@ func (s *Store) prune(now time.Time) {
 			i--
 		}
 	}
+	for i := range toAdd {
+		next := toAdd[i]
+		if err := s.addIdentityNoSave(next); err != nil {
+			jww.ERROR.Printf("Failed to add identity to process next "+
+				"for %d(%s). The identity chain may be lost",
+				next.EphId.Int64(), next.Source)
+		}
+	}
 
 	// Save the list if it changed
-	if lengthBefore != len(s.active) {
+	if len(added) > 0 || len(pruned) > 0 {
 		jww.INFO.Printf(
-			"Pruned %d identities [%+v]", lengthBefore-len(s.active), pruned)
+			"Pruned %d identities [%+v], added %d [%+v]", len(pruned), pruned,
+			len(added), added)
 		if err := s.save(); err != nil {
 			jww.FATAL.Panicf("Failed to store reception storage: %+v", err)
 		}
diff --git a/cmix/identity/tracker.go b/cmix/identity/tracker.go
index 7ab08da034fbdd1dbbbfd35ff54b7fc72c273929..a292711b7fad381838b82584fa30ee8afe0ba0f8 100644
--- a/cmix/identity/tracker.go
+++ b/cmix/identity/tracker.go
@@ -42,12 +42,22 @@ const (
 
 	// DefaultExtraChecks is the default value for ExtraChecks
 	// on receptionID.Identity.
-	DefaultExtraChecks = 10
+	DefaultExtraChecks = 5
+
+	// NetworkRetention is how long messages are
+	// retained on the network
+	NetworkRetention = 500 * time.Hour
+
+	// GenerationDelta is how far into the past
+	// to go in order to ensure all relevant
+	// ephemeral identities are generated
+	GenerationDelta = time.Duration(ephemeral.Period) + (5 * time.Second)
 )
 
 type Tracker interface {
 	StartProcesses() stoppable.Stoppable
 	AddIdentity(id *id.ID, validUntil time.Time, persistent bool)
+	AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool)
 	RemoveIdentity(id *id.ID)
 	ForEach(n int, rng io.Reader, addressSize uint8,
 		operator func([]receptionID.IdentityUse) error) error
@@ -73,7 +83,7 @@ type TrackedID struct {
 	Creation       time.Time
 }
 
-func NewOrLoadTracker(session storage.Session, addrSpace address.Space) *manager {
+func NewOrLoadTracker(session storage.Session, addrSpace address.Space) Tracker {
 	// Initialization
 	t := &manager{
 		tracked:        make([]*TrackedID, 0),
@@ -128,9 +138,32 @@ func (t *manager) StartProcesses() stoppable.Stoppable {
 
 // AddIdentity adds an identity to be tracked.
 func (t *manager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {
+	lastGeneration := netTime.Now().Add(-GenerationDelta)
+	t.newIdentity <- TrackedID{
+		NextGeneration: netTime.Now().Add(-time.Second),
+		LastGeneration: lastGeneration,
+		Source:         id,
+		ValidUntil:     validUntil,
+		Persistent:     persistent,
+		Creation:       netTime.Now(),
+	}
+}
+
+// AddIdentityWithHistory adds an identity to be tracked which will slowly pick up history.
+func (t *manager) AddIdentityWithHistory(id *id.ID, validUntil, historicalBeginning time.Time, persistent bool) {
+	retention := netTime.Now().Add(-NetworkRetention)
+	if historicalBeginning.Before(retention) {
+		historicalBeginning = retention
+	}
+
+	if now := time.Now(); historicalBeginning.After(now) ||
+		now.Sub(historicalBeginning) < GenerationDelta {
+		historicalBeginning = now.Add(-GenerationDelta)
+	}
+
 	t.newIdentity <- TrackedID{
 		NextGeneration: netTime.Now().Add(-time.Second),
-		LastGeneration: netTime.Now().Add(-time.Duration(ephemeral.Period)),
+		LastGeneration: historicalBeginning,
 		Source:         id,
 		ValidUntil:     validUntil,
 		Persistent:     persistent,
@@ -331,9 +364,14 @@ func (t *manager) generateIdentitiesOverRange(inQuestion *TrackedID,
 		jww.FATAL.Panicf("Could not generate upcoming IDs: %+v", err)
 	}
 
+	identitiesToAdd := make([]receptionID.Identity, 0, len(protoIds))
+	identitiesToChain := make([]receptionID.Identity, 0, len(protoIds))
+
 	// Add identities for every address ID
 	lastIdentityEnd := time.Time{}
-	for i, eid := range protoIds {
+	var NewestIdentity receptionID.Identity
+	for i, _ := range protoIds {
+		eid := protoIds[i]
 		// Expand the grace period for both start and end
 		newIdentity := receptionID.Identity{
 			EphemeralIdentity: receptionID.EphemeralIdentity{
@@ -355,25 +393,51 @@ func (t *manager) generateIdentitiesOverRange(inQuestion *TrackedID,
 		}
 
 		newIdentity.Ephemeral = !inQuestion.Persistent
-		if err := t.ephemeral.AddIdentity(newIdentity); err != nil {
-			jww.FATAL.Panicf("Could not insert identity: %+v", err)
+
+		// If the identity expired before the current time, we know it
+		// is no longer valid and should be added to the chain
+		if netTime.Now().After(newIdentity.EndValid) {
+			identitiesToChain = append(identitiesToChain, newIdentity)
+		} else {
+			identitiesToAdd = append(identitiesToAdd, newIdentity)
 		}
 
-		// Print debug information and set return value
-		if isLastIdentity := i == len(protoIds)-1; isLastIdentity {
-			jww.INFO.Printf("Current Identity: %d (source: %s), Start: %s, "+
-				"End: %s, addrSize: %d",
-				newIdentity.EphId.Int64(),
-				newIdentity.Source,
-				newIdentity.StartValid,
-				newIdentity.EndValid,
-				addressSize)
+		if newIdentity.End.After(lastIdentityEnd) {
 			lastIdentityEnd = newIdentity.End
+			NewestIdentity = newIdentity
+		}
+	}
+
+	//link the chain
+	if len(identitiesToChain) > 0 {
+		firstLink := &identitiesToChain[len(identitiesToChain)-1]
+		currentLink := firstLink
+		if len(identitiesToChain) > 1 {
+			for i := len(identitiesToChain) - 1; i >= 0; i-- {
+				currentLink.ProcessNext = &identitiesToChain[i]
+				currentLink = currentLink.ProcessNext
+			}
 		}
+		identitiesToAdd = append(identitiesToAdd, *firstLink)
 	}
 
+	//add the identities
+	for i := 0; i < len(identitiesToAdd); i++ {
+		if err = t.ephemeral.AddIdentity(identitiesToAdd[i]); err != nil {
+			jww.FATAL.Panicf("Could not insert identity: %+v", err)
+		}
+	}
+
+	jww.INFO.Printf("Current Identity: %d (source: %s), Start: %s, "+
+		"End: %s, addrSize: %d",
+		NewestIdentity.EphId.Int64(),
+		NewestIdentity.Source,
+		NewestIdentity.StartValid,
+		NewestIdentity.EndValid,
+		addressSize)
+
 	jww.INFO.Printf("Number of identities generated: %d", len(protoIds))
-	return lastIdentityEnd
+	return NewestIdentity.End
 }
 
 // save persistent TrackedID to storage
diff --git a/cmix/interface.go b/cmix/interface.go
index f6572fb1dbdf6811052cb5d541e05286288c20cb..1d0bfdaeb09c25ab4b26018233ab0b8b52e93964 100644
--- a/cmix/interface.go
+++ b/cmix/interface.go
@@ -116,6 +116,13 @@ type Client interface {
 	// the identity will not be stored to disk and will be dropped on reload.
 	AddIdentity(id *id.ID, validUntil time.Time, persistent bool)
 
+	// AddIdentityWithHistory adds an identity to be tracked. If persistent is
+	// false, the identity will not be stored to disk and will be dropped on
+	// reload. It will pickup messages slowly back in the history or up back
+	// until beginning or the start of message retention, which should be ~500
+	// houses back
+	AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool)
+
 	// RemoveIdentity removes a currently tracked identity.
 	RemoveIdentity(id *id.ID)
 
diff --git a/connect/utils_test.go b/connect/utils_test.go
index 86f190808b95d44e80cff854d87be643339f2f0c..3aab375cca15e1385a2fa7c621751a0ab508d0cf 100644
--- a/connect/utils_test.go
+++ b/connect/utils_test.go
@@ -172,8 +172,9 @@ func (m *mockCmix) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAss
 func (m *mockCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) {
 	return rounds.Round{}, []ephemeral.Id{}, nil
 }
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {}
-func (m *mockCmix) RemoveIdentity(*id.ID)               {}
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)                       {}
+func (m *mockCmix) AddIdentityWithHistory(*id.ID, time.Time, time.Time, bool) {}
+func (m *mockCmix) RemoveIdentity(*id.ID)                                     {}
 
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) {
 	return identity.TrackedID{Creation: netTime.Now().Add(-time.Minute)}, nil
diff --git a/dummy/mockCmix_test.go b/dummy/mockCmix_test.go
index 2aca679d0702225c69d01e7449c028ddd57cd7ee..75cdee581be7e2b08de783f8e27d9d58de078093 100644
--- a/dummy/mockCmix_test.go
+++ b/dummy/mockCmix_test.go
@@ -86,6 +86,11 @@ func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXPara
 	panic("implement me")
 }
 
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	//TODO implement me
+	panic("implement me")
+}
+
 func (m *mockCmix) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {
 	//TODO implement me
 	panic("implement me")
diff --git a/e2e/fpGenerator_test.go b/e2e/fpGenerator_test.go
index 249dc5bba79fc07fb38439a64b4266a658215ee0..657fc16462548659dcd8e409c5acb6da928ffeef 100644
--- a/e2e/fpGenerator_test.go
+++ b/e2e/fpGenerator_test.go
@@ -129,7 +129,9 @@ func (m *mockFpgCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rou
 	return rounds.Round{}, nil, nil
 }
 func (m *mockFpgCmix) AddIdentity(*id.ID, time.Time, bool) {}
-func (m *mockFpgCmix) RemoveIdentity(*id.ID)               {}
+func (m *mockFpgCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
+func (m *mockFpgCmix) RemoveIdentity(*id.ID) {}
 func (m *mockFpgCmix) GetIdentity(*id.ID) (identity.TrackedID, error) {
 	return identity.TrackedID{}, nil
 }
diff --git a/e2e/rekey/utils_test.go b/e2e/rekey/utils_test.go
index 0b9fd388668ff77f9cbfed8bc7dc6dc6572d3eeb..aeccacbe316832b436901c654981a6d6fc1138e5 100644
--- a/e2e/rekey/utils_test.go
+++ b/e2e/rekey/utils_test.go
@@ -252,6 +252,9 @@ func (m *mockNetManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CM
 
 func (m *mockNetManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {}
 
+func (m *mockNetManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
+
 func (m *mockNetManager) RemoveIdentity(id *id.ID) {}
 
 func (m *mockNetManager) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint,
diff --git a/e2e/utils_test.go b/e2e/utils_test.go
index 6d8835b8c51edaf47ca2821521e9e55de95f5db3..78a0eaa7c57a7cd0520f42c260e3968fdbf6ff6a 100644
--- a/e2e/utils_test.go
+++ b/e2e/utils_test.go
@@ -214,7 +214,9 @@ func (m *mockCmix) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAss
 func (m *mockCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) {
 	return rounds.Round{}, nil, nil
 }
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            {}
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {}
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          {}
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { return identity.TrackedID{}, nil }
 
diff --git a/fileTransfer/connect/utils_test.go b/fileTransfer/connect/utils_test.go
index 6c9de504f42e812ec9bfc7c2c9925667241daa71..5910ac657f1262c741c64d7acd42155885c23452 100644
--- a/fileTransfer/connect/utils_test.go
+++ b/fileTransfer/connect/utils_test.go
@@ -140,7 +140,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/fileTransfer/e2e/utils_test.go b/fileTransfer/e2e/utils_test.go
index 7de4bba2c25ddb23103da9f04c4a6eac8898984c..1c33203a16665ed99d99560477b1ca5f06c78a5e 100644
--- a/fileTransfer/e2e/utils_test.go
+++ b/fileTransfer/e2e/utils_test.go
@@ -142,7 +142,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/fileTransfer/groupChat/utils_test.go b/fileTransfer/groupChat/utils_test.go
index 61dd18006d7d80b35712cc938267a2f5bd2ae4f7..b1f5f18d4e37d8a638caafb87aa739f9ee1aa337 100644
--- a/fileTransfer/groupChat/utils_test.go
+++ b/fileTransfer/groupChat/utils_test.go
@@ -137,7 +137,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/fileTransfer/utils_test.go b/fileTransfer/utils_test.go
index ff7750fcbce0c8d99f260ffdd2c48bb6d64d14a7..a885e4d82139d363ebce7db8051325e642de2220 100644
--- a/fileTransfer/utils_test.go
+++ b/fileTransfer/utils_test.go
@@ -193,7 +193,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler,
 	panic("implement me")
 }
 
-func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool)            { panic("implement me") }
+func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") }
+func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	panic("implement me")
+}
 func (m *mockCmix) RemoveIdentity(*id.ID)                          { panic("implement me") }
 func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") }
 
diff --git a/go.mod b/go.mod
index 86c8bb0e613356f1acab4c51d235bd4a8e450ac4..ff2b199186dfd6f5aa81b91170d59f903d06be25 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/stretchr/testify v1.8.0
 	gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f
 	gitlab.com/elixxir/comms v0.0.4-0.20221025020711-eba3adc4eb06
-	gitlab.com/elixxir/crypto v0.0.7-0.20221025020525-985806badd65
+	gitlab.com/elixxir/crypto v0.0.7-0.20221025180839-3d8948607447
 	gitlab.com/elixxir/ekv v0.2.1
 	gitlab.com/elixxir/primitives v0.0.3-0.20221025020430-f5d2eb330fbc
 	gitlab.com/xx_network/comms v0.0.4-0.20221025020408-9b62d4c2e700
diff --git a/go.sum b/go.sum
index 9ad9976a69f119bc27c6ec2cfc6d4c1ed2ce000c..2597a5c1231516e046c341ee927ae87b85c59f53 100644
--- a/go.sum
+++ b/go.sum
@@ -512,6 +512,8 @@ gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo
 gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA=
 gitlab.com/elixxir/crypto v0.0.7-0.20221025020525-985806badd65 h1:CWBU/BFw0II7q4ZKkLUVMSCzn2sRVCbbEiN4EJJ/vu0=
 gitlab.com/elixxir/crypto v0.0.7-0.20221025020525-985806badd65/go.mod h1:NImDa7951+jSolkYN/BBUm6qG6f+k0hsFZOCIxBlLhE=
+gitlab.com/elixxir/crypto v0.0.7-0.20221025180839-3d8948607447 h1:hFOOOGiVB9XtzSM//aClSJ+5nf4JSmmCkoWcc635W8I=
+gitlab.com/elixxir/crypto v0.0.7-0.20221025180839-3d8948607447/go.mod h1:NImDa7951+jSolkYN/BBUm6qG6f+k0hsFZOCIxBlLhE=
 gitlab.com/elixxir/ekv v0.2.1 h1:dtwbt6KmAXG2Tik5d60iDz2fLhoFBgWwST03p7T+9Is=
 gitlab.com/elixxir/ekv v0.2.1/go.mod h1:USLD7xeDnuZEavygdrgzNEwZXeLQJK/w1a+htpN+JEU=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=
diff --git a/groupChat/networkManager_test.go b/groupChat/networkManager_test.go
index e87b3f655bca1e2d5ccbf3d6547a25c1b1ac471d..934744be0b08341ba95cc8e4e4af25bbcb5bae0d 100644
--- a/groupChat/networkManager_test.go
+++ b/groupChat/networkManager_test.go
@@ -95,6 +95,11 @@ func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, pers
 	panic("implement me")
 }
 
+func (tnm *testNetworkManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	//TODO implement me
+	panic("implement me")
+}
+
 func (tnm *testNetworkManager) RemoveIdentity(id *id.ID) {
 	//TODO implement me
 	panic("implement me")
diff --git a/ud/networkManager_test.go b/ud/networkManager_test.go
index bd3630ebf9016e37535dbba6ea332c5676da4a1a..e58b3cf1fe3ef539e4c19bcb8ca2f95e24a15901 100644
--- a/ud/networkManager_test.go
+++ b/ud/networkManager_test.go
@@ -127,6 +127,10 @@ func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, pers
 	return
 }
 
+func (tnm *testNetworkManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) {
+	return
+}
+
 func (tnm *testNetworkManager) DeleteClientFingerprints(identity *id.ID) {
 	return
 }
diff --git a/xxdk/utilsInterfaces_test.go b/xxdk/utilsInterfaces_test.go
index 4fbf3852387c7c095934c2fbf65f388cfa046e2f..a6be0ca8d7143ed748efe04058930a47392aa08c 100644
--- a/xxdk/utilsInterfaces_test.go
+++ b/xxdk/utilsInterfaces_test.go
@@ -160,6 +160,10 @@ func (t *testNetworkManagerGeneric) AddHealthCallback(f func(bool)) uint64 {
 func (t *testNetworkManagerGeneric) AddIdentity(id *id.ID,
 	validUntil time.Time, persistent bool) {
 }
+func (t *testNetworkManagerGeneric) AddIdentityWithHistory(id *id.ID, validUntil,
+	beginning time.Time, persistent bool) {
+}
+
 func (t *testNetworkManagerGeneric) RemoveIdentity(id *id.ID) {}
 func (t *testNetworkManagerGeneric) AddService(clientID *id.ID,
 	newService message.Service, response message.Processor) {