                 }
             )
 
-            disposable += tableView.reactive.dataSource.feed(
-                property: dataSource,
-                to: #selector(UITableViewDataSource.tableView(_:titleForHeaderInSection:)),
-                map: { (dataSource: DataSource?, tableView: UITableView, index: Int) -> NSString? in
-                    guard let dataSource = dataSource else { return nil }
-                    return binder.titleForHeader(in: index, dataSource: dataSource) as NSString?
-                }
-            )
-
-            disposable += tableView.reactive.dataSource.feed(
-                property: dataSource,
-                to: #selector(UITableViewDataSource.tableView(_:titleForFooterInSection:)),
-                map: { (dataSource: DataSource?, tableView: UITableView, index: Int) -> NSString? in
-                    guard let dataSource = dataSource else { return nil }
-                    return binder.titleForFooter(in: index, dataSource: dataSource) as NSString?
-                }
-            )
-
+            // TODO: Remove when TableViewBond is removed
+            if let bondBinder = binder as? AnyTableViewBondBinder<DataSource> {
+                disposable += tableView.reactive.dataSource.feed(
+                    property: dataSource,
+                    to: #selector(UITableViewDataSource.tableView(_:titleForHeaderInSection:)),
+                    map: { (dataSource: DataSource?, tableView: UITableView, index: Int) -> NSString? in
+                        guard let dataSource = dataSource else { return nil }
+                        return bondBinder.titleForHeader(in: index, dataSource: dataSource) as NSString?
+                    }
+                )
+
+                disposable += tableView.reactive.dataSource.feed(
+                    property: dataSource,
+                    to: #selector(UITableViewDataSource.tableView(_:titleForFooterInSection:)),
+                    map: { (dataSource: DataSource?, tableView: UITableView, index: Int) -> NSString? in
+                        guard let dataSource = dataSource else { return nil }
+                        return bondBinder.titleForFooter(in: index, dataSource: dataSource) as NSString?
+                    }
+                )
+            }
 
             disposable += tableView.reactive.dataSource.feed(
                 property: dataSource,

                tableView.endUpdates()
            }
        }

        /// - Returns: Header title for the given section. Default implementation returns `nil`.
        open func titleForHeader(in section: Int, dataSource: DataSource) -> String? {
            return nil
        }

        /// - Returns: Footer title for the given section. Default implementation returns `nil`.
        open func titleForFooter(in section: Int, dataSource: DataSource) -> String? {
            return nil
        }
    }

    /// A `TableViewBinder` subclass that applies events without animations or batching.

        }
    }

    private class AnyTableViewBondBinder<DataSource: DataSourceProtocol>: TableViewBinder<DataSource> {

        func titleForHeader(in section: Int, dataSource: DataSource) -> String? {
            return nil
        }

        func titleForFooter(in section: Int, dataSource: DataSource) -> String? {
            return nil
        }
    }

    @available(*, deprecated)
    private class TableViewBondBinder<Bond: TableViewBond>: AnyTableViewBondBinder<Bond.DataSource> {

        let bond: Bond

