diff --git a/bindings/restoreContacts.go b/bindings/restoreContacts.go
index 61e14d3c1073e3e80a44fcbb58df4b6f400393ea..b970c77a2ed8cbf5664f76a6754904edb9b8d0f0 100644
--- a/bindings/restoreContacts.go
+++ b/bindings/restoreContacts.go
@@ -29,6 +29,7 @@ type RestoreContactsReport struct {
 	restored []*id.ID
 	failed   []*id.ID
 	errs     []error
+	restErr  error
 }
 
 // LenRestored returns the length of ID's restored.
@@ -56,6 +57,14 @@ func (r *RestoreContactsReport) GetErrorAt(index int) string {
 	return r.errs[index].Error()
 }
 
+// GetRestoreContactsError returns an error string. Empty if no error.
+func (r *RestoreContactsReport) GetRestoreContactsError() string {
+	if r.restErr == nil {
+		return ""
+	}
+	return r.restErr.Error()
+}
+
 // RestoreContactsFromBackup takes as input the jason output of the
 // `NewClientFromBackup` function, unmarshals it into IDs, looks up
 // each ID in user discovery, and initiates a session reset request.
@@ -65,8 +74,8 @@ func (r *RestoreContactsReport) GetErrorAt(index int) string {
 // the mobile phone apps and are not intended to be part of the xxDK. It
 // should be treated as internal functions specific to the phone apps.
 func RestoreContactsFromBackup(backupPartnerIDs []byte, client *Client,
-	udManager *UserDiscovery, updatesCb RestoreContactsUpdater) (
-	*RestoreContactsReport, error) {
+	udManager *UserDiscovery,
+	updatesCb RestoreContactsUpdater) *RestoreContactsReport {
 
 	restored, failed, errs, err := xxmutils.RestoreContactsFromBackup(
 		backupPartnerIDs, &client.api, udManager.ud, updatesCb)
@@ -75,6 +84,7 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *Client,
 		restored: restored,
 		failed:   failed,
 		errs:     errs,
-	}, err
+		restErr:  err,
+	}
 
 }
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}
 	}
 }