diff --git a/groupChat/receive.go b/groupChat/receive.go
index 93a149c4e0e480d4d56b98123ce1627cf5962d55..d02dc57b95a0ed7f854f36beb47a9e0b28de289b 100644
--- a/groupChat/receive.go
+++ b/groupChat/receive.go
@@ -42,11 +42,18 @@ func (m Manager) receive(rawMsgs chan message.Receive, stop *stoppable.Single) {
 			stop.ToStopped()
 			return
 		case receiveMsg := <-rawMsgs:
-			jww.TRACE.Print("Group message reception received cMix message.")
+			jww.DEBUG.Printf("Group message reception received cMix message on round %d (%d) sent by %s at %d.",
+				receiveMsg.RoundId, receiveMsg.RoundTimestamp.Unix(),
+				receiveMsg.Sender.String(), receiveMsg.Timestamp.Unix())
+
+			// If given zero time, try to guesstimate roundTimestamp as right now
+			if receiveMsg.RoundTimestamp.Equal(time.Unix(0, 0)) {
+				jww.ERROR.Printf("getCryptKey missing roundTimestamp")
+				receiveMsg.RoundTimestamp = time.Now()
+			}
 
 			// Attempt to read the message
-			g, msgID, timestamp, senderID, msg, noFpMatch, err :=
-				m.readMessage(receiveMsg)
+			g, msgID, timestamp, senderID, msg, noFpMatch, err := m.readMessage(receiveMsg)
 			if err != nil {
 				if noFpMatch {
 					jww.TRACE.Printf("Received message not for group chat: %+v",
@@ -145,6 +152,9 @@ func (m *Manager) decryptMessage(g gs.Group, cMixMsg format.Message,
 
 	messageID := group.NewMessageID(g.ID, intlMsg.Marshal())
 
+	// Remove from garbled message on success to prevent reprocessing
+	m.store.GetGarbledMessages().Remove(cMixMsg)
+
 	return messageID, intlMsg.GetTimestamp(), senderID, intlMsg.GetPayload(), nil
 }
 
diff --git a/network/follow.go b/network/follow.go
index 817ba0effc0c01e744cd430effa7ecc874d746fb..e8df942d8c303b2c91f7917cfe89283ab846fc6a 100644
--- a/network/follow.go
+++ b/network/follow.go
@@ -374,6 +374,7 @@ func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source,
 
 	if !m.param.RealtimeOnly {
 		roundsWithMessages2 = identity.UR.Iterate(func(rid id.Round) bool {
+			// TODO add set unchecked
 			if gwRoundsState.Checked(rid) {
 				return rounds.Checker(rid, filterList, identity.CR)
 			}
@@ -384,6 +385,7 @@ func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source,
 	for _, rid := range roundsWithMessages {
 		//denote that the round has been looked at in the tracking store
 		if identity.CR.Check(rid) {
+			// TODO: Err
 			m.round.GetMessagesFromRound(rid, identity)
 		}
 	}
diff --git a/network/message/garbled.go b/network/message/garbled.go
index b2449ca9f0d79c8d1b5cdd7a8e9cd9db1ae2863f..8d0950f3d2a781e3f5836cb7ffa225f10e01c294 100644
--- a/network/message/garbled.go
+++ b/network/message/garbled.go
@@ -109,11 +109,11 @@ func (m *Manager) handleGarbledMessages() {
 					MessageType:    message.Raw,
 					Sender:         &id.ID{},
 					EphemeralID:    ephemeral.Id{},
-					Timestamp:      time.Time{},
+					Timestamp:      time.Unix(0, 0),
 					Encryption:     message.None,
 					RecipientID:    &id.ID{},
 					RoundId:        0,
-					RoundTimestamp: time.Time{},
+					RoundTimestamp: time.Unix(0, 0),
 				}
 				im := fmt.Sprintf("[GARBLE] RAW Message reprocessed: keyFP: %v, "+
 					"msgDigest: %s", grbldMsg.GetKeyFP(), grbldMsg.Digest())
diff --git a/network/rounds/check.go b/network/rounds/check.go
index afcd20f1d52a0f1b089adb82b28606f576ebf1ec..39068df86502617f96edd55b07f6614f40db1860 100644
--- a/network/rounds/check.go
+++ b/network/rounds/check.go
@@ -63,7 +63,7 @@ func (m *Manager) GetMessagesFromRound(roundID id.Round, identity reception.Iden
 		jww.INFO.Printf("Messages found in round %d for %d (%s), looking "+
 			"up messages via historical lookup", roundID, identity.EphId.Int64(),
 			identity.Source)
-		//store the round as an unretreived round
+		//store the round as an unreceived round
 		err = m.Session.UncheckedRounds().AddRound(roundID, nil,
 			identity.Source, identity.EphId)
 		if err != nil {
@@ -79,7 +79,7 @@ func (m *Manager) GetMessagesFromRound(roundID id.Round, identity reception.Iden
 		jww.INFO.Printf("Messages found in round %d for %d (%s), looking "+
 			"up messages via in ram lookup", roundID, identity.EphId.Int64(),
 			identity.Source)
-		//store the round as an unretreived round
+		//store the round as an unreceived round
 		if !m.params.RealtimeOnly {
 			err = m.Session.UncheckedRounds().AddRound(roundID, ri,
 				identity.Source, identity.EphId)