     }
     
     // MARK: Lifecycle
-    
+
+    open override func loadView() {
+        super.loadView()
+        if delegate == nil {
+            delegate = self
+        }
+    }
+
     open override func viewDidLoad() {
         super.viewDidLoad()
+        reload()
+    }
 
-        reload()
+    // MARK: TableViewModelControllerDelegate
+
+    open func cell(forIdentifier identifier: String) -> TableCell {
+        return .basic
+    }
+
+    open func update(_ cell: UITableViewCell & TableViewModelCell, at indexPath: IndexPath) {
+        let item = dataSource.item(at: indexPath)
+        cell.update(with: item)
+    }
+
+    open func performAction(for cell: UITableViewCell & TableViewModelCell, at indexPath: IndexPath, sender: Any) {
+        /// - TODO: check later
+        cell.action(cell)
     }
 
     // MARK: Helpers

extension TableViewModelController {
    
    open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard
            let cell = tableView.cellForRow(at: indexPath),
            let tableViewModelCell = cell as? TableViewModelCell
        else { return }
        
        if cell.selectionStyle != .none {
            tableViewModelCell.action(cell)
        }
    }
    

    
    private func registerCell(with identifier: String) {
        guard let delegate = delegate else {
            fatalError("Delegate must be provided by now.")
        }
        switch delegate.cell(forIdentifier: identifier) {
        case .basic:
