     switch changeSet {
     case .Inserts(let indices):
       let indexPaths = indices.map { NSIndexPath(forItem: $0, inSection: sectionIndex) }
-      if let animation = dataSource?.tableView?(tableView, shouldAnimationForRowAtIndexPaths: indexPaths) where animation == false { tableView.reloadData(); break }
       tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: dataSource?.tableView?(tableView, animationForRowAtIndexPaths: indexPaths) ?? .Automatic)
     case .Updates(let indices):
       let indexPaths = indices.map { NSIndexPath(forItem: $0, inSection: sectionIndex) }
-      if let animation = dataSource?.tableView?(tableView, shouldAnimationForRowAtIndexPaths: indexPaths) where animation == false { tableView.reloadData(); break }
       tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: dataSource?.tableView?(tableView, animationForRowAtIndexPaths: indexPaths) ?? .Automatic)
     case .Deletes(let indices):
       let indexPaths = indices.map { NSIndexPath(forItem: $0, inSection: sectionIndex) }
-      if let animation = dataSource?.tableView?(tableView, shouldAnimationForRowAtIndexPaths: indexPaths) where animation == false { tableView.reloadData(); break }
       tableView.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: dataSource?.tableView?(tableView, animationForRowAtIndexPaths: indexPaths) ?? .Automatic)
     }
   }

  private class func applySectionUnitChangeSet(changeSet: ObservableArrayEventChangeSet, tableView: UITableView, dataSource: BNDTableViewProxyDataSource?) {
    switch changeSet {
    case .Inserts(let indices):
      if let animation = dataSource?.tableView?(tableView, shouldAnimationForRowInSections: indices) where animation == false { tableView.reloadData(); break }
      tableView.insertSections(NSIndexSet(set: indices), withRowAnimation: dataSource?.tableView?(tableView, animationForRowInSections: indices) ?? .Automatic)
    case .Updates(let indices):
      if let animation = dataSource?.tableView?(tableView, shouldAnimationForRowInSections: indices) where animation == false { tableView.reloadData(); break }
      tableView.reloadSections(NSIndexSet(set: indices), withRowAnimation: dataSource?.tableView?(tableView, animationForRowInSections: indices) ?? .Automatic)
    case .Deletes(let indices):
      if let animation = dataSource?.tableView?(tableView, shouldAnimationForRowInSections: indices) where animation == false { tableView.reloadData(); break }
      tableView.deleteSections(NSIndexSet(set: indices), withRowAnimation: dataSource?.tableView?(tableView, animationForRowInSections: indices) ?? .Automatic)
    }
  }

    for (sectionIndex, sectionObservableArray) in array.enumerate() {
      sectionObservableArray.observeNew { [weak tableView, weak self] arrayEvent in
        guard let tableView = tableView else { return }
        if let _ = self?.proxyDataSource?.shouldReloadInsteadOfUpdateTableView?(tableView) { tableView.reloadData(); return }
        
        switch arrayEvent.operation {
        case .Batch(let operations):
          tableView.beginUpdates()
