 	
 	// MARK: Article Fetching
 	
-	func fetchAndReplaceArticlesAsync(feeds: [Feed]) {
+	func fetchAndReplaceArticlesAsync() {
 		var fetchers = feeds as [ArticleFetcher]
 		if let fetcher = exceptionArticleFetcher {
 			fetchers.append(fetcher)

	
	func replaceArticles(with unsortedArticles: Set<Article>) {
		articles = Array(unsortedArticles).sortedByDate(sortDirection ? .orderedDescending : .orderedAscending, groupByFeed: groupByFeed)
		rebuildTimelineItems(isReadFiltered: isReadFiltered)
		// TODO: Update unread counts and other item done in didSet on AppKit
	}
	
	func rebuildTimelineItems(isReadFiltered: Bool?) {
		let filtered = isReadFiltered ?? false
		let selectedArticleIDs = selectedArticles.map { $0.articleID }


		// if it’s been superseded by a newer fetch, or the timeline was emptied, etc., it won’t get called.
		precondition(Thread.isMainThread)
		cancelPendingAsyncFetches()

		// Right now we are pulling all the records and filtering them in the UI.  This is because the async
		// change of the timeline times doesn't trigger an animation because it isn't in a withAnimation block.
		// Ideally this would be done in the database tier with a query, but if you look, we always pull everything
		// from SQLite and filter it programmatically at that level currently.  So no big deal.
		// We should change this as soon as we figure out how to trigger animations on Lists with async tasks.
		let fetchOperation = FetchRequestOperation(id: fetchSerialNumber, readFilter: false, representedObjects: representedObjects) { [weak self] (articles, operation) in
			precondition(Thread.isMainThread)
			guard !operation.isCanceled, let strongSelf = self, operation.id == strongSelf.fetchSerialNumber else {
				return
