   @objc
   public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
     let identifier = nibNameForObjectMatching(dataSource.objectAtIndexPath(indexPath)!)
-    if let cell = instances[identifier] as? HeightCalculatingCell {
+    if let cell = cellInstances[identifier] as? HeightCalculatingCell {
       return cell.heightFor(dataSource.objectAtIndexPath(indexPath), width: tableView.frame.size.width)
     }
     return UITableViewAutomaticDimension;
+  }
+  
+  
+  public func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
+    if let identifier = headerNibNameForSectionIndexMatching(section) {
+      return tableView.dequeueReusableHeaderFooterViewWithIdentifier(identifier)
+    }
+    
+    return nil
+  }
+  
+  @objc
+  public func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
+    if let identifier = footerNibNameForSectionIndexMatching(section) {
+      return tableView.dequeueReusableHeaderFooterViewWithIdentifier(identifier)
+    }
+    
+    return nil
+  }
+  
+  public func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
+    if let identifier = headerNibNameForSectionIndexMatching(section),
+      let view = headerFooterInstances[identifier] as? HeightCalculatingCell {
+      return view.heightFor(nil, width: tableView.frame.size.width)
+    }
+    
+    return UITableViewAutomaticDimension
+  }
+  
+  public func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
+    if let identifier = headerNibNameForSectionIndexMatching(section),
+      let view = headerFooterInstances[identifier] as? HeightCalculatingCell {
+      return view.heightFor(nil, width: tableView.frame.size.width)
+    }
+    
+    return UITableViewAutomaticDimension
   }
   
   @objc

    }.putInto(pool)
  }
  
  public func registerCellClass<U: ObjectConsuming where U.ObjectType == ObjectType>(cellClass: U.Type) {
    let identifier = String(cellClass)
    let nib = UINib(nibName: identifier, bundle: nil)
    tableView.registerNib(nib, forCellReuseIdentifier: identifier)
    instances[identifier] = nib.instantiateWithOwner(self, options: nil).last as? UITableViewCell
    
    mappings[identifier] = { object, cell, _ in
      if let consumer = cell as? U { consumer.applyObject(object) }

  typealias DataSourceType = ObjectsDataSource<ObjectType>
  
  public var nibNameForObjectMatching: (ObjectType -> String)!
  public var footerNibNameForSectionIndexMatching: (Int -> String?) = { _ in nil }
  public var headerNibNameForSectionIndexMatching: (Int -> String?) = { _ in nil }
  
  public let didSelectCellSignal = Pipe<(cell: UITableViewCell?, object: ObjectType?)>()
  public let willDisplayCellSignal = Pipe<(UITableViewCell, NSIndexPath)>()
