           defer { tableView.endUpdates() }
         }
         indexPaths.forEach { indexPath in
-          tableView.removeRows(at: IndexSet(integer: indexPath.item), withAnimation: [.effectFade, .slideUp])
-          tableView.insertRows(at: IndexSet(integer: indexPath.item), withAnimation: [.effectFade, .slideUp])
+          tableView.removeRows(at: IndexSet(integer: indexPath.item), withAnimation: configurator.deleteAnimation)
+          tableView.insertRows(at: IndexSet(integer: indexPath.item), withAnimation: configurator.insertAnimation)
         }
       case .moveItem(let indexPath, let newIndexPath):
         tableView.moveRow(at: indexPath.item, to: newIndexPath.item)

  }
}

public extension SignalProtocol where Element: DataSourceEventProtocol, Element.DataSource: QueryableDataSourceProtocol, Element.DataSource.Item: Any, Element.DataSource.Index == Int, Error == NoError {

  public typealias DataSource = Element.DataSource

  @discardableResult
  public func bind(to tableView: NSTableView, animated: Bool = true, measureCell: ((DataSource, Int, NSTableView) -> CGFloat)? = nil, createCell: @escaping (DataSource, Int, NSTableView) -> NSView?) -> Disposable {

    let dataSource = Property<DataSource?>(nil)

		if let measureCell = measureCell {
      tableView.reactive.delegate.feed(
				property: dataSource,
				to: #selector(NSTableViewDelegate.tableView(_:heightOfRow:)),

          defer { tableView.endUpdates() }
        }
        indexPaths.forEach { indexPath in
          tableView.insertRows(at: IndexSet(integer: indexPath.item), withAnimation: configurator.insertAnimation)
        }
      case .deleteItems(let indexPaths):
        if !updating && indexPaths.count > 1 {
