         sites += suggestedSites as [Site]
     }
 
-    // Flags the next set of sites to do a replace, not a merge.
-    func invalidateSites() {
-        sitesInvalidated = true
-    }
-
     subscript(index: Int) -> Site? {
         if count() == 0 {
             return nil

    }

    private func refreshTopSites(frecencyLimit: Int) {
        // Don't allow Sync or other notifications to change the data source if we're deleting a thumbnail.
        // If we are, we'll refresh at the end, so we can drop this one.
        if !(self.collection?.userInteractionEnabled ?? true) {
            return
        }

        // Reload right away with whatever is in the cache, then check to see if the cache is invalid. If it's invalid,
        // invalidate the cache and requery. This allows us to always show results right away if they are cached but
        // also load in the up-to-date results asynchronously if needed
        reloadTopSitesWithLimit(frecencyLimit) >>> {
            self.profile.history.updateTopSitesCacheIfInvalidated() >>== { dirty in
                if dirty {
                    self.dataSource.invalidateSites()
                    self.reloadTopSitesWithLimit(frecencyLimit)
                }
            }
        }

    private func setHistorySites(var historySites: [Site]) {
        // Sites are invalidated and we have a new data set, so do a replace.
        if (sitesInvalidated) {
            self.sites = []
        }

        // We requery every time we do a deletion. If the query contains a top site that's
