         
     }
     
+    var isLoadingNewContent = false
+    var isScrolledToTop: Bool {
+        return collectionView.contentOffset.y <= 0 - collectionView.contentInset.top
+    }
     @objc(updateFeedSourcesWithDate:userInitiated:completion:)
     public func updateFeedSources(with date: Date?, userInitiated: Bool, completion: @escaping () -> Void) {
+        assert(Thread.isMainThread)
+        guard !isLoadingNewContent else {
+            return
+        }
+        isLoadingNewContent = true
+        if let refreshControl = collectionView.refreshControl, !refreshControl.isRefreshing {
+            #if UI_TEST
+            #else
+            refreshControl.beginRefreshing()
+            #endif
+            if isScrolledToTop && numberOfSectionsInExploreFeed == 0 {
+                collectionView.contentOffset = CGPoint(x: 0, y: 0 - collectionView.contentInset.top - refreshControl.frame.size.height)
+            }
+        }
         self.dataStore.feedContentController.updateFeedSources(with: date, userInitiated: userInitiated) {
-           self.resetRefreshControl()
-            if date == nil {
-                self.startMonitoringReachabilityIfNeeded()
-                self.showOfflineEmptyViewIfNeeded()
-            }
-            completion()
+            DispatchQueue.main.async {
+                self.isLoadingNewContent = false
+                self.resetRefreshControl()
+                if date == nil {
+                    self.startMonitoringReachabilityIfNeeded()
+                    self.showOfflineEmptyViewIfNeeded()
+                }
+                completion()
+            }
         }
     }
     

        
        navigationItem.titleView = titleView
        navigationBar.addExtendedNavigationBarView(searchBarContainerView)
    }
    
    private var fetchedResultsController: NSFetchedResultsController<WMFContentGroup>!

        return ReadingListHintController(dataStore: dataStore, presenter: self)
    }()
    
    var numberOfSectionsInExploreFeed: Int {
        guard let sections = fetchedResultsController.sections else {
            return 0
        }
        return sections.count
    }
    
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return numberOfSectionsInExploreFeed
    }
    
    private func resetRefreshControl() {
        guard let refreshControl = collectionView.refreshControl,
            refreshControl.isRefreshing else {
            return
        }
        refreshControl.endRefreshing()
    }
    
    private func startMonitoringReachabilityIfNeeded() {
