                 tableView.deselectRowAtIndexPath(indexPath, animated: true)
             }
 
-            let layout = feedCellLayoutOfFeed(feed)
-            let update: FeedCellLayout.Update = { [weak self] newLayout in
-                self?.updateFeedCellLayout(newLayout, forFeed: feed)
+            let layout = FeedsViewController.layoutPool.feedCellLayoutOfFeed(feed)
+            let update: FeedCellLayout.Update = { newLayout in
+                FeedsViewController.layoutPool.updateFeedCellLayout(newLayout, forFeed: feed)
             }
             let layoutCache = (layout: layout, update: update)
 


        case Section.Feed.rawValue:
            let feed = feeds[indexPath.row]
            return heightOfFeed(feed)

        case Section.LoadMore.rawValue:
            return 60

        feedsTableView.tableFooterView = feeds.isEmpty ? noFeedsFooterView : UIView()
    }

    struct LayoutPool {

        private var feedCellLayoutHash = [String: FeedCellLayout]()

        private func feedCellLayoutOfFeed(feed: DiscoveredFeed) -> FeedCellLayout? {
            let key = feed.id

            return feedCellLayoutHash[key]
        }

        private mutating func updateFeedCellLayout(layout: FeedCellLayout, forFeed feed: DiscoveredFeed) {

            let key = feed.id

            if !key.isEmpty {
                feedCellLayoutHash[key] = layout
            }

            println("feedCellLayoutHash.count: \(feedCellLayoutHash.count)")
        }

        private mutating func heightOfFeed(feed: DiscoveredFeed) -> CGFloat {

            if let layout = feedCellLayoutOfFeed(feed) {
                return layout.height

            } else {
                let layout = FeedCellLayout(feed: feed)
                updateFeedCellLayout(layout, forFeed: feed)
                return layout.height
            }
        }
    }
    static var layoutPool = LayoutPool()

    private var feedSortStyle: FeedSortStyle = .Match {
        didSet {
