         }
         profile.history.removeHostFromTopSites(host).uponQueue(dispatch_get_main_queue()) { result in
             guard result.isSuccess else { return }
-            self.reloadTopSites()
+            self.invalidateTopSites().uponQueue(dispatch_get_main_queue()) { _ in
+                self.reloadAll()
+            }
         }
     }
 
     func hideFromHighlights(site: Site) {
         profile.recommendations.removeHighlightForURL(site.url).uponQueue(dispatch_get_main_queue()) { result in
             guard result.isSuccess else { return }
-            self.reloadHighlights()
+            self.invalidateHighlights().uponQueue(dispatch_get_main_queue()) { _ in
+                self.reloadAll()
+            }
         }
     }
 

    func notificationReceived(notification: NSNotification) {
        switch notification.name {
        case NotificationProfileDidFinishSyncing, NotificationFirefoxAccountChanged, NotificationPrivateDataClearedHistory, NotificationDynamicFontChanged:
            self.reloadTopSites()
        default:
            log.warning("Received unexpected notification \(notification.name)")
        }
    }

    private func reloadHighlights() -> Success {
        return fetchHighlights().bindQueue(dispatch_get_main_queue()) { result in
            self.highlights = result.successValue?.asArray() ?? self.highlights
            return succeed()
        }
    }

    private func fetchHighlights() -> Deferred<Maybe<Cursor<Site>>> {
        return self.profile.recommendations.getHighlights()
    }

    private func reloadTopSites() -> Success {
        return invalidateTopSites().bindQueue(dispatch_get_main_queue()) { result in
            let defaultSites = self.defaultTopSites()
            let mySites = (result.successValue ?? [])

            // Merge default topsites with a user's topsites.
            let mergedSites = mySites.union(defaultSites, f: { (site) -> String in
                return NSURL(string: site.url)?.extractDomainName() ?? ""
            })

            // Favour topsites from defaultSites as they have better favicons.
            let newSites = mergedSites.map { site -> Site in
                let domain = NSURL(string: site.url)?.extractDomainName() ?? ""
                return defaultSites.find { $0.title.lowercaseString == domain } ?? site
            }

            self.topSitesManager.currentTraits = self.view.traitCollection
            self.topSitesManager.content = newSites.count > ASPanelUX.topSitesCacheSize ? Array(newSites[0..<ASPanelUX.topSitesCacheSize]) : newSites
            self.topSitesManager.urlPressedHandler = { [unowned self] url, indexPath in
                let event = ASInfo(actionPosition: indexPath.item, source: .topSites)
                ASOnyxPing.reportTapEvent(event)
                self.showSiteWithURLHandler(url)
            }
            return succeed()
        }
    }

    private func invalidateTopSites() -> Deferred<Maybe<[Site]>> {
        let frecencyLimit = ASPanelUX.topSitesCacheSize
        return self.profile.history.updateTopSitesCacheIfInvalidated() >>== { dirty in
            return self.profile.history.getTopSitesWithLimit(frecencyLimit) >>== { topSites in
                return deferMaybe(topSites.asArray())
            }
        }
    }

        tableView.estimatedSectionHeaderHeight = 15
        tableView.sectionFooterHeight = 0
        tableView.sectionHeaderHeight = UITableViewAutomaticDimension
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.onyxSession = OnyxTelemetry.sharedClient.beginSession()

        all([invalidateTopSites(), invalidateHighlights()]).uponQueue(dispatch_get_main_queue()) { _ in
            self.reloadAll()
        }
    }

    override func viewDidDisappear(animated: Bool) {
