       forEvents events: UIControlEvents = UIControlEvents.allEvents,
       context: C,
       _ block: @escaping (C, AnyObject?, UIEvent) -> Void) {
-      
-      self.actionChannel(forEvents: events)
+
+      self.actions(forEvents: events)
         .onUpdate(context: context) { (context, update) in
           block(context, update.sender, update.event)
       }
     }
-  }
-  
+
+    /// An `ProducerProxy` that refers to read-write property `UIControl.isEnabled`
+    var isEnabled: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "enabled", onNone: .drop) }
+
+    /// An `ProducerProxy` that refers to read-write property `UIControl.isSelected`
+    var isSelected: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "selected", onNone: .drop) }
+
+    /// An `Channel` that refers to read-only property `UIControl.state`
+    var state: Channel<UIControlState, Void> { return updating(forKeyPath: "state", onNone: .drop) }
+  }
+
   private class UIControlActionReceiver: NSObject {
     weak var control: UIControl?
-    let producer = Producer<UIControl.ActionChannelUpdate, Void>(bufferSize: 0)
-    
+    let producer = Producer<(sender: AnyObject?, event: UIEvent), Void>(bufferSize: 0)
+
     init(control: UIControl) {
       self.control = control
     }
-    
+
     dynamic func asyncNinjaAction(sender: AnyObject?, forEvent event: UIEvent) {
-      let update: UIControl.ActionChannelUpdate = (
+      let update: (sender: AnyObject?, event: UIEvent) = (
         sender: sender,
         event: event
       )
       self.producer.update(update, from: .main)
     }
-  }
-
-  private class ActionReceiver: NSObject {
-    weak var object: NSObject?
-    let producer = Producer<AnyObject?, Void>(bufferSize: 0)
-    
-    init(object: NSObject) {
-      self.object = object
-    }
-    
-    dynamic func asyncNinjaAction(sender: AnyObject?) {
-      self.producer.update(sender, from: .main)
-    }
-  }
-
-  // MARK: - reactive properties for UIView
-  public extension ReactiveProperties where Object: UIView {
-    /// An `ProducerProxy` that refers to read-write property `UIView.alpha`
-    var alpha: ProducerProxy<CGFloat, Void> { return updatable(forKeyPath: "alpha", onNone: .drop) }
-
-    /// An `ProducerProxy` that refers to read-write property `UIView.tintColor`
-    var tintColor: ProducerProxy<UIColor, Void> { return updatable(forKeyPath: "tintColor", onNone: .drop) }
-
-    /// An `ProducerProxy` that refers to read-write property `UIView.isHidden`
-    var isHidden: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "hidden", onNone: .drop) }
-
-    /// An `ProducerProxy` that refers to read-write property `UIView.isOpaque`
-    var isOpaque: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "opaque", onNone: .drop) }
-
-    /// An `ProducerProxy` that refers to read-write property `UIView.isUserInteractionEnabled`
-    var isUserInteractionEnabled: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "userInteractionEnabled", onNone: .drop) }
-  }
-  
-  // MARK: - reactive properties for UIControl
-  public extension ReactiveProperties where Object: UIControl {
-    /// An `ProducerProxy` that refers to read-write property `UIControl.isEnabled`
-    var isEnabled: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "enabled", onNone: .drop) }
-
-    /// An `ProducerProxy` that refers to read-write property `UIControl.isSelected`
-    var isSelected: ProducerProxy<Bool, Void> { return updatable(forKeyPath: "selected", onNone: .drop) }
-
-    /// An `Channel` that refers to read-only property `UIControl.state`
-    var state: Channel<UIControlState, Void> { return updating(forKeyPath: "state", onNone: .drop) }
   }
 
   // MARK: - reactive properties for UILabel

    }
    #endif
  }
  
#if os(iOS)
  // MARK: - reactive properties for UIDatePicker
  public extension ReactiveProperties where Object: UIDatePicker {

    }
  }
  
  // MARK: - reactive properties for UIBarButtonItem
  public extension ReactiveProperties where Object: UIBarButtonItem {
    func actionChannel() -> Channel<AnyObject?, Void> {
      if let actionReceiver = object.target as? UIBarButtonItemActionReceiver {
        return actionReceiver.producer
      } else {
        let actionReceiver = UIBarButtonItemActionReceiver(object: object)
        object.target = actionReceiver
        object.action = #selector(UIBarButtonItemActionReceiver.asyncNinjaAction(sender:))
        object.notifyDeinit {
          actionReceiver.producer.cancelBecauseOfDeallocatedContext(from: nil)
        }
        return actionReceiver.producer
      }
    }

    /// An `ProducerProxy` that refers to read-write property `UIBarButtonItem.style`
    var style: ProducerProxy<UIBarButtonItemStyle, Void> {
      return updatable(forKeyPath: "style", onNone: .drop, customGetter: { $0.style }, customSetter: { $0.style = $1 })
