         super.didReceiveMemoryWarning()
     }
 
+    func handleRefresh() {
+        if let section = self.section {
+            WhisperRequestManager.sharedInstance.requestForWhispers(section, offset: 0)
+        } else {
+            refreshControl?.endRefreshing()
+        }
+    }
+
     // MARK: - WhisperRequestManager delegate methods
 
     func whisperRequestManager(whisperRequestManager: WhisperRequestManager, didReceiveWhispers newWhispers: [Whisper]) {
         SVProgressHUD.dismiss()
+        tableView.infiniteScrollingView.stopAnimating()
 
-        tableView.infiniteScrollingView.stopAnimating()
+        if let isRefreshing = refreshControl?.refreshing where isRefreshing {
+            whispers.removeAll()
+            tableView.reloadData()
+        }
 
         var indexPaths = [NSIndexPath]()
         for i in (whispers.count..<(whispers.count + newWhispers.count)) {

        tableView.beginUpdates()
        tableView.insertRowsAtIndexPaths(
            indexPaths,
            withRowAnimation: UITableViewRowAnimation.Fade)
        tableView.endUpdates()
    }

    // MARK: - Table view data source

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 44

        refreshControl = UIRefreshControl()
        refreshControl?.addTarget(self, action: "handleRefresh", forControlEvents: UIControlEvents.ValueChanged)

        tableView.addInfiniteScrollingWithActionHandler {
            if let section = self.section {
                WhisperRequestManager.sharedInstance.requestForWhispers(
