         didSet { self.configuration?.didAssociate(with: self) }
     }
 
-    fileprivate var weakRegistry: Set<WeakReference<Token>> = []
+    fileprivate var weakRegistry: Set<WeakReference<Token>> = [] {
+        didSet {
+            guard let view = self.view else { return }
+            view.removeGestureRecognizer(self.tapGestureRecognizer)
+            view.removeGestureRecognizer(self.longPressGestureRecognizer)
+            let gestureEvents = self.weakRegistry.flatMap({ $0.referent?.action.gestureEvent })
+            if !gestureEvents.filter({ $0.isTap }).isEmpty {
+                view.addGestureRecognizer(self.tapGestureRecognizer)
+            }
+            if !gestureEvents.filter({ $0.isLongPress }).isEmpty {
+                view.addGestureRecognizer(self.longPressGestureRecognizer)
+            }
+        }
+    }
     fileprivate var storedRegistry: Set<Token> = []
 
     public func subscribe(to touchEvent: TouchEvent, with callback: TouchEventCallback) -> Token {

    public typealias GestureEventCallback = (ViewStateManager, UIView, GestureEvent) -> Void

    public enum GestureEvent {
        case tap
        case longPress
    }

    public final class Token: Hashable {

        fileprivate enum Action {
            case touch(event: TouchEvent, callback: TouchEventCallback)
            case gesture(event: GestureEvent, callback: GestureEventCallback)
            case state(callback: StateEventCallback)
        }

        fileprivate weak var stateManager: ViewStateManager?

        view.addGestureRecognizer(self.touchGestureRecognizer)

        self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleGestureRecognizer(_:)))
        self.longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleGestureRecognizer(_:)))
    }

    public var state: State = .enabled {
