diff --git a/xxmutils/restoreContacts.go b/xxmutils/restoreContacts.go
index 9505cc7866be3b0416b5b5bf617bc5fee8234796..b64947418cb401ea797c99cc8c5935a60335bfb9 100644
--- a/xxmutils/restoreContacts.go
+++ b/xxmutils/restoreContacts.go
@@ -149,13 +149,18 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *api.Client,
 	}
 
 	// Cleanup
+	//   lookupCh -> foundCh -> resetContactCh -> restoredCh
 	close(lookupCh)
-	close(resetContactCh)
-	close(failCh)
 	// Now wait for subroutines to close before closing their output chans
 	lcWg.Wait()
+	// Close input to reset chan after lookup is done to avoid writes after
+	// close
 	close(foundCh)
+	close(resetContactCh)
 	rsWg.Wait()
+	// failCh is closed after exit of the threads to avoid writes after
+	// close
+	close(failCh)
 	close(restoredCh)
 	failWg.Wait()
 
@@ -185,8 +190,6 @@ func LookupContacts(in chan *id.ID, out chan *contact.Contact,
 			continue
 		}
 		jww.WARN.Printf("could not lookup %s: %v", lookupID, err)
-		// Retry later
-		in <- lookupID
 	}
 }
 
@@ -207,9 +210,9 @@ func ResetSessions(in, out chan *contact.Contact, failCh chan failure,
 			continue
 		}
 		// If an error, figure out if I should report or retry
-		// Note: Always retry here for now.
+		// Note: Always fail here for now.
 		jww.WARN.Printf("could not reset %s: %v", c.ID, err)
-		in <- c
+		failCh <- failure{ID: c.ID, Err: err}
 	}
 }