diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go
index ca0ba9ba8319bb246c05f33e816bfbbb9f8b8b39..e2af5aaa6a4b808300777498e406eb43041ef924 100644
--- a/channels/joinedChannel_test.go
+++ b/channels/joinedChannel_test.go
@@ -599,8 +599,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/store.go b/cmix/identity/receptionID/store.go
index 35efbb2266a03bbe16600766ca452f3a287ff53f..bfd11eece56e01726cfed7bbbfa33e80ab03053f 100644
--- a/cmix/identity/receptionID/store.go
+++ b/cmix/identity/receptionID/store.go
@@ -210,6 +210,21 @@ func (s *Store) AddIdentity(identity Identity) error {
 }
 
 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
@@ -233,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
 }
 
@@ -318,18 +326,17 @@ 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 {
-				if err := s.AddIdentity(*inQuestion.ProcessNext); err != nil {
-					jww.ERROR.Printf("Failed to add identity to process next "+
-						"for %d(%s). The identity chain may be lost",
-						inQuestion.EphId.Int64(), inQuestion.Source)
-				}
+				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",
@@ -343,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/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/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) {