             return carousel.apply(changeSet: carouselChangeSet, layoutEngine: layoutEngine)
             
         case .touchable(let touchableChangeSet):
-            let result = render(changeSet: touchableChangeSet.child, into: view)
-            
-            switch touchableChangeSet.gesture {
-                
-            case .change(to: .tap(let message)):
-                let mailbox: Mailbox<ActionType> = result.view.getMailbox()
-                let dispatcher = MessageDispatcher(mailbox: mailbox, message: message)
-                result.view.register(dispatcher: dispatcher)
-                result.view.gestureRecognizers?.forEach { result.view.removeGestureRecognizer($0) }
-                let recognizer = UITapGestureRecognizer(target: dispatcher, action: dispatcher.selector)
-                result.view.addGestureRecognizer(recognizer)
-            
-            case .noChange:
-                break
-                
-            }
-            
-            return result
+            return apply(changeSet: touchableChangeSet, to: view)
             
         case .segmented(let segmentedChangeSet):
             let segmented = castOrRelease(view: view, to: UISegmentedControl.self)

        }
    }
    // swiftlint:enable cyclomatic_complexity function_body_length
    
    fileprivate func apply(changeSet: ContainerChangeSet<ActionType>, to view: UIView) -> Render<ActionType> {
        var afterLayoutTasks = [AfterLayoutTask]()

            return textField.apply(changeSet: textFieldChangeSet, layoutEngine: layoutEngine)
            
        case .custom(let customComponentChangeSet):
            return apply(changeSet: customComponentChangeSet, to: view ?? UIView())
            
        case .spinner(let spinnerChangeSet):
            let spinner = castOrRelease(view: view, to: UIActivityIndicatorView.self)
