diff --git a/Documentation/API.md b/Documentation/API.md index 0afd30a7..c25d5dbc 100644 --- a/Documentation/API.md +++ b/Documentation/API.md @@ -102,13 +102,13 @@ Creating new operators is also pretty straightforward. ```swift -extension NSObject { +extension Reactive where Base: NSObject { - public var rx_deallocated: Observable {} + public var deallocated: Observable {} #if !DISABLE_SWIZZLING - public var rx_deallocating: Observable {} + public var deallocating: Observable {} #endif @@ -118,9 +118,9 @@ extension NSObject { ```swift -extension NSObject { +extension Reactive where Base: NSObject { - public func rx_observe( + public func observe( type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = .New | .Initial, @@ -129,7 +129,7 @@ extension NSObject { #if !DISABLE_SWIZZLING - public func rx_observeWeakly( + public func observeWeakly( type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = .New | .Initial @@ -140,23 +140,23 @@ extension NSObject { ``` ```swift -extension NSURLSession { +extension Reactive where Base: NSURLSession { - public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {} + public func response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {} - public func rx_data(request: NSURLRequest) -> Observable {} + public func data(request: NSURLRequest) -> Observable {} - public func rx_JSON(request: NSURLRequest) -> Observable {} + public func JSON(request: NSURLRequest) -> Observable {} - public func rx_JSON(URL: NSURL) -> Observable {} + public func JSON(URL: NSURL) -> Observable {} } ``` ```swift -extension NSNotificationCenter { +extension Reactive where Base: NSNotificationCenter { - public func rx_notification(name: String, object: AnyObject?) -> Observable {} + public func notification(name: String, object: AnyObject?) -> Observable {} } ``` @@ -170,39 +170,39 @@ class DelegateProxy { ``` ```swift -extension CLLocationManager { +extension Reactive where Base: CLLocationManager { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public var rx_didUpdateLocations: Observable<[CLLocation]> {} + public var didUpdateLocations: Observable<[CLLocation]> {} - public var rx_didFailWithError: Observable {} + public var didFailWithError: Observable {} - public var rx_didFinishDeferredUpdatesWithError: Observable {} + public var didFinishDeferredUpdatesWithError: Observable {} - public var rx_didPauseLocationUpdates: Observable {} + public var didPauseLocationUpdates: Observable {} - public var rx_didResumeLocationUpdates: Observable {} + public var didResumeLocationUpdates: Observable {} - public var rx_didUpdateHeading: Observable {} + public var didUpdateHeading: Observable {} - public var rx_didEnterRegion: Observable {} + public var didEnterRegion: Observable {} - public var rx_didExitRegion: Observable {} + public var didExitRegion: Observable {} - public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {} + public var didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {} - public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {} + public var monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {} - public var rx_didStartMonitoringForRegion: Observable {} + public var didStartMonitoringForRegion: Observable {} - public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {} + public var didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {} - public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {} + public var rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {} - public var rx_didVisit: Observable {} + public var didVisit: Observable {} - public var rx_didChangeAuthorizationStatus: Observable {} + public var didChangeAuthorizationStatus: Observable {} } ``` @@ -211,281 +211,281 @@ extension CLLocationManager { ```swift -extension UIControl { +extension Reactive where Base: UIControl { - public func rx_controlEvent(controlEvents: UIControlEvents) -> ControlEvent {} + public func controlEvent(controlEvents: UIControlEvents) -> ControlEvent {} - public var rx_enabled: ObserverOf {} + public var enabled: ObserverOf {} } ``` ```swift -extension UIButton { +extension Reactive where Base: UIButton { - public var rx_tap: ControlEvent {} + public var tap: ControlEvent {} } ``` ```swift -extension UITextField { +extension Reactive where Base: UITextField { - public var rx_text: ControlProperty {} + public var text: ControlProperty {} } ``` ```swift -extension UITextView { +extension Reactive where Base: UITextView { - override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {} + override func createDelegateProxy() -> RxScrollViewDelegateProxy {} - public var rx_text: ControlProperty {} + public var text: ControlProperty {} } ``` ```swift -extension UISearchBar { +extension Reactive where Base: UISearchBar { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public var rx_searchText: ControlProperty {} + public var searchText: ControlProperty {} } ``` ```swift -extension UILabel { +extension Reactive where Base: UILabel { - public var rx_text: ObserverOf {} + public var text: ObserverOf {} } ``` ```swift -extension UIDatePicker { +extension Reactive where Base: UIDatePicker { - public var rx_date: ControlProperty {} + public var date: ControlProperty {} } ``` ```swift -extension UIImageView { +extension Reactive where Base: UIImageView { - public var rx_image: ObserverOf {} + public var image: ObserverOf {} - public func rx_imageAnimated(transitionType: String?) -> AnyObserver + public func imageAnimated(transitionType: String?) -> AnyObserver } ``` ```swift -extension UIScrollView { +extension Reactive where Base: UIScrollView { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public func rx_setDelegate(delegate: UIScrollViewDelegate) {} + public func setDelegate(delegate: UIScrollViewDelegate) {} - public var rx_contentOffset: ControlProperty {} + public var contentOffset: ControlProperty {} } ``` ```swift -extension UIBarButtonItem { +extension Reactive where Base: UIBarButtonItem { - public var rx_tap: ControlEvent {} + public var tap: ControlEvent {} } ``` ```swift -extension UISlider { +extension Reactive where Base: UISlider { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension UITableView { +extension Reactive where Base: UITableView { - public var rx_dataSource: DelegateProxy {} + public var dataSource: DelegateProxy {} - public func rx_setDataSource(dataSource: UITableViewDataSource) -> Disposable {} + public func setDataSource(dataSource: UITableViewDataSource) -> Disposable {} - public func rx_itemsWithCellFactory(source: O)(cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable {} + public func itemsWithCellFactory(source: O)(cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable {} - public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} + public func itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} - public func rx_itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} + public func itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} - public var rx_itemSelected: ControlEvent {} + public var itemSelected: ControlEvent {} - public var rx_itemDeselected: ControlEvent {} + public var itemDeselected: ControlEvent {} - public var rx_itemInserted: ControlEvent {} + public var itemInserted: ControlEvent {} - public var rx_itemDeleted: ControlEvent {} + public var itemDeleted: ControlEvent {} - public var rx_itemMoved: ControlEvent {} + public var itemMoved: ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelSelected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelSelected(modelType: T.Type) -> ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelDeselected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelDeselected(modelType: T.Type) -> ControlEvent {} } ``` ```swift -extension UICollectionView { +extension Reactive where Base: UICollectionView { - public var rx_dataSource: DelegateProxy {} + public var dataSource: DelegateProxy {} - public func rx_setDataSource(dataSource: UICollectionViewDataSource) -> Disposable {} + public func setDataSource(dataSource: UICollectionViewDataSource) -> Disposable {} - public func rx_itemsWithCellFactory(source: O)(cellFactory: (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) -> Disposable {} + public func itemsWithCellFactory(source: O)(cellFactory: (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) -> Disposable {} - public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} + public func itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} - public func rx_itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} + public func itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} - public var rx_itemSelected: ControlEvent {} + public var itemSelected: ControlEvent {} - public var rx_itemDeselected: ControlEvent {} + public var itemDeselected: ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelSelected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelSelected(modelType: T.Type) -> ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelSelected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelSelected(modelType: T.Type) -> ControlEvent {} } ``` ```swift -extension UIGestureRecognizer { +extension Reactive where Base: UIGestureRecognizer { - public var rx_event: ControlEvent {} + public var event: ControlEvent {} } ``` ```swift -extension UIImagePickerController { +extension Reactive where Base: UIImagePickerController { - public var rx_didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {} + public var didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {} - public var rx_didCancel: Observable<()> {} + public var didCancel: Observable<()> {} } ``` ```swift -extension UISegmentedControl { +extension Reactive where Base: UISegmentedControl { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension UISwitch { +extension Reactive where Base: UISwitch { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension UIActivityIndicatorView { +extension Reactive where Base: UIActivityIndicatorView { - public var rx_animating: AnyObserver {} + public var animating: AnyObserver {} } ``` ```swift -extension UINavigationItem { +extension Reactive where Base: UINavigationItem { - public var rx_title: AnyObserver {} + public var title: AnyObserver {} } ``` **OSX** ```swift -extension NSControl { +extension Reactive where Base: NSControl { - public var rx_controlEvent: ControlEvent<()> {} + public var controlEvent: ControlEvent<()> {} - public var rx_enabled: AnyObserver {} + public var enabled: AnyObserver {} } ``` ```swift -extension NSSlider { +extension Reactive where Base: NSSlider { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension NSButton { +extension Reactive where Base: NSButton { - public var rx_tap: ControlEvent {} + public var tap: ControlEvent {} - public var rx_state: ControlProperty {} + public var state: ControlProperty {} } ``` ```swift -extension NSImageView { +extension Reactive where Base: NSImageView { - public var rx_image: ObserverOf {} + public var image: ObserverOf {} - public func rx_imageAnimated(transitionType: String?) -> AnyObserver + public func imageAnimated(transitionType: String?) -> AnyObserver } ``` ```swift -extension NSTextField { +extension Reactive where Base: NSTextField { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public var rx_text: ControlProperty {} + public var text: ControlProperty {} } ``` ```swift -extension UITabBarItem { +extension Reactive where Base: UITabBarItem { - public var rx_badgeValue: AnyObserver {} + public var badgeValue: AnyObserver {} } ``` ```swift -extension UITabBar { +extension Reactive where Base: UITabBar { - public var rx_didSelectItem: ControlEvent {} + public var didSelectItem: ControlEvent {} - public var rx_willBeginCustomizing: ControlEvent<[UITabBarItem]> {} + public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {} - public var rx_didBeginCustomizing: ControlEvent<[UITabBarItem]> {} + public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {} - public var rx_willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} + public var willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} - public var rx_didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} + public var didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} } ``` diff --git a/Documentation/Examples.md b/Documentation/Examples.md index 0c4e09c8..d3cb73a0 100644 --- a/Documentation/Examples.md +++ b/Documentation/Examples.md @@ -72,17 +72,17 @@ b.value = -8 // doesn't print anything ## Simple UI bindings -* Instead of binding to variables, let's bind to `UITextField` values using the `rx_text` property +* Instead of binding to variables, let's bind to `UITextField` values using the `rx.text` property * Next, `map` the `String` into an `Int` and determine if the number is prime using an async API * If the text is changed before the async call completes, a new async call will replace it via `concat` * Bind the results to a `UILabel` ```swift -let subscription/*: Disposable */ = primeTextField.rx_text // type is Observable +let subscription/*: Disposable */ = primeTextField.rx.text // type is Observable .map { WolframAlphaIsPrime(Int($0) ?? 0) } // type is Observable> .concat() // type is Observable .map { "number \($0.n) is prime? \($0.isPrime)" } // type is Observable - .bindTo(resultLabel.rx_text) // return Disposable that can be used to unbind everything + .bindTo(resultLabel.rx.text) // return Disposable that can be used to unbind everything // This will set `resultLabel.text` to "number 43 is prime? true" after // server call completes. @@ -108,7 +108,7 @@ Let's give it a shot. ```swift // bind UI control values directly // use username from `usernameOutlet` as username values source -self.usernameOutlet.rx_text +self.usernameOutlet.rx.text .map { username in // synchronous validation, nothing special here diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md index dab7945a..3f3630de 100644 --- a/Documentation/GettingStarted.md +++ b/Documentation/GettingStarted.md @@ -208,7 +208,7 @@ Additional way to automatically dispose subscription on dealloc is to use `takeU ```swift sequence - .takeUntil(self.rx_deallocated) + .takeUntil(self.rx.deallocated) .subscribe { print($0) } @@ -554,8 +554,8 @@ Behavior for URL observables is equivalent. This is how HTTP requests are wrapped in Rx. It's pretty much the same pattern like the `interval` operator. ```swift -extension NSURLSession { - public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> { +extension Reactive where Base: NSURLSession { + public func response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> { return Observable.create { observer in let task = self.dataTaskWithRequest(request) { (data, response, error) in guard let response = response, data = data else { @@ -933,14 +933,14 @@ There are two built in ways this library supports KVO. ```swift // KVO -extension NSObject { - public func rx_observe(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable {} +extension Reactive where Base: NSObject { + public func observe(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable {} } #if !DISABLE_SWIZZLING // KVO -extension NSObject { - public func rx_observeWeakly(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable {} +extension Reactive where Base: NSObject { + public func observeWeakly(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable {} } #endif ``` @@ -951,7 +951,7 @@ Example how to observe frame of `UIView`. ```swift view - .rx_observe(CGRect.self, "frame") + .rx.observe(CGRect.self, "frame") .subscribe(onNext: { frame in ... }) @@ -961,15 +961,15 @@ or ```swift view - .rx_observeWeakly(CGRect.self, "frame") + .rx.observeWeakly(CGRect.self, "frame") .subscribe(onNext: { frame in ... }) ``` -### `rx_observe` +### `rx.observe` -`rx_observe` is more performant because it's just a simple wrapper around KVO mechanism, but it has more limited usage scenarios +`rx.observe` is more performant because it's just a simple wrapper around KVO mechanism, but it has more limited usage scenarios * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`) * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`) @@ -978,14 +978,14 @@ view E.g. ```swift -self.rx_observe(CGRect.self, "view.frame", retainSelf: false) +self.rx.observe(CGRect.self, "view.frame", retainSelf: false) ``` -### `rx_observeWeakly` +### `rx.observeWeakly` -`rx_observeWeakly` has somewhat slower than `rx_observe` because it has to handle object deallocation in case of weak references. +`rx.observeWeakly` has somewhat slower than `rx.observe` because it has to handle object deallocation in case of weak references. -It can be used in all cases where `rx_observe` can be used and additionally +It can be used in all cases where `rx.observe` can be used and additionally * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown * it can be used to observe `weak` properties @@ -993,7 +993,7 @@ It can be used in all cases where `rx_observe` can be used and additionally E.g. ```swift -someSuspiciousViewController.rx_observeWeakly(Bool.self, "behavingOk") +someSuspiciousViewController.rx.observeWeakly(Bool.self, "behavingOk") ``` ### Observing structs @@ -1004,7 +1004,7 @@ KVO is an Objective-C mechanism so it relies heavily on `NSValue`. When observing some other structures it is necessary to extract those structures from `NSValue` manually. -[Here](../RxCocoa/Common/KVORepresentable+CoreGraphics.swift) are examples how to extend KVO observing mechanism and `rx_observe*` methods for other structs by implementing `KVORepresentable` protocol. +[Here](../RxCocoa/Common/KVORepresentable+CoreGraphics.swift) are examples how to extend KVO observing mechanism and `rx.observe*` methods for other structs by implementing `KVORepresentable` protocol. ## UI layer tips @@ -1070,7 +1070,7 @@ let request = NSURLRequest(URL: NSURL(string: "http://en.wikipedia.org/w/api.php If you want to just execute that request outside of composition with other observables, this is what needs to be done. ```swift -let responseJSON = NSURLSession.sharedSession().rx_JSON(request) +let responseJSON = NSURLSession.sharedSession().rx.JSON(request) // no requests will be performed up to this point // `responseJSON` is just a description how to fetch the response @@ -1093,7 +1093,7 @@ cancelRequest.dispose() In case you want a more low level access to response, you can use: ```swift -NSURLSession.sharedSession().rx_response(myNSURLRequest) +NSURLSession.sharedSession().rx.response(myNSURLRequest) .debug("my request") // this will print out information to console .flatMap { (data: NSData!, response: NSURLResponse!) -> Observable in if let response = response as? NSHTTPURLResponse { diff --git a/Documentation/Units.md b/Documentation/Units.md index c1d2a11f..5f347da5 100644 --- a/Documentation/Units.md +++ b/Documentation/Units.md @@ -164,7 +164,7 @@ E.g. This is a typical beginner example. ```swift -let results = query.rx_text +let results = query.rx.text .throttle(0.3, scheduler: MainScheduler.instance) .flatMapLatest { query in fetchAutoCompleteItems(query) @@ -172,11 +172,11 @@ let results = query.rx_text results .map { "\($0.count)" } - .bindTo(resultCount.rx_text) + .bindTo(resultCount.rx.text) .addDisposableTo(disposeBag) results - .bindTo(resultsTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in + .bindTo(resultsTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in cell.textLabel?.text = "\(result)" } .addDisposableTo(disposeBag) @@ -195,7 +195,7 @@ So, what are the problems with this code?: A more appropriate version of the code would look like this: ```swift -let results = query.rx_text +let results = query.rx.text .throttle(0.3, scheduler: MainScheduler.instance) .flatMapLatest { query in fetchAutoCompleteItems(query) @@ -207,11 +207,11 @@ let results = query.rx_text results .map { "\($0.count)" } - .bindTo(resultCount.rx_text) + .bindTo(resultCount.rx.text) .addDisposableTo(disposeBag) results - .bindTo(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in + .bindTo(resultTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in cell.textLabel?.text = "\(result)" } .addDisposableTo(disposeBag) @@ -222,7 +222,7 @@ Making sure all of these requirements are properly handled in large systems can The following code looks almost the same: ```swift -let results = query.rx_text.asDriver() // This converts a normal sequence into a `Driver` sequence. +let results = query.rx.text.asDriver() // This converts a normal sequence into a `Driver` sequence. .throttle(0.3, scheduler: MainScheduler.instance) .flatMapLatest { query in fetchAutoCompleteItems(query) @@ -231,11 +231,11 @@ let results = query.rx_text.asDriver() // This converts a normal sequence results .map { "\($0.count)" } - .drive(resultCount.rx_text) // If there is a `drive` method available instead of `bindTo`, + .drive(resultCount.rx.text) // If there is a `drive` method available instead of `bindTo`, .addDisposableTo(disposeBag) // that means that the compiler has proven that all properties // are satisfied. results - .drive(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in + .drive(resultTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in cell.textLabel?.text = "\(result)" } .addDisposableTo(disposeBag) @@ -246,7 +246,7 @@ So what is happening here? This first `asDriver` method converts the `ControlProperty` unit to a `Driver` unit. ```swift -query.rx_text.asDriver() +query.rx.text.asDriver() ``` Notice that there wasn't anything special that needed to be done. `Driver` has all of the properties of the `ControlProperty` unit, plus some more. The underlying observable sequence is just wrapped as a `Driver` unit, and that's it. diff --git a/Documentation/Warnings.md b/Documentation/Warnings.md index ff4f229d..52813279 100644 --- a/Documentation/Warnings.md +++ b/Documentation/Warnings.md @@ -55,7 +55,7 @@ _ = xs .filter { ... } .map { ... } .switchLatest() - .takeUntil(someObject.rx_deallocated) // <-- note the `takeUntil` operator + .takeUntil(someObject.deallocated) // <-- note the `takeUntil` operator .subscribe(onNext: { ... }, onError: { diff --git a/README.md b/README.md index b65cb038..989d15cf 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ KVO observing, async operations and streams are all unified under [abstraction o
-let searchResults = searchBar.rx_text
+let searchResults = searchBar.rx.text
     .throttle(0.3, scheduler: MainScheduler.instance)
     .distinctUntilChanged()
     .flatMapLatest { query -> Observable<[Repository]> in
@@ -96,7 +96,7 @@ let searchResults = searchBar.rx_text
   
     
 searchResults
-    .bindTo(tableView.rx_itemsWithCellIdentifier("Cell")) {
+    .bindTo(tableView.rx.itemsWithCellIdentifier("Cell")) {
         (index, repository: Repository, cell) in
         cell.textLabel?.text = repository.name
         cell.detailTextLabel?.text = repository.url
diff --git a/Rx.xcodeproj/project.pbxproj b/Rx.xcodeproj/project.pbxproj
index f3a1760f..144a26ef 100644
--- a/Rx.xcodeproj/project.pbxproj
+++ b/Rx.xcodeproj/project.pbxproj
@@ -66,6 +66,7 @@
 		84E4D3931C9AFD3500ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
 		84E4D3941C9AFD3600ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
 		84E4D3961C9B011000ADFDC9 /* UISearchController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */; };
+		87379AE01D61C6F50047CA88 /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F461001CD7ABE400527B4D /* Reactive.swift */; };
 		88718CFE1CE5D80000D88D60 /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */; };
 		88718CFF1CE5D80000D88D60 /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */; };
 		88718D011CE5DE2600D88D60 /* UITabBar+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718D001CE5DE2500D88D60 /* UITabBar+RxTests.swift */; };
@@ -1415,9 +1416,9 @@
 		84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextStorageDelegateProxy.swift; sourceTree = ""; };
 		84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchController+Rx.swift"; sourceTree = ""; };
 		84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchController+RxTests.swift"; sourceTree = ""; };
-		88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITabBar+Rx.swift"; sourceTree = ""; };
+		88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITabBar+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		88718D001CE5DE2500D88D60 /* UITabBar+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITabBar+RxTests.swift"; sourceTree = ""; };
-		88D98F2D1CE7549A00D50457 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTabBarDelegateProxy.swift; sourceTree = ""; };
+		88D98F2D1CE7549A00D50457 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxTabBarDelegateProxy.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		914FCD661CCDB82E0058B304 /* UIPageControl+RxTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIPageControl+RxTest.swift"; sourceTree = ""; };
 		91BE429B1CBF7EC000F6B062 /* UIPageControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIPageControl+Rx.swift"; sourceTree = ""; };
 		9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIActivityIndicatorView+Rx.swift"; sourceTree = ""; };
@@ -1573,8 +1574,8 @@
 		C83508DC1C38706D0027C24C /* Control+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Control+RxTests.swift"; sourceTree = ""; };
 		C83508DD1C38706D0027C24C /* ControlEventTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlEventTests.swift; sourceTree = ""; };
 		C83508DE1C38706D0027C24C /* ControlPropertyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlPropertyTests.swift; sourceTree = ""; };
-		C83508DF1C38706D0027C24C /* DelegateProxyTest+Cocoa.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DelegateProxyTest+Cocoa.swift"; sourceTree = ""; };
-		C83508E01C38706D0027C24C /* DelegateProxyTest+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DelegateProxyTest+UIKit.swift"; sourceTree = ""; };
+		C83508DF1C38706D0027C24C /* DelegateProxyTest+Cocoa.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DelegateProxyTest+Cocoa.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
+		C83508E01C38706D0027C24C /* DelegateProxyTest+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DelegateProxyTest+UIKit.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C83508E11C38706D0027C24C /* DelegateProxyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelegateProxyTest.swift; sourceTree = ""; };
 		C83508E21C38706D0027C24C /* Driver+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Extensions.swift"; sourceTree = ""; };
 		C83508E31C38706D0027C24C /* Driver+Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Test.swift"; sourceTree = ""; };
@@ -1667,29 +1668,29 @@
 		C88253F41B8A752B00B02D69 /* ItemEvents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemEvents.swift; sourceTree = ""; };
 		C88253F71B8A752B00B02D69 /* RxCollectionViewDataSourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewDataSourceType.swift; sourceTree = ""; };
 		C88253F81B8A752B00B02D69 /* RxTableViewDataSourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewDataSourceType.swift; sourceTree = ""; };
-		C88253FC1B8A752B00B02D69 /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewDataSourceProxy.swift; sourceTree = ""; };
+		C88253FC1B8A752B00B02D69 /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxCollectionViewDataSourceProxy.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C88253FD1B8A752B00B02D69 /* RxCollectionViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewDelegateProxy.swift; sourceTree = ""; };
-		C88253FE1B8A752B00B02D69 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxScrollViewDelegateProxy.swift; sourceTree = ""; };
-		C88253FF1B8A752B00B02D69 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxSearchBarDelegateProxy.swift; sourceTree = ""; };
-		C88254001B8A752B00B02D69 /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewDataSourceProxy.swift; sourceTree = ""; };
+		C88253FE1B8A752B00B02D69 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxScrollViewDelegateProxy.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
+		C88253FF1B8A752B00B02D69 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxSearchBarDelegateProxy.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
+		C88254001B8A752B00B02D69 /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxTableViewDataSourceProxy.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C88254011B8A752B00B02D69 /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewDelegateProxy.swift; sourceTree = ""; };
 		C88254021B8A752B00B02D69 /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextViewDelegateProxy.swift; sourceTree = ""; };
 		C88254051B8A752B00B02D69 /* UIBarButtonItem+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIBarButtonItem+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C88254061B8A752B00B02D69 /* UIButton+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIButton+Rx.swift"; sourceTree = ""; };
-		C88254071B8A752B00B02D69 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Rx.swift"; sourceTree = ""; };
+		C88254071B8A752B00B02D69 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UICollectionView+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C88254081B8A752B00B02D69 /* UIControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIControl+Rx.swift"; sourceTree = ""; };
 		C88254091B8A752B00B02D69 /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Rx.swift"; sourceTree = ""; };
 		C882540A1B8A752B00B02D69 /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIGestureRecognizer+Rx.swift"; sourceTree = ""; };
 		C882540B1B8A752B00B02D69 /* UIImageView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+Rx.swift"; sourceTree = ""; };
 		C882540C1B8A752B00B02D69 /* UILabel+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UILabel+Rx.swift"; sourceTree = ""; };
-		C882540D1B8A752B00B02D69 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIScrollView+Rx.swift"; sourceTree = ""; };
-		C882540E1B8A752B00B02D69 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchBar+Rx.swift"; sourceTree = ""; };
+		C882540D1B8A752B00B02D69 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIScrollView+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
+		C882540E1B8A752B00B02D69 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UISearchBar+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C882540F1B8A752B00B02D69 /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISegmentedControl+Rx.swift"; sourceTree = ""; };
 		C88254101B8A752B00B02D69 /* UISlider+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISlider+Rx.swift"; sourceTree = ""; };
 		C88254111B8A752B00B02D69 /* UISwitch+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISwitch+Rx.swift"; sourceTree = ""; };
-		C88254121B8A752B00B02D69 /* UITableView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+Rx.swift"; sourceTree = ""; };
+		C88254121B8A752B00B02D69 /* UITableView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITableView+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C88254131B8A752B00B02D69 /* UITextField+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextField+Rx.swift"; sourceTree = ""; };
-		C88254141B8A752B00B02D69 /* UITextView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextView+Rx.swift"; sourceTree = ""; };
+		C88254141B8A752B00B02D69 /* UITextView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITextView+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
 		C88BB8711B07E5ED0064D411 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RunLoopLock.swift; sourceTree = ""; };
 		C88F76801CE5341700D5A014 /* RxTextInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextInput.swift; sourceTree = ""; };
@@ -4376,6 +4377,7 @@
 				C8F0C0261BBBFBB9001B112F /* _RXDelegateProxy.m in Sources */,
 				C8F0C0271BBBFBB9001B112F /* NSObject+Rx.swift in Sources */,
 				9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */,
+				87379AE01D61C6F50047CA88 /* Reactive.swift in Sources */,
 				842A5A2E1C357F94003568D5 /* NSTextStorage+Rx.swift in Sources */,
 				C8F0C0281BBBFBB9001B112F /* RxTextViewDelegateProxy.swift in Sources */,
 				C8F0C0291BBBFBB9001B112F /* UIBarButtonItem+Rx.swift in Sources */,
diff --git a/RxCocoa/Common/CLLocationManager+Rx.swift b/RxCocoa/Common/CLLocationManager+Rx.swift
index c5cd8053..a170bb5c 100644
--- a/RxCocoa/Common/CLLocationManager+Rx.swift
+++ b/RxCocoa/Common/CLLocationManager+Rx.swift
@@ -12,15 +12,15 @@ import RxSwift
 #endif
 
 
-extension CLLocationManager {
+extension Reactive where Base: CLLocationManager {
 
     /**
     Reactive wrapper for `delegate`.
 
     For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_delegate: DelegateProxy {
-        return RxCLLocationManagerDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxCLLocationManagerDelegateProxy.proxyForObject(base)
     }
 
     // MARK: Responding to Location Events
@@ -28,8 +28,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didUpdateLocations: Observable<[CLLocation]> {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateLocations:)))
+    public var didUpdateLocations: Observable<[CLLocation]> {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateLocations:)))
             .map { a in
                 return try castOrThrow([CLLocation].self, a[1])
             }
@@ -38,8 +38,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didFailWithError: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFailWithError:)))
+    public var didFailWithError: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFailWithError:)))
             .map { a in
                 return try castOrThrow(NSError.self, a[1])
             }
@@ -49,8 +49,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didFinishDeferredUpdatesWithError: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFinishDeferredUpdatesWithError:)))
+    public var didFinishDeferredUpdatesWithError: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFinishDeferredUpdatesWithError:)))
             .map { a in
                 return try castOptionalOrThrow(NSError.self, a[1])
             }
@@ -64,8 +64,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didPauseLocationUpdates: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManagerDidPauseLocationUpdates(_:)))
+    public var didPauseLocationUpdates: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManagerDidPauseLocationUpdates(_:)))
             .map { _ in
                 return ()
             }
@@ -74,8 +74,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didResumeLocationUpdates: Observable {
-        return rx_delegate.observe( #selector(CLLocationManagerDelegate.locationManagerDidResumeLocationUpdates(_:)))
+    public var didResumeLocationUpdates: Observable {
+        return delegate.observe( #selector(CLLocationManagerDelegate.locationManagerDidResumeLocationUpdates(_:)))
             .map { _ in
                 return ()
             }
@@ -86,8 +86,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didUpdateHeading: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateHeading:)))
+    public var didUpdateHeading: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateHeading:)))
             .map { a in
                 return try castOrThrow(CLHeading.self, a[1])
             }
@@ -98,8 +98,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didEnterRegion: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didEnterRegion:)))
+    public var didEnterRegion: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didEnterRegion:)))
             .map { a in
                 return try castOrThrow(CLRegion.self, a[1])
             }
@@ -108,8 +108,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didExitRegion: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didExitRegion:)))
+    public var didExitRegion: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didExitRegion:)))
             .map { a in
                 return try castOrThrow(CLRegion.self, a[1])
             }
@@ -123,8 +123,8 @@ extension CLLocationManager {
     Reactive wrapper for `delegate` message.
     */
     @available(OSX 10.10, *)
-    public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didDetermineState:for:)))
+    public var didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didDetermineState:for:)))
             .map { a in
                 let stateNumber = try castOrThrow(NSNumber.self, a[1])
                 let state = CLRegionState(rawValue: stateNumber.intValue) ?? CLRegionState.unknown
@@ -136,8 +136,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:monitoringDidFailFor:withError:)))
+    public var monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:monitoringDidFailFor:withError:)))
             .map { a in
                 let region = try castOptionalOrThrow(CLRegion.self, a[1])
                 let error = try castOrThrow(NSError.self, a[2])
@@ -148,8 +148,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didStartMonitoringForRegion: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didStartMonitoringFor:)))
+    public var didStartMonitoringForRegion: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didStartMonitoringFor:)))
             .map { a in
                 return try castOrThrow(CLRegion.self, a[1])
             }
@@ -164,8 +164,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didRangeBeacons:in:)))
+    public var didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didRangeBeacons:in:)))
             .map { a in
                 let beacons = try castOrThrow([CLBeacon].self, a[1])
                 let region = try castOrThrow(CLBeaconRegion.self, a[2])
@@ -176,8 +176,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:rangingBeaconsDidFailFor:withError:)))
+    public var rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:rangingBeaconsDidFailFor:withError:)))
             .map { a in
                 let region = try castOrThrow(CLBeaconRegion.self, a[1])
                 let error = try castOrThrow(NSError.self, a[2])
@@ -191,8 +191,8 @@ extension CLLocationManager {
     Reactive wrapper for `delegate` message.
     */
     @available(iOS 8.0, *)
-    public var rx_didVisit: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didVisit:)))
+    public var didVisit: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didVisit:)))
             .map { a in
                 return try castOrThrow(CLVisit.self, a[1])
             }
@@ -205,8 +205,8 @@ extension CLLocationManager {
     /**
     Reactive wrapper for `delegate` message.
     */
-    public var rx_didChangeAuthorizationStatus: Observable {
-        return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didChangeAuthorization:)))
+    public var didChangeAuthorizationStatus: Observable {
+        return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didChangeAuthorization:)))
             .map { a in
                 let number = try castOrThrow(NSNumber.self, a[1])
                 return CLAuthorizationStatus(rawValue: Int32(number.intValue)) ?? .notDetermined
diff --git a/RxCocoa/Common/DelegateProxy.swift b/RxCocoa/Common/DelegateProxy.swift
index d27a3f3a..9e311c08 100644
--- a/RxCocoa/Common/DelegateProxy.swift
+++ b/RxCocoa/Common/DelegateProxy.swift
@@ -73,8 +73,8 @@ open class DelegateProxy : _RXDelegateProxy {
          ....
 
          // reactive property implementation in a real class (`UIScrollView`)
-         public var rx_property: Observable {
-             let proxy = RxScrollViewDelegateProxy.proxyForObject(self)
+         public var property: Observable {
+             let proxy = RxScrollViewDelegateProxy.proxyForObject(base)
              return proxy.internalSubject.asObservable()
          }
 
diff --git a/RxCocoa/Common/DelegateProxyType.swift b/RxCocoa/Common/DelegateProxyType.swift
index b3d9ce63..7d48dcf8 100644
--- a/RxCocoa/Common/DelegateProxyType.swift
+++ b/RxCocoa/Common/DelegateProxyType.swift
@@ -69,8 +69,8 @@ every view has a corresponding delegate virtual factory method.
 In case of UITableView / UIScrollView, there is
 
     extension UIScrollView {
-        public func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
-            return RxScrollViewDelegateProxy(parentObject: self)
+        public func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
+            return RxScrollViewDelegateProxy(parentObject: base)
         }
     ....
 
@@ -78,7 +78,7 @@ In case of UITableView / UIScrollView, there is
 and override in UITableView
 
     extension UITableView {
-        public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+        public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         ....
 
 
@@ -160,14 +160,14 @@ extension DelegateProxyType {
      - returns: Installed instance of delegate proxy.
 
 
-         extension UISearchBar {
+         extension Reactive where Base: UISearchBar {
 
-             public var rx_delegate: DelegateProxy {
-                return RxSearchBarDelegateProxy.proxyForObject(self)
+             public var delegate: DelegateProxy {
+                return RxSearchBarDelegateProxy.proxyForObject(base)
              }
 
-             public var rx_text: ControlProperty {
-                 let source: Observable = self.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))
+             public var text: ControlProperty {
+                 let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))
                  ...
              }
          }
diff --git a/RxCocoa/Common/NSLayoutConstraint+Rx.swift b/RxCocoa/Common/NSLayoutConstraint+Rx.swift
index d7e01e42..94fda3e7 100644
--- a/RxCocoa/Common/NSLayoutConstraint+Rx.swift
+++ b/RxCocoa/Common/NSLayoutConstraint+Rx.swift
@@ -19,12 +19,12 @@ import RxSwift
 #endif
 
 #if os(iOS) || os(OSX) || os(tvOS)
-extension NSLayoutConstraint {
+extension Reactive where Base: NSLayoutConstraint {
     /**
      Bindable sink for `constant` property.
      */
-    public var rx_constant: AnyObserver {
-        return UIBindingObserver(UIElement: self) { constraint, constant in
+    public var constant: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { constraint, constant in
             constraint.constant = constant
         }.asObserver()
     }
@@ -33,8 +33,8 @@ extension NSLayoutConstraint {
      Bindable sink for `active` property.
      */
     @available(iOS 8, OSX 10.10, *)
-    public var rx_active: AnyObserver {
-        return UIBindingObserver(UIElement: self) { constraint, value in
+    public var active: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { constraint, value in
             constraint.isActive = value
         }.asObserver()
     }
diff --git a/RxCocoa/Common/Observables/Implementations/KVOObservable.swift b/RxCocoa/Common/Observables/Implementations/KVOObservable.swift
index 4ad4b706..0d4b305d 100644
--- a/RxCocoa/Common/Observables/Implementations/KVOObservable.swift
+++ b/RxCocoa/Common/Observables/Implementations/KVOObservable.swift
@@ -75,7 +75,7 @@ func isWeakProperty(_ properyRuntimeInfo: String) -> Bool {
 extension ObservableType where E == AnyObject? {
     func finishWithNilWhenDealloc(_ target: NSObject)
         -> Observable {
-        let deallocating = target.rx_deallocating
+        let deallocating = target.rx.deallocating
             
         return deallocating
             .map { _ in
diff --git a/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift b/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift
index d89dfb97..23f1f533 100644
--- a/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift
+++ b/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift
@@ -11,7 +11,7 @@ import Foundation
 import RxSwift
 #endif
 
-extension NotificationCenter {
+extension Reactive where Base: NotificationCenter {
     /**
     Transforms notifications posted to notification center to observable sequence of notifications.
     
@@ -20,14 +20,14 @@ extension NotificationCenter {
     - returns: Observable sequence of posted notifications.
     */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_notification(_ name: Notification.Name, object: AnyObject? = nil) -> Observable {
+    public func notification(_ name: Notification.Name, object: AnyObject? = nil) -> Observable {
         return Observable.create { [weak object] observer in
-            let nsObserver = self.addObserver(forName: name, object: object, queue: nil) { notification in
+            let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in
                 observer.on(.next(notification))
             }
             
             return Disposables.create {
-                self.removeObserver(nsObserver)
+                self.base.removeObserver(nsObserver)
             }
         }
     }
diff --git a/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift b/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift
index aba143ab..9b8858c6 100644
--- a/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift
+++ b/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift
@@ -11,34 +11,34 @@ import Foundation
     import RxSwift
 #endif
 
-extension NSObject {
+extension Reactive where Base: NSObject {
 
     /**
-     Specialization of generic `rx_observe` method.
+     Specialization of generic `observe` method.
 
      This is a special overload because to observe values of some type (for example `Int`), first values of KVO type
      need to be observed (`NSNumber`), and then converted to result type.
 
-     For more information take a look at `rx_observe` method.
+     For more information take a look at `observe` method.
      */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable {
-        return rx_observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
+    public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable {
+        return observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
             .map(E.init)
     }
 }
 
 #if !DISABLE_SWIZZLING
     // KVO
-    extension NSObject {
+    extension Reactive where Base: NSObject {
         /**
-        Specialization of generic `rx_observeWeakly` method.
+        Specialization of generic `observeWeakly` method.
 
-        For more information take a look at `rx_observeWeakly` method.
+        For more information take a look at `observeWeakly` method.
         */
         // @warn_unused_result(message:"http://git.io/rxs.uo")
-        public func rx_observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable {
-            return rx_observeWeakly(E.KVOType.self, keyPath, options: options)
+        public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable {
+            return observeWeakly(E.KVOType.self, keyPath, options: options)
                 .map(E.init)
         }
     }
diff --git a/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift b/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift
index 25ee8b5b..50f9cacc 100644
--- a/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift
+++ b/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift
@@ -11,40 +11,40 @@ import Foundation
     import RxSwift
 #endif
 
-extension NSObject {
+extension Reactive where Base: NSObject {
     /**
-     Specialization of generic `rx_observe` method.
+     Specialization of generic `observe` method.
 
      This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
      
      It is useful for observing bridged ObjC enum values.
 
-     For more information take a look at `rx_observe` method.
+     For more information take a look at `observe` method.
      */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable where E.RawValue: KVORepresentable {
-        return rx_observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
+    public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable where E.RawValue: KVORepresentable {
+        return observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
             .map(E.init)
     }
 }
 
 #if !DISABLE_SWIZZLING
 
-    // rx_observeWeakly + RawRepresentable
-    extension NSObject {
+    // observeWeakly + RawRepresentable
+    extension Reactive where Base: NSObject {
 
         /**
-         Specialization of generic `rx_observeWeakly` method.
+         Specialization of generic `observeWeakly` method.
 
          This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
      
          It is useful for observing bridged ObjC enum values.
 
-         For more information take a look at `rx_observeWeakly` method.
+         For more information take a look at `observeWeakly` method.
          */
         // @warn_unused_result(message:"http://git.io/rxs.uo")
-        public func rx_observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable where E.RawValue: KVORepresentable {
-            return rx_observeWeakly(E.RawValue.KVOType.self, keyPath, options: options)
+        public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable where E.RawValue: KVORepresentable {
+            return observeWeakly(E.RawValue.KVOType.self, keyPath, options: options)
                 .map(E.init)
         }
     }
diff --git a/RxCocoa/Common/Observables/NSObject+Rx.swift b/RxCocoa/Common/Observables/NSObject+Rx.swift
index b43c4cc2..c25b66d8 100644
--- a/RxCocoa/Common/Observables/NSObject+Rx.swift
+++ b/RxCocoa/Common/Observables/NSObject+Rx.swift
@@ -38,20 +38,20 @@ Both approaches can fail in certain scenarios:
 Second approach is chosen. It can fail in case there are multiple libraries dynamically trying
 to replace dealloc method. In case that isn't the case, it should be ok.
 */
-extension NSObject {
+extension Reactive where Base: NSObject {
 
 
     /**
      Observes values on `keyPath` starting from `self` with `options` and retains `self` if `retainSelf` is set.
 
-     `rx_observe` is just a simple and performant wrapper around KVO mechanism.
+     `observe` is just a simple and performant wrapper around KVO mechanism.
 
      * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`)
      * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`)
      * the paths have to consist only of `strong` properties, otherwise you are risking crashing the system by not unregistering KVO observer before dealloc.
 
      If support for weak properties is needed or observing arbitrary or unknown relationships in the
-     ownership tree, `rx_observeWeakly` is the preferred option.
+     ownership tree, `observeWeakly` is the preferred option.
 
      - parameter keyPath: Key path of property names to observe.
      - parameter options: KVO mechanism notification options.
@@ -59,18 +59,18 @@ extension NSObject {
      - returns: Observable sequence of objects on `keyPath`.
      */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable {
-        return KVOObservable(object: self, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()
+    public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable {
+        return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()
     }
 }
 
 #if !DISABLE_SWIZZLING
 // KVO
-extension NSObject {
+extension Reactive where Base: NSObject {
     /**
      Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`.
 
-     It can be used in all cases where `rx_observe` can be used and additionally
+     It can be used in all cases where `observe` can be used and additionally
 
      * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown
      * it can be used to observe `weak` properties
@@ -82,8 +82,8 @@ extension NSObject {
      - returns: Observable sequence of objects on `keyPath`.
      */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable {
-        return observeWeaklyKeyPathFor(self, keyPath: keyPath, options: options)
+    public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable {
+        return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options)
             .map { n in
                 return n as? E
             }
@@ -92,7 +92,7 @@ extension NSObject {
 #endif
 
 // Dealloc
-extension NSObject {
+extension Reactive where Base: NSObject {
     
     /**
     Observable sequence of object deallocated events.
@@ -101,15 +101,15 @@ extension NSObject {
     
     - returns: Observable sequence of object deallocated events.
     */
-    public var rx_deallocated: Observable {
-        return rx_synchronized {
-            if let deallocObservable = objc_getAssociatedObject(self, &deallocatedSubjectContext) as? DeallocObservable {
+    public var deallocated: Observable {
+        return synchronized {
+            if let deallocObservable = objc_getAssociatedObject(base, &deallocatedSubjectContext) as? DeallocObservable {
                 return deallocObservable._subject
             }
 
             let deallocObservable = DeallocObservable()
 
-            objc_setAssociatedObject(self, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            objc_setAssociatedObject(base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
             return deallocObservable._subject
         }
     }
@@ -125,24 +125,24 @@ extension NSObject {
 
      - returns: Observable sequence of object deallocating events.
      */
-    public func rx_sentMessage(_ selector: Selector) -> Observable<[Any]> {
-        return rx_synchronized {
+    public func sentMessage(_ selector: Selector) -> Observable<[AnyObject]> {
+        return synchronized {
             // in case of dealloc selector replay subject behavior needs to be used
             if selector == deallocSelector {
-                return rx_deallocating.map { _ in [] }
+                return deallocating.map { _ in [] }
             }
 
             let rxSelector = RX_selector(selector)
             let selectorReference = RX_reference_from_selector(rxSelector)
 
             let subject: MessageSentObservable
-            if let existingSubject = objc_getAssociatedObject(self, selectorReference) as? MessageSentObservable {
+            if let existingSubject = objc_getAssociatedObject(base, selectorReference) as? MessageSentObservable {
                 subject = existingSubject
             }
             else {
                 subject = MessageSentObservable()
                 objc_setAssociatedObject(
-                    self,
+                    base,
                     selectorReference,
                     subject,
                     .OBJC_ASSOCIATION_RETAIN_NONATOMIC
@@ -154,8 +154,8 @@ extension NSObject {
             }
 
             var error: NSError?
-            guard let targetImplementation = RX_ensure_observing(self, selector, &error) else {
-                return Observable.error(error?.rxCocoaErrorForTarget(self) ?? RxCocoaError.unknown)
+            guard let targetImplementation = RX_ensure_observing(base, selector, &error) else {
+                return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown)
             }
 
             subject.targetImplementation = targetImplementation
@@ -173,17 +173,17 @@ extension NSObject {
     
     - returns: Observable sequence of object deallocating events.
     */
-    public var rx_deallocating: Observable<()> {
-        return rx_synchronized {
+    public var deallocating: Observable<()> {
+        return synchronized {
 
             let subject: DeallocatingObservable
-            if let existingSubject = objc_getAssociatedObject(self, rxDeallocatingSelectorReference) as? DeallocatingObservable {
+            if let existingSubject = objc_getAssociatedObject(base, rxDeallocatingSelectorReference) as? DeallocatingObservable {
                 subject = existingSubject
             }
             else {
                 subject = DeallocatingObservable()
                 objc_setAssociatedObject(
-                    self,
+                    base,
                     rxDeallocatingSelectorReference,
                     subject,
                     .OBJC_ASSOCIATION_RETAIN_NONATOMIC
@@ -195,9 +195,9 @@ extension NSObject {
             }
 
             var error: NSError?
-            let targetImplementation = RX_ensure_observing(self, deallocSelector, &error)
+            let targetImplementation = RX_ensure_observing(base, deallocSelector, &error)
             if targetImplementation == nil {
-                return Observable.error(error?.rxCocoaErrorForTarget(self) ?? RxCocoaError.unknown)
+                return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown)
             }
 
             subject.targetImplementation = targetImplementation!
@@ -211,28 +211,28 @@ let deallocSelector = NSSelectorFromString("dealloc")
 let rxDeallocatingSelector = RX_selector(deallocSelector)
 let rxDeallocatingSelectorReference = RX_reference_from_selector(rxDeallocatingSelector)
 
-extension NSObject {
-    func rx_synchronized(_ action: () -> T) -> T {
-        objc_sync_enter(self)
+extension Reactive where Base: NSObject {
+    func synchronized( _ action: () -> T) -> T {
+        objc_sync_enter(self.base)
         let result = action()
-        objc_sync_exit(self)
+        objc_sync_exit(self.base)
         return result
     }
 }
 
-extension NSObject {
+extension Reactive where Base: NSObject {
     /**
      Helper to make sure that `Observable` returned from `createCachedObservable` is only created once.
      This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`.
      */
-    func rx_lazyInstanceObservable(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {
-        if let value = objc_getAssociatedObject(self, key) {
+    func lazyInstanceObservable(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {
+        if let value = objc_getAssociatedObject(base, key) {
             return value as! T
         }
         
         let observable = createCachedObservable()
         
-        objc_setAssociatedObject(self, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        objc_setAssociatedObject(base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
         
         return observable
     }
diff --git a/RxCocoa/Common/Observables/NSURLSession+Rx.swift b/RxCocoa/Common/Observables/NSURLSession+Rx.swift
index 31bc7265..8e23f8f6 100644
--- a/RxCocoa/Common/Observables/NSURLSession+Rx.swift
+++ b/RxCocoa/Common/Observables/NSURLSession+Rx.swift
@@ -105,7 +105,7 @@ func convertResponseToString(_ data: Data!, _ response: URLResponse!, _ error: N
     return ""
 }
 
-extension URLSession {
+extension Reactive where Base: URLSession {
     /**
     Observable sequence of responses for URL request.
     
@@ -119,7 +119,7 @@ extension URLSession {
     - returns: Observable sequence of URL responses.
     */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> {
+    public func response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> {
         return Observable.create { observer in
 
             // smart compiler should be able to optimize this out
@@ -129,7 +129,7 @@ extension URLSession {
                 d = Date()
             }
 
-            let task = self.dataTask(with: request) { (data, response, error) in
+            let task = self.base.dataTask(with: request) { (data, response, error) in
 
                 if Logging.URLRequests(request) {
                     let interval = Date().timeIntervalSince(d ?? Date())
@@ -175,8 +175,8 @@ extension URLSession {
     - returns: Observable sequence of response data.
     */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_data(_ request: URLRequest) -> Observable {
-        return rx_response(request).map { (data, response) -> Data in
+    public func data(_ request: URLRequest) -> Observable {
+        return response(request).map { (data, response) -> Data in
             if 200 ..< 300 ~= response.statusCode {
                 return data
             }
@@ -204,8 +204,8 @@ extension URLSession {
     - returns: Observable sequence of response JSON.
     */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_JSON(_ request: URLRequest) -> Observable {
-        return rx_data(request).map { (data) -> AnyObject in
+    public func JSON(_ request: URLRequest) -> Observable {
+        return data(request).map { (data) -> AnyObject in
             do {
                 return try JSONSerialization.jsonObject(with: data, options: []) as AnyObject
             } catch let error {
@@ -232,7 +232,7 @@ extension URLSession {
     - returns: Observable sequence of response JSON.
     */
     // @warn_unused_result(message:"http://git.io/rxs.uo")
-    public func rx_JSON(_ URL: Foundation.URL) -> Observable {
-        return rx_JSON(URLRequest(url: URL))
+    public func JSON(_ URL: Foundation.URL) -> Observable {
+        return JSON(URLRequest(url: URL))
     }
 }
diff --git a/RxCocoa/Common/Reactive.swift b/RxCocoa/Common/Reactive.swift
index 189f8321..f6661fd2 100644
--- a/RxCocoa/Common/Reactive.swift
+++ b/RxCocoa/Common/Reactive.swift
@@ -7,27 +7,41 @@
 //
 
 /**
-We can use `Reactive` protocol as customization point for constrained protocol extensions.
+ Use `Reactive` proxy as customization point for constrained protocol extensions.
 
-General pattern would be:
+ General pattern would be:
 
+ // 1. Extend Reactive protocol with constrain on Self
+ // Read as: Reactive Extension where Self is a SomeType
+ extension Reactive where Self: SomeType {
+ // 2. Put any specific reactive extension for SomeType here
+ }
 
-    // 1. Conform SomeType to Reactive protocol
-    extension SomeType: Reactive {}
+ With this approach we can have more specialized methods and properties using
+ `Self` and not just specialized on common base type.
 
-    // 2. Extend Reactive protocol with constrain on Self
-    // Read as: Reactive Extension where Self is a SomeType
-    extension Reactive where Self: SomeType {
-        // 3. Put any specific reactive extension for SomeType here
+ */
+
+public struct Reactive {
+    public let base: Base
+
+    public init(_ base: Base) {
+        self.base = base
     }
-
-
-With this approach we can have more specialized methods and properties using 
-`Self` and not just specialized on common base type.
-
-See UIGestureRecognizer+Rx.swift as an example
-*/
-
-public protocol Reactive {
-    
 }
+
+public protocol ReactiveCompatible {
+    associatedtype CompatibleType
+    var rx: Reactive { get }
+}
+
+public extension ReactiveCompatible {
+    public var rx: Reactive {
+        return Reactive(self)
+    }
+}
+
+/**
+ Extend NSObject with `rx` proxy.
+*/
+extension NSObject: ReactiveCompatible { }
diff --git a/RxCocoa/Common/RxCocoa.swift b/RxCocoa/Common/RxCocoa.swift
index e193ae83..62ee7ad8 100644
--- a/RxCocoa/Common/RxCocoa.swift
+++ b/RxCocoa/Common/RxCocoa.swift
@@ -80,9 +80,9 @@ public enum RxCocoaObjCRuntimeError
     If the object is reporting a different class then it's real class, that means that there is probably
     already some interception mechanism in place or something weird is happening.
 
-    The most common case when this would happen is when using a combination of KVO (`rx_observe`) and `rx_sentMessage`.
+    The most common case when this would happen is when using a combination of KVO (`observe`) and `sentMessage`.
 
-    This error is easily resolved by just using `rx_sentMessage` observing before `rx_observe`.
+    This error is easily resolved by just using `sentMessage` observing before `observe`.
 
     The reason why the other way around could create issues is because KVO will unregister it's interceptor
     class and restore original class. Unfortunately that will happen no matter was there another interceptor
@@ -90,7 +90,7 @@ public enum RxCocoaObjCRuntimeError
 
     Failure scenario:
     * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)
-    * `rx_sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
+    * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
     * then unobserving with KVO will restore class to be `OriginalClass` -> failure point (possibly a bug in KVO)
 
     The reason why changing order of observing works is because any interception method on unregistration 
diff --git a/RxCocoa/Common/RxTextInput.swift b/RxCocoa/Common/RxTextInput.swift
index ba56d379..4665a665 100644
--- a/RxCocoa/Common/RxTextInput.swift
+++ b/RxCocoa/Common/RxTextInput.swift
@@ -21,6 +21,19 @@ import Foundation
         */
         var rx_text: ControlProperty { get }
     }
+
+    extension UITextField : RxTextInput {
+        public var rx_text: ControlProperty {
+            return self.rx.text
+        }
+    }
+
+    extension UITextView : RxTextInput {
+        public var rx_text: ControlProperty {
+            return self.rx.text
+        }
+    }
+
 #endif
 
 #if os(OSX)
@@ -36,4 +49,13 @@ import Foundation
         */
         var rx_text: ControlProperty { get }
     }
-#endif
\ No newline at end of file
+
+    extension NSTextField : RxTextInput {
+        public var rx_text: ControlProperty {
+            return self.rx.text
+        }
+    }
+
+#endif
+
+
diff --git a/RxCocoa/Common/_RXObjCRuntime.m b/RxCocoa/Common/_RXObjCRuntime.m
index 5f9cead1..50d54d04 100644
--- a/RxCocoa/Common/_RXObjCRuntime.m
+++ b/RxCocoa/Common/_RXObjCRuntime.m
@@ -613,11 +613,11 @@ static NSMutableDictionary *optimi
     }
 
     // For `dealloc` message, original implementation will be swizzled.
-    // This is a special case because observing `dealloc` message is performed when `rx_observeWeakly` is used.
+    // This is a special case because observing `dealloc` message is performed when `observeWeakly` is used.
     //
     // Some toll free bridged classes don't handle `object_setClass` well and cause crashes.
     //
-    // To make `rx_deallocating` as robust as possible, original implementation will be replaced.
+    // To make `deallocating` as robust as possible, original implementation will be replaced.
     if (selector == deallocSelector) {
         Class __nonnull deallocSwizzingTarget = [target class];
         IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];
@@ -720,9 +720,9 @@ static NSMutableDictionary *optimi
      If the object is reporting a different class then what it's real class, that means that there is probably
      already some interception mechanism in place or something weird is happening.
      
-     Most common case when this would happen is when using KVO (`rx_observe`) and `rx_sentMessage`.
+     Most common case when this would happen is when using KVO (`observe`) and `sentMessage`.
 
-     This error is easily resolved by just using `rx_sentMessage` observing before `rx_observe`.
+     This error is easily resolved by just using `sentMessage` observing before `observe`.
      
      The reason why other way around could create issues is because KVO will unregister it's interceptor 
      class and restore original class. Unfortunately that will happen no matter was there another interceptor
@@ -730,7 +730,7 @@ static NSMutableDictionary *optimi
      
      Failure scenario:
      * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)
-     * `rx_sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
+     * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
      * then unobserving with KVO will restore class to be `OriginalClass` -> failure point
 
      The reason why changing order of observing works is because any interception method should return
@@ -1017,4 +1017,4 @@ NSInteger RX_number_of_swizzled_methods() {
 
 #endif
 
-#endif
\ No newline at end of file
+#endif
diff --git a/RxCocoa/OSX/NSButton+Rx.swift b/RxCocoa/OSX/NSButton+Rx.swift
index c18492a6..91a12cc1 100644
--- a/RxCocoa/OSX/NSButton+Rx.swift
+++ b/RxCocoa/OSX/NSButton+Rx.swift
@@ -12,21 +12,21 @@ import RxSwift
 #endif
 import Cocoa
 
-extension NSButton {
+extension Reactive where Base: NSButton {
     
     /**
     Reactive wrapper for control event.
     */
-    public var rx_tap: ControlEvent {
-        return rx_controlEvent
+    public var tap: ControlEvent {
+        return controlEvent
     }
 
     /**
     Reactive wrapper for `state` property`.
     */
-    public var rx_state: ControlProperty {
-        return NSButton.rx_value(
-            self,
+    public var state: ControlProperty {
+        return Reactive.value(
+            base,
             getter: { control in
                 return control.state
             }, setter: { control, state in
@@ -34,4 +34,4 @@ extension NSButton {
             }
         )
     }
-}
\ No newline at end of file
+}
diff --git a/RxCocoa/OSX/NSControl+Rx.swift b/RxCocoa/OSX/NSControl+Rx.swift
index f01be61f..8dc3b53b 100644
--- a/RxCocoa/OSX/NSControl+Rx.swift
+++ b/RxCocoa/OSX/NSControl+Rx.swift
@@ -15,19 +15,19 @@ import RxSwift
 var rx_value_key: UInt8 = 0
 var rx_control_events_key: UInt8 = 0
 
-extension NSControl {
+extension Reactive where Base: NSControl {
 
     /**
     Reactive wrapper for control event.
     */
-    public var rx_controlEvent: ControlEvent {
+    public var controlEvent: ControlEvent {
         MainScheduler.ensureExecutingOnScheduler()
 
-        let source = rx_lazyInstanceObservable(&rx_control_events_key) { () -> Observable in
-            Observable.create { [weak self] observer in
+        let source = lazyInstanceObservable(&rx_control_events_key) { () -> Observable in
+            Observable.create { [weak control = self.base] observer in
                 MainScheduler.ensureExecutingOnScheduler()
 
-                guard let control = self else {
+                guard let control = control else {
                     observer.on(.completed)
                     return Disposables.create()
                 }
@@ -37,7 +37,7 @@ extension NSControl {
                 }
                 
                 return observer
-            }.takeUntil(self.rx_deallocated)
+            }.takeUntil(self.deallocated)
         }
         
         return ControlEvent(events: source)
@@ -47,10 +47,10 @@ extension NSControl {
      You might be wondering why the ugly `as!` casts etc, well, for some reason if
      Swift compiler knows C is UIControl type and optimizations are turned on, it will crash.
     */
-    static func rx_value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty {
+    static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty {
         MainScheduler.ensureExecutingOnScheduler()
 
-        let source = (control as! NSObject).rx_lazyInstanceObservable(&rx_value_key) { () -> Observable in
+        let source = (control as! NSObject).rx.lazyInstanceObservable(&rx_value_key) { () -> Observable in
             return Observable.create { [weak weakControl = control] (observer: AnyObserver) in
                 guard let control = weakControl else {
                     observer.on(.completed)
@@ -68,7 +68,7 @@ extension NSControl {
                 return observer
             }
             .distinctUntilChanged()
-            .takeUntil((control as! NSObject).rx_deallocated)
+            .takeUntil((control as! NSObject).rx.deallocated)
         }
 
         let bindingObserver = UIBindingObserver(UIElement: control, binding: setter)
@@ -79,8 +79,8 @@ extension NSControl {
     /**
      Bindable sink for `enabled` property.
     */
-    public var rx_enabled: AnyObserver {
-        return UIBindingObserver(UIElement: self) { (owner, value) in
+    public var enabled: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { (owner, value) in
             owner.isEnabled = value
         }.asObserver()
     }
diff --git a/RxCocoa/OSX/NSImageView+Rx.swift b/RxCocoa/OSX/NSImageView+Rx.swift
index fbd00ace..15cbb299 100644
--- a/RxCocoa/OSX/NSImageView+Rx.swift
+++ b/RxCocoa/OSX/NSImageView+Rx.swift
@@ -12,13 +12,13 @@ import RxSwift
 #endif
 import Cocoa
 
-extension NSImageView {
+extension Reactive where Base: NSImageView {
    
     /**
     Bindable sink for `image` property.
     */
-    public var rx_image: AnyObserver {
-        return self.rx_image(transitionType: nil)
+    public var image: AnyObserver {
+        return image(transitionType: nil)
     }
     
     /**
@@ -26,9 +26,9 @@ extension NSImageView {
     
     - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
     */
-    @available(*, deprecated, renamed: "rx_image(transitionType:)")
-    public func rx_imageAnimated(_ transitionType: String?) -> AnyObserver {
-        return UIBindingObserver(UIElement: self) { control, value in
+    @available(*, deprecated, renamed: "image(transitionType:)")
+    public func imageAnimated(_ transitionType: String?) -> AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { control, value in
             if let transitionType = transitionType {
                 if value != nil {
                     let transition = CATransition()
@@ -50,8 +50,8 @@ extension NSImageView {
 
      - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
      */
-    public func rx_image(transitionType: String? = nil) -> AnyObserver {
-        return UIBindingObserver(UIElement: self) { control, value in
+    public func image(transitionType: String? = nil) -> AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { control, value in
             if let transitionType = transitionType {
                 if value != nil {
                     let transition = CATransition()
diff --git a/RxCocoa/OSX/NSSlider+Rx.swift b/RxCocoa/OSX/NSSlider+Rx.swift
index b1d9edd9..2928675b 100644
--- a/RxCocoa/OSX/NSSlider+Rx.swift
+++ b/RxCocoa/OSX/NSSlider+Rx.swift
@@ -12,14 +12,14 @@ import RxSwift
 #endif
 import Cocoa
 
-extension NSSlider {
+extension Reactive where Base: NSSlider {
     
     /**
     Reactive wrapper for `value` property.
     */
-    public var rx_value: ControlProperty {
-        return NSControl.rx_value(
-            self,
+    public var value: ControlProperty {
+        return Reactive.value(
+            base,
             getter: { control in
                 return control.doubleValue
             },
@@ -29,4 +29,4 @@ extension NSSlider {
         )
     }
     
-}
\ No newline at end of file
+}
diff --git a/RxCocoa/OSX/NSTextField+Rx.swift b/RxCocoa/OSX/NSTextField+Rx.swift
index af2371d1..e1a3ff4d 100644
--- a/RxCocoa/OSX/NSTextField+Rx.swift
+++ b/RxCocoa/OSX/NSTextField+Rx.swift
@@ -55,7 +55,7 @@ public class RxTextFieldDelegateProxy
     public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
         let control = (object as! NSTextField)
 
-        return castOrFatalError(control.rx_createDelegateProxy())
+        return castOrFatalError(control.createRxDelegateProxy())
     }
 
     /**
@@ -76,37 +76,40 @@ public class RxTextFieldDelegateProxy
     
 }
 
-extension NSTextField : RxTextInput {
+extension NSTextField {
 
     /**
-    Factory method that enables subclasses to implement their own `rx_delegate`.
+    Factory method that enables subclasses to implement their own `delegate`.
 
      - returns: Instance of delegate proxy that wraps `delegate`.
      */
-    public func rx_createDelegateProxy() -> RxTextFieldDelegateProxy {
+    public func createRxDelegateProxy() -> RxTextFieldDelegateProxy {
         return RxTextFieldDelegateProxy(parentObject: self)
     }
+}
+
+extension Reactive where Base: NSTextField {
 
     /**
     Reactive wrapper for `delegate`.
     
     For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_delegate: DelegateProxy {
-        return RxTextFieldDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxTextFieldDelegateProxy.proxyForObject(base)
     }
     
     /**
     Reactive wrapper for `text` property.
     */
-    public var rx_text: ControlProperty {
-        let delegate = RxTextFieldDelegateProxy.proxyForObject(self)
+    public var text: ControlProperty {
+        let delegate = RxTextFieldDelegateProxy.proxyForObject(base)
         
-        let source = Observable.deferred { [weak self] in
-            delegate.textSubject.startWith(self?.stringValue ?? "")
-        }.takeUntil(rx_deallocated)
+        let source = Observable.deferred { [weak textField = self.base] in
+            delegate.textSubject.startWith(textField?.stringValue ?? "")
+        }.takeUntil(deallocated)
 
-        let observer = UIBindingObserver(UIElement: self) { control, value in
+        let observer = UIBindingObserver(UIElement: base) { control, value in
             control.stringValue = value
         }
 
diff --git a/RxCocoa/OSX/NSView+Rx.swift b/RxCocoa/OSX/NSView+Rx.swift
index 42879296..a55bce04 100644
--- a/RxCocoa/OSX/NSView+Rx.swift
+++ b/RxCocoa/OSX/NSView+Rx.swift
@@ -12,12 +12,12 @@ import Cocoa
 import RxSwift
 #endif
 
-extension NSView {
+extension Reactive where Base: NSView {
     /**
      Bindable sink for `hidden` property.
      */
-    public var rx_hidden: AnyObserver {
-        return UIBindingObserver(UIElement: self) { view, value in
+    public var hidden: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { view, value in
             view.isHidden = value
         }.asObserver()
     }
@@ -25,8 +25,8 @@ extension NSView {
     /**
      Bindable sink for `alphaValue` property.
      */
-    public var rx_alpha: AnyObserver {
-        return UIBindingObserver(UIElement: self) { view, value in
+    public var alpha: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { view, value in
             view.alphaValue = value
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/NSTextStorage+Rx.swift b/RxCocoa/iOS/NSTextStorage+Rx.swift
index 262fc01d..a0482b3e 100644
--- a/RxCocoa/iOS/NSTextStorage+Rx.swift
+++ b/RxCocoa/iOS/NSTextStorage+Rx.swift
@@ -14,22 +14,22 @@ import Foundation
 #endif
     import UIKit
 
-extension NSTextStorage {
+extension Reactive where Base: NSTextStorage {
 
     /**
      Reactive wrapper for `delegate`.
 
      For more information take a look at `DelegateProxyType` protocol documentation.
      */
-    public var rx_delegate:DelegateProxy {
-        return RxTextStorageDelegateProxy.proxyForObject(self)
+    public var delegate:DelegateProxy {
+        return RxTextStorageDelegateProxy.proxyForObject(base)
     }
 
     /**
      Reactive wrapper for `delegate` message.
      */
-    public var rx_didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> {
-        return rx_delegate
+    public var didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> {
+        return delegate
             .observe(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:)))
             .map { a in
                 let editedMask = NSTextStorageEditActions(rawValue: try castOrThrow(UInt.self, a[1]) )
diff --git a/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift b/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift
index 49380370..5bd59266 100644
--- a/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift
+++ b/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift
@@ -81,7 +81,7 @@ public class RxCollectionViewDataSourceProxy
     public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
         let collectionView = (object as! UICollectionView)
 
-        return castOrFatalError(collectionView.rx_createDataSourceProxy())
+        return castOrFatalError(collectionView.createRxDataSourceProxy())
     }
 
     /**
diff --git a/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift b/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift
index d4aad3ea..3d2bf2e1 100644
--- a/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift
+++ b/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift
@@ -72,7 +72,7 @@ public class RxScrollViewDelegateProxy
     public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
         let scrollView = (object as! UIScrollView)
         
-        return castOrFatalError(scrollView.rx_createDelegateProxy())
+        return castOrFatalError(scrollView.createRxDelegateProxy())
     }
 
     /**
diff --git a/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift b/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift
index 330028b0..aea343ce 100644
--- a/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift
+++ b/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift
@@ -47,7 +47,7 @@ public class RxSearchBarDelegateProxy
     public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
         let searchBar = (object as! UISearchBar)
         
-        return castOrFatalError(searchBar.rx_createDelegateProxy())
+        return castOrFatalError(searchBar.createRxDelegateProxy())
     }
 #endif
     
diff --git a/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift b/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift
index 95103b41..931695c3 100644
--- a/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift
+++ b/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift
@@ -44,7 +44,7 @@ public class RxTabBarDelegateProxy
     public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
         let tabBar = (object as! UITabBar)
 
-        return castOrFatalError(tabBar.rx_createDelegateProxy())
+        return castOrFatalError(tabBar.createRxDelegateProxy())
     }
 
 }
diff --git a/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift b/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift
index f54db564..34531c44 100644
--- a/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift
+++ b/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift
@@ -78,7 +78,7 @@ public class RxTableViewDataSourceProxy
     public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
         let tableView = (object as! UITableView)
 
-        return castOrFatalError(tableView.rx_createDataSourceProxy())
+        return castOrFatalError(tableView.createRxDataSourceProxy())
     }
 
     /**
diff --git a/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift b/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift
index f1a76967..7e19a3a8 100644
--- a/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift
+++ b/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift
@@ -13,17 +13,17 @@ import UIKit
 import RxSwift
 #endif
 
-extension UIActivityIndicatorView {
+extension Reactive where Base: UIActivityIndicatorView {
 
     /**
     Bindable sink for `startAnimating()`, `stopAnimating()` methods.
     */
-    public var rx_animating: AnyObserver {
-        return UIBindingObserver(UIElement: self) { activityIndicator, active in
+    public var animating: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { activityIndicator, active in
             if active {
-                self.startAnimating()
+                activityIndicator.startAnimating()
             } else {
-                self.stopAnimating()
+                activityIndicator.stopAnimating()
             }
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UIAlertAction+Rx.swift b/RxCocoa/iOS/UIAlertAction+Rx.swift
index 165b979e..432b3875 100644
--- a/RxCocoa/iOS/UIAlertAction+Rx.swift
+++ b/RxCocoa/iOS/UIAlertAction+Rx.swift
@@ -17,13 +17,13 @@ import UIKit
 import RxSwift
 #endif
 
-extension UIAlertAction {
+extension Reactive where Base: UIAlertAction {
 
     /**
      Bindable sink for `enabled` property.
      */
-    public var rx_enabled: AnyObserver {
-        return UIBindingObserver(UIElement: self) { alertAction, value in
+    public var enabled: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { alertAction, value in
             alertAction.isEnabled = value
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UIApplication+Rx.swift b/RxCocoa/iOS/UIApplication+Rx.swift
index 8a9a8276..08aa5526 100644
--- a/RxCocoa/iOS/UIApplication+Rx.swift
+++ b/RxCocoa/iOS/UIApplication+Rx.swift
@@ -15,13 +15,13 @@ import Foundation
     import RxSwift
 #endif
 
-    extension UIApplication {
+    extension Reactive where Base: UIApplication {
         
         /**
          Bindable sink for `networkActivityIndicatorVisible`.
          */
-        public var rx_networkActivityIndicatorVisible: AnyObserver {
-            return UIBindingObserver(UIElement: self) { application, active in
+        public var networkActivityIndicatorVisible: AnyObserver {
+            return UIBindingObserver(UIElement: self.base) { application, active in
                 application.isNetworkActivityIndicatorVisible = active
             }.asObserver()
         }
diff --git a/RxCocoa/iOS/UIBarButtonItem+Rx.swift b/RxCocoa/iOS/UIBarButtonItem+Rx.swift
index 49123cd9..45979e4e 100644
--- a/RxCocoa/iOS/UIBarButtonItem+Rx.swift
+++ b/RxCocoa/iOS/UIBarButtonItem+Rx.swift
@@ -15,13 +15,13 @@ import RxSwift
 
 var rx_tap_key: UInt8 = 0
 
-extension UIBarButtonItem {
+extension Reactive where Base: UIBarButtonItem {
     
     /**
     Bindable sink for `enabled` property.
     */
-    public var rx_enabled: AnyObserver {
-        return UIBindingObserver(UIElement: self) { UIElement, value in
+    public var enabled: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { UIElement, value in
             UIElement.isEnabled = value
         }.asObserver()
     }
@@ -29,10 +29,10 @@ extension UIBarButtonItem {
     /**
     Reactive wrapper for target action pattern on `self`.
     */
-    public var rx_tap: ControlEvent {
-        let source = rx_lazyInstanceObservable(&rx_tap_key) { () -> Observable in
-            Observable.create { [weak self] observer in
-                guard let control = self else {
+    public var tap: ControlEvent {
+        let source = lazyInstanceObservable(&rx_tap_key) { () -> Observable in
+            Observable.create { [weak control = self.base] observer in
+                guard let control = control else {
                     observer.on(.completed)
                     return Disposables.create()
                 }
@@ -41,7 +41,7 @@ extension UIBarButtonItem {
                 }
                 return target
             }
-            .takeUntil(self.rx_deallocated)
+            .takeUntil(self.deallocated)
             .share()
         }
         
diff --git a/RxCocoa/iOS/UIButton+Rx.swift b/RxCocoa/iOS/UIButton+Rx.swift
index 6385aacd..a308075b 100644
--- a/RxCocoa/iOS/UIButton+Rx.swift
+++ b/RxCocoa/iOS/UIButton+Rx.swift
@@ -14,13 +14,13 @@ import RxSwift
 #endif
 import UIKit
 
-extension UIButton {
+extension Reactive where Base: UIButton {
     
     /**
     Reactive wrapper for `TouchUpInside` control event.
     */
-    public var rx_tap: ControlEvent {
-        return rx_controlEvent(.touchUpInside)
+    public var tap: ControlEvent {
+        return controlEvent(.touchUpInside)
     }
 }
 
@@ -34,13 +34,13 @@ import Foundation
 #endif
 import UIKit
 
-extension UIButton {
+extension Reactive where Base: UIButton {
 
     /**
      Reactive wrapper for `PrimaryActionTriggered` control event.
      */
-    public var rx_primaryAction: ControlEvent {
-        return rx_controlEvent(.primaryActionTriggered)
+    public var primaryAction: ControlEvent {
+        return controlEvent(.primaryActionTriggered)
     }
 
 }
@@ -55,12 +55,12 @@ extension UIButton {
 #endif
     import UIKit
 
-extension UIButton {
+extension Reactive where Base: UIButton {
     /**
      Reactive wrapper for `setTitle(_:controlState:)`
      */
-    public func rx_title(controlState: UIControlState = []) -> AnyObserver {
-        return UIBindingObserver(UIElement: self) { (button, title) -> () in
+    public func title(controlState: UIControlState = []) -> AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { (button, title) -> () in
             button.setTitle(title, for: controlState)
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UICollectionView+Rx.swift b/RxCocoa/iOS/UICollectionView+Rx.swift
index 36bf5d4e..629883c3 100644
--- a/RxCocoa/iOS/UICollectionView+Rx.swift
+++ b/RxCocoa/iOS/UICollectionView+Rx.swift
@@ -16,7 +16,7 @@ import UIKit
 
 // Items
 
-extension UICollectionView {
+extension Reactive where Base: UICollectionView {
     
     /**
     Binds sequences of elements to collection view items.
@@ -34,7 +34,7 @@ extension UICollectionView {
          ])
 
          items
-         .bindTo(collectionView.rx_itemsWithCellFactory) { (collectionView, row, element) in
+         .bindTo(collectionView.rx.itemsWithCellFactory) { (collectionView, row, element) in
              let indexPath = IndexPath(forItem: row, inSection: 0)
              let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell
              cell.value?.text = "\(element) @ \(row)"
@@ -42,14 +42,14 @@ extension UICollectionView {
          }
          .addDisposableTo(disposeBag)
     */
-    @available(*, deprecated, renamed: "rx_items(source:cellFactory:)")
+    @available(*, deprecated, renamed: "items(source:cellFactory:)")
     public func rx_itemsWithCellFactory
         (_ source: O)
         -> (_ cellFactory: @escaping (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell)
         -> Disposable where O.E == S {
         return { cellFactory in
             let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper(cellFactory: cellFactory)
-            return self.rx_itemsWithDataSource(dataSource)(source)
+            return self.items(dataSource: dataSource)(source)
         }
         
     }
@@ -70,7 +70,7 @@ extension UICollectionView {
          ])
 
          items
-         .bindTo(collectionView.rx_items) { (collectionView, row, element) in
+         .bindTo(collectionView.rx.items) { (collectionView, row, element) in
              let indexPath = IndexPath(forItem: row, inSection: 0)
              let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell
              cell.value?.text = "\(element) @ \(row)"
@@ -78,13 +78,13 @@ extension UICollectionView {
          }
          .addDisposableTo(disposeBag)
     */
-    public func rx_items
+    public func items
         (source: O)
         -> (_ cellFactory: @escaping (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell)
         -> Disposable where O.E == S {
         return { cellFactory in
             let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper(cellFactory: cellFactory)
-            return self.rx_items(dataSource: dataSource)(source)
+            return self.items(dataSource: dataSource)(source)
         }
         
     }
@@ -107,12 +107,12 @@ extension UICollectionView {
          ])
 
          items
-             .bindTo(collectionView.rx_itemsWithCellIdentifier("Cell", cellType: NumberCell.self)) { (row, element, cell) in
+             .bindTo(collectionView.rx.itemsWithCellIdentifier("Cell", cellType: NumberCell.self)) { (row, element, cell) in
                 cell.value?.text = "\(element) @ \(row)"
              }
              .addDisposableTo(disposeBag)
     */
-    @available(*, deprecated, renamed: "rx_items(cellIdentifier:cellType:source:configureCell:)")
+    @available(*, deprecated, renamed: "items(cellIdentifier:cellType:source:configureCell:)")
     public func rx_itemsWithCellIdentifier
         (_ cellIdentifier: String, cellType: Cell.Type = Cell.self)
         -> (_ source: O)
@@ -127,7 +127,7 @@ extension UICollectionView {
                     return cell
                 }
                     
-                return self.rx_itemsWithDataSource(dataSource)(source)
+                return self.items(dataSource: dataSource)(source)
             }
         }
     }
@@ -150,12 +150,12 @@ extension UICollectionView {
          ])
 
          items
-             .bindTo(collectionView.rx_items(cellIdentifier: "Cell", cellType: NumberCell.self)) { (row, element, cell) in
+             .bindTo(collectionView.rx.items(cellIdentifier: "Cell", cellType: NumberCell.self)) { (row, element, cell) in
                 cell.value?.text = "\(element) @ \(row)"
              }
              .addDisposableTo(disposeBag)
     */
-    public func rx_items
+    public func items
         (cellIdentifier: String, cellType: Cell.Type = Cell.self)
         -> (_ source: O)
         -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)
@@ -169,7 +169,7 @@ extension UICollectionView {
                     return cell
                 }
                     
-                return self.rx_items(dataSource: dataSource)(source)
+                return self.items(dataSource: dataSource)(source)
             }
         }
     }
@@ -211,11 +211,11 @@ extension UICollectionView {
          }
 
          items
-            .bindTo(collectionView.rx_itemsWithDataSource(dataSource))
+            .bindTo(collectionView.rx.itemsWithDataSource(dataSource))
             .addDisposableTo(disposeBag)
     */
-    @available(*, deprecated, renamed: "rx_items(dataSource:source:)")
-    public func rx_itemsWithDataSource<
+    @available(*, deprecated, renamed: "items(dataSource:source:)")
+    public func itemsWithDataSource<
             DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,
             O: ObservableType>
         (_ dataSource: DataSource)
@@ -223,9 +223,8 @@ extension UICollectionView {
         -> Disposable where DataSource.Element == O.E
           {
         return { source in
-            
-            return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxCollectionViewDataSourceProxy, event) -> Void in
-                guard let collectionView = self else {
+            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak collectionView = self.base] (_: RxCollectionViewDataSourceProxy, event) -> Void in
+                guard let collectionView = collectionView else {
                     return
                 }
                 dataSource.collectionView(collectionView, observedEvent: event)
@@ -269,10 +268,10 @@ extension UICollectionView {
          }
 
          items
-            .bindTo(collectionView.rx_items(dataSource: dataSource))
+            .bindTo(collectionView.rx.items(dataSource: dataSource))
             .addDisposableTo(disposeBag)
     */
-    public func rx_items<
+    public func items<
             DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,
             O: ObservableType>
         (dataSource: DataSource)
@@ -286,10 +285,10 @@ extension UICollectionView {
             // call `self.rx_delegate`. If that happens, it might cause weird side effects since
             // setting data source will set delegate, and UITableView might get into a weird state.
             // Therefore it's better to set delegate proxy first, just to be sure.
-            _ = self.rx_delegate
+            _ = self.delegate
             // Strong reference is needed because data source is in use until result subscription is disposed
-            return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxCollectionViewDataSourceProxy, event) -> Void in
-                guard let collectionView = self else {
+            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak collectionView = self.base] (_: RxCollectionViewDataSourceProxy, event) -> Void in
+                guard let collectionView = collectionView else {
                     return
                 }
                 dataSource.collectionView(collectionView, observedEvent: event)
@@ -301,34 +300,38 @@ extension UICollectionView {
 extension UICollectionView {
    
     /**
-    Factory method that enables subclasses to implement their own `rx_delegate`.
+    Factory method that enables subclasses to implement their own `delegate`.
     
     - returns: Instance of delegate proxy that wraps `delegate`.
     */
-    public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return RxCollectionViewDelegateProxy(parentObject: self)
     }
 
     /**
-    Factory method that enables subclasses to implement their own `rx_dataSource`.
-    
-    - returns: Instance of delegate proxy that wraps `dataSource`.
-    */
-    public func rx_createDataSourceProxy() -> RxCollectionViewDataSourceProxy {
+     Factory method that enables subclasses to implement their own `rx.dataSource`.
+
+     - returns: Instance of delegate proxy that wraps `dataSource`.
+     */
+    public func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy {
         return RxCollectionViewDataSourceProxy(parentObject: self)
     }
-    
+
+}
+
+extension Reactive where Base: UICollectionView {
+
     /**
     Reactive wrapper for `dataSource`.
     
     For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_dataSource: DelegateProxy {
-        return RxCollectionViewDataSourceProxy.proxyForObject(self)
+    public var dataSource: DelegateProxy {
+        return RxCollectionViewDataSourceProxy.proxyForObject(base)
     }
     
     /**
-    Installs data source as forwarding delegate on `rx_dataSource`. 
+    Installs data source as forwarding delegate on `rx.dataSource`. 
     Data source won't be retained.
     
     It enables using normal delegate mechanism with reactive delegate mechanism.
@@ -336,16 +339,16 @@ extension UICollectionView {
     - parameter dataSource: Data source object.
     - returns: Disposable object that can be used to unbind the data source.
     */
-    public func rx_setDataSource(_ dataSource: UICollectionViewDataSource)
+    public func setDataSource(_ dataSource: UICollectionViewDataSource)
         -> Disposable {
-        return RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self)
+        return RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)
     }
    
     /**
     Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
     */
-    public var rx_itemSelected: ControlEvent {
-        let source = rx_delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:)))
+    public var itemSelected: ControlEvent {
+        let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:)))
             .map { a in
                 return a[1] as! IndexPath
             }
@@ -356,8 +359,8 @@ extension UICollectionView {
     /**
      Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
      */
-    public var rx_itemDeselected: ControlEvent {
-        let source = rx_delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:)))
+    public var itemDeselected: ControlEvent {
+        let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:)))
             .map { a in
                 return a[1] as! IndexPath
         }
@@ -368,21 +371,21 @@ extension UICollectionView {
     /**
     Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
 
-    It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
+    It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
     or any other data source conforming to `SectionedViewDataSourceType` protocol.
     
      ```
-         collectionView.rx_modelSelected(MyModel.self)
+         collectionView.rx.modelSelected(MyModel.self)
             .map { ...
      ```
     */
-    public func rx_modelSelected(_ modelType: T.Type) -> ControlEvent {
-        let source: Observable = rx_itemSelected.flatMap { [weak self] indexPath -> Observable in
-            guard let view = self else {
+    public func modelSelected(_ modelType: T.Type) -> ControlEvent {
+        let source: Observable = itemSelected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable in
+            guard let view = view else {
                 return Observable.empty()
             }
 
-            return Observable.just(try view.rx_modelAtIndexPath(indexPath))
+            return Observable.just(try view.rx.modelAtIndexPath(indexPath))
         }
         
         return ControlEvent(events: source)
@@ -391,21 +394,21 @@ extension UICollectionView {
     /**
      Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
 
-     It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
+     It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
      or any other data source conforming to `SectionedViewDataSourceType` protocol.
 
      ```
-         collectionView.rx_modelDeselected(MyModel.self)
+         collectionView.rx.modelDeselected(MyModel.self)
             .map { ...
      ```
      */
-    public func rx_modelDeselected(_ modelType: T.Type) -> ControlEvent {
-        let source: Observable = rx_itemDeselected.flatMap { [weak self] indexPath -> Observable in
-            guard let view = self else {
+    public func modelDeselected(_ modelType: T.Type) -> ControlEvent {
+        let source: Observable = itemDeselected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable in
+            guard let view = view else {
                 return Observable.empty()
             }
 
-            return Observable.just(try view.rx_modelAtIndexPath(indexPath))
+            return Observable.just(try view.rx.modelAtIndexPath(indexPath))
         }
 
         return ControlEvent(events: source)
@@ -414,8 +417,8 @@ extension UICollectionView {
     /**
     Syncronous helper method for retrieving a model at indexPath through a reactive data source
     */
-    public func rx_modelAtIndexPath(_ indexPath: IndexPath) throws -> T {
-        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.rx_dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx_itemsWith*` methods was used.")
+    public func modelAtIndexPath(_ indexPath: IndexPath) throws -> T {
+        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx.itemsWith*` methods was used.")
         
         let element = try dataSource.modelAtIndexPath(indexPath)
 
@@ -426,14 +429,14 @@ extension UICollectionView {
 
 #if os(tvOS)
 
-extension UICollectionView {
+extension Reactive where Base: UICollectionView {
     
     /**
      Reactive wrapper for `delegate` message `collectionView:didUpdateFocusInContext:withAnimationCoordinator:`.
      */
-    public var rx_didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
+    public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
         
-        let source = rx_delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:)))
+        let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:)))
             .map { a -> (context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in
                 let context = a[1] as! UIFocusUpdateContext
                 let animationCoordinator = a[2] as! UIFocusAnimationCoordinator
diff --git a/RxCocoa/iOS/UIControl+Rx.swift b/RxCocoa/iOS/UIControl+Rx.swift
index 8a58049c..2e5eff59 100644
--- a/RxCocoa/iOS/UIControl+Rx.swift
+++ b/RxCocoa/iOS/UIControl+Rx.swift
@@ -14,13 +14,13 @@ import RxSwift
 #endif
 import UIKit
 
-extension UIControl {
+extension Reactive where Base: UIControl {
     
     /**
     Bindable sink for `enabled` property.
     */
-    public var rx_enabled: AnyObserver {
-        return UIBindingObserver(UIElement: self) { control, value in
+    public var enabled: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { control, value in
             control.isEnabled = value
         }.asObserver()
     }
@@ -28,8 +28,8 @@ extension UIControl {
     /**
      Bindable sink for `selected` property.
      */
-    public var rx_selected: AnyObserver {
-        return UIBindingObserver(UIElement: self) { control, selected in
+    public var selected: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { control, selected in
             control.isSelected = selected
         }.asObserver()
     }
@@ -39,11 +39,11 @@ extension UIControl {
     
     - parameter controlEvents: Filter for observed event types.
     */
-    public func rx_controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent {
-        let source: Observable = Observable.create { [weak self] observer in
+    public func controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent {
+        let source: Observable = Observable.create { [weak control = self.base] observer in
             MainScheduler.ensureExecutingOnScheduler()
 
-            guard let control = self else {
+            guard let control = control else {
                 observer.on(.completed)
                 return Disposables.create()
             }
@@ -54,8 +54,8 @@ extension UIControl {
             }
             
             return Disposables.create(with: controlTarget.dispose)
-        }.takeUntil(rx_deallocated)
-        
+        }.takeUntil(deallocated)
+
         return ControlEvent(events: source)
     }
 
@@ -63,7 +63,7 @@ extension UIControl {
      You might be wondering why the ugly `as!` casts etc, well, for some reason if 
      Swift compiler knows C is UIControl type and optimizations are turned on, it will crash.
     */
-    static func rx_value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty {
+    static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty {
         let source: Observable = Observable.create { [weak weakControl = control] observer in
                 guard let control = weakControl else {
                     observer.on(.completed)
@@ -80,7 +80,7 @@ extension UIControl {
                 
                 return Disposables.create(with: controlTarget.dispose)
             }
-            .takeUntil((control as! NSObject).rx_deallocated)
+            .takeUntil((control as! NSObject).rx.deallocated)
 
         let bindingObserver = UIBindingObserver(UIElement: control, binding: setter)
 
diff --git a/RxCocoa/iOS/UIDatePicker+Rx.swift b/RxCocoa/iOS/UIDatePicker+Rx.swift
index ae33579e..35f1b2ea 100644
--- a/RxCocoa/iOS/UIDatePicker+Rx.swift
+++ b/RxCocoa/iOS/UIDatePicker+Rx.swift
@@ -14,14 +14,14 @@ import RxSwift
 #endif
 import UIKit
 
-extension UIDatePicker {
+extension Reactive where Base: UIDatePicker {
     
     /**
     Reactive wrapper for `date` property.
     */
-    public var rx_date: ControlProperty {
-        return UIControl.rx_value(
-            self,
+    public var date: ControlProperty {
+        return Reactive.value(
+            self.base,
             getter: { datePicker in
                 datePicker.date
             }, setter: { datePicker, value in
diff --git a/RxCocoa/iOS/UIGestureRecognizer+Rx.swift b/RxCocoa/iOS/UIGestureRecognizer+Rx.swift
index 82b3fcd0..4ea5052e 100644
--- a/RxCocoa/iOS/UIGestureRecognizer+Rx.swift
+++ b/RxCocoa/iOS/UIGestureRecognizer+Rx.swift
@@ -51,18 +51,16 @@ class GestureTarget: RxTarget {
     }
 }
 
-extension UIGestureRecognizer: Reactive  { }
-
-extension Reactive where Self: UIGestureRecognizer {
+extension Reactive where Base: UIGestureRecognizer {
     
     /**
     Reactive wrapper for gesture recognizer events.
     */
-    public var rx_event: ControlEvent {
-        let source: Observable = Observable.create { [weak self] observer in
+    public var event: ControlEvent {
+        let source: Observable = Observable.create { [weak control = self.base] observer in
             MainScheduler.ensureExecutingOnScheduler()
 
-            guard let control = self else {
+            guard let control = control else {
                 observer.on(.completed)
                 return Disposables.create()
             }
@@ -73,7 +71,7 @@ extension Reactive where Self: UIGestureRecognizer {
             }
             
             return observer
-        }.takeUntil(rx_deallocated)
+        }.takeUntil(deallocated)
         
         return ControlEvent(events: source)
     }
diff --git a/RxCocoa/iOS/UIImagePickerController+Rx.swift b/RxCocoa/iOS/UIImagePickerController+Rx.swift
index 63e9cf15..f66a613c 100644
--- a/RxCocoa/iOS/UIImagePickerController+Rx.swift
+++ b/RxCocoa/iOS/UIImagePickerController+Rx.swift
@@ -16,22 +16,22 @@ import Foundation
 #endif
     import UIKit
 
-    extension UIImagePickerController {
+    extension Reactive where Base: UIImagePickerController {
 
         /**
          Reactive wrapper for `delegate`.
 
          For more information take a look at `DelegateProxyType` protocol documentation.
          */
-        public var rx_delegate: DelegateProxy {
-            return RxImagePickerDelegateProxy.proxyForObject(self)
+        public var delegate: DelegateProxy {
+            return RxImagePickerDelegateProxy.proxyForObject(base)
         }
 
         /**
          Reactive wrapper for `delegate` message.
          */
-        public var rx_didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {
-            return rx_delegate
+        public var didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {
+            return delegate
                 .observe(#selector(UIImagePickerControllerDelegate.imagePickerController(_:didFinishPickingMediaWithInfo:)))
                 .map({ (a) in
                     return try castOrThrow(Dictionary.self, a[1])
@@ -41,8 +41,8 @@ import Foundation
         /**
          Reactive wrapper for `delegate` message.
          */
-        public var rx_didCancel: Observable<()> {
-            return rx_delegate
+        public var didCancel: Observable<()> {
+            return delegate
                 .observe(#selector(UIImagePickerControllerDelegate.imagePickerControllerDidCancel(_:)))
                 .map {_ in () }
         }
diff --git a/RxCocoa/iOS/UIImageView+Rx.swift b/RxCocoa/iOS/UIImageView+Rx.swift
index 8b68578b..495cc25d 100644
--- a/RxCocoa/iOS/UIImageView+Rx.swift
+++ b/RxCocoa/iOS/UIImageView+Rx.swift
@@ -14,13 +14,13 @@ import RxSwift
 #endif
 import UIKit
 
-extension UIImageView {
+extension Reactive where Base: UIImageView {
     
     /**
     Bindable sink for `image` property.
     */
-    public var rx_image: AnyObserver {
-        return self.rx_image(transitionType: nil)
+    public var image: AnyObserver {
+        return image(transitionType: nil)
     }
     
     /**
@@ -28,9 +28,9 @@ extension UIImageView {
     
     - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
     */
-    @available(*, deprecated, renamed: "rx_image(transitionType:)")
-    public func rx_imageAnimated(_ transitionType: String?) -> AnyObserver {
-        return UIBindingObserver(UIElement: self) { imageView, image in
+    @available(*, deprecated, renamed: "image(transitionType:)")
+    public func imageAnimated(_ transitionType: String?) -> AnyObserver {
+        return UIBindingObserver(UIElement: base) { imageView, image in
             if let transitionType = transitionType {
                 if image != nil {
                     let transition = CATransition()
@@ -52,8 +52,8 @@ extension UIImageView {
 
      - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
      */
-    public func rx_image(transitionType: String? = nil) -> AnyObserver {
-        return UIBindingObserver(UIElement: self) { imageView, image in
+    public func image(transitionType: String? = nil) -> AnyObserver {
+        return UIBindingObserver(UIElement: base) { imageView, image in
             if let transitionType = transitionType {
                 if image != nil {
                     let transition = CATransition()
diff --git a/RxCocoa/iOS/UILabel+Rx.swift b/RxCocoa/iOS/UILabel+Rx.swift
index ee3d8004..2b8c880e 100644
--- a/RxCocoa/iOS/UILabel+Rx.swift
+++ b/RxCocoa/iOS/UILabel+Rx.swift
@@ -14,13 +14,13 @@ import RxSwift
 #endif
 import UIKit
 
-extension UILabel {
+extension Reactive where Base: UILabel {
     
     /**
     Bindable sink for `text` property.
     */
-    public var rx_text: AnyObserver {
-        return UIBindingObserver(UIElement: self) { label, text in
+    public var text: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { label, text in
             label.text = text
         }.asObserver()
     }
@@ -28,8 +28,8 @@ extension UILabel {
     /**
     Bindable sink for `attributedText` property.
     */
-    public var rx_attributedText: AnyObserver {
-        return UIBindingObserver(UIElement: self) { label, text in
+    public var attributedText: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { label, text in
             label.attributedText = text
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UINavigationItem+Rx.swift b/RxCocoa/iOS/UINavigationItem+Rx.swift
index 29e08ad8..3552d9f7 100644
--- a/RxCocoa/iOS/UINavigationItem+Rx.swift
+++ b/RxCocoa/iOS/UINavigationItem+Rx.swift
@@ -14,16 +14,16 @@ import UIKit
 import RxSwift
 #endif
     
-extension UINavigationItem {
+extension Reactive where Base: UINavigationItem {
     /**
     Bindable sink for `title` property.
     */
-    public var rx_title: AnyObserver {
-        return UIBindingObserver(UIElement: self) { navigationItem, text in
+    public var title: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { navigationItem, text in
             navigationItem.title = text
             }.asObserver()
     }
         
 }
     
-#endif
\ No newline at end of file
+#endif
diff --git a/RxCocoa/iOS/UIPageControl+Rx.swift b/RxCocoa/iOS/UIPageControl+Rx.swift
index 857810a1..8323994a 100644
--- a/RxCocoa/iOS/UIPageControl+Rx.swift
+++ b/RxCocoa/iOS/UIPageControl+Rx.swift
@@ -14,13 +14,13 @@ import RxSwift
 #endif
 import UIKit
     
-extension UIPageControl {
+extension Reactive where Base: UIPageControl {
     
     /**
     Bindable sink for `currentPage` property.
     */
-    public var rx_currentPage: AnyObserver {
-        return UIBindingObserver(UIElement: self) { controller, page in
+    public var currentPage: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { controller, page in
             controller.currentPage = page
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UIPickerView+Rx.swift b/RxCocoa/iOS/UIPickerView+Rx.swift
index 9c198241..3022d2b4 100644
--- a/RxCocoa/iOS/UIPickerView+Rx.swift
+++ b/RxCocoa/iOS/UIPickerView+Rx.swift
@@ -14,17 +14,17 @@
 #endif
     import UIKit
 
-extension UIPickerView {
+extension Reactive where Base: UIPickerView {
     /**
      Reactive wrapper for `delegate`.
      For more information take a look at `DelegateProxyType` protocol documentation.
      */
-    public var rx_delegate: DelegateProxy {
-        return RxPickerViewDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxPickerViewDelegateProxy.proxyForObject(base)
     }
     
-    public var rx_itemSelected: ControlEvent<(Int, Int)> {
-        let source = rx_delegate
+    public var itemSelected: ControlEvent<(Int, Int)> {
+        let source = delegate
             .observe(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:)))
             .map {
                 return (try castOrThrow(Int.self, $0[1]), try castOrThrow(Int.self, $0[2]))
diff --git a/RxCocoa/iOS/UIProgressView+Rx.swift b/RxCocoa/iOS/UIProgressView+Rx.swift
index 3b59dd71..26f70cc8 100644
--- a/RxCocoa/iOS/UIProgressView+Rx.swift
+++ b/RxCocoa/iOS/UIProgressView+Rx.swift
@@ -14,17 +14,17 @@ import RxSwift
 #endif
 import UIKit
 
-extension UIProgressView {
+extension Reactive where Base: UIProgressView {
 
     /**
     Bindable sink for `progress` property
     */
-    public var rx_progress: AnyObserver {
-        return UIBindingObserver(UIElement: self) { progressView, progress in
+    public var progress: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { progressView, progress in
             progressView.progress = progress
         }.asObserver()
     }
 
 }
 
-#endif
\ No newline at end of file
+#endif
diff --git a/RxCocoa/iOS/UIRefreshControl+Rx.swift b/RxCocoa/iOS/UIRefreshControl+Rx.swift
index 4c106d25..69b54dc9 100644
--- a/RxCocoa/iOS/UIRefreshControl+Rx.swift
+++ b/RxCocoa/iOS/UIRefreshControl+Rx.swift
@@ -13,13 +13,13 @@ import UIKit
 import RxSwift
 #endif
 
-extension UIRefreshControl {
+extension Reactive where Base: UIRefreshControl {
 
     /**
     Bindable sink for `beginRefreshing()`, `endRefreshing()` methods.
     */
-    public var rx_refreshing: AnyObserver {
-        return UIBindingObserver(UIElement: self) { refreshControl, refresh in
+    public var refreshing: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { refreshControl, refresh in
             if refresh {
                 refreshControl.beginRefreshing()
             } else {
diff --git a/RxCocoa/iOS/UIScrollView+Rx.swift b/RxCocoa/iOS/UIScrollView+Rx.swift
index dab21375..a7f798db 100644
--- a/RxCocoa/iOS/UIScrollView+Rx.swift
+++ b/RxCocoa/iOS/UIScrollView+Rx.swift
@@ -17,30 +17,34 @@ import UIKit
 extension UIScrollView {
     
     /**
-    Factory method that enables subclasses to implement their own `rx_delegate`.
+    Factory method that enables subclasses to implement their own `delegate`.
     
     - returns: Instance of delegate proxy that wraps `delegate`.
     */
-    public func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    public func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return RxScrollViewDelegateProxy(parentObject: self)
     }
     
+}
+
+extension Reactive where Base: UIScrollView {
+
     /**
     Reactive wrapper for `delegate`.
     
     For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_delegate: DelegateProxy {
-        return RxScrollViewDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxScrollViewDelegateProxy.proxyForObject(base)
     }
     
     /**
     Reactive wrapper for `contentOffset`.
     */
-    public var rx_contentOffset: ControlProperty {
-        let proxy = RxScrollViewDelegateProxy.proxyForObject(self)
+    public var contentOffset: ControlProperty {
+        let proxy = RxScrollViewDelegateProxy.proxyForObject(base)
 
-        let bindingObserver = UIBindingObserver(UIElement: self) { scrollView, contentOffset in
+        let bindingObserver = UIBindingObserver(UIElement: self.base) { scrollView, contentOffset in
             scrollView.contentOffset = contentOffset
         }
 
@@ -50,14 +54,14 @@ extension UIScrollView {
     /**
     Bindable sink for `scrollEnabled` property.
     */
-    public var rx_scrollEnabled: AnyObserver {
-        return UIBindingObserver(UIElement: self) { scrollView, scrollEnabled in
+    public var scrollEnabled: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { scrollView, scrollEnabled in
             scrollView.isScrollEnabled = scrollEnabled
         }.asObserver()
     }
 
     /**
-    Installs delegate as forwarding delegate on `rx_delegate`.
+    Installs delegate as forwarding delegate on `delegate`.
     Delegate won't be retained.
     
     It enables using normal delegate mechanism with reactive delegate mechanism.
@@ -65,9 +69,9 @@ extension UIScrollView {
     - parameter delegate: Delegate object.
     - returns: Disposable object that can be used to unbind the delegate.
     */
-    public func rx_setDelegate(_ delegate: UIScrollViewDelegate)
+    public func setDelegate(_ delegate: UIScrollViewDelegate)
         -> Disposable {
-        return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self)
+        return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)
     }
 }
 
diff --git a/RxCocoa/iOS/UISearchBar+Rx.swift b/RxCocoa/iOS/UISearchBar+Rx.swift
index 358baa73..d74af11e 100644
--- a/RxCocoa/iOS/UISearchBar+Rx.swift
+++ b/RxCocoa/iOS/UISearchBar+Rx.swift
@@ -15,44 +15,46 @@ import RxSwift
 import UIKit
 
 
-
-extension UISearchBar {
-    
 #if os(iOS)
-    /**
-     Factory method that enables subclasses to implement their own `rx_delegate`.
-     
-     - returns: Instance of delegate proxy that wraps `delegate`.
-     */
-    public func rx_createDelegateProxy() -> RxSearchBarDelegateProxy {
-        return RxSearchBarDelegateProxy(parentObject: self)
+    extension UISearchBar {
+        /**
+         Factory method that enables subclasses to implement their own `delegate`.
+
+         - returns: Instance of delegate proxy that wraps `delegate`.
+         */
+        public func createRxDelegateProxy() -> RxSearchBarDelegateProxy {
+            return RxSearchBarDelegateProxy(parentObject: self)
+        }
+        
     }
 #endif
-    
+
+extension Reactive where Base: UISearchBar {
+
     /**
     Reactive wrapper for `delegate`.
     
     For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_delegate: DelegateProxy {
-        return RxSearchBarDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxSearchBarDelegateProxy.proxyForObject(base)
     }
     
     /**
     Reactive wrapper for `text` property.
     */
-    public var rx_text: ControlProperty {
-        let source: Observable = Observable.deferred { [weak self] () -> Observable in
-            let text = self?.text ?? ""
+    public var text: ControlProperty {
+        let source: Observable = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable in
+            let text = searchBar?.text ?? ""
             
-            return (self?.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())
+            return (searchBar?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())
                     .map { a in
                         return a[1] as? String ?? ""
                     }
                     .startWith(text)
         }
 
-        let bindingObserver = UIBindingObserver(UIElement: self) { (searchBar, text: String) in
+        let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, text: String) in
             searchBar.text = text
         }
         
@@ -62,18 +64,18 @@ extension UISearchBar {
     /**
     Reactive wrapper for `selectedScopeButtonIndex` property.
     */
-    public var rx_selectedScopeButtonIndex: ControlProperty {
-        let source: Observable = Observable.deferred { [weak self] () -> Observable in
-            let index = self?.selectedScopeButtonIndex ?? 0
+    public var selectedScopeButtonIndex: ControlProperty {
+        let source: Observable = Observable.deferred { [weak source = self.base as UISearchBar] () -> Observable in
+            let index = source?.selectedScopeButtonIndex ?? 0
             
-            return (self?.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())
+            return (source?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())
                 .map { a in
                     return try castOrThrow(Int.self, a[1])
                 }
                 .startWith(index)
         }
         
-        let bindingObserver = UIBindingObserver(UIElement: self) { (searchBar, index: Int) in
+        let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, index: Int) in
             searchBar.selectedScopeButtonIndex = index
         }
         
@@ -84,8 +86,8 @@ extension UISearchBar {
     /**
     Reactive wrapper for delegate method `searchBarCancelButtonClicked`.
     */
-    public var rx_cancelButtonClicked: ControlEvent {
-        let source: Observable = rx_delegate.observe(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))
+    public var cancelButtonClicked: ControlEvent {
+        let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))
             .map { _ in
                 return ()
             }
@@ -96,8 +98,8 @@ extension UISearchBar {
     /**
      Reactive wrapper for delegate method `searchBarSearchButtonClicked`.
      */
-    public var rx_searchButtonClicked: ControlEvent {
-        let source: Observable = rx_delegate.observe(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))
+    public var searchButtonClicked: ControlEvent {
+        let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))
             .map { _ in
                 return ()
         }
diff --git a/RxCocoa/iOS/UISearchController+Rx.swift b/RxCocoa/iOS/UISearchController+Rx.swift
index 11bde04e..2aa01d52 100644
--- a/RxCocoa/iOS/UISearchController+Rx.swift
+++ b/RxCocoa/iOS/UISearchController+Rx.swift
@@ -17,51 +17,51 @@ import Foundation
     import UIKit
     
 @available(iOS 8.0, *)
-extension UISearchController {
+extension Reactive where Base: UISearchController {
     /**
      Reactive wrapper for `delegate`.
      For more information take a look at `DelegateProxyType` protocol documentation.
      */
-    public var rx_delegate: DelegateProxy {
-        return RxSearchControllerDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxSearchControllerDelegateProxy.proxyForObject(base)
     }
     /**
      Reactive wrapper for `delegate` message.
      */
-    public var rx_didDismiss: Observable {
-        return rx_delegate
+    public var didDismiss: Observable {
+        return delegate
             .observe( #selector(UISearchControllerDelegate.didDismissSearchController(_:)))
             .map {_ in}
     }
     /**
      Reactive wrapper for `delegate` message.
      */
-    public var rx_didPresent: Observable {
-        return rx_delegate
+    public var didPresent: Observable {
+        return delegate
             .observe(#selector(UISearchControllerDelegate.didPresentSearchController(_:)))
             .map {_ in}
     }
     /**
      Reactive wrapper for `delegate` message.
      */
-    public var rx_present: Observable {
-        return rx_delegate
+    public var present: Observable {
+        return delegate
             .observe( #selector(UISearchControllerDelegate.presentSearchController(_:)))
             .map {_ in}
     }
     /**
      Reactive wrapper for `delegate` message.
      */
-    public var rx_willDismiss: Observable {
-        return rx_delegate
+    public var willDismiss: Observable {
+        return delegate
             .observe(#selector(UISearchControllerDelegate.willDismissSearchController(_:)))
             .map {_ in}
     }
     /**
      Reactive wrapper for `delegate` message.
      */
-    public var rx_willPresent: Observable {
-        return rx_delegate
+    public var willPresent: Observable {
+        return delegate
             .observe( #selector(UISearchControllerDelegate.willPresentSearchController(_:)))
             .map {_ in}
     }
diff --git a/RxCocoa/iOS/UISegmentedControl+Rx.swift b/RxCocoa/iOS/UISegmentedControl+Rx.swift
index be46f4a7..f4cdf41b 100644
--- a/RxCocoa/iOS/UISegmentedControl+Rx.swift
+++ b/RxCocoa/iOS/UISegmentedControl+Rx.swift
@@ -14,14 +14,14 @@ import RxSwift
 #endif
 
 
-extension UISegmentedControl {
+extension Reactive where Base: UISegmentedControl {
     
     /**
     Reactive wrapper for `selectedSegmentIndex` property.
     */
-    public var rx_value: ControlProperty {
-        return UIControl.rx_value(
-            self,
+    public var value: ControlProperty {
+        return Reactive.value(
+            self.base,
             getter: { segmentedControl in
                 segmentedControl.selectedSegmentIndex
             }, setter: { segmentedControl, value in
diff --git a/RxCocoa/iOS/UISlider+Rx.swift b/RxCocoa/iOS/UISlider+Rx.swift
index 2c02bd08..2081b7e0 100644
--- a/RxCocoa/iOS/UISlider+Rx.swift
+++ b/RxCocoa/iOS/UISlider+Rx.swift
@@ -14,14 +14,14 @@ import RxSwift
 #endif
 import UIKit
 
-extension UISlider {
+extension Reactive where Base: UISlider {
     
     /**
     Reactive wrapper for `value` property.
     */
-    public var rx_value: ControlProperty {
-        return UIControl.rx_value(
-            self,
+    public var value: ControlProperty {
+        return Reactive.value(
+            self.base,
             getter: { slider in
                 slider.value
             }, setter: { slider, value in
diff --git a/RxCocoa/iOS/UIStepper+Rx.swift b/RxCocoa/iOS/UIStepper+Rx.swift
index 9dc40c5c..129d3714 100644
--- a/RxCocoa/iOS/UIStepper+Rx.swift
+++ b/RxCocoa/iOS/UIStepper+Rx.swift
@@ -14,14 +14,14 @@ import UIKit
 import RxSwift
 #endif
 
-extension UIStepper {
+extension Reactive where Base: UIStepper {
     
     /**
     Reactive wrapper for `value` property.
     */
-    public var rx_value: ControlProperty {
-        return UIControl.rx_value(
-            self,
+    public var value: ControlProperty {
+        return Reactive.value(
+            self.base,
             getter: { stepper in
                 stepper.value
             }, setter: { stepper, value in
diff --git a/RxCocoa/iOS/UISwitch+Rx.swift b/RxCocoa/iOS/UISwitch+Rx.swift
index c5971b09..73338366 100644
--- a/RxCocoa/iOS/UISwitch+Rx.swift
+++ b/RxCocoa/iOS/UISwitch+Rx.swift
@@ -14,14 +14,14 @@ import RxSwift
 #endif
 
 
-extension UISwitch {
+extension Reactive where Base: UISwitch {
     
     /**
     Reactive wrapper for `on` property.
     */
-    public var rx_value: ControlProperty {
-        return UIControl.rx_value(
-            self,
+    public var value: ControlProperty {
+        return Reactive.value(
+            self.base,
             getter: { uiSwitch in
                 uiSwitch.isOn
             }, setter: { uiSwitch, value in
diff --git a/RxCocoa/iOS/UITabBar+Rx.swift b/RxCocoa/iOS/UITabBar+Rx.swift
index 3c8b5162..250c09a6 100644
--- a/RxCocoa/iOS/UITabBar+Rx.swift
+++ b/RxCocoa/iOS/UITabBar+Rx.swift
@@ -18,14 +18,14 @@ import RxSwift
  iOS only
  */
 #if os(iOS)
-extension UITabBar {
+extension Reactive where Base: UITabBar {
 
     /**
      Reactive wrapper for `delegate` message `tabBar:willBeginCustomizingItems:`.
     */
-    public var rx_willBeginCustomizing: ControlEvent<[UITabBarItem]> {
+    public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {
         
-        let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:)))
+        let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:)))
             .map { a in
                 return try castOrThrow([UITabBarItem].self, a[1])
             }
@@ -36,8 +36,8 @@ extension UITabBar {
     /**
      Reactive wrapper for `delegate` message `tabBar:didBeginCustomizingItems:`.
     */
-    public var rx_didBeginCustomizing: ControlEvent<[UITabBarItem]> {
-        let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:)))
+    public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {
+        let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:)))
             .map { a in
                 return try castOrThrow([UITabBarItem].self, a[1])
             }
@@ -48,8 +48,8 @@ extension UITabBar {
     /**
      Reactive wrapper for `delegate` message `tabBar:willEndCustomizingItems:changed:`.
     */
-    public var rx_willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
-        let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:)))
+    public var willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
+        let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:)))
             .map { (a: [AnyObject]) -> (([UITabBarItem], Bool)) in
                 let items = try castOrThrow([UITabBarItem].self, a[1])
                 let changed = try castOrThrow(Bool.self, a[2])
@@ -62,8 +62,8 @@ extension UITabBar {
     /**
      Reactive wrapper for `delegate` message `tabBar:didEndCustomizingItems:changed:`.
     */
-    public var rx_didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
-        let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:)))
+    public var didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
+        let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:)))
             .map { (a: [AnyObject]) -> (([UITabBarItem], Bool)) in
                 let items = try castOrThrow([UITabBarItem].self, a[1])
                 let changed = try castOrThrow(Bool.self, a[2])
@@ -82,28 +82,31 @@ extension UITabBar {
 extension UITabBar {
     
     /**
-     Factory method that enables subclasses to implement their own `rx_delegate`.
+     Factory method that enables subclasses to implement their own `delegate`.
 
      - returns: Instance of delegate proxy that wraps `delegate`.
      */
-    public func rx_createDelegateProxy() -> RxTabBarDelegateProxy {
+    public func createRxDelegateProxy() -> RxTabBarDelegateProxy {
         return RxTabBarDelegateProxy(parentObject: self)
     }
 
+}
+
+extension Reactive where Base: UITabBar {
     /**
      Reactive wrapper for `delegate`.
 
      For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_delegate: DelegateProxy {
-        return RxTabBarDelegateProxy.proxyForObject(self)
+    public var delegate: DelegateProxy {
+        return RxTabBarDelegateProxy.proxyForObject(base)
     }
 
     /**
      Reactive wrapper for `delegate` message `tabBar:didSelectItem:`.
     */
-    public var rx_didSelectItem: ControlEvent {
-        let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:didSelect:)))
+    public var didSelectItem: ControlEvent {
+        let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didSelect:)))
             .map { a in
                 return try castOrThrow(UITabBarItem.self, a[1])
             }
diff --git a/RxCocoa/iOS/UITabBarItem+Rx.swift b/RxCocoa/iOS/UITabBarItem+Rx.swift
index 2d07cde4..fc170ada 100644
--- a/RxCocoa/iOS/UITabBarItem+Rx.swift
+++ b/RxCocoa/iOS/UITabBarItem+Rx.swift
@@ -14,13 +14,13 @@
     import RxSwift
 #endif
     
-extension UITabBarItem {
+extension Reactive where Base: UITabBarItem {
     
     /**
      Bindable sink for `badgeValue` property.
      */
-    public var rx_badgeValue: AnyObserver {
-        return UIBindingObserver(UIElement: self) { tabBarItem, badgeValue in
+    public var badgeValue: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { tabBarItem, badgeValue in
             tabBarItem.badgeValue = badgeValue
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UITableView+Rx.swift b/RxCocoa/iOS/UITableView+Rx.swift
index 6ecc00ef..f2bf1db5 100644
--- a/RxCocoa/iOS/UITableView+Rx.swift
+++ b/RxCocoa/iOS/UITableView+Rx.swift
@@ -16,7 +16,7 @@ import UIKit
 
 // Items
 
-extension UITableView {
+extension Reactive where Base: UITableView {
     
     /**
     Binds sequences of elements to table view rows.
@@ -34,7 +34,7 @@ extension UITableView {
          ])
 
          items
-         .bindTo(tableView.rx_itemsWithCellFactory) { (tableView, row, element) in
+         .bindTo(tableView.rx.itemsWithCellFactory) { (tableView, row, element) in
              let cell = tableView.dequeueReusableCellWithIdentifier("Cell")!
              cell.textLabel?.text = "\(element) @ row \(row)"
              return cell
@@ -42,7 +42,7 @@ extension UITableView {
          .addDisposableTo(disposeBag)
 
     */
-    @available(*, deprecated, renamed: "rx_items(source:cellFactory:)")
+    @available(*, deprecated, renamed: "items(source:cellFactory:)")
     public func rx_itemsWithCellFactory
         (_ source: O)
         -> (_ cellFactory: @escaping (UITableView, Int, S.Iterator.Element) -> UITableViewCell)
@@ -51,7 +51,7 @@ extension UITableView {
         return { cellFactory in
             let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper(cellFactory: cellFactory)
             
-            return self.rx_items(dataSource: dataSource)(source)
+            return self.items(dataSource: dataSource)(source)
         }
     }
 
@@ -71,7 +71,7 @@ extension UITableView {
          ])
 
          items
-         .bindTo(tableView.rx_items) { (tableView, row, element) in
+         .bindTo(tableView.items) { (tableView, row, element) in
              let cell = tableView.dequeueReusableCellWithIdentifier("Cell")!
              cell.textLabel?.text = "\(element) @ row \(row)"
              return cell
@@ -79,15 +79,14 @@ extension UITableView {
          .addDisposableTo(disposeBag)
 
      */
-    public func rx_items
+    public func items
         (_ source: O)
         -> (_ cellFactory: @escaping (UITableView, Int, S.Iterator.Element) -> UITableViewCell)
         -> Disposable
         where O.E == S {
             return { cellFactory in
                 let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper(cellFactory: cellFactory)
-
-                return self.rx_items(dataSource: dataSource)(source)
+                return self.items(dataSource: dataSource)(source)
             }
     }
 
@@ -109,12 +108,12 @@ extension UITableView {
          ])
 
          items
-             .bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
+             .bindTo(tableView.rx.itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
                 cell.textLabel?.text = "\(element) @ row \(row)"
              }
              .addDisposableTo(disposeBag)
     */
-    @available(*, deprecated, renamed: "rx_items(cellIdentifier:cellType:source:configureCell:)")
+    @available(*, deprecated, renamed: "items(cellIdentifier:cellType:source:configureCell:)")
     public func rx_itemsWithCellIdentifier
         (_ cellIdentifier: String, cellType: Cell.Type = Cell.self)
         -> (_ source: O)
@@ -129,7 +128,7 @@ extension UITableView {
                     configureCell(i, item, cell)
                     return cell
                 }
-                return self.rx_items(dataSource: dataSource)(source)
+                return self.items(dataSource: dataSource)(source)
             }
         }
     }
@@ -152,12 +151,12 @@ extension UITableView {
          ])
 
          items
-             .bindTo(tableView.rx_items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
+             .bindTo(tableView.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
                 cell.textLabel?.text = "\(element) @ row \(row)"
              }
              .addDisposableTo(disposeBag)
     */
-    public func rx_items
+    public func items
         (cellIdentifier: String, cellType: Cell.Type = Cell.self)
         -> (_ source: O)
         -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)
@@ -171,7 +170,7 @@ extension UITableView {
                     configureCell(i, item, cell)
                     return cell
                 }
-                return self.rx_items(dataSource: dataSource)(source)
+                return self.items(dataSource: dataSource)(source)
             }
         }
     }
@@ -217,10 +216,10 @@ extension UITableView {
         }
 
         items
-            .bindTo(tableView.rx_itemsWithDataSource(dataSource))
+            .bindTo(tableView.rx.itemsWithDataSource(dataSource))
             .addDisposableTo(disposeBag)
     */
-    @available(*, deprecated, renamed: "rx_items(dataSource:source:)")
+    @available(*, deprecated, renamed: "items(dataSource:source:)")
     public func rx_itemsWithDataSource<
             DataSource: RxTableViewDataSourceType & UITableViewDataSource,
             O: ObservableType>
@@ -231,8 +230,8 @@ extension UITableView {
     {
         return { source in
             // There needs to be a strong retaining here because
-            return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxTableViewDataSourceProxy, event) -> Void in
-                guard let tableView = self else {
+            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak tableView = self.base] (_: RxTableViewDataSourceProxy, event) -> Void in
+                guard let tableView = tableView else {
                     return
                 }
                 dataSource.tableView(tableView, observedEvent: event)
@@ -281,10 +280,10 @@ extension UITableView {
         }
 
         items
-            .bindTo(tableView.rx_items(dataSource: dataSource))
+            .bindTo(tableView.rx.items(dataSource: dataSource))
             .addDisposableTo(disposeBag)
     */
-    public func rx_items<
+    public func items<
             DataSource: RxTableViewDataSourceType & UITableViewDataSource,
             O: ObservableType>
         (dataSource: DataSource)
@@ -298,10 +297,10 @@ extension UITableView {
             // call `self.rx_delegate`. If that happens, it might cause weird side effects since
             // setting data source will set delegate, and UITableView might get into a weird state.
             // Therefore it's better to set delegate proxy first, just to be sure.
-            _ = self.rx_delegate
+            _ = self.delegate
             // Strong reference is needed because data source is in use until result subscription is disposed
-            return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxTableViewDataSourceProxy, event) -> Void in
-                guard let tableView = self else {
+            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak tableView = self.base] (_: RxTableViewDataSourceProxy, event) -> Void in
+                guard let tableView = tableView else {
                     return
                 }
                 dataSource.tableView(tableView, observedEvent: event)
@@ -314,34 +313,37 @@ extension UITableView {
 extension UITableView {
  
     /**
-    Factory method that enables subclasses to implement their own `rx_delegate`.
+    Factory method that enables subclasses to implement their own `delegate`.
     
     - returns: Instance of delegate proxy that wraps `delegate`.
     */
-    public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return RxTableViewDelegateProxy(parentObject: self)
     }
 
     /**
-    Factory method that enables subclasses to implement their own `rx_dataSource`.
+    Factory method that enables subclasses to implement their own `rx.dataSource`.
     
     - returns: Instance of delegate proxy that wraps `dataSource`.
     */
-    public func rx_createDataSourceProxy() -> RxTableViewDataSourceProxy {
+    public func createRxDataSourceProxy() -> RxTableViewDataSourceProxy {
         return RxTableViewDataSourceProxy(parentObject: self)
     }
-    
+
+}
+
+extension Reactive where Base: UITableView {
     /**
     Reactive wrapper for `dataSource`.
     
     For more information take a look at `DelegateProxyType` protocol documentation.
     */
-    public var rx_dataSource: DelegateProxy {
-        return RxTableViewDataSourceProxy.proxyForObject(self)
+    public var dataSource: DelegateProxy {
+        return RxTableViewDataSourceProxy.proxyForObject(base)
     }
    
     /**
-    Installs data source as forwarding delegate on `rx_dataSource`.
+    Installs data source as forwarding delegate on `rx.dataSource`.
     Data source won't be retained.
     
     It enables using normal delegate mechanism with reactive delegate mechanism.
@@ -349,9 +351,9 @@ extension UITableView {
     - parameter dataSource: Data source object.
     - returns: Disposable object that can be used to unbind the data source.
     */
-    public func rx_setDataSource(_ dataSource: UITableViewDataSource)
+    public func setDataSource(_ dataSource: UITableViewDataSource)
         -> Disposable {
-        return RxTableViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self)
+        return RxTableViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)
     }
     
     // events
@@ -359,8 +361,8 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.
     */
-    public var rx_itemSelected: ControlEvent {
-        let source = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:)))
+    public var itemSelected: ControlEvent {
+        let source = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:)))
             .map { a in
                 return try castOrThrow(IndexPath.self, a[1])
             }
@@ -371,8 +373,8 @@ extension UITableView {
     /**
      Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.
      */
-    public var rx_itemDeselected: ControlEvent {
-        let source = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:)))
+    public var itemDeselected: ControlEvent {
+        let source = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:)))
             .map { a in
                 return try castOrThrow(IndexPath.self, a[1])
             }
@@ -383,8 +385,8 @@ extension UITableView {
     /**
      Reactive wrapper for `delegate` message `tableView:accessoryButtonTappedForRowWithIndexPath:`.
      */
-    public var rx_itemAccessoryButtonTapped: ControlEvent {
-        let source: Observable = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:)))
+    public var itemAccessoryButtonTapped: ControlEvent {
+        let source: Observable = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:)))
             .map { a in
                 return try castOrThrow(IndexPath.self, a[1])
             }
@@ -395,8 +397,8 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.
     */
-    public var rx_itemInserted: ControlEvent {
-        let source = rx_dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
+    public var itemInserted: ControlEvent {
+        let source = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
             .filter { a in
                 return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .insert
             }
@@ -410,8 +412,8 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.
     */
-    public var rx_itemDeleted: ControlEvent {
-        let source = rx_dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
+    public var itemDeleted: ControlEvent {
+        let source = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
             .filter { a in
                 return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .delete
             }
@@ -425,8 +427,8 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:moveRowAtIndexPath:toIndexPath:`.
     */
-    public var rx_itemMoved: ControlEvent {
-        let source: Observable = rx_dataSource.observe(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:)))
+    public var itemMoved: ControlEvent {
+        let source: Observable = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:)))
             .map { a in
                 return (try castOrThrow(IndexPath.self, a[1]), try castOrThrow(IndexPath.self, a[2]))
             }
@@ -437,8 +439,8 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:willDisplayCell:forRowAtIndexPath:`.
     */
-    public var rx_willDisplayCell: ControlEvent {
-        let source: Observable = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:)))
+    public var willDisplayCell: ControlEvent {
+        let source: Observable = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:)))
             .map { a in
                 return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))
             }
@@ -449,8 +451,8 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:didEndDisplayingCell:forRowAtIndexPath:`.
     */
-    public var rx_didEndDisplayingCell: ControlEvent {
-        let source: Observable = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:)))
+    public var didEndDisplayingCell: ControlEvent {
+        let source: Observable = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:)))
             .map { a in
                 return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))
             }
@@ -461,21 +463,21 @@ extension UITableView {
     /**
     Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.
     
-    It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
+    It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
     or any other data source conforming to `SectionedViewDataSourceType` protocol.
     
      ```
-        tableView.rx_modelSelected(MyModel.self)
+        tableView.rx.modelSelected(MyModel.self)
             .map { ...
      ```
     */
-    public func rx_modelSelected(_ modelType: T.Type) -> ControlEvent {
-        let source: Observable = rx_itemSelected.flatMap { [weak self] indexPath -> Observable in
-            guard let view = self else {
+    public func modelSelected(_ modelType: T.Type) -> ControlEvent {
+        let source: Observable = self.itemSelected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable in
+            guard let view = view else {
                 return Observable.empty()
             }
 
-            return Observable.just(try view.rx_modelAtIndexPath(indexPath))
+            return Observable.just(try view.rx.modelAtIndexPath(indexPath))
         }
         
         return ControlEvent(events: source)
@@ -484,21 +486,21 @@ extension UITableView {
     /**
      Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.
 
-     It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
+     It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
      or any other data source conforming to `SectionedViewDataSourceType` protocol.
 
      ```
-        tableView.rx_modelDeselected(MyModel.self)
+        tableView.rx.modelDeselected(MyModel.self)
             .map { ...
      ```
      */
-    public func rx_modelDeselected(_ modelType: T.Type) -> ControlEvent {
-         let source: Observable = rx_itemDeselected.flatMap { [weak self] indexPath -> Observable in
-             guard let view = self else {
+    public func modelDeselected(_ modelType: T.Type) -> ControlEvent {
+         let source: Observable = self.itemDeselected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable in
+             guard let view = view else {
                  return Observable.empty()
              }
 
-           return Observable.just(try view.rx_modelAtIndexPath(indexPath))
+           return Observable.just(try view.rx.modelAtIndexPath(indexPath))
         }
 
         return ControlEvent(events: source)
@@ -507,8 +509,8 @@ extension UITableView {
     /**
      Synchronous helper method for retrieving a model at indexPath through a reactive data source.
      */
-    public func rx_modelAtIndexPath(_ indexPath: IndexPath) throws -> T {
-        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.rx_dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx_items*` methods was used.")
+    public func modelAtIndexPath(_ indexPath: IndexPath) throws -> T {
+        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx.items*` methods was used.")
         
         let element = try dataSource.modelAtIndexPath(indexPath)
 
@@ -520,14 +522,14 @@ extension UITableView {
 
 #if os(tvOS)
     
-    extension UITableView {
+    extension Reactive where Base: UITableView {
         
         /**
          Reactive wrapper for `delegate` message `tableView:didUpdateFocusInContext:withAnimationCoordinator:`.
          */
-        public var rx_didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
+        public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
             
-            let source = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:)))
+            let source = delegate.observe(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:)))
                 .map { a -> (context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in
                     let context = a[1] as! UIFocusUpdateContext
                     let animationCoordinator = try castOrThrow(UIFocusAnimationCoordinator.self, a[2])
diff --git a/RxCocoa/iOS/UITextField+Rx.swift b/RxCocoa/iOS/UITextField+Rx.swift
index c45957dc..680cfdeb 100644
--- a/RxCocoa/iOS/UITextField+Rx.swift
+++ b/RxCocoa/iOS/UITextField+Rx.swift
@@ -14,14 +14,14 @@ import RxSwift
 #endif
 import UIKit
 
-extension UITextField : RxTextInput {
+extension Reactive where Base: UITextField {
     
     /**
     Reactive wrapper for `text` property.
     */
-    public var rx_text: ControlProperty {
-        return UIControl.rx_value(
-            self,
+    public var text: ControlProperty {
+        return Reactive.value(
+            base,
             getter: { textField in
                 textField.text ?? ""
             }, setter: { textField, value in
diff --git a/RxCocoa/iOS/UITextView+Rx.swift b/RxCocoa/iOS/UITextView+Rx.swift
index e9828837..aa474cb0 100644
--- a/RxCocoa/iOS/UITextView+Rx.swift
+++ b/RxCocoa/iOS/UITextView+Rx.swift
@@ -16,35 +16,37 @@ import RxSwift
 
     
     
-extension UITextView : RxTextInput {
+extension UITextView {
     
     /**
-    Factory method that enables subclasses to implement their own `rx_delegate`.
+    Factory method that enables subclasses to implement their own `delegate`.
     
     - returns: Instance of delegate proxy that wraps `delegate`.
     */
-    public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return RxTextViewDelegateProxy(parentObject: self)
     }
-    
+}
+
+extension Reactive where Base: UITextView {
     /**
     Reactive wrapper for `text` property.
     */
-    public var rx_text: ControlProperty {
-        let source: Observable = Observable.deferred { [weak self] in
-            let text = self?.text ?? ""
+    public var text: ControlProperty {
+        let source: Observable = Observable.deferred { [weak textView = self.base] in
+            let text = textView?.text ?? ""
             
-            let textChanged = self?.textStorage
+            let textChanged = textView?.textStorage
                 // This project uses text storage notifications because
                 // that's the only way to catch autocorrect changes
                 // in all cases. Other suggestions are welcome.
-                .rx_didProcessEditingRangeChangeInLength
+                .rx.didProcessEditingRangeChangeInLength
                 // This observe on is here because text storage
                 // will emit event while process is not completely done,
                 // so rebinding a value will cause an exception to be thrown.
                 .observeOn(MainScheduler.asyncInstance)
                 .map { _ in
-                    return self?.textStorage.string ?? ""
+                    return textView?.textStorage.string ?? ""
                 }
                 ?? Observable.empty()
             
@@ -52,7 +54,7 @@ extension UITextView : RxTextInput {
                 .startWith(text)
         }
 
-        let bindingObserver = UIBindingObserver(UIElement: self) { (textView, text: String) in
+        let bindingObserver = UIBindingObserver(UIElement: self.base) { (textView, text: String) in
             // This check is important because setting text value always clears control state
             // including marked text selection which is imporant for proper input 
             // when IME input method is used.
diff --git a/RxCocoa/iOS/UIView+Rx.swift b/RxCocoa/iOS/UIView+Rx.swift
index 7a451782..5c67dedd 100644
--- a/RxCocoa/iOS/UIView+Rx.swift
+++ b/RxCocoa/iOS/UIView+Rx.swift
@@ -14,12 +14,12 @@ import UIKit
 import RxSwift
 #endif
 
-extension UIView {
+extension Reactive where Base: UIView {
     /**
      Bindable sink for `hidden` property.
      */
-    public var rx_hidden: AnyObserver {
-        return UIBindingObserver(UIElement: self) { view, hidden in
+    public var hidden: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { view, hidden in
             view.isHidden = hidden
         }.asObserver()
     }
@@ -27,8 +27,8 @@ extension UIView {
     /**
      Bindable sink for `alpha` property.
      */
-    public var rx_alpha: AnyObserver {
-        return UIBindingObserver(UIElement: self) { view, alpha in
+    public var alpha: AnyObserver {
+        return UIBindingObserver(UIElement: self.base) { view, alpha in
             view.alpha = alpha
         }.asObserver()
     }
diff --git a/RxCocoa/iOS/UIViewController+Rx.swift b/RxCocoa/iOS/UIViewController+Rx.swift
index 02c5d2db..2a284bdb 100644
--- a/RxCocoa/iOS/UIViewController+Rx.swift
+++ b/RxCocoa/iOS/UIViewController+Rx.swift
@@ -15,15 +15,15 @@ import Foundation
   import RxSwift
 #endif
 
-  extension UIViewController {
+  extension Reactive where Base: UIViewController {
 
     /**
      Bindable sink for `title`.
      */
-    public var rx_title: AnyObserver {
-      return UIBindingObserver(UIElement: self) { viewController, title in
+    public var title: AnyObserver {
+      return UIBindingObserver(UIElement: self.base) { viewController, title in
         viewController.title = title
       }.asObserver()
     }
   }
-#endif
\ No newline at end of file
+#endif
diff --git a/RxExample/RxDataSources/DataSources+Rx/UISectionedViewType+RxAnimatedDataSource.swift b/RxExample/RxDataSources/DataSources+Rx/UISectionedViewType+RxAnimatedDataSource.swift
index 27e932c2..4e23eb5c 100644
--- a/RxExample/RxDataSources/DataSources+Rx/UISectionedViewType+RxAnimatedDataSource.swift
+++ b/RxExample/RxDataSources/DataSources+Rx/UISectionedViewType+RxAnimatedDataSource.swift
@@ -13,9 +13,9 @@ import RxSwift
 import RxCocoa
 #endif
 
-extension UITableView {
-    @available(*, deprecated:0.7, renamed:"rx_itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
-    public func rx_itemsAnimatedWithDataSource<
+extension Reactive where Base: UITableView {
+    @available(*, deprecated:0.7, renamed:"itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
+    public func itemsAnimatedWithDataSource<
             DataSource: RxTableViewDataSourceType & UITableViewDataSource,
             S: Sequence,
             O: ObservableType>
@@ -28,14 +28,14 @@ extension UITableView {
         S.Iterator.Element: AnimatableSectionModelType
     {
         return  { source in
-            return self.rx_itemsWithDataSource(dataSource)(source)
+            return self.items(dataSource: dataSource)(source)
         }
     }
 }
 
-extension UICollectionView {
-    @available(*, deprecated:0.7, renamed:"rx_itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
-    public func rx_itemsAnimatedWithDataSource<
+extension Reactive where Base: UICollectionView {
+    @available(*, deprecated:0.7, renamed:"itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
+    public func itemsAnimatedWithDataSource<
             DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,
             S: Sequence,
             O: ObservableType>
@@ -48,7 +48,7 @@ extension UICollectionView {
         S.Iterator.Element: AnimatableSectionModelType
     {
         return { source in
-            return self.rx_itemsWithDataSource(dataSource)(source)
+            return self.items(dataSource: dataSource)(source)
         }
     }
 }
diff --git a/RxExample/RxExample/Examples/APIWrappers/APIWrappersViewController.swift b/RxExample/RxExample/Examples/APIWrappers/APIWrappersViewController.swift
index 4733de1b..499fdae6 100644
--- a/RxExample/RxExample/Examples/APIWrappers/APIWrappersViewController.swift
+++ b/RxExample/RxExample/Examples/APIWrappers/APIWrappersViewController.swift
@@ -62,7 +62,7 @@ class APIWrappersViewController: ViewController {
 
         // MARK: UIBarButtonItem
 
-        bbitem.rx_tap
+        bbitem.rx.tap
             .subscribe(onNext: { [weak self] x in
                 self?.debug("UIBarButtonItem Tapped")
             })
@@ -72,7 +72,7 @@ class APIWrappersViewController: ViewController {
 
         // also test two way binding
         let segmentedValue = Variable(0)
-        _ = segmentedControl.rx_value <-> segmentedValue
+        _ = segmentedControl.rx.value <-> segmentedValue
 
         segmentedValue.asObservable()
             .subscribe(onNext: { [weak self] x in
@@ -85,7 +85,7 @@ class APIWrappersViewController: ViewController {
 
         // also test two way binding
         let switchValue = Variable(true)
-        _ = switcher.rx_value <-> switchValue
+        _ = switcher.rx.value <-> switchValue
 
         switchValue.asObservable()
             .subscribe(onNext: { [weak self] x in
@@ -95,14 +95,14 @@ class APIWrappersViewController: ViewController {
 
         // MARK: UIActivityIndicatorView
 
-        switcher.rx_value
-            .bindTo(activityIndicator.rx_animating)
+        switcher.rx.value
+            .bindTo(activityIndicator.rx.animating)
             .addDisposableTo(disposeBag)
 
 
         // MARK: UIButton
 
-        button.rx_tap
+        button.rx.tap
             .subscribe(onNext: { [weak self] x in
                 self?.debug("UIButton Tapped")
             })
@@ -113,7 +113,7 @@ class APIWrappersViewController: ViewController {
 
         // also test two way binding
         let sliderValue = Variable(1.0)
-        _ = slider.rx_value <-> sliderValue
+        _ = slider.rx.value <-> sliderValue
 
         sliderValue.asObservable()
             .subscribe(onNext: { [weak self] x in
@@ -126,7 +126,7 @@ class APIWrappersViewController: ViewController {
 
         // also test two way binding
         let dateValue = Variable(Date(timeIntervalSince1970: 0))
-        _ = datePicker.rx_date <-> dateValue
+        _ = datePicker.rx.date <-> dateValue
 
 
         dateValue.asObservable()
@@ -151,7 +151,7 @@ class APIWrappersViewController: ViewController {
 
         // MARK: UIGestureRecognizer
 
-        mypan.rx_event
+        mypan.rx.event
             .subscribe(onNext: { [weak self] x in
                 self?.debug("UIGestureRecognizer event \(x.state)")
             })
@@ -162,7 +162,7 @@ class APIWrappersViewController: ViewController {
 
         // also test two way binding
         let textViewValue = Variable("")
-        _ = textView <-> textViewValue
+        _ = textView! <-> textViewValue
 
         textViewValue.asObservable()
             .subscribe(onNext: { [weak self] x in
@@ -176,18 +176,18 @@ class APIWrappersViewController: ViewController {
         manager.requestWhenInUseAuthorization()
         #endif
 
-        manager.rx_didUpdateLocations
+        manager.rx.didUpdateLocations
             .subscribe(onNext: { x in
                 print("rx_didUpdateLocations \(x)")
             })
             .addDisposableTo(disposeBag)
 
-        _ = manager.rx_didFailWithError
+        _ = manager.rx.didFailWithError
             .subscribe(onNext: { x in
                 print("rx_didFailWithError \(x)")
             })
         
-        manager.rx_didChangeAuthorizationStatus
+        manager.rx.didChangeAuthorizationStatus
             .subscribe(onNext: { status in
                 print("Authorization status \(status)")
             })
diff --git a/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift b/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift
index 445a3024..eac62b22 100644
--- a/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift
+++ b/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift
@@ -43,30 +43,30 @@ class CalculatorViewController: ViewController {
     
     override func viewDidLoad() {
         let commands:[Observable] = [
-            allClearButton.rx_tap.map { _ in .clear },
+            allClearButton.rx.tap.map { _ in .clear },
             
-            changeSignButton.rx_tap.map { _ in .changeSign },
-            percentButton.rx_tap.map { _ in .percent },
+            changeSignButton.rx.tap.map { _ in .changeSign },
+            percentButton.rx.tap.map { _ in .percent },
             
-            divideButton.rx_tap.map { _ in .operation(.division) },
-            multiplyButton.rx_tap.map { _ in .operation(.multiplication) },
-            minusButton.rx_tap.map { _ in .operation(.subtraction) },
-            plusButton.rx_tap.map { _ in .operation(.addition) },
+            divideButton.rx.tap.map { _ in .operation(.division) },
+            multiplyButton.rx.tap.map { _ in .operation(.multiplication) },
+            minusButton.rx.tap.map { _ in .operation(.subtraction) },
+            plusButton.rx.tap.map { _ in .operation(.addition) },
             
-            equalButton.rx_tap.map { _ in .equal },
+            equalButton.rx.tap.map { _ in .equal },
             
-            dotButton.rx_tap.map { _ in  .addDot },
+            dotButton.rx.tap.map { _ in  .addDot },
             
-            zeroButton.rx_tap.map { _ in .addNumber("0") },
-            oneButton.rx_tap.map { _ in .addNumber("1") },
-            twoButton.rx_tap.map { _ in .addNumber("2") },
-            threeButton.rx_tap.map { _ in .addNumber("3") },
-            fourButton.rx_tap.map { _ in .addNumber("4") },
-            fiveButton.rx_tap.map { _ in .addNumber("5") },
-            sixButton.rx_tap.map { _ in .addNumber("6") },
-            sevenButton.rx_tap.map { _ in .addNumber("7") },
-            eightButton.rx_tap.map { _ in .addNumber("8") },
-            nineButton.rx_tap.map { _ in .addNumber("9") }
+            zeroButton.rx.tap.map { _ in .addNumber("0") },
+            oneButton.rx.tap.map { _ in .addNumber("1") },
+            twoButton.rx.tap.map { _ in .addNumber("2") },
+            threeButton.rx.tap.map { _ in .addNumber("3") },
+            fourButton.rx.tap.map { _ in .addNumber("4") },
+            fiveButton.rx.tap.map { _ in .addNumber("5") },
+            sixButton.rx.tap.map { _ in .addNumber("6") },
+            sevenButton.rx.tap.map { _ in .addNumber("7") },
+            eightButton.rx.tap.map { _ in .addNumber("8") },
+            nineButton.rx.tap.map { _ in .addNumber("9") }
         ]
         
         Observable.from(commands)
diff --git a/RxExample/RxExample/Examples/GeolocationExample/GeolocationViewController.swift b/RxExample/RxExample/Examples/GeolocationExample/GeolocationViewController.swift
index 629cc893..db0b4647 100644
--- a/RxExample/RxExample/Examples/GeolocationExample/GeolocationViewController.swift
+++ b/RxExample/RxExample/Examples/GeolocationExample/GeolocationViewController.swift
@@ -13,17 +13,17 @@ import CoreLocation
     import RxCocoa
 #endif
 
-private extension UILabel {
-    var rx_driveCoordinates: AnyObserver {
-        return UIBindingObserver(UIElement: self) { label, location in
+private extension Reactive where Base: UILabel {
+    var driveCoordinates: AnyObserver {
+        return UIBindingObserver(UIElement: base) { label, location in
             label.text = "Lat: \(location.latitude)\nLon: \(location.longitude)"
         }.asObserver()
     }
 }
 
-private extension UIView {
-    var rx_driveAuthorization: AnyObserver {
-        return UIBindingObserver(UIElement: self) { view, authorized in
+private extension Reactive where Base: UIView {
+    var driveAuthorization: AnyObserver {
+        return UIBindingObserver(UIElement: base) { view, authorized in
             if authorized {
                 view.isHidden = true
                 view.superview?.sendSubview(toBack:view)
@@ -49,20 +49,20 @@ class GeolocationViewController: ViewController {
         let geolocationService = GeolocationService.instance
 
         geolocationService.authorized
-            .drive(noGeolocationView.rx_driveAuthorization)
+            .drive(noGeolocationView.rx.driveAuthorization)
             .addDisposableTo(disposeBag)
         
         geolocationService.location
-            .drive(label.rx_driveCoordinates)
+            .drive(label.rx.driveCoordinates)
             .addDisposableTo(disposeBag)
 
-        button.rx_tap
+        button.rx.tap
             .bindNext { [weak self] in
                 self?.openAppPreferences()
             }
             .addDisposableTo(disposeBag)
         
-        button2.rx_tap
+        button2.rx.tap
             .bindNext { [weak self] in
                 self?.openAppPreferences()
             }
diff --git a/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesAPI.swift b/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesAPI.swift
index 2dd246db..c554501a 100644
--- a/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesAPI.swift
+++ b/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesAPI.swift
@@ -165,7 +165,7 @@ extension GitHubSearchRepositoriesAPI {
 
     private func loadSearchURL(_ searchURL: URL) -> Observable {
         return URLSession.shared
-            .rx_response(URLRequest(url: searchURL))
+            .rx.response(URLRequest(url: searchURL))
             .retry(3)
             .trackActivity(self.activityIndicator)
             .observeOn(Dependencies.sharedDependencies.backgroundWorkScheduler)
diff --git a/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesViewController.swift b/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesViewController.swift
index 37ed882c..083401d5 100644
--- a/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesViewController.swift
+++ b/RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesViewController.swift
@@ -48,14 +48,14 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
         }
 
 
-        let loadNextPageTrigger = self.tableView.rx_contentOffset
+        let loadNextPageTrigger = self.tableView.rx.contentOffset
             .flatMap { _ in
                 self.tableView.isNearBottomEdge(edgeOffset: 20.0)
                     ? Observable.just(())
                     : Observable.empty()
             }
 
-        let searchResult = self.searchBar.rx_text.asDriver()
+        let searchResult = self.searchBar.rx.text.asDriver()
             .throttle(0.3)
             .distinctUntilChanged()
             .flatMapLatest { query -> Driver in
@@ -69,12 +69,12 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
 
         searchResult
             .map { $0.serviceState }
-            .drive(navigationController!.rx_serviceState)
+            .drive(navigationController!.rx.serviceState)
             .addDisposableTo(disposeBag)
 
         searchResult
             .map { [SectionModel(model: "Repositories", items: $0.repositories)] }
-            .drive(tableView.rx_items(dataSource: dataSource))
+            .drive(tableView.rx.items(dataSource: dataSource))
             .addDisposableTo(disposeBag)
 
         searchResult
@@ -85,7 +85,7 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
             .addDisposableTo(disposeBag)
 
         // dismiss keyboard on scroll
-        tableView.rx_contentOffset
+        tableView.rx.contentOffset
             .subscribe { _ in
                 if self.searchBar.isFirstResponder {
                     _ = self.searchBar.resignFirstResponder()
@@ -94,13 +94,13 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
             .addDisposableTo(disposeBag)
 
         // so normal delegate customization can also be used
-        tableView.rx_setDelegate(self)
+        tableView.rx.setDelegate(self)
             .addDisposableTo(disposeBag)
 
         // activity indicator in status bar
         // {
         GitHubSearchRepositoriesAPI.sharedAPI.activityIndicator
-            .drive(UIApplication.shared.rx_networkActivityIndicatorVisible)
+            .drive(UIApplication.shared.rx.networkActivityIndicatorVisible)
             .addDisposableTo(disposeBag)
         // }
     }
diff --git a/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift b/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift
index 2ef7f583..35251a23 100644
--- a/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift
+++ b/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift
@@ -18,14 +18,14 @@ struct Colors {
     static let OnlineColor = nil as UIColor?
 }
 
-extension UINavigationController {
-    var rx_serviceState: AnyObserver {
-        return UIBindingObserver(UIElement: self) { navigationController, maybeServiceState in
+extension Reactive where Base: UINavigationController {
+    var serviceState: AnyObserver {
+        return UIBindingObserver(UIElement: base) { navigationController, maybeServiceState in
             // if nil is being bound, then don't change color, it's not perfect, but :)
             if let serviceState = maybeServiceState {
                 let isOffline = serviceState == .offline
 
-                self.navigationBar.backgroundColor = isOffline
+                navigationController.navigationBar.backgroundColor = isOffline
                     ? Colors.OfflineColor
                     : Colors.OnlineColor
             }
diff --git a/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift b/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift
index 9c87522d..27cd1bb7 100644
--- a/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift
+++ b/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift
@@ -48,9 +48,9 @@ extension ValidationResult {
     }
 }
 
-extension UILabel {
-    var ex_validationResult: AnyObserver {
-        return UIBindingObserver(UIElement: self) { label, result in
+extension Reactive where Base: UILabel {
+    var validationResult: AnyObserver {
+        return UIBindingObserver(UIElement: base) { label, result in
             label.textColor = result.textColor
             label.text = result.description
         }.asObserver()
diff --git a/RxExample/RxExample/Examples/GitHubSignup/DefaultImplementations.swift b/RxExample/RxExample/Examples/GitHubSignup/DefaultImplementations.swift
index 59ae506f..fd37c3c1 100644
--- a/RxExample/RxExample/Examples/GitHubSignup/DefaultImplementations.swift
+++ b/RxExample/RxExample/Examples/GitHubSignup/DefaultImplementations.swift
@@ -95,7 +95,7 @@ class GitHubDefaultAPI : GitHubAPI {
         
         let url = URL(string: "https://github.com/\(username.URLEscaped)")!
         let request = URLRequest(url: url)
-        return self.URLSession.rx_response(request)
+        return self.URLSession.rx.response(request)
             .map { (maybeData, response) in
                 return response.statusCode == 404
             }
diff --git a/RxExample/RxExample/Examples/GitHubSignup/UsingDriver/GitHubSignupViewController2.swift b/RxExample/RxExample/Examples/GitHubSignup/UsingDriver/GitHubSignupViewController2.swift
index 76ad23b6..2cf39c97 100644
--- a/RxExample/RxExample/Examples/GitHubSignup/UsingDriver/GitHubSignupViewController2.swift
+++ b/RxExample/RxExample/Examples/GitHubSignup/UsingDriver/GitHubSignupViewController2.swift
@@ -31,10 +31,10 @@ class GitHubSignupViewController2 : ViewController {
 
         let viewModel = GithubSignupViewModel2(
             input: (
-                username: usernameOutlet.rx_text.asDriver(),
-                password: passwordOutlet.rx_text.asDriver(),
-                repeatedPassword: repeatedPasswordOutlet.rx_text.asDriver(),
-                loginTaps: signupOutlet.rx_tap.asDriver()
+                username: usernameOutlet.rx.text.asDriver(),
+                password: passwordOutlet.rx.text.asDriver(),
+                repeatedPassword: repeatedPasswordOutlet.rx.text.asDriver(),
+                loginTaps: signupOutlet.rx.tap.asDriver()
             ),
             dependency: (
                 API: GitHubDefaultAPI.sharedAPI,
@@ -52,19 +52,19 @@ class GitHubSignupViewController2 : ViewController {
             .addDisposableTo(disposeBag)
 
         viewModel.validatedUsername
-            .drive(usernameValidationOutlet.ex_validationResult)
+            .drive(usernameValidationOutlet.rx.validationResult)
             .addDisposableTo(disposeBag)
 
         viewModel.validatedPassword
-            .drive(passwordValidationOutlet.ex_validationResult)
+            .drive(passwordValidationOutlet.rx.validationResult)
             .addDisposableTo(disposeBag)
 
         viewModel.validatedPasswordRepeated
-            .drive(repeatedPasswordValidationOutlet.ex_validationResult)
+            .drive(repeatedPasswordValidationOutlet.rx.validationResult)
             .addDisposableTo(disposeBag)
 
         viewModel.signingIn
-            .drive(signingUpOulet.rx_animating)
+            .drive(signingUpOulet.rx.animating)
             .addDisposableTo(disposeBag)
 
         viewModel.signedIn
@@ -75,7 +75,7 @@ class GitHubSignupViewController2 : ViewController {
         //}
 
         let tapBackground = UITapGestureRecognizer()
-        tapBackground.rx_event
+        tapBackground.rx.event
             .subscribe(onNext: { [weak self] _ in
                 self?.view.endEditing(true)
             })
diff --git a/RxExample/RxExample/Examples/GitHubSignup/UsingVanillaObservables/GitHubSignupViewController1.swift b/RxExample/RxExample/Examples/GitHubSignup/UsingVanillaObservables/GitHubSignupViewController1.swift
index b12feb2e..5a89b09b 100644
--- a/RxExample/RxExample/Examples/GitHubSignup/UsingVanillaObservables/GitHubSignupViewController1.swift
+++ b/RxExample/RxExample/Examples/GitHubSignup/UsingVanillaObservables/GitHubSignupViewController1.swift
@@ -31,10 +31,10 @@ class GitHubSignupViewController1 : ViewController {
 
         let viewModel = GithubSignupViewModel1(
             input: (
-                username: usernameOutlet.rx_text.asObservable(),
-                password: passwordOutlet.rx_text.asObservable(),
-                repeatedPassword: repeatedPasswordOutlet.rx_text.asObservable(),
-                loginTaps: signupOutlet.rx_tap.asObservable()
+                username: usernameOutlet.rx.text.asObservable(),
+                password: passwordOutlet.rx.text.asObservable(),
+                repeatedPassword: repeatedPasswordOutlet.rx.text.asObservable(),
+                loginTaps: signupOutlet.rx.tap.asObservable()
             ),
             dependency: (
                 API: GitHubDefaultAPI.sharedAPI,
@@ -52,19 +52,19 @@ class GitHubSignupViewController1 : ViewController {
             .addDisposableTo(disposeBag)
 
         viewModel.validatedUsername
-            .bindTo(usernameValidationOutlet.ex_validationResult)
+            .bindTo(usernameValidationOutlet.rx.validationResult)
             .addDisposableTo(disposeBag)
 
         viewModel.validatedPassword
-            .bindTo(passwordValidationOutlet.ex_validationResult)
+            .bindTo(passwordValidationOutlet.rx.validationResult)
             .addDisposableTo(disposeBag)
 
         viewModel.validatedPasswordRepeated
-            .bindTo(repeatedPasswordValidationOutlet.ex_validationResult)
+            .bindTo(repeatedPasswordValidationOutlet.rx.validationResult)
             .addDisposableTo(disposeBag)
 
         viewModel.signingIn
-            .bindTo(signingUpOulet.rx_animating)
+            .bindTo(signingUpOulet.rx.animating)
             .addDisposableTo(disposeBag)
 
         viewModel.signedIn
@@ -75,7 +75,7 @@ class GitHubSignupViewController1 : ViewController {
         //}
 
         let tapBackground = UITapGestureRecognizer()
-        tapBackground.rx_event
+        tapBackground.rx.event
             .subscribe(onNext: { [weak self] _ in
                 self?.view.endEditing(true)
             })
diff --git a/RxExample/RxExample/Examples/ImagePicker/ImagePickerController.swift b/RxExample/RxExample/Examples/ImagePicker/ImagePickerController.swift
index e6a1cfba..6a448e67 100644
--- a/RxExample/RxExample/Examples/ImagePicker/ImagePickerController.swift
+++ b/RxExample/RxExample/Examples/ImagePicker/ImagePickerController.swift
@@ -26,51 +26,51 @@ class ImagePickerController: ViewController {
 
         cameraButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.camera)
 
-        cameraButton.rx_tap
+        cameraButton.rx.tap
             .flatMapLatest { [weak self] _ in
-                return UIImagePickerController.rx_createWithParent(self) { picker in
+                return Reactive.createWithParent(self) { picker in
                     picker.sourceType = .camera
                     picker.allowsEditing = false
                 }
-                .flatMap { $0.rx_didFinishPickingMediaWithInfo }
+                .flatMap { $0.rx.didFinishPickingMediaWithInfo }
                 .take(1)
             }
             .map { info in
                 return info[UIImagePickerControllerOriginalImage] as? UIImage
             }
-            .bindTo(imageView.rx_image)
+            .bindTo(imageView.rx.image)
             .addDisposableTo(disposeBag)
 
-        galleryButton.rx_tap
+        galleryButton.rx.tap
             .flatMapLatest { [weak self] _ in
-                return UIImagePickerController.rx_createWithParent(self) { picker in
+                return Reactive.createWithParent(self) { picker in
                     picker.sourceType = .photoLibrary
                     picker.allowsEditing = false
                 }
                 .flatMap {
-                    $0.rx_didFinishPickingMediaWithInfo
+                    $0.rx.didFinishPickingMediaWithInfo
                 }
                 .take(1)
             }
             .map { info in
                 return info[UIImagePickerControllerOriginalImage] as? UIImage
             }
-            .bindTo(imageView.rx_image)
+            .bindTo(imageView.rx.image)
             .addDisposableTo(disposeBag)
 
-        cropButton.rx_tap
+        cropButton.rx.tap
             .flatMapLatest { [weak self] _ in
-                return UIImagePickerController.rx_createWithParent(self) { picker in
+                return Reactive.createWithParent(self) { picker in
                     picker.sourceType = .photoLibrary
                     picker.allowsEditing = true
                 }
-                .flatMap { $0.rx_didFinishPickingMediaWithInfo }
+                .flatMap { $0.rx.didFinishPickingMediaWithInfo }
                 .take(1)
             }
             .map { info in
                 return info[UIImagePickerControllerEditedImage] as? UIImage
             }
-            .bindTo(imageView.rx_image)
+            .bindTo(imageView.rx.image)
             .addDisposableTo(disposeBag)
     }
     
diff --git a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift
index d339015e..34e376da 100644
--- a/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift
+++ b/RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift
@@ -27,12 +27,12 @@ func dismissViewController(_ viewController: UIViewController, animated: Bool) {
     }
 }
 
-extension UIImagePickerController {
-    static func rx_createWithParent(_ parent: UIViewController?, animated: Bool = true, configureImagePicker: @escaping (UIImagePickerController) throws -> () = { x in }) -> Observable {
+extension Reactive where Base: UIImagePickerController {
+    static func createWithParent(_ parent: UIViewController?, animated: Bool = true, configureImagePicker: @escaping (UIImagePickerController) throws -> () = { x in }) -> Observable {
         return Observable.create { [weak parent] observer in
             let imagePicker = UIImagePickerController()
-            let dismissDisposable = imagePicker
-                .rx_didCancel
+            let dismissDisposable = imagePicker.rx
+                .didCancel
                 .subscribe(onNext: { [weak imagePicker] in
                     guard let imagePicker = imagePicker else {
                         return
diff --git a/RxExample/RxExample/Examples/Numbers/NumbersViewController.swift b/RxExample/RxExample/Examples/Numbers/NumbersViewController.swift
index 9b71241f..4269cd2c 100644
--- a/RxExample/RxExample/Examples/Numbers/NumbersViewController.swift
+++ b/RxExample/RxExample/Examples/Numbers/NumbersViewController.swift
@@ -23,11 +23,11 @@ class NumbersViewController: ViewController {
     override func viewDidLoad() {
         super.viewDidLoad()
 
-        Observable.combineLatest(number1.rx_text, number2.rx_text, number3.rx_text) { textValue1, textValue2, textValue3 -> Int in
+        Observable.combineLatest(number1.rx.text, number2.rx.text, number3.rx.text) { textValue1, textValue2, textValue3 -> Int in
                 return (Int(textValue1) ?? 0) + (Int(textValue2) ?? 0) + (Int(textValue3) ?? 0)
             }
             .map { $0.description }
-            .bindTo(result.rx_text)
+            .bindTo(result.rx.text)
             .addDisposableTo(disposeBag)
     }
 }
diff --git a/RxExample/RxExample/Examples/OSX simple example/IntroductionExampleViewController.swift b/RxExample/RxExample/Examples/OSX simple example/IntroductionExampleViewController.swift
index 742fc70a..4728b9bd 100644
--- a/RxExample/RxExample/Examples/OSX simple example/IntroductionExampleViewController.swift	
+++ b/RxExample/RxExample/Examples/OSX simple example/IntroductionExampleViewController.swift	
@@ -27,7 +27,7 @@ class IntroductionExampleViewController : ViewController {
         showAlert("After you close this, prepare for a loud sound ...")
 
         // c = a + b
-        let sum = Observable.combineLatest(a.rx_text, b.rx_text) { (a: String, b: String) -> (Int, Int) in
+        let sum = Observable.combineLatest(a.rx.text, b.rx.text) { (a: String, b: String) -> (Int, Int) in
             return (Int(a) ?? 0, Int(b) ?? 0)
         }
         
@@ -36,7 +36,7 @@ class IntroductionExampleViewController : ViewController {
             .map { (a, b) in
                 return "\(a + b)"
             }
-            .bindTo(c.rx_text)
+            .bindTo(c.rx.text)
             .addDisposableTo(disposeBag)
         
         // Also, tell it out loud
@@ -56,13 +56,13 @@ class IntroductionExampleViewController : ViewController {
             .addDisposableTo(disposeBag)
         
         
-        slider.rx_value
+        slider.rx.value
             .subscribe(onNext: { value in
                 self.sliderValue.stringValue = "\(Int(value))"
             })
             .addDisposableTo(disposeBag)
         
-        sliderValue.rx_text
+        sliderValue.rx.text
             .subscribe(onNext: { value in
                 let doubleValue = value.toDouble() ?? 0.0
                 self.slider.doubleValue = doubleValue
@@ -70,7 +70,7 @@ class IntroductionExampleViewController : ViewController {
             })
             .addDisposableTo(disposeBag)
         
-        disposeButton.rx_tap
+        disposeButton.rx.tap
             .subscribe(onNext: { [weak self] _ in
                 print("Unbind everything")
                 self?.disposeBag = DisposeBag()
diff --git a/RxExample/RxExample/Examples/SimpleTableViewExample/SimpleTableViewExampleViewController.swift b/RxExample/RxExample/Examples/SimpleTableViewExample/SimpleTableViewExampleViewController.swift
index 3f5e0e60..c320eccd 100644
--- a/RxExample/RxExample/Examples/SimpleTableViewExample/SimpleTableViewExampleViewController.swift
+++ b/RxExample/RxExample/Examples/SimpleTableViewExample/SimpleTableViewExampleViewController.swift
@@ -26,21 +26,21 @@ class SimpleTableViewExampleViewController : ViewController {
         ])
 
         items
-            .bindTo(tableView.rx_items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
+            .bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
                 cell.textLabel?.text = "\(element) @ row \(row)"
             }
             .addDisposableTo(disposeBag)
 
 
-        tableView
-            .rx_modelSelected(String.self)
+        tableView.rx
+            .modelSelected(String.self)
             .subscribe(onNext:  { value in
                 DefaultWireframe.presentAlert("Tapped `\(value)`")
             })
             .addDisposableTo(disposeBag)
 
-        tableView
-            .rx_itemAccessoryButtonTapped
+        tableView.rx
+            .itemAccessoryButtonTapped
             .subscribe(onNext: { indexPath in
                 DefaultWireframe.presentAlert("Tapped Detail @ \(indexPath.section),\(indexPath.row)")
             })
diff --git a/RxExample/RxExample/Examples/SimpleTableViewExampleSectioned/SimpleTableViewExampleSectionedViewController.swift b/RxExample/RxExample/Examples/SimpleTableViewExampleSectioned/SimpleTableViewExampleSectionedViewController.swift
index 49ce3acb..5e8338a3 100644
--- a/RxExample/RxExample/Examples/SimpleTableViewExampleSectioned/SimpleTableViewExampleSectionedViewController.swift
+++ b/RxExample/RxExample/Examples/SimpleTableViewExampleSectioned/SimpleTableViewExampleSectionedViewController.swift
@@ -50,11 +50,11 @@ class SimpleTableViewExampleSectionedViewController
         }
 
         items
-            .bindTo(tableView.rx_items(dataSource: dataSource))
+            .bindTo(tableView.rx.items(dataSource: dataSource))
             .addDisposableTo(disposeBag)
 
-        tableView
-            .rx_itemSelected
+        tableView.rx
+            .itemSelected
             .map { indexPath in
                 return (indexPath, dataSource.itemAtIndexPath(indexPath))
             }
@@ -63,8 +63,8 @@ class SimpleTableViewExampleSectionedViewController
             })
             .addDisposableTo(disposeBag)
 
-        tableView
-            .rx_setDelegate(self)
+        tableView.rx
+            .setDelegate(self)
             .addDisposableTo(disposeBag)
     }
 
diff --git a/RxExample/RxExample/Examples/SimpleValidation/SimpleValidationViewController.swift b/RxExample/RxExample/Examples/SimpleValidation/SimpleValidationViewController.swift
index 63476e1b..db0abe36 100644
--- a/RxExample/RxExample/Examples/SimpleValidation/SimpleValidationViewController.swift
+++ b/RxExample/RxExample/Examples/SimpleValidation/SimpleValidationViewController.swift
@@ -32,11 +32,11 @@ class SimpleValidationViewController : ViewController {
         usernameValidOutlet.text = "Username has to be at least \(minimalUsernameLength) characters"
         passwordValidOutlet.text = "Password has to be at least \(minimalPasswordLength) characters"
 
-        let usernameValid = usernameOutlet.rx_text
+        let usernameValid = usernameOutlet.rx.text
             .map { $0.characters.count >= minimalUsernameLength }
             .shareReplay(1) // without this map would be executed once for each binding, rx is stateless by default
 
-        let passwordValid = passwordOutlet.rx_text
+        let passwordValid = passwordOutlet.rx.text
             .map { $0.characters.count >= minimalPasswordLength }
             .shareReplay(1)
 
@@ -44,22 +44,22 @@ class SimpleValidationViewController : ViewController {
             .shareReplay(1)
 
         usernameValid
-            .bindTo(passwordOutlet.rx_enabled)
+            .bindTo(passwordOutlet.rx.enabled)
             .addDisposableTo(disposeBag)
 
         usernameValid
-            .bindTo(usernameValidOutlet.rx_hidden)
+            .bindTo(usernameValidOutlet.rx.hidden)
             .addDisposableTo(disposeBag)
 
         passwordValid
-            .bindTo(passwordValidOutlet.rx_hidden)
+            .bindTo(passwordValidOutlet.rx.hidden)
             .addDisposableTo(disposeBag)
 
         everythingValid
-            .bindTo(doSomethingOutlet.rx_enabled)
+            .bindTo(doSomethingOutlet.rx.enabled)
             .addDisposableTo(disposeBag)
 
-        doSomethingOutlet.rx_tap
+        doSomethingOutlet.rx.tap
             .subscribe(onNext: { [weak self] in self?.showAlert() })
             .addDisposableTo(disposeBag)
     }
diff --git a/RxExample/RxExample/Examples/TableViewPartialUpdates/PartialUpdatesViewController.swift b/RxExample/RxExample/Examples/TableViewPartialUpdates/PartialUpdatesViewController.swift
index 56f383c2..13f30cc5 100644
--- a/RxExample/RxExample/Examples/TableViewPartialUpdates/PartialUpdatesViewController.swift
+++ b/RxExample/RxExample/Examples/TableViewPartialUpdates/PartialUpdatesViewController.swift
@@ -85,11 +85,11 @@ class PartialUpdatesViewController : ViewController {
         skinTableViewDataSource(reloadDataSource)
 
         self.sections.asObservable()
-            .bindTo(partialUpdatesTableViewOutlet.rx_items(dataSource: tvAnimatedDataSource))
+            .bindTo(partialUpdatesTableViewOutlet.rx.items(dataSource: tvAnimatedDataSource))
             .addDisposableTo(disposeBag)
 
         self.sections.asObservable()
-            .bindTo(reloadTableViewOutlet.rx_items(dataSource: reloadDataSource))
+            .bindTo(reloadTableViewOutlet.rx.items(dataSource: reloadDataSource))
             .addDisposableTo(disposeBag)
 
         // Collection view logic works, but when clicking fast because of internal bugs
@@ -109,25 +109,25 @@ class PartialUpdatesViewController : ViewController {
             skinCollectionViewDataSource(cvAnimatedDataSource)
 
             updates
-                .bindTo(partialUpdatesCollectionViewOutlet.rx_itemsWithDataSource(cvAnimatedDataSource))
+                .bindTo(partialUpdatesCollectionViewOutlet.rx.itemsWithDataSource(cvAnimatedDataSource))
                 .addDisposableTo(disposeBag)
         #else
             let cvReloadDataSource = RxCollectionViewSectionedReloadDataSource()
             skinCollectionViewDataSource(cvReloadDataSource)
             self.sections.asObservable()
-                .bindTo(partialUpdatesCollectionViewOutlet.rx_items(dataSource: cvReloadDataSource))
+                .bindTo(partialUpdatesCollectionViewOutlet.rx.items(dataSource: cvReloadDataSource))
                 .addDisposableTo(disposeBag)
         #endif
 
         // touches
 
-        partialUpdatesCollectionViewOutlet.rx_itemSelected
+        partialUpdatesCollectionViewOutlet.rx.itemSelected
             .subscribe(onNext: { [weak self] i in
                 print("Let me guess, it's .... It's \(self?.generator.sections[i.section].items[i.item]), isn't it? Yeah, I've got it.")
             })
             .addDisposableTo(disposeBag)
 
-        Observable.of(partialUpdatesTableViewOutlet.rx_itemSelected, reloadTableViewOutlet.rx_itemSelected)
+        Observable.of(partialUpdatesTableViewOutlet.rx.itemSelected, reloadTableViewOutlet.rx.itemSelected)
             .merge()
             .subscribe(onNext: { [weak self] i in
                 print("I have a feeling it's .... \(self?.generator.sections[i.section].items[i.item])?")
diff --git a/RxExample/RxExample/Examples/TableViewWithEditingCommands/DetailViewController.swift b/RxExample/RxExample/Examples/TableViewWithEditingCommands/DetailViewController.swift
index a5f1439c..bcf0c105 100644
--- a/RxExample/RxExample/Examples/TableViewWithEditingCommands/DetailViewController.swift
+++ b/RxExample/RxExample/Examples/TableViewWithEditingCommands/DetailViewController.swift
@@ -28,12 +28,12 @@ class DetailViewController: ViewController {
         let url = URL(string: user.imageURL)!
         let request = URLRequest(url: url)
         
-        URLSession.shared.rx_data(request)
+        URLSession.shared.rx.data(request)
             .map { data in
                 UIImage(data: data)
             }
             .observeOn($.mainScheduler)
-            .subscribe(imageView.rx_image)
+            .subscribe(imageView.rx.image)
             .addDisposableTo(disposeBag)
         
         label.text = user.firstName + " " + user.lastName
diff --git a/RxExample/RxExample/Examples/TableViewWithEditingCommands/RandomUserAPI.swift b/RxExample/RxExample/Examples/TableViewWithEditingCommands/RandomUserAPI.swift
index bd37dcc9..0343c30d 100644
--- a/RxExample/RxExample/Examples/TableViewWithEditingCommands/RandomUserAPI.swift
+++ b/RxExample/RxExample/Examples/TableViewWithEditingCommands/RandomUserAPI.swift
@@ -19,7 +19,7 @@ class RandomUserAPI {
     
     func getExampleUserResultSet() -> Observable<[User]> {
         let url = URL(string: "http://api.randomuser.me/?results=20")!
-        return URLSession.shared.rx_JSON(url)
+        return URLSession.shared.rx.JSON(url)
             .map { json in
                 guard let json = json as? [String: AnyObject] else {
                     throw exampleError("Casting to dictionary failed")
diff --git a/RxExample/RxExample/Examples/TableViewWithEditingCommands/TableViewWithEditingCommandsViewController.swift b/RxExample/RxExample/Examples/TableViewWithEditingCommands/TableViewWithEditingCommandsViewController.swift
index 12447ab1..79fb2e3e 100644
--- a/RxExample/RxExample/Examples/TableViewWithEditingCommands/TableViewWithEditingCommandsViewController.swift
+++ b/RxExample/RxExample/Examples/TableViewWithEditingCommands/TableViewWithEditingCommandsViewController.swift
@@ -83,10 +83,10 @@ class TableViewWithEditingCommandsViewController: ViewController, UITableViewDel
                 .concat(loadFavoriteUsers)
                 .observeOn(MainScheduler.instance)
 
-        let deleteUserCommand = tableView.rx_itemDeleted.map(TableViewEditingCommand.deleteUser)
+        let deleteUserCommand = tableView.rx.itemDeleted.map(TableViewEditingCommand.deleteUser)
         let moveUserCommand = tableView
-            .rx_itemMoved
-            // This is needed because rx_itemMoved is being performed before delegate method is
+            .rx.itemMoved
+            // This is needed because rx.itemMoved is being performed before delegate method is
             // delegated to RxDataSource.
             // This observeOn makes sure data is rebound after automatic move is performed in data source.
             // This will be improved in RxSwift 3.0 when order will be inversed.
@@ -107,10 +107,10 @@ class TableViewWithEditingCommandsViewController: ViewController, UITableViewDel
                     SectionModel(model: "Normal Users", items: $0.users)
                 ]
             }
-            .bindTo(tableView.rx_items(dataSource: dataSource))
+            .bindTo(tableView.rx.items(dataSource: dataSource))
             .addDisposableTo(disposeBag)
 
-        tableView.rx_itemSelected
+        tableView.rx.itemSelected
             .withLatestFrom(viewModel) { i, viewModel in
                 let all = [viewModel.favoriteUsers, viewModel.users]
                 return all[i.section][i.row]
@@ -122,7 +122,7 @@ class TableViewWithEditingCommandsViewController: ViewController, UITableViewDel
 
         // customization using delegate
         // RxTableViewDelegateBridge will forward correct messages
-        tableView.rx_setDelegate(self)
+        tableView.rx.setDelegate(self)
             .addDisposableTo(disposeBag)
     }
 
diff --git a/RxExample/RxExample/Examples/WikipediaImageSearch/Views/CollectionViewImageCell.swift b/RxExample/RxExample/Examples/WikipediaImageSearch/Views/CollectionViewImageCell.swift
index b21bac68..ea31cf81 100644
--- a/RxExample/RxExample/Examples/WikipediaImageSearch/Views/CollectionViewImageCell.swift
+++ b/RxExample/RxExample/Examples/WikipediaImageSearch/Views/CollectionViewImageCell.swift
@@ -24,7 +24,7 @@ public class CollectionViewImageCell: UICollectionViewCell {
 
             self.downloadableImage?
                 .asDriver(onErrorJustReturn: DownloadableImage.offlinePlaceholder)
-                .drive(imageOutlet.rxex_downloadableImageAnimated(kCATransitionFade))
+                .drive(imageOutlet.rx.downloadableImageAnimated(kCATransitionFade))
                 .addDisposableTo(disposeBag)
 
             self.disposeBag = disposeBag
diff --git a/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchCell.swift b/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchCell.swift
index 633e29dc..1b91569a 100644
--- a/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchCell.swift
+++ b/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchCell.swift
@@ -35,14 +35,14 @@ public class WikipediaSearchCell: UITableViewCell {
 
             viewModel.title
                 .map(Optional.init)
-                .drive(self.titleOutlet.rx_text)
+                .drive(self.titleOutlet.rx.text)
                 .addDisposableTo(disposeBag)
 
             self.URLOutlet.text = viewModel.searchResult.URL.absoluteString
 
             let reachabilityService = Dependencies.sharedDependencies.reachabilityService
             viewModel.imageURLs
-                .drive(self.imagesOutlet.rx_items(cellIdentifier: "ImageCell", cellType: CollectionViewImageCell.self)) { [weak self] (_, url, cell) in
+                .drive(self.imagesOutlet.rx.items(cellIdentifier: "ImageCell", cellType: CollectionViewImageCell.self)) { [weak self] (_, url, cell) in
                     cell.downloadableImage = self?.imageService.imageFromURL(url, reachabilityService: reachabilityService) ?? Observable.empty()
                 }
                 .addDisposableTo(disposeBag)
diff --git a/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchViewController.swift b/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchViewController.swift
index 9c2c1eed..25a85525 100644
--- a/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchViewController.swift
+++ b/RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchViewController.swift
@@ -64,7 +64,7 @@ class WikipediaSearchViewController: ViewController {
         resultsTableView.delegate = nil
         resultsTableView.dataSource = nil
 
-        searchBar.rx_text
+        searchBar.rx.text
             .asDriver()
             .throttle(0.3)
             .distinctUntilChanged()
@@ -78,7 +78,7 @@ class WikipediaSearchViewController: ViewController {
             .map { results in
                 results.map(SearchResultViewModel.init)
             }
-            .drive(resultsTableView.rx_items(cellIdentifier: "WikipediaSearchCell", cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
+            .drive(resultsTableView.rx.items(cellIdentifier: "WikipediaSearchCell", cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
                 cell.viewModel = viewModel
             }
             .addDisposableTo(disposeBag)
@@ -88,7 +88,7 @@ class WikipediaSearchViewController: ViewController {
         let searchBar = self.searchBar
         let searchController = self.searchController
         
-        resultsTableView.rx_contentOffset
+        resultsTableView.rx.contentOffset
             .asDriver()
             .filter { _ -> Bool in
                 return !searchController.isBeingPresented
@@ -104,7 +104,7 @@ class WikipediaSearchViewController: ViewController {
     func configureNavigateOnRowClick() {
         let wireframe = DefaultWireframe.sharedInstance
 
-        resultsTableView.rx_modelSelected(SearchResultViewModel.self)
+        resultsTableView.rx.modelSelected(SearchResultViewModel.self)
             .asDriver()
             .drive(onNext: { searchResult in
                 wireframe.open(url:searchResult.searchResult.URL)
@@ -118,7 +118,7 @@ class WikipediaSearchViewController: ViewController {
             DefaultImageService.sharedImageService.loadingImage
         ) { $0 || $1 }
             .distinctUntilChanged()
-            .drive(UIApplication.shared.rx_networkActivityIndicatorVisible)
+            .drive(UIApplication.shared.rx.networkActivityIndicatorVisible)
             .addDisposableTo(disposeBag)
     }
 }
diff --git a/RxExample/RxExample/Examples/WikipediaImageSearch/WikipediaAPI/WikipediaAPI.swift b/RxExample/RxExample/Examples/WikipediaImageSearch/WikipediaAPI/WikipediaAPI.swift
index 8f96c97a..a20e902c 100644
--- a/RxExample/RxExample/Examples/WikipediaImageSearch/WikipediaAPI/WikipediaAPI.swift
+++ b/RxExample/RxExample/Examples/WikipediaImageSearch/WikipediaAPI/WikipediaAPI.swift
@@ -33,9 +33,9 @@ class DefaultWikipediaAPI: WikipediaAPI {
 
     private init() {}
 
-    private func rx_JSON(_ url: URL) -> Observable {
+    private func JSON(_ url: URL) -> Observable {
         return $.URLSession
-            .rx_JSON(url)
+            .rx.JSON(url)
             .trackActivity(loadingWikipediaData)
     }
 
@@ -45,7 +45,7 @@ class DefaultWikipediaAPI: WikipediaAPI {
         let urlContent = "http://en.wikipedia.org/w/api.php?action=opensearch&search=\(escapedQuery)"
         let url = URL(string: urlContent)!
             
-        return rx_JSON(url)
+        return JSON(url)
             .observeOn($.backgroundWorkScheduler)
             .map { json in
                 guard let json = json as? [AnyObject] else {
@@ -64,7 +64,7 @@ class DefaultWikipediaAPI: WikipediaAPI {
             return Observable.error(apiError("Can't create url"))
         }
         
-        return rx_JSON(url)
+        return JSON(url)
             .map { jsonResult in
                 guard let json = jsonResult as? NSDictionary else {
                     throw exampleError("Parsing error")
diff --git a/RxExample/RxExample/Services/GeolocationService.swift b/RxExample/RxExample/Services/GeolocationService.swift
index 1780a2b8..da71f9a0 100644
--- a/RxExample/RxExample/Services/GeolocationService.swift
+++ b/RxExample/RxExample/Services/GeolocationService.swift
@@ -32,7 +32,7 @@ class GeolocationService {
                     return Observable.just(status)
                 }
                 return locationManager
-                    .rx_didChangeAuthorizationStatus
+                    .rx.didChangeAuthorizationStatus
                     .startWith(status)
             }
             .asDriver(onErrorJustReturn: CLAuthorizationStatus.notDetermined)
@@ -45,7 +45,7 @@ class GeolocationService {
                 }
             }
         
-        location = locationManager.rx_didUpdateLocations
+        location = locationManager.rx.didUpdateLocations
             .asDriver(onErrorJustReturn: [])
             .flatMap {
                 return $0.last.map(Driver.just) ?? Driver.empty()
diff --git a/RxExample/RxExample/Services/ImageService.swift b/RxExample/RxExample/Services/ImageService.swift
index 08388a92..2ab6d49e 100644
--- a/RxExample/RxExample/Services/ImageService.swift
+++ b/RxExample/RxExample/Services/ImageService.swift
@@ -74,7 +74,7 @@ class DefaultImageService: ImageService {
                     }
                     else {
                         // fetch from network
-                        decodedImage = self.$.URLSession.rx_data(URLRequest(url: url))
+                        decodedImage = self.$.URLSession.rx.data(URLRequest(url: url))
                             .do(onNext: { data in
                                 self._imageDataCache.setObject(data as AnyObject, forKey: url as AnyObject)
                             })
diff --git a/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift b/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift
index 3c5fd481..7709ed75 100644
--- a/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift
+++ b/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift
@@ -14,20 +14,20 @@ import RxCocoa
 #endif
 import UIKit
 
-extension UIImageView{
+extension Reactive where Base: UIImageView{
 
-    var rxex_downloadableImage: AnyObserver{
-        return self.rxex_downloadableImageAnimated(nil)
+    var downloadableImage: AnyObserver{
+        return downloadableImageAnimated(nil)
     }
 
-    func rxex_downloadableImageAnimated(_ transitionType:String?) -> AnyObserver {
-        return UIBindingObserver(UIElement: self) { imageView, image in
+    func downloadableImageAnimated(_ transitionType:String?) -> AnyObserver {
+        return UIBindingObserver(UIElement: base as UIImageView) { imageView, image in
             for subview in imageView.subviews {
                 subview.removeFromSuperview()
             }
             switch image {
             case .content(let image):
-                imageView.rx_image.onNext(image)
+                imageView.rx.image.onNext(image)
             case .offlinePlaceholder:
                 let label = UILabel(frame: imageView.bounds)
                 label.textAlignment = .center
diff --git a/Tests/RxCocoaTests/CLLocationManager+RxTests.swift b/Tests/RxCocoaTests/CLLocationManager+RxTests.swift
index be819c6b..ec272315 100644
--- a/Tests/RxCocoaTests/CLLocationManager+RxTests.swift
+++ b/Tests/RxCocoaTests/CLLocationManager+RxTests.swift
@@ -28,7 +28,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didUpdateLocations.subscribe(onNext: { l in
+            _ = manager.rx.didUpdateLocations.subscribe(onNext: { l in
                     location = l[0]
                 }, onCompleted: {
                     completed = true
@@ -49,7 +49,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didFailWithError.subscribe(onNext: { e in
+            _ = manager.rx.didFailWithError.subscribe(onNext: { e in
                 error = e
                 }, onCompleted: {
                     completed = true
@@ -71,7 +71,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
+            _ = manager.rx.didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
                 error = e
                 }, onCompleted: {
                     completed = true
@@ -91,7 +91,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
+            _ = manager.rx.didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
                 error = e
                 }, onCompleted: {
                     completed = true
@@ -115,7 +115,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didPauseLocationUpdates.subscribe(onNext: { u in
+            _ = manager.rx.didPauseLocationUpdates.subscribe(onNext: { u in
                     updates = u
                 }, onCompleted: {
                     completed = true
@@ -135,7 +135,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didResumeLocationUpdates.subscribe(onNext: { _ in
+            _ = manager.rx.didResumeLocationUpdates.subscribe(onNext: { _ in
                     updates = ()
                 }, onCompleted: {
                     completed = true
@@ -157,7 +157,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didUpdateHeading.subscribe(onNext: { n in
+            _ = manager.rx.didUpdateHeading.subscribe(onNext: { n in
                     heading = n
                 }, onCompleted: {
                     completed = true
@@ -179,7 +179,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didEnterRegion.subscribe(onNext: { n in
+            _ = manager.rx.didEnterRegion.subscribe(onNext: { n in
                     value = n
                 }, onCompleted: {
                     completed = true
@@ -201,7 +201,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didExitRegion.subscribe(onNext: { n in
+            _ = manager.rx.didExitRegion.subscribe(onNext: { n in
                     value = n
                 }, onCompleted: {
                     completed = true
@@ -227,7 +227,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didDetermineStateForRegion.subscribe(onNext: { n in
+            _ = manager.rx.didDetermineStateForRegion.subscribe(onNext: { n in
                     value = (n.state, n.region)
                 }, onCompleted: {
                     completed = true
@@ -251,7 +251,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_monitoringDidFailForRegionWithError.subscribe(onNext: { l in
+            _ = manager.rx.monitoringDidFailForRegionWithError.subscribe(onNext: { l in
                     region = l.region
                     error = l.error
                 }, onCompleted: {
@@ -276,7 +276,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_monitoringDidFailForRegionWithError.subscribe(onNext: { l in
+            _ = manager.rx.monitoringDidFailForRegionWithError.subscribe(onNext: { l in
                 region = l.region
                 error = l.error
                 }, onCompleted: {
@@ -300,7 +300,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didStartMonitoringForRegion.subscribe(onNext: { n in
+            _ = manager.rx.didStartMonitoringForRegion.subscribe(onNext: { n in
                     value = n
                 }, onCompleted: {
                     completed = true
@@ -332,7 +332,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didRangeBeaconsInRegion.subscribe(onNext: { n in
+            _ = manager.rx.didRangeBeaconsInRegion.subscribe(onNext: { n in
                     value = n
                 }, onCompleted: {
                     completed = true
@@ -359,7 +359,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_rangingBeaconsDidFailForRegionWithError.subscribe(onNext: { n in
+            _ = manager.rx.rangingBeaconsDidFailForRegionWithError.subscribe(onNext: { n in
                     value = n
                 }, onCompleted: {
                     completed = true
@@ -384,7 +384,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didVisit.subscribe(onNext: { n in
+            _ = manager.rx.didVisit.subscribe(onNext: { n in
                     value = n
                 }, onCompleted: {
                     completed = true
@@ -413,7 +413,7 @@ extension CLLocationManagerTests {
         autoreleasepool {
             let manager = CLLocationManager()
 
-            _ = manager.rx_didChangeAuthorizationStatus.subscribe(onNext: { status in
+            _ = manager.rx.didChangeAuthorizationStatus.subscribe(onNext: { status in
                     authorizationStatus = status
                 }, onCompleted: {
                     completed = true
diff --git a/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift b/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift
index a597edd4..0be975f8 100644
--- a/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift
+++ b/Tests/RxCocoaTests/Control+RxTests+Cocoa.swift
@@ -15,7 +15,7 @@ import XCTest
 extension ControlTests {
     func testTextField_TextCompletesOnDealloc() {
         let createView: () -> NSTextField = { NSTextField(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, "a") { (view: NSTextField) in view.rx_text }
+        ensurePropertyDeallocated(createView, "a") { (view: NSTextField) in view.rx.text }
     }
 }
 
@@ -23,13 +23,13 @@ extension ControlTests {
 extension ControlTests {
     func testControl_DelegateEventCompletesOnDealloc() {
         let createView: () -> NSControl = { NSControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: NSControl) in view.rx_controlEvent }
+        ensureEventDeallocated(createView) { (view: NSControl) in view.rx.controlEvent }
     }
 
     func testControl_enabled_true() {
         let control = NSControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
 
-        _ = Observable.just(true).bindTo(control.rx_enabled)
+        _ = Observable.just(true).bindTo(control.rx.enabled)
 
         XCTAssertEqual(true, control.isEnabled)
     }
@@ -37,7 +37,7 @@ extension ControlTests {
     func testControl_enabled_false() {
         let control = NSControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
 
-        _ = Observable.just(false).bindTo(control.rx_enabled)
+        _ = Observable.just(false).bindTo(control.rx.enabled)
 
         XCTAssertEqual(false, control.isEnabled)
     }
@@ -47,7 +47,7 @@ extension ControlTests {
 extension ControlTests {
     func testCollectionView_DelegateEventCompletesOnDealloc() {
         let createView: () -> NSSlider = { NSSlider(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, 0.3) { (view: NSSlider) in view.rx_value }
+        ensurePropertyDeallocated(createView, 0.3) { (view: NSSlider) in view.rx.value }
     }
 }
 
@@ -55,24 +55,24 @@ extension ControlTests {
 extension ControlTests {
     func testButton_DelegateEventCompletesOnDealloc() {
         let createView: () -> NSButton = { NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: NSButton) in view.rx_tap }
+        ensureEventDeallocated(createView) { (view: NSButton) in view.rx.tap }
     }
 
     func testButton_StateCompletesOnDealloc() {
         let createView: () -> NSButton = { NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, 0) { (view: NSButton) in view.rx_state }
+        ensurePropertyDeallocated(createView, 0) { (view: NSButton) in view.rx.state }
     }
 
     func testButton_state_observer_on() {
         let button = NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
-        _ = Observable.just(NSOnState).bindTo(button.rx_state)
+        _ = Observable.just(NSOnState).bindTo(button.rx.state)
 
         XCTAssertEqual(button.state, NSOnState)
     }
 
     func testButton_state_observer_off() {
         let button = NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
-        _ = Observable.just(NSOffState).bindTo(button.rx_state)
+        _ = Observable.just(NSOffState).bindTo(button.rx.state)
 
         XCTAssertEqual(button.state, NSOffState)
     }
diff --git a/Tests/RxCocoaTests/Control+RxTests+UIKit.swift b/Tests/RxCocoaTests/Control+RxTests+UIKit.swift
index adec6a83..5dbba23c 100644
--- a/Tests/RxCocoaTests/Control+RxTests+UIKit.swift
+++ b/Tests/RxCocoaTests/Control+RxTests+UIKit.swift
@@ -14,7 +14,7 @@ import XCTest
 extension ControlTests {
     func testSubscribeEnabledToTrue() {
         let subject = UIControl()
-        let disposable = Observable.just(true).subscribe(subject.rx_enabled)
+        let disposable = Observable.just(true).subscribe(subject.rx.enabled)
         defer { disposable.dispose() }
 
         XCTAssert(subject.isEnabled == true, "Expected enabled set to true")
@@ -22,7 +22,7 @@ extension ControlTests {
 
     func testSubscribeEnabledToFalse() {
         let subject = UIControl()
-        let disposable = Observable.just(false).subscribe(subject.rx_enabled)
+        let disposable = Observable.just(false).subscribe(subject.rx.enabled)
         defer { disposable.dispose() }
 
         XCTAssert(subject.isEnabled == false, "Expected enabled set to false")
@@ -30,7 +30,7 @@ extension ControlTests {
 
     func testSubscribedSelectedToTrue() {
         let subject = UIControl()
-        let disposable = Observable.just(true).subscribe(subject.rx_selected)
+        let disposable = Observable.just(true).subscribe(subject.rx.selected)
         defer { disposable.dispose() }
 
         XCTAssert(subject.isSelected == true, "Expected selected set to true")
@@ -38,7 +38,7 @@ extension ControlTests {
 
     func testSubscribeSelectedToFalse() {
         let subject = UIControl()
-        let disposable = Observable.just(false).subscribe(subject.rx_selected)
+        let disposable = Observable.just(false).subscribe(subject.rx.selected)
         defer { disposable.dispose() }
 
         XCTAssert(subject.isSelected == false, "Expected selected set to false")
@@ -52,7 +52,7 @@ extension ControlTests {
 // UIBarButtonItem
 extension ControlTests {
     func testBarButtonItem_DelegateEventCompletesOnDealloc() {
-        ensureEventDeallocated({ UIBarButtonItem() }) { (view: UIBarButtonItem) in view.rx_tap }
+        ensureEventDeallocated({ UIBarButtonItem() }) { (view: UIBarButtonItem) in view.rx.tap }
     }
 }
 
@@ -60,13 +60,13 @@ extension ControlTests {
 extension ControlTests {
     func testLabel_HasWeakReference() {
         let variable = Variable(nil)
-        ensureControlObserverHasWeakReference(UILabel(), { (label: UILabel) -> AnyObserver in label.rx_attributedText }, { variable.asObservable() })
+        ensureControlObserverHasWeakReference(UILabel(), { (label: UILabel) -> AnyObserver in label.rx.attributedText }, { variable.asObservable() })
     }
 
     func testLabel_NextElementsSetsValue() {
         let subject = UILabel()
         let attributedTextSequence = Variable(nil)
-        let disposable = attributedTextSequence.asObservable().bindTo(subject.rx_attributedText)
+        let disposable = attributedTextSequence.asObservable().bindTo(subject.rx.attributedText)
         defer { disposable.dispose() }
 
         attributedTextSequence.value = NSAttributedString(string: "Hello!")
@@ -77,13 +77,13 @@ extension ControlTests {
 // UIProgressView
 extension ControlTests {
     func testProgressView_HasWeakReference() {
-        ensureControlObserverHasWeakReference(UIProgressView(), { (progressView: UIProgressView) -> AnyObserver in progressView.rx_progress }, { Variable(0.0).asObservable() })
+        ensureControlObserverHasWeakReference(UIProgressView(), { (progressView: UIProgressView) -> AnyObserver in progressView.rx.progress }, { Variable(0.0).asObservable() })
     }
 
     func testProgressView_NextElementsSetsValue() {
         let subject = UIProgressView()
         let progressSequence = Variable(0.0)
-        let disposable = progressSequence.asObservable().bindTo(subject.rx_progress)
+        let disposable = progressSequence.asObservable().bindTo(subject.rx.progress)
         defer { disposable.dispose() }
 
         progressSequence.value = 1.0
@@ -95,7 +95,7 @@ extension ControlTests {
 extension ControlTests {
     func testControl_DelegateEventCompletesOnDealloc() {
         let createView: () -> UIControl = { UIControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: UIControl) in view.rx_controlEvent(.allEditingEvents) }
+        ensureEventDeallocated(createView) { (view: UIControl) in view.rx.controlEvent(.allEditingEvents) }
     }
 }
 
@@ -103,7 +103,7 @@ extension ControlTests {
 extension ControlTests {
     func testGestureRecognizer_DelegateEventCompletesOnDealloc() {
         let createView: () -> UIGestureRecognizer = { UIGestureRecognizer(target: nil, action: NSSelectorFromString("s")) }
-        ensureEventDeallocated(createView) { (view: UIGestureRecognizer) in view.rx_event }
+        ensureEventDeallocated(createView) { (view: UIGestureRecognizer) in view.rx.event }
     }
 }
 
@@ -111,7 +111,7 @@ extension ControlTests {
 extension ControlTests {
     func testScrollView_DelegateEventCompletesOnDealloc() {
         let createView: () -> UIScrollView = { UIScrollView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, CGPoint(x: 1, y: 1)) { (view: UIScrollView) in view.rx_contentOffset }
+        ensurePropertyDeallocated(createView, CGPoint(x: 1, y: 1)) { (view: UIScrollView) in view.rx.contentOffset }
     }
 }
 
@@ -119,21 +119,21 @@ extension ControlTests {
 extension ControlTests {
     func testSegmentedControl_DelegateEventCompletesOnDealloc() {
         let createView: () -> UISegmentedControl = { UISegmentedControl(items: ["a", "b", "c"]) }
-        ensurePropertyDeallocated(createView, 1) { (view: UISegmentedControl) in view.rx_value }
+        ensurePropertyDeallocated(createView, 1) { (view: UISegmentedControl) in view.rx.value }
     }
 }
 
 // UIActivityIndicatorView
 extension ControlTests {
     func testActivityIndicator_HasWeakReference() {
-        ensureControlObserverHasWeakReference(UIActivityIndicatorView(), { (view: UIActivityIndicatorView) -> AnyObserver in view.rx_animating }, { Variable(true).asObservable() })
+        ensureControlObserverHasWeakReference(UIActivityIndicatorView(), { (view: UIActivityIndicatorView) -> AnyObserver in view.rx.animating }, { Variable(true).asObservable() })
     }
 
     func testActivityIndicator_NextElementsSetsValue() {
         let subject = UIActivityIndicatorView()
         let boolSequence = Variable(false)
 
-        let disposable = boolSequence.asObservable().bindTo(subject.rx_animating)
+        let disposable = boolSequence.asObservable().bindTo(subject.rx.animating)
         defer { disposable.dispose() }
 
         boolSequence.value = true
@@ -148,14 +148,14 @@ extension ControlTests {
 extension ControlTests {
     func testAlertAction_Enable() {
         let subject = UIAlertAction()
-        Observable.just(false).subscribe(subject.rx_enabled).dispose()
+        Observable.just(false).subscribe(subject.rx.enabled).dispose()
         
         XCTAssertTrue(subject.isEnabled == false)
     }
 
     func testAlertAction_Disable() {
         let subject = UIAlertAction()
-        Observable.just(true).subscribe(subject.rx_enabled).dispose()
+        Observable.just(true).subscribe(subject.rx.enabled).dispose()
         
         XCTAssertTrue(subject.isEnabled == true)
     }
@@ -167,7 +167,7 @@ extension ControlTests {
 extension ControlTests {
     func testDatePicker_DelegateEventCompletesOnDealloc() {
         let createView: () -> UIDatePicker = { UIDatePicker(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, Date()) { (view: UIDatePicker) in view.rx_date }
+        ensurePropertyDeallocated(createView, Date()) { (view: UIDatePicker) in view.rx.date }
     }
 }
 
@@ -176,7 +176,7 @@ extension ControlTests {
 extension ControlTests {
     func testSlider_DelegateEventCompletesOnDealloc() {
         let createView: () -> UISlider = { UISlider(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, 0.5) { (view: UISlider) in view.rx_value }
+        ensurePropertyDeallocated(createView, 0.5) { (view: UISlider) in view.rx.value }
     }
 }
 
@@ -184,7 +184,7 @@ extension ControlTests {
 extension ControlTests {
     func testStepper_DelegateEventCompletesOnDealloc() {
         let createView: () -> UIStepper = { UIStepper(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, 1) { (view: UIStepper) in view.rx_value }
+        ensurePropertyDeallocated(createView, 1) { (view: UIStepper) in view.rx.value }
     }
 }
 
@@ -195,7 +195,7 @@ extension ControlTests {
     // TODO: UISwitch doesn't dealloc on Swift 2.3 compiler
     func testSwitch_DelegateEventCompletesOnDealloc() {
         let createView: () -> UISwitch = { UISwitch(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, true) { (view: UISwitch) in view.rx_value }
+        ensurePropertyDeallocated(createView, true) { (view: UISwitch) in view.rx.value }
     }
     #endif
 }
@@ -204,7 +204,7 @@ extension ControlTests {
 extension ControlTests {
     func testButton_tapDeallocates() {
         let createView: () -> UIButton = { UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: UIButton) in view.rx_tap }
+        ensureEventDeallocated(createView) { (view: UIButton) in view.rx.tap }
     }
 }
 
@@ -214,7 +214,7 @@ extension ControlTests {
 extension ControlTests {
     func testButton_tapDeallocates() {
         let createView: () -> UIButton = { UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: UIButton) in view.rx_primaryAction }
+        ensureEventDeallocated(createView) { (view: UIButton) in view.rx.primaryAction }
     }
 }
 
diff --git a/Tests/RxCocoaTests/DelegateProxyTest+Cocoa.swift b/Tests/RxCocoaTests/DelegateProxyTest+Cocoa.swift
index acbc468b..b20d640a 100644
--- a/Tests/RxCocoaTests/DelegateProxyTest+Cocoa.swift
+++ b/Tests/RxCocoaTests/DelegateProxyTest+Cocoa.swift
@@ -43,7 +43,7 @@ class ExtendNSTextFieldDelegateProxy
 class NSTextFieldSubclass
     : NSTextField
     , TestDelegateControl {
-    override func rx_createDelegateProxy() -> RxTextFieldDelegateProxy {
+    override func createRxDelegateProxy() -> RxTextFieldDelegateProxy {
         return ExtendNSTextFieldDelegateProxy(parentObject: self)
     }
 
@@ -52,7 +52,7 @@ class NSTextFieldSubclass
     }
 
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(NSTextFieldDelegateSubclass.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
diff --git a/Tests/RxCocoaTests/DelegateProxyTest+UIKit.swift b/Tests/RxCocoaTests/DelegateProxyTest+UIKit.swift
index 9dca2e00..34f4dba7 100644
--- a/Tests/RxCocoaTests/DelegateProxyTest+UIKit.swift
+++ b/Tests/RxCocoaTests/DelegateProxyTest+UIKit.swift
@@ -149,7 +149,7 @@ class ExtendTableViewDelegateProxy
 class UITableViewSubclass1
     : UITableView
     , TestDelegateControl {
-    override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return ExtendTableViewDelegateProxy(parentObject: self)
     }
 
@@ -158,7 +158,7 @@ class UITableViewSubclass1
     }
 
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -182,7 +182,7 @@ class ExtendTableViewDataSourceProxy
 class UITableViewSubclass2
     : UITableView
     , TestDelegateControl {
-    override func rx_createDataSourceProxy() -> RxTableViewDataSourceProxy {
+    override func createRxDataSourceProxy() -> RxTableViewDataSourceProxy {
         return ExtendTableViewDataSourceProxy(parentObject: self)
     }
 
@@ -191,7 +191,7 @@ class UITableViewSubclass2
     }
 
     var test: Observable {
-        return rx_dataSource
+        return rx.dataSource
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -215,7 +215,7 @@ class ExtendCollectionViewDelegateProxy
 class UICollectionViewSubclass1
     : UICollectionView
     , TestDelegateControl {
-    override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return ExtendCollectionViewDelegateProxy(parentObject: self)
     }
 
@@ -224,7 +224,7 @@ class UICollectionViewSubclass1
     }
 
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -248,7 +248,7 @@ class ExtendCollectionViewDataSourceProxy
 class UICollectionViewSubclass2
     : UICollectionView
     , TestDelegateControl {
-    override func rx_createDataSourceProxy() -> RxCollectionViewDataSourceProxy {
+    override func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy {
         return ExtendCollectionViewDataSourceProxy(parentObject: self)
     }
 
@@ -257,7 +257,7 @@ class UICollectionViewSubclass2
     }
 
     var test: Observable {
-        return rx_dataSource
+        return rx.dataSource
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -281,7 +281,7 @@ class ExtendScrollViewDelegateProxy
 class UIScrollViewSubclass
     : UIScrollView
     , TestDelegateControl {
-    override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return ExtendScrollViewDelegateProxy(parentObject: self)
     }
 
@@ -290,7 +290,7 @@ class UIScrollViewSubclass
     }
 
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -316,7 +316,7 @@ class UISearchBarSubclass
     : UISearchBar
     , TestDelegateControl {
     
-    override func rx_createDelegateProxy() -> RxSearchBarDelegateProxy {
+    override func createRxDelegateProxy() -> RxSearchBarDelegateProxy {
         return ExtendSearchBarDelegateProxy(parentObject: self)
     }
     
@@ -325,7 +325,7 @@ class UISearchBarSubclass
     }
     
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -350,7 +350,7 @@ class ExtendTextViewDelegateProxy
 class UITextViewSubclass
     : UITextView
     , TestDelegateControl {
-    override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
+    override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
         return ExtendTextViewDelegateProxy(parentObject: self)
     }
 
@@ -359,7 +359,7 @@ class UITextViewSubclass
     }
 
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -378,7 +378,7 @@ class UISearchControllerSubclass
     }
     
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
@@ -397,7 +397,7 @@ class UIPickerViewSubclass
     }
     
     var test: Observable {
-        return rx_delegate
+        return rx.delegate
             .observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
             .map { a in (a[0] as! NSNumber).intValue }
     }
diff --git a/Tests/RxCocoaTests/DelegateProxyTest.swift b/Tests/RxCocoaTests/DelegateProxyTest.swift
index 5087e497..fed6fead 100644
--- a/Tests/RxCocoaTests/DelegateProxyTest.swift
+++ b/Tests/RxCocoaTests/DelegateProxyTest.swift
@@ -48,10 +48,10 @@ class DelegateProxyTest : RxTest {
         
         view.delegate = mock
         
-        let _ = view.rx_proxy
+        let _ = view.rx.proxy
         
         XCTAssertEqual(mock.messages, [])
-        XCTAssertTrue(view.rx_proxy.forwardToDelegate() === mock)
+        XCTAssertTrue(view.rx.proxy.forwardToDelegate() === mock)
     }
     
     func test_forwardsUnobservedMethods() {
@@ -60,7 +60,7 @@ class DelegateProxyTest : RxTest {
         
         view.delegate = mock
         
-        let _ = view.rx_proxy
+        let _ = view.rx.proxy
         
         view.delegate?.threeDView?(view, didLearnSomething: "Psssst ...")
         
@@ -75,7 +75,7 @@ class DelegateProxyTest : RxTest {
         
         var observedFeedRequest = false
         
-        let d = view.rx_proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
+        let d = view.rx.proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
             .subscribe(onNext: { n in
                 observedFeedRequest = true
             })
@@ -98,7 +98,7 @@ class DelegateProxyTest : RxTest {
         
         var nMessages = 0
         
-        let d = view.rx_proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
+        let d = view.rx.proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
             .subscribe(onNext: { n in
                 nMessages += 1
             })
@@ -136,7 +136,7 @@ class DelegateProxyTest : RxTest {
         
         var receivedArgument: IndexPath? = nil
         
-        let d = view.rx_proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didGetXXX:)))
+        let d = view.rx.proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didGetXXX:)))
             .subscribe(onNext: { n in
                 let ip = n[1] as! IndexPath
                 receivedArgument = ip
@@ -165,7 +165,7 @@ class DelegateProxyTest : RxTest {
             let sentArgument = IndexPath(index: 0)
             
             _ = view
-                .rx_proxy
+                .rx.proxy
                 .observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didGetXXX:)))
                 .subscribe(onCompleted: {
                     completed = true
@@ -183,7 +183,7 @@ class DelegateProxyTest : RxTest {
 extension DelegateProxyTest {
     func test_DelegateProxyHierarchyWorks() {
         let tableView = UITableView()
-        _ = tableView.rx_delegate.observe(#selector(UIScrollViewDelegate.scrollViewWillBeginDragging(_:)))
+        _ = tableView.rx.delegate.observe(#selector(UIScrollViewDelegate.scrollViewWillBeginDragging(_:)))
     }
 }
 #endif
@@ -209,7 +209,7 @@ extension DelegateProxyTest {
                 completed = true
             })
 
-            _ = (control as! NSObject).rx_deallocated.subscribe(onNext: { _ in
+            _ = (control as! NSObject).rx.deallocated.subscribe(onNext: { _ in
                 deallocated = true
             })
         }
@@ -302,9 +302,9 @@ class ThreeDSectionedViewDelegateProxy : DelegateProxy
     }
 }
 
-extension ThreeDSectionedView {
-    var rx_proxy: DelegateProxy {
-        return ThreeDSectionedViewDelegateProxy.proxyForObject(self)
+extension Reactive where Base: ThreeDSectionedView {
+    var proxy: DelegateProxy {
+        return ThreeDSectionedViewDelegateProxy.proxyForObject(base)
     }
 }
 
diff --git a/Tests/RxCocoaTests/KVOObservableTests.swift b/Tests/RxCocoaTests/KVOObservableTests.swift
index d7672618..d33c6654 100644
--- a/Tests/RxCocoaTests/KVOObservableTests.swift
+++ b/Tests/RxCocoaTests/KVOObservableTests.swift
@@ -32,7 +32,7 @@ class Parent : NSObject {
     init(callback: @escaping (String?) -> Void) {
         super.init()
         
-        self.rx_observe(String.self, "val", options: [.initial, .new], retainSelf: false)
+        self.rx.observe(String.self, "val", options: [.initial, .new], retainSelf: false)
             .subscribe(onNext: callback)
             .addDisposableTo(disposeBag)
     }
@@ -47,7 +47,7 @@ class Child : NSObject {
     
     init(parent: ParentWithChild, callback: @escaping (String?) -> Void) {
         super.init()
-        parent.rx_observe(String.self, "val", options: [.initial, .new], retainSelf: false)
+        parent.rx.observe(String.self, "val", options: [.initial, .new], retainSelf: false)
             .subscribe(onNext: callback)
             .addDisposableTo(disposeBag)
     }
@@ -140,7 +140,7 @@ extension KVOObservableTests {
     func test_New() {
         let testClass = TestClass()
         
-        let os = testClass.rx_observe(String.self, "pr", options: .new)
+        let os = testClass.rx.observe(String.self, "pr", options: .new)
         
         var latest: String?
         
@@ -174,7 +174,7 @@ extension KVOObservableTests {
     func test_New_And_Initial() {
         let testClass = TestClass()
         
-        let os = testClass.rx_observe(String.self, "pr", options: NSKeyValueObservingOptions(rawValue: NSKeyValueObservingOptions.initial.rawValue | NSKeyValueObservingOptions.new.rawValue))
+        let os = testClass.rx.observe(String.self, "pr", options: NSKeyValueObservingOptions(rawValue: NSKeyValueObservingOptions.initial.rawValue | NSKeyValueObservingOptions.new.rawValue))
         
         var latest: String?
         
@@ -208,7 +208,7 @@ extension KVOObservableTests {
     func test_Default() {
         let testClass = TestClass()
         
-        let os = testClass.rx_observe(String.self, "pr")
+        let os = testClass.rx.observe(String.self, "pr")
         
         var latest: String?
         
@@ -247,11 +247,11 @@ extension KVOObservableTests {
             latest = n
         }
         
-        _ = parent.rx_deallocated
+        _ = parent.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
             })
-        
+
         XCTAssertTrue(latest == "")
         XCTAssertTrue(isDisposed == false)
         
@@ -274,11 +274,11 @@ extension KVOObservableTests {
             latest = n
         }
         
-        _ = parent.rx_deallocated
+        _ = parent.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
             })
-        
+
         XCTAssertTrue(latest == "")
         XCTAssertTrue(isDisposed == false)
         
@@ -305,16 +305,16 @@ extension KVOObservableTests {
         
         var root: HasStrongProperty! = HasStrongProperty()
         
-        _ = root.rx_observeWeakly(String.self, "property")
+        _ = root.rx.observeWeakly(String.self, "property")
             .subscribe(onNext: { n in
                 latest = n
             })
         
-        _ = root.rx_deallocated
+        _ = root.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
             })
-        
+
         XCTAssertTrue(latest == nil)
         XCTAssertTrue(!isDisposed)
         
@@ -335,16 +335,16 @@ extension KVOObservableTests {
         
         var root: HasWeakProperty! = HasWeakProperty()
         
-        _ = root.rx_observeWeakly(String.self, "property")
+        _ = root.rx.observeWeakly(String.self, "property")
             .subscribe(onNext: { n in
                 latest = n
         })
         
-        _ = root.rx_deallocated
+        _ = root.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
         })
-        
+
         XCTAssertTrue(latest == nil)
         XCTAssertTrue(!isDisposed)
     
@@ -369,16 +369,16 @@ extension KVOObservableTests {
         
         var root: HasWeakProperty! = HasWeakProperty()
         
-        _ = root.rx_observeWeakly(String.self, "property.property")
+        _ = root.rx.observeWeakly(String.self, "property.property")
             .subscribe(onNext: { n in
                 latest = n
             })
         
-        _ = root.rx_deallocated
+        _ = root.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
             })
-        
+
         XCTAssertTrue(latest == nil)
         XCTAssertTrue(isDisposed == false)
         
@@ -418,16 +418,16 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         XCTAssertTrue(isDisposed == false)
         
-        _ = root.rx_observeWeakly(String.self, "property.property")
+        _ = root.rx.observeWeakly(String.self, "property.property")
             .subscribe(onNext: { n in
                 latest = n
         })
         
-        _ = root.rx_deallocated
+        _ = root.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
         })
-        
+
         XCTAssertTrue(latest == "1")
         XCTAssertTrue(isDisposed == false)
         
@@ -446,16 +446,16 @@ extension KVOObservableTests {
         
         var root: HasStrongProperty! = HasStrongProperty()
         
-        _ = root.rx_observeWeakly(String.self, "property.property")
+        _ = root.rx.observeWeakly(String.self, "property.property")
             .subscribe(onNext: { n in
                 latest = n
         })
         
-        _ = root.rx_deallocated
+        _ = root.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
         })
-        
+
         XCTAssertTrue(latest == nil)
         XCTAssertTrue(isDisposed == false)
         
@@ -495,16 +495,16 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         XCTAssertTrue(isDisposed == false)
         
-        _ = root.rx_observeWeakly(String.self, "property.property")
+        _ = root.rx.observeWeakly(String.self, "property.property")
             .subscribe(onNext: { n in
                 latest = n
             })
         
-        _ = root.rx_deallocated
+        _ = root.rx.deallocated
             .subscribe(onCompleted: {
                 isDisposed = true
         })
-        
+
         XCTAssertTrue(latest == "1")
         XCTAssertTrue(isDisposed == false)
         
@@ -534,7 +534,7 @@ extension KVOObservableTests {
             
             XCTAssertTrue(latest == nil)
             
-            let observable = root.rx_observeWeakly(NSObject.self, "property.property")
+            let observable = root.rx.observeWeakly(NSObject.self, "property.property")
             _ = observable
                 .subscribe(onNext: { n in
                     latest = n
@@ -542,7 +542,7 @@ extension KVOObservableTests {
             
             XCTAssertTrue(latest! === one)
          
-            dealloc = one.rx_deallocating
+            dealloc = one.rx.deallocating
             
             one = nil
         }
@@ -577,7 +577,7 @@ extension KVOObservableTests {
             
             XCTAssertTrue(latest == nil)
             
-            let observable = root.rx_observeWeakly(NSObject.self, "property.property.property")
+            let observable = root.rx.observeWeakly(NSObject.self, "property.property.property")
             _ = observable
                 .subscribe(onNext: { n in
                     latest = n
@@ -591,7 +591,7 @@ extension KVOObservableTests {
             
             XCTAssertTrue(latest === one)
             
-            dealloc = middle.rx_deallocating
+            dealloc = middle.rx.deallocating
         }
         return (root!, latest, dealloc)
     }
@@ -621,7 +621,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         
         _ = root
-            .rx_observeWeakly(String.self, "property")
+            .rx.observeWeakly(String.self, "property")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -631,7 +631,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -652,7 +652,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         
         _ = root
-            .rx_observeWeakly(String.self, "property", options: .new)
+            .rx.observeWeakly(String.self, "property", options: .new)
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -666,7 +666,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -686,7 +686,7 @@ extension KVOObservableTests {
         
         XCTAssertTrue(latest == nil)
         
-        let disposable = root.rx_observe(NSRect.self, "frame")
+        let disposable = root.rx.observe(NSRect.self, "frame")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -699,7 +699,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -722,7 +722,7 @@ extension KVOObservableTests {
         
         XCTAssertTrue(latest == nil)
         
-        let d = root.rx_observe(CGSize.self, "frame")
+        let d = root.rx.observe(CGSize.self, "frame")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -740,7 +740,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -758,7 +758,7 @@ extension KVOObservableTests {
         
         XCTAssertTrue(latest == nil)
         
-        let d = root.rx_observe(CGRect.self, "frame")
+        let d = root.rx.observe(CGRect.self, "frame")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -776,7 +776,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -794,7 +794,7 @@ extension KVOObservableTests {
         
         XCTAssertTrue(latest == nil)
         
-        let d = root.rx_observe(CGSize.self, "size")
+        let d = root.rx.observe(CGSize.self, "size")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -812,7 +812,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -830,7 +830,7 @@ extension KVOObservableTests {
         
         XCTAssertTrue(latest == nil)
         
-        let d = root.rx_observe(CGPoint.self, "point")
+        let d = root.rx.observe(CGPoint.self, "point")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -847,7 +847,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -867,7 +867,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         
         _ = root
-            .rx_observeWeakly(CGRect.self, "frame")
+            .rx.observeWeakly(CGRect.self, "frame")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -880,7 +880,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -899,7 +899,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         
         _ = root
-            .rx_observeWeakly(CGSize.self, "size")
+            .rx.observeWeakly(CGSize.self, "size")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -912,7 +912,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -931,7 +931,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         
         _ = root
-            .rx_observeWeakly(CGPoint.self, "point")
+            .rx.observeWeakly(CGPoint.self, "point")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -945,7 +945,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -964,7 +964,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
         
         _ = root
-            .rx_observeWeakly(NSNumber.self, "integer")
+            .rx.observeWeakly(NSNumber.self, "integer")
             .subscribe(onNext: { n in
                 latest = n?.intValue
             })
@@ -977,7 +977,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -993,7 +993,7 @@ extension KVOObservableTests {
         
         var lastError: Swift.Error? = nil
         
-        _ = root.rx_observeWeakly(NSNumber.self, "notExist")
+        _ = root.rx.observeWeakly(NSNumber.self, "notExist")
             .subscribe(onError: { error in
                 lastError = error
             })
@@ -1004,7 +1004,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1019,7 +1019,7 @@ extension KVOObservableTests {
         
         var lastError: Swift.Error? = nil
         
-        _ = root.rx_observeWeakly(NSNumber.self, "property.notExist")
+        _ = root.rx.observeWeakly(NSNumber.self, "property.notExist")
             .subscribe(onError: { error in
                 lastError = error
             })
@@ -1033,7 +1033,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
         
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1055,7 +1055,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(Int.self, "integer")
+        let disposable = root.rx.observe(Int.self, "integer")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -1068,7 +1068,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1088,7 +1088,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(UInt.self, "uinteger")
+        let disposable = root.rx.observe(UInt.self, "uinteger")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1101,7 +1101,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1125,7 +1125,7 @@ extension KVOObservableTests {
             XCTAssertTrue(latest == nil)
 
             _ = root
-                .rx_observeWeakly(Int.self, "integer")
+                .rx.observeWeakly(Int.self, "integer")
                 .subscribe(onNext: { n in
                     latest = n
                 })
@@ -1139,7 +1139,7 @@ extension KVOObservableTests {
             var rootDeallocated = false
 
             _ = root
-                .rx_deallocated
+                .rx.deallocated
                 .subscribe(onCompleted: {
                     rootDeallocated = true
                 })
@@ -1158,7 +1158,7 @@ extension KVOObservableTests {
             XCTAssertTrue(latest == nil)
 
             _ = root
-                .rx_observeWeakly(UInt.self, "uinteger")
+                .rx.observeWeakly(UInt.self, "uinteger")
                 .subscribe(onNext: { n in
                     latest = n
                 })
@@ -1172,7 +1172,7 @@ extension KVOObservableTests {
             var rootDeallocated = false
 
             _ = root
-                .rx_deallocated
+                .rx.deallocated
                 .subscribe(onCompleted: {
                     rootDeallocated = true
                 })
@@ -1194,7 +1194,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(IntEnum.self, "intEnum")
+        let disposable = root.rx.observe(IntEnum.self, "intEnum")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -1207,7 +1207,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1227,7 +1227,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(Int32Enum.self, "int32Enum")
+        let disposable = root.rx.observe(Int32Enum.self, "int32Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1240,7 +1240,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1260,7 +1260,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(Int64Enum.self, "int64Enum")
+        let disposable = root.rx.observe(Int64Enum.self, "int64Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1273,7 +1273,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1294,7 +1294,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(UIntEnum.self, "uintEnum")
+        let disposable = root.rx.observe(UIntEnum.self, "uintEnum")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -1307,7 +1307,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1327,7 +1327,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(UInt32Enum.self, "uint32Enum")
+        let disposable = root.rx.observe(UInt32Enum.self, "uint32Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1340,7 +1340,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1360,7 +1360,7 @@ extension KVOObservableTests {
 
         XCTAssertTrue(latest == nil)
 
-        let disposable = root.rx_observe(UInt64Enum.self, "uint64Enum")
+        let disposable = root.rx.observe(UInt64Enum.self, "uint64Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1373,7 +1373,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1397,7 +1397,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
 
         _ = root
-            .rx_observeWeakly(IntEnum.self, "intEnum")
+            .rx.observeWeakly(IntEnum.self, "intEnum")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -1410,7 +1410,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1429,7 +1429,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
 
         _ = root
-            .rx_observeWeakly(Int32Enum.self, "int32Enum")
+            .rx.observeWeakly(Int32Enum.self, "int32Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1442,7 +1442,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1461,7 +1461,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
 
         _ = root
-            .rx_observeWeakly(Int64Enum.self, "int64Enum")
+            .rx.observeWeakly(Int64Enum.self, "int64Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1474,7 +1474,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1493,7 +1493,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
 
         _ = root
-            .rx_observeWeakly(UIntEnum.self, "uintEnum")
+            .rx.observeWeakly(UIntEnum.self, "uintEnum")
             .subscribe(onNext: { n in
                 latest = n
             })
@@ -1506,7 +1506,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1525,7 +1525,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
 
         _ = root
-            .rx_observeWeakly(UInt32Enum.self, "uint32Enum")
+            .rx.observeWeakly(UInt32Enum.self, "uint32Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1538,7 +1538,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
@@ -1557,7 +1557,7 @@ extension KVOObservableTests {
         XCTAssertTrue(latest == nil)
 
         _ = root
-            .rx_observeWeakly(UInt32Enum.self, "uint64Enum")
+            .rx.observeWeakly(UInt32Enum.self, "uint64Enum")
             .subscribe(onNext: { n in
                 latest = n
         })
@@ -1570,7 +1570,7 @@ extension KVOObservableTests {
         var rootDeallocated = false
 
         _ = root
-            .rx_deallocated
+            .rx.deallocated
             .subscribe(onCompleted: {
                 rootDeallocated = true
             })
diff --git a/Tests/RxCocoaTests/NSLayoutConstraint+RxTests.swift b/Tests/RxCocoaTests/NSLayoutConstraint+RxTests.swift
index 82a3aa5f..18824a12 100644
--- a/Tests/RxCocoaTests/NSLayoutConstraint+RxTests.swift
+++ b/Tests/RxCocoaTests/NSLayoutConstraint+RxTests.swift
@@ -27,7 +27,7 @@ extension NSLayoutConstraintTest {
         let subject = View(frame: CGRect.zero)
         let subject2 = View(frame: CGRect.zero)
         let constraint = NSLayoutConstraint(item: subject, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: subject2, attribute: NSLayoutAttribute.top, multiplier: 0.5, constant: 0.5)
-        Observable.just(0).subscribe(constraint.rx_constant).dispose()
+        Observable.just(0).subscribe(constraint.rx.constant).dispose()
 
         XCTAssertTrue(constraint.constant == 0.0)
     }
@@ -36,7 +36,7 @@ extension NSLayoutConstraintTest {
         let subject = View(frame: CGRect.zero)
         let subject2 = View(frame: CGRect.zero)
         let constraint = NSLayoutConstraint(item: subject, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: subject2, attribute: NSLayoutAttribute.top, multiplier: 0.5, constant: 0.5)
-        Observable.just(1.0).subscribe(constraint.rx_constant).dispose()
+        Observable.just(1.0).subscribe(constraint.rx.constant).dispose()
 
         XCTAssertTrue(constraint.constant == 1.0)
     }
@@ -51,7 +51,7 @@ extension NSLayoutConstraintTest {
         parent.addSubview(subject)
         parent.addSubview(subject2)
         let constraint = NSLayoutConstraint(item: subject, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: subject2, attribute: NSLayoutAttribute.top, multiplier: 0.5, constant: 0.5)
-        Observable.just(true).subscribe(constraint.rx_active).dispose()
+        Observable.just(true).subscribe(constraint.rx.active).dispose()
 
         XCTAssertTrue(constraint.isActive == true)
     }
@@ -63,7 +63,7 @@ extension NSLayoutConstraintTest {
         parent.addSubview(subject)
         parent.addSubview(subject2)
         let constraint = NSLayoutConstraint(item: subject, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: subject2, attribute: NSLayoutAttribute.top, multiplier: 0.5, constant: 0.5)
-        Observable.just(false).subscribe(constraint.rx_active).dispose()
+        Observable.just(false).subscribe(constraint.rx.active).dispose()
 
         XCTAssertTrue(constraint.isActive == false)
     }
diff --git a/Tests/RxCocoaTests/NSNotificationCenterTests.swift b/Tests/RxCocoaTests/NSNotificationCenterTests.swift
index 0289660e..51c80361 100644
--- a/Tests/RxCocoaTests/NSNotificationCenterTests.swift
+++ b/Tests/RxCocoaTests/NSNotificationCenterTests.swift
@@ -21,7 +21,7 @@ class NSNotificationCenterTests : RxTest {
         
         XCTAssertTrue(numberOfNotifications == 0)
         
-        let subscription = notificationCenter.rx_notification(Notification.Name(rawValue: "testNotification"), object: nil)
+        let subscription = notificationCenter.rx.notification(Notification.Name(rawValue: "testNotification"), object: nil)
             .subscribe(onNext: { n in
                 numberOfNotifications += 1
             })
@@ -57,7 +57,7 @@ class NSNotificationCenterTests : RxTest {
         
         XCTAssertTrue(numberOfNotifications == 0)
         
-        let subscription = notificationCenter.rx_notification(Notification.Name(rawValue: "testNotification"), object: targetObject)
+        let subscription = notificationCenter.rx.notification(Notification.Name(rawValue: "testNotification"), object: targetObject)
             .subscribe(onNext: { n in
                 numberOfNotifications += 1
             })
diff --git a/Tests/RxCocoaTests/NSObject+RxTests.swift b/Tests/RxCocoaTests/NSObject+RxTests.swift
index 6414dd0b..750fadc6 100644
--- a/Tests/RxCocoaTests/NSObject+RxTests.swift
+++ b/Tests/RxCocoaTests/NSObject+RxTests.swift
@@ -15,15 +15,15 @@ class NSObjectTests: RxTest {
     
 }
 
-// rx_deallocated
+// deallocated
 extension NSObjectTests {
     func testDeallocated_ObservableFires() {
         var a = NSObject()
         
         var fired = false
         
-        _ = a
-            .rx_deallocated
+        _ = a.rx
+            .deallocated
             .map { _ in
                 return 1
             }
@@ -43,8 +43,8 @@ extension NSObjectTests {
         
         var fired = false
         
-        _ = a
-            .rx_deallocated
+        _ = a.rx
+            .deallocated
             .map { _ in
                 return 1
             }
@@ -64,8 +64,8 @@ extension NSObjectTests {
         
         var fired = false
 
-        _ = a
-            .rx_deallocated
+        _ = a.rx
+            .deallocated
             .map { _ in
                 return 1
             }
@@ -83,7 +83,7 @@ extension NSObjectTests {
 }
 
 #if !DISABLE_SWIZZLING
-// rx_deallocating
+// rx.deallocating
 extension NSObjectTests {
     func testDeallocating_ObservableFires() {
         var a = NSObject()
@@ -91,7 +91,7 @@ extension NSObjectTests {
         var fired = false
         
         _ = a
-            .rx_deallocating
+            .rx.deallocating
             .map { _ in
                 return 1
             }
@@ -112,7 +112,7 @@ extension NSObjectTests {
         var fired = false
         
         _ = a
-            .rx_deallocating
+            .rx.deallocating
             .map { _ in
                 return 1
             }
@@ -133,7 +133,7 @@ extension NSObjectTests {
         var fired = false
 
         _ = a
-            .rx_deallocating
+            .rx.deallocating
             .map { _ in
                 return 1
             }
diff --git a/Tests/RxCocoaTests/NSView+RxTests.swift b/Tests/RxCocoaTests/NSView+RxTests.swift
index cc02c712..90701a42 100644
--- a/Tests/RxCocoaTests/NSView+RxTests.swift
+++ b/Tests/RxCocoaTests/NSView+RxTests.swift
@@ -18,14 +18,14 @@ class NSViewTests : RxTest {
 extension NSViewTests {
     func testHidden_True() {
         let subject = NSView(frame: CGRect.zero)
-        Observable.just(true).subscribe(subject.rx_hidden).dispose()
+        Observable.just(true).subscribe(subject.rx.hidden).dispose()
 
         XCTAssertTrue(subject.isHidden == true)
     }
 
     func testHidden_False() {
         let subject = NSView(frame: CGRect.zero)
-        Observable.just(false).subscribe(subject.rx_hidden).dispose()
+        Observable.just(false).subscribe(subject.rx.hidden).dispose()
 
         XCTAssertTrue(subject.isHidden == false)
     }
@@ -34,14 +34,14 @@ extension NSViewTests {
 extension NSViewTests {
     func testAlpha_0() {
         let subject = NSView(frame: CGRect.zero)
-        Observable.just(0).subscribe(subject.rx_alpha).dispose()
+        Observable.just(0).subscribe(subject.rx.alpha).dispose()
 
         XCTAssertTrue(subject.alphaValue == 0.0)
     }
 
     func testAlpha_1() {
         let subject = NSView(frame: CGRect.zero)
-        Observable.just(1).subscribe(subject.rx_alpha).dispose()
+        Observable.just(1).subscribe(subject.rx.alpha).dispose()
 
         XCTAssertTrue(subject.alphaValue == 1.0)
     }
diff --git a/Tests/RxCocoaTests/RxTest+Controls.swift b/Tests/RxCocoaTests/RxTest+Controls.swift
index d4ce0e33..d11f4f3d 100644
--- a/Tests/RxCocoaTests/RxTest+Controls.swift
+++ b/Tests/RxCocoaTests/RxTest+Controls.swift
@@ -35,7 +35,7 @@ extension RxTest {
             })
 
 
-            _ = control.rx_deallocated.subscribe(onNext: { _ in
+            _ = (control as NSObject).rx.deallocated.subscribe(onNext: { _ in
                 deallocated = true
             })
 
@@ -77,7 +77,7 @@ extension RxTest {
                 completed = true
             })
 
-            _ = control.rx_deallocated.subscribe(onNext: { _ in
+            _ = (control as NSObject).rx.deallocated.subscribe(onNext: { _ in
                 deallocated = true
             })
 
@@ -101,7 +101,7 @@ extension RxTest {
 
             observable.bindTo(propertyObserver).addDisposableTo(disposeBag)
 
-            _ = control.rx_deallocated.subscribe(onNext: { _ in
+            _ = (control as NSObject).rx.deallocated.subscribe(onNext: { _ in
                 deallocated = true
             })
         }
diff --git a/Tests/RxCocoaTests/SentMessageTest.swift b/Tests/RxCocoaTests/SentMessageTest.swift
index 166cbad1..b6b48ab2 100644
--- a/Tests/RxCocoaTests/SentMessageTest.swift
+++ b/Tests/RxCocoaTests/SentMessageTest.swift
@@ -28,7 +28,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTestBase_dealloc) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationAdded(forSelector: NSSelectorFromString("dealloc")),
@@ -43,7 +43,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTest_dealloc) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationAdded(forSelector: NSSelectorFromString("dealloc")),
@@ -60,7 +60,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTestBase_dealloc2) in
-                return [target.rx_deallocating.map { _ in [] }]
+                return [target.rx.deallocating.map { _ in [] }]
             },
             objectActingClassChange: [
                 .implementationAdded(forSelector: NSSelectorFromString("dealloc")),
@@ -75,7 +75,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTest_dealloc2) in
-                return [target.rx_deallocating.map { _ in [] }]
+                return [target.rx.deallocating.map { _ in [] }]
             },
             objectActingClassChange: [
                 .implementationAdded(forSelector: NSSelectorFromString("dealloc")),
@@ -92,7 +92,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTestBase_dealloc_base) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationChanged(forSelector: NSSelectorFromString("dealloc")),
@@ -107,7 +107,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTest_dealloc_base) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationAdded(forSelector: NSSelectorFromString("dealloc")),
@@ -124,7 +124,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTestBase_dealloc_subclass) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationAdded(forSelector: NSSelectorFromString("dealloc")),
@@ -139,7 +139,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTest_dealloc_subclass) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationChanged(forSelector: NSSelectorFromString("dealloc")),
@@ -156,7 +156,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTestBase_dealloc_base_subclass) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationChanged(forSelector: NSSelectorFromString("dealloc")),
@@ -171,7 +171,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: SentMessageTest_dealloc_base_subclass) in
-                return [target.rx_sentMessage(NSSelectorFromString("dealloc"))]
+                return [target.rx.sentMessage(NSSelectorFromString("dealloc"))]
             },
             objectActingClassChange: [
                 .implementationChanged(forSelector: NSSelectorFromString("dealloc")),
@@ -192,7 +192,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(SentMessageTest_interact_forwarding.self),
             observeIt: { target in
-                return [target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
+                return [target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
             },
             objectActingClassChange: [
             ],
@@ -217,7 +217,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(SentMessageTestBase_interact_forwarding.self),
             observeIt: { target in
-                return [target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
+                return [target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
             },
             objectActingClassChange: [
             ],
@@ -243,7 +243,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(SentMessageTest_interact_forwarding.self),
             observeIt: { target in
-                return [target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
+                return [target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
             },
             objectActingClassChange: [
             ],
@@ -268,7 +268,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(SentMessageTestBase_interact_forwarding.self),
             observeIt: { target in
-                return [target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
+                return [target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledObject(toSay:)))]
             },
             objectActingClassChange: [
             ],
@@ -363,12 +363,12 @@ extension SentMessageTest {
     <
         BaseClass: SentMessageTestClassCreationProtocol & NSObjectProtocol,
         TargetClass: SentMessageTestClassCreationProtocol & NSObjectProtocol
-    >(_ baseClass: BaseClass.Type, _ targetClass: TargetClass.Type, _ method: Selector, _ invoke: (BaseClass) -> [[MethodParameters]]) {
+    >(_ baseClass: BaseClass.Type, _ targetClass: TargetClass.Type, _ method: Selector, _ invoke: @escaping (BaseClass) -> [[MethodParameters]]) {
         // now force forwarding mechanism for normal class
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { target in
-                return [(target as! NSObject).rx_sentMessage(method)]
+                return [(target as! NSObject).rx.sentMessage(method)]
             },
             objectActingClassChange: [
             ],
@@ -383,7 +383,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: BaseClass) in
-                return [(target as! NSObject).rx_sentMessage(method)]
+                return [(target as! NSObject).rx.sentMessage(method)]
             },
             objectActingClassChange: [
 
@@ -398,7 +398,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { target in
-                return [(target as! NSObject).rx_sentMessage(method)]
+                return [(target as! NSObject).rx.sentMessage(method)]
             },
             objectActingClassChange: [
             ],
@@ -413,7 +413,7 @@ extension SentMessageTest {
         ensureGlobalRuntimeChangesAreCached(
             createNormalInstance(),
             observeIt: { (target: BaseClass) in
-                return [(target as! NSObject).rx_sentMessage(method)]
+                return [(target as! NSObject).rx.sentMessage(method)]
             },
             objectActingClassChange: [
             ],
@@ -448,7 +448,7 @@ extension SentMessageTest {
         let target = SentMessageTest_forwarding_basic()
         var messages = [[Any]]()
 
-        let d = target.rx_sentMessage(#selector(SentMessageTestBase_shared.message_allSupportedParameters(_:p2:p3:p4:p5:p6:p7:p8:p9:p10:p11:p12:p13:p14:p15:p16:))).subscribe(onNext: { n in
+        let d = target.rx.sentMessage(#selector(SentMessageTestBase_shared.message_allSupportedParameters(_:p2:p3:p4:p5:p6:p7:p8:p9:p10:p11:p12:p13:p14:p15:p16:))).subscribe(onNext: { n in
                 messages.append(n)
             }, onError: { e in
                 XCTFail("Errors out \(e)")
@@ -476,7 +476,7 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         do {
-            _ = try target.rx_sentMessage(NSSelectorFromString("unknownSelector:"))
+            _ = try target.rx.sentMessage(NSSelectorFromString("unknownSelector:"))
                 .toBlocking()
                 .first()
 
@@ -496,13 +496,13 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         let disposeBag = DisposeBag()
-        target.rx_observe(NSArray.self, "messages")
+        target.rx.observe(NSArray.self, "messages")
             .subscribe(onNext: { _ in
             })
             .addDisposableTo(disposeBag)
 
         do {
-            _ = try target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
+            _ = try target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
                 .toBlocking()
                 .first()
 
@@ -525,7 +525,7 @@ extension SentMessageTest {
         object_setClass(target, SentMessageTest_shared_mock_interceptor.self)
 
         do {
-            _ = try target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
+            _ = try target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
                 .toBlocking()
                 .first()
 
@@ -547,7 +547,7 @@ extension SentMessageTest {
             let target = "\(Date())"
 
             do {
-                _ = try target.rx_sentMessage(#selector(_NSStringCoreType.length))
+                _ = try target.rx.sentMessage(#selector(_NSStringCoreType.length))
                     .toBlocking()
                     .first()
 
@@ -573,9 +573,9 @@ extension SentMessageTest {
     func testWorksWithKVOInCaseKVORegisteredAfter() {
         let target = SentMessageTest_shared()
 
-        let messages = target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
+        let messages = target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
 
-        let kvo = target.rx_observe(NSArray.self, "messages")
+        let kvo = target.rx.observe(NSArray.self, "messages")
             .subscribe(onNext: { _ in
             })
 
@@ -608,7 +608,7 @@ extension SentMessageTest {
         autoreleasepool {
             let target = SentMessageTest_shared()
 
-            messages = target.rx_sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
+            messages = target.rx.sentMessage(#selector(SentMessageTestBase_shared.justCalledBool(toSay:)))
 
             target.justCalledBool(toSay: true)
 
@@ -631,7 +631,7 @@ extension SentMessageTest {
         autoreleasepool {
             let target = SentMessageTest_shared()
 
-            deallocSequence = target.rx_sentMessage(NSSelectorFromString("dealloc"))
+            deallocSequence = target.rx.sentMessage(NSSelectorFromString("dealloc"))
         }
 
         var called = false
@@ -651,7 +651,7 @@ extension SentMessageTest {
         autoreleasepool {
             let target = SentMessageTest_shared()
 
-            deallocSequence = target.rx_deallocating
+            deallocSequence = target.rx.deallocating
         }
 
         var called = false
@@ -674,7 +674,7 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         do {
-            _ = try target.rx_sentMessage(NSSelectorFromString("class"))
+            _ = try target.rx.sentMessage(NSSelectorFromString("class"))
                 .toBlocking()
                 .first()
 
@@ -694,7 +694,7 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         do {
-            _ = try target.rx_sentMessage(NSSelectorFromString("forwardingTargetForSelector:"))
+            _ = try target.rx.sentMessage(NSSelectorFromString("forwardingTargetForSelector:"))
                 .toBlocking()
                 .first()
 
@@ -714,7 +714,7 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         do {
-            _ = try target.rx_sentMessage(NSSelectorFromString("methodSignatureForSelector:"))
+            _ = try target.rx.sentMessage(NSSelectorFromString("methodSignatureForSelector:"))
                 .toBlocking()
                 .first()
 
@@ -734,7 +734,7 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         do {
-            _ = try target.rx_sentMessage(NSSelectorFromString("respondsToSelector:"))
+            _ = try target.rx.sentMessage(NSSelectorFromString("respondsToSelector:"))
                 .toBlocking()
                 .first()
 
@@ -758,7 +758,7 @@ extension SentMessageTest {
         let target = SentMessageTest_shared()
 
         do {
-            _ = try target.rx_sentMessage(#selector(SentMessageTestBase_shared.hugeResult))
+            _ = try target.rx.sentMessage(#selector(SentMessageTestBase_shared.hugeResult))
                 .toBlocking()
                 .first()
 
@@ -897,7 +897,7 @@ extension SentMessageTest {
         let action: () -> Disposable = { () -> Disposable in
             let target = SentMessageTest_all_supported_types()
 
-            let d = target.rx_sentMessage(selector).subscribe(onNext: { n in
+            let d = target.rx.sentMessage(selector).subscribe(onNext: { n in
                     observedMessages.append(n)
                 }, onError: { e in
                     XCTFail("Errors out \(e)")
@@ -929,12 +929,12 @@ extension SentMessageTest {
      results properly can cause serious memory leaks.
     */
     func ensureGlobalRuntimeChangesAreCached(
-        _ createIt: () -> T,
-        observeIt: (T) -> [Observable],
+        _ createIt: @escaping () -> T,
+        observeIt: @escaping (T) -> [Observable],
         objectActingClassChange: [ObjectRuntimeChange],
         objectRealClassChange: [ObjectRuntimeChange],
         runtimeChange: RxObjCRuntimeChange,
-        useIt: (T) -> [[MethodParameters]]
+        useIt: @escaping (T) -> [[MethodParameters]]
         ) {
         // First run normal experiment
         _ensureGlobalRuntimeChangesAreCached(createIt,
@@ -1061,7 +1061,7 @@ extension SentMessageTest {
     func createKVODynamicSubclassed(_ type: T.Type = T.self) -> () -> (T, [Disposable]) {
         return {
             let t = T.createInstance()
-            //let disposable = (t as! NSObject).rx_observe(NSArray.self, "messages").publish().connect()
+            //let disposable = (t as! NSObject).rx.observe(NSArray.self, "messages").publish().connect()
             (t as! NSObject).addObserver(self, forKeyPath: "messages", options: [], context: nil)
             return (t, [Disposables.create { (t as! NSObject).removeObserver(self, forKeyPath: "messages") }])
         }
@@ -1091,4 +1091,4 @@ public func ==(lhs: some_insanely_large_struct, rhs: some_insanely_large_struct)
     return lhs.some_large_text == rhs.some_large_text && lhs.next == rhs.next
 }
 
-typealias MethodParameters = [Any]
+typealias MethodParameters = [AnyObject]
diff --git a/Tests/RxCocoaTests/UIButton+RxTests.swift b/Tests/RxCocoaTests/UIButton+RxTests.swift
index 928ddd75..d2599e3b 100644
--- a/Tests/RxCocoaTests/UIButton+RxTests.swift
+++ b/Tests/RxCocoaTests/UIButton+RxTests.swift
@@ -18,7 +18,7 @@ class RxButtonTests: RxTest {
         let button = UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
 
         XCTAssertFalse(button.title(for: []) == "normal")
-        _ = Observable.just("normal").subscribe(button.rx_title(controlState: []))
+        _ = Observable.just("normal").subscribe(button.rx.title(controlState: []))
         XCTAssertTrue(button.title(for: []) == "normal")
     }
 
@@ -26,7 +26,7 @@ class RxButtonTests: RxTest {
         let button = UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
 
         XCTAssertFalse(button.title(for: .selected) == "normal")
-        _ = Observable.just("normal").subscribe(button.rx_title(controlState: .selected))
+        _ = Observable.just("normal").subscribe(button.rx.title(controlState: .selected))
         XCTAssertTrue(button.title(for: .selected) == "normal")
     }
 
@@ -34,7 +34,7 @@ class RxButtonTests: RxTest {
         let button = UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
 
         XCTAssertFalse(button.title(for: []) == "normal")
-        _ = Observable.just("normal").subscribe(button.rx_title())
+        _ = Observable.just("normal").subscribe(button.rx.title())
         XCTAssertTrue(button.title(for: []) == "normal")
     }
 }
diff --git a/Tests/RxCocoaTests/UICollectionView+RxTests.swift b/Tests/RxCocoaTests/UICollectionView+RxTests.swift
index ef82eed4..e65c5ae8 100644
--- a/Tests/RxCocoaTests/UICollectionView+RxTests.swift
+++ b/Tests/RxCocoaTests/UICollectionView+RxTests.swift
@@ -17,10 +17,10 @@ class UICollectionViewTests : RxTest {
         let layout = UICollectionViewFlowLayout()
         let createView: () -> UICollectionView = { UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout) }
 
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_itemSelected }
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_itemDeselected }
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_modelSelected(Int.self) }
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_modelDeselected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.itemSelected }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.itemDeselected }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.modelDeselected(Int.self) }
     }
 
     func testCollectionView_itemSelected() {
@@ -29,7 +29,7 @@ class UICollectionViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = collectionView.rx_itemSelected
+        let subscription = collectionView.rx.itemSelected
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -47,7 +47,7 @@ class UICollectionViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = collectionView.rx_itemDeselected
+        let subscription = collectionView.rx.itemDeselected
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -66,13 +66,13 @@ class UICollectionViewTests : RxTest {
         let layout = UICollectionViewFlowLayout()
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
-            let s = items.bindTo(collectionView.rx_items) { (cv, index: Int, item: Int) -> UICollectionViewCell in
+            let s = items.bindTo(collectionView.rx.items) { (cv, index: Int, item: Int) -> UICollectionViewCell in
                 return UICollectionViewCell(frame: CGRect(x: 1, y: 1, width: 1, height: 1))
             }
 
             return (collectionView, s)
         }
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.modelSelected(Int.self) }
     }
 
     func testCollectionView_DelegateEventCompletesOnDealloc2() {
@@ -83,13 +83,13 @@ class UICollectionViewTests : RxTest {
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(NSClassFromString("UICollectionViewCell"), forCellWithReuseIdentifier: "a")
-            let s = items.bindTo(collectionView.rx_items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
+            let s = items.bindTo(collectionView.rx.items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
 
             }
 
             return (collectionView, s)
         }
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.modelSelected(Int.self) }
     }
 
     func testCollectionView_DelegateEventCompletesOnDealloc2_cellType() {
@@ -100,13 +100,13 @@ class UICollectionViewTests : RxTest {
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(NSClassFromString("UICollectionViewCell"), forCellWithReuseIdentifier: "a")
-            let s = items.bindTo(collectionView.rx_items(cellIdentifier: "a", cellType: UICollectionViewCell.self)) { (index: Int, item: Int, cell) in
+            let s = items.bindTo(collectionView.rx.items(cellIdentifier: "a", cellType: UICollectionViewCell.self)) { (index: Int, item: Int, cell) in
 
             }
 
             return (collectionView, s)
         }
-        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx_modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UICollectionView) in view.rx.modelSelected(Int.self) }
     }
 
     func testCollectionView_ModelSelected_itemsWithCellFactory() {
@@ -116,7 +116,7 @@ class UICollectionViewTests : RxTest {
 
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
-            let s = items.bindTo(collectionView.rx_items) { (cv, index: Int, item: Int) -> UICollectionViewCell in
+            let s = items.bindTo(collectionView.rx.items) { (cv, index: Int, item: Int) -> UICollectionViewCell in
                 return UICollectionViewCell(frame: CGRect(x: 1, y: 1, width: 1, height: 1))
             }
 
@@ -127,7 +127,7 @@ class UICollectionViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = collectionView.rx_modelSelected(Int.self)
+        let s = collectionView.rx.modelSelected(Int.self)
             .subscribe(onNext: { (item: Int) in
                 selectedItem = item
             })
@@ -147,7 +147,7 @@ class UICollectionViewTests : RxTest {
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(NSClassFromString("UICollectionViewCell"), forCellWithReuseIdentifier: "a")
-            let dataSourceSubscription = items.bindTo(collectionView.rx_items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
+            let dataSourceSubscription = items.bindTo(collectionView.rx.items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
 
             }
 
@@ -158,7 +158,7 @@ class UICollectionViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = collectionView.rx_modelSelected(Int.self)
+        let s = collectionView.rx.modelSelected(Int.self)
             .subscribe(onNext: { item in
                 selectedItem = item
             })
@@ -178,7 +178,7 @@ class UICollectionViewTests : RxTest {
 
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
-            let s = items.bindTo(collectionView.rx_items) { (cv, index: Int, item: Int) -> UICollectionViewCell in
+            let s = items.bindTo(collectionView.rx.items) { (cv, index: Int, item: Int) -> UICollectionViewCell in
                 return UICollectionViewCell(frame: CGRect(x: 1, y: 1, width: 1, height: 1))
             }
 
@@ -189,7 +189,7 @@ class UICollectionViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = collectionView.rx_modelDeselected(Int.self)
+        let s = collectionView.rx.modelDeselected(Int.self)
             .subscribe(onNext: { (item: Int) in
                 selectedItem = item
             })
@@ -209,7 +209,7 @@ class UICollectionViewTests : RxTest {
         let createView: () -> (UICollectionView, Disposable) = {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(NSClassFromString("UICollectionViewCell"), forCellWithReuseIdentifier: "a")
-            let dataSourceSubscription = items.bindTo(collectionView.rx_items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
+            let dataSourceSubscription = items.bindTo(collectionView.rx.items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
 
             }
 
@@ -220,7 +220,7 @@ class UICollectionViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = collectionView.rx_modelDeselected(Int.self)
+        let s = collectionView.rx.modelDeselected(Int.self)
             .subscribe(onNext: { item in
                 selectedItem = item
             })
@@ -241,14 +241,14 @@ class UICollectionViewTests : RxTest {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(NSClassFromString("UICollectionViewCell"), forCellWithReuseIdentifier: "a")
             let dataSource = SectionedViewDataSourceMock()
-            let dataSourceSubscription = items.bindTo(collectionView.rx_items(dataSource: dataSource))
+            let dataSourceSubscription = items.bindTo(collectionView.rx.items(dataSource: dataSource))
 
             return (collectionView, dataSourceSubscription)
 
         }
         let (collectionView, dataSourceSubscription) = createView()
 
-        let model: Int = try! collectionView.rx_modelAtIndexPath(IndexPath(item: 1, section: 0))
+        let model: Int = try! collectionView.rx.modelAtIndexPath(IndexPath(item: 1, section: 0))
 
         XCTAssertEqual(model, 2)
 
@@ -268,15 +268,15 @@ extension UICollectionViewTests {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "a")
             let dataSource = SectionedViewDataSourceMock()
-            dataSourceSubscription = items.bindTo(collectionView.rx_items(dataSource: dataSource))
+            dataSourceSubscription = items.bindTo(collectionView.rx.items(dataSource: dataSource))
 
-            _ = dataSource.rx_deallocated.subscribe(onNext: { _ in
+            _ = dataSource.rx.deallocated.subscribe(onNext: { _ in
                 dataSourceDeallocated = true
             })
         }
 
         XCTAssert(dataSourceDeallocated == false)
-        dataSourceSubscription.dispose()
+        autoreleasepool { dataSourceSubscription.dispose() }
         XCTAssert(dataSourceDeallocated == true)
     }
 
@@ -291,9 +291,9 @@ extension UICollectionViewTests {
             let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 1, height: 1), collectionViewLayout: layout)
             collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "a")
             let dataSource = SectionedViewDataSourceMock()
-            _ = items.bindTo(collectionView.rx_items(dataSource: dataSource))
+            _ = items.bindTo(collectionView.rx.items(dataSource: dataSource))
             
-            _ = dataSource.rx_deallocated.subscribe(onNext: { _ in
+            _ = dataSource.rx.deallocated.subscribe(onNext: { _ in
                 dataSourceDeallocated = true
             })
 
@@ -311,9 +311,9 @@ extension UICollectionViewTests {
         autoreleasepool {
             collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "a")
             let dataSource = SectionedViewDataSourceMock()
-            _ = collectionView.rx_setDataSource(dataSource)
+            _ = collectionView.rx.setDataSource(dataSource)
 
-            _ = dataSource.rx_deallocated.subscribe(onNext: { _ in
+            _ = dataSource.rx.deallocated.subscribe(onNext: { _ in
                 dataSourceDeallocated = true
             })
 
diff --git a/Tests/RxCocoaTests/UIImagePickerController+RxTests.swift b/Tests/RxCocoaTests/UIImagePickerController+RxTests.swift
index a8387ecf..3e2895a3 100644
--- a/Tests/RxCocoaTests/UIImagePickerController+RxTests.swift
+++ b/Tests/RxCocoaTests/UIImagePickerController+RxTests.swift
@@ -31,7 +31,7 @@ extension UIImagePickerControllerTests {
         autoreleasepool {
             let imagePickerController = UIImagePickerController()
             
-            _ = imagePickerController.rx_didFinishPickingMediaWithInfo
+            _ = imagePickerController.rx.didFinishPickingMediaWithInfo
                 .subscribe(onNext: { (i) -> Void in
                     info = i
                 }, onCompleted: {
@@ -56,7 +56,7 @@ extension UIImagePickerControllerTests {
             
             let imagePickerController = UIImagePickerController()
             
-            _ = imagePickerController.rx_didCancel
+            _ = imagePickerController.rx.didCancel
                 .subscribe(onNext: { (i) -> Void in
                         canceled = true
                     }, onCompleted: {
diff --git a/Tests/RxCocoaTests/UINavigationItem+RxTests.swift.swift b/Tests/RxCocoaTests/UINavigationItem+RxTests.swift.swift
index 1c4451c0..9243dc6c 100644
--- a/Tests/RxCocoaTests/UINavigationItem+RxTests.swift.swift
+++ b/Tests/RxCocoaTests/UINavigationItem+RxTests.swift.swift
@@ -19,15 +19,15 @@ class UINavigationItemTests : RxTest {
 extension UINavigationItemTests {
     func testTitle_Text() {
         let subject = UINavigationItem()
-        Observable.just("Editing").subscribe(subject.rx_title).dispose()
+        Observable.just("Editing").subscribe(subject.rx.title).dispose()
         
         XCTAssertTrue(subject.title == "Editing")
     }
     
     func testTitle_Empty() {
         let subject = UINavigationItem()
-        Observable.just(nil).subscribe(subject.rx_title).dispose()
+        Observable.just(nil).subscribe(subject.rx.title).dispose()
         
         XCTAssertTrue(subject.title == nil)
     }
-}
\ No newline at end of file
+}
diff --git a/Tests/RxCocoaTests/UIPageControl+RxTest.swift b/Tests/RxCocoaTests/UIPageControl+RxTest.swift
index ef87a30a..3854b3a8 100644
--- a/Tests/RxCocoaTests/UIPageControl+RxTest.swift
+++ b/Tests/RxCocoaTests/UIPageControl+RxTest.swift
@@ -22,7 +22,7 @@ extension UIPageControlTest {
     func testPageControl_CurrentPage() {
         let pageControl = UIPageControl(frame: CGRect.zero)
         pageControl.numberOfPages = 10
-        Observable.just(5).bindTo(pageControl.rx_currentPage).dispose()
+        Observable.just(5).bindTo(pageControl.rx.currentPage).dispose()
         XCTAssertTrue(pageControl.currentPage == 5)
     }
 }
diff --git a/Tests/RxCocoaTests/UIPickerView+RxTests.swift b/Tests/RxCocoaTests/UIPickerView+RxTests.swift
index 719eb4a5..7459f824 100644
--- a/Tests/RxCocoaTests/UIPickerView+RxTests.swift
+++ b/Tests/RxCocoaTests/UIPickerView+RxTests.swift
@@ -18,7 +18,7 @@ class UIPickerViewTests: RxTest {
     func testTableView_DelegateEventCompletesOnDealloc() {
         let createView: () -> UIPickerView = { UIPickerView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
         
-        ensureEventDeallocated(createView) { (view: UIPickerView) in view.rx_itemSelected }
+        ensureEventDeallocated(createView) { (view: UIPickerView) in view.rx.itemSelected }
     }
 
     func testPickerView_itemSelected() {
@@ -28,7 +28,7 @@ class UIPickerViewTests: RxTest {
         var result: (row: Int, component: Int)?
         
         autoreleasepool {
-            _ = pickerView.rx_itemSelected.subscribe(onNext: { (element) in
+            _ = pickerView.rx.itemSelected.subscribe(onNext: { (element) in
                 result = element
             })
             pickerView.delegate!.pickerView!(pickerView,
diff --git a/Tests/RxCocoaTests/UIRefreshControl+RxTests.swift b/Tests/RxCocoaTests/UIRefreshControl+RxTests.swift
index 36a3e98f..948f04ac 100644
--- a/Tests/RxCocoaTests/UIRefreshControl+RxTests.swift
+++ b/Tests/RxCocoaTests/UIRefreshControl+RxTests.swift
@@ -20,14 +20,14 @@ class UIRefreshControlTests : RxTest {
 extension UIRefreshControlTests {
     func testRefreshing_True() {
         let subject = UIRefreshControl()
-        Observable.just(true).subscribe(subject.rx_refreshing).dispose()
+        Observable.just(true).subscribe(subject.rx.refreshing).dispose()
 
         XCTAssertTrue(subject.isRefreshing == true)
     }
 
     func testRefreshing_False() {
         let subject = UIRefreshControl()
-        Observable.just(false).subscribe(subject.rx_refreshing).dispose()
+        Observable.just(false).subscribe(subject.rx.refreshing).dispose()
 
         XCTAssertTrue(subject.isRefreshing == false)
     }
diff --git a/Tests/RxCocoaTests/UIScrollView+RxTests.swift b/Tests/RxCocoaTests/UIScrollView+RxTests.swift
index 2ce1ac3c..ba987e9f 100644
--- a/Tests/RxCocoaTests/UIScrollView+RxTests.swift
+++ b/Tests/RxCocoaTests/UIScrollView+RxTests.swift
@@ -23,14 +23,14 @@ extension UIScrollViewTests {
     func testScrollEnabled_False() {
         let scrollView = UIScrollView(frame: CGRect.zero)
         scrollView.isScrollEnabled = true
-        Observable.just(false).bindTo(scrollView.rx_scrollEnabled).dispose()
+        Observable.just(false).bindTo(scrollView.rx.scrollEnabled).dispose()
         XCTAssertTrue(scrollView.isScrollEnabled == false)
     }
 
     func testScrollEnabled_True() {
         let scrollView = UIScrollView(frame: CGRect.zero)
         scrollView.isScrollEnabled = false
-        Observable.just(true).bindTo(scrollView.rx_scrollEnabled).dispose()
+        Observable.just(true).bindTo(scrollView.rx.scrollEnabled).dispose()
         XCTAssertTrue(scrollView.isScrollEnabled == true)
     }
 
@@ -50,9 +50,9 @@ extension UIScrollViewTests {
         let scrollView = UIScrollView(frame: CGRect.zero)
         autoreleasepool {
             let delegate = MockScrollViewDelegate()
-            _ = scrollView.rx_setDelegate(delegate)
+            _ = scrollView.rx.setDelegate(delegate)
 
-            _ = delegate.rx_deallocated.subscribe(onNext: { _ in
+            _ = delegate.rx.deallocated.subscribe(onNext: { _ in
                 delegateDeallocated = true
             })
 
diff --git a/Tests/RxCocoaTests/UISearchBar+RxTests.swift b/Tests/RxCocoaTests/UISearchBar+RxTests.swift
index 6a2ea385..c9549ab8 100644
--- a/Tests/RxCocoaTests/UISearchBar+RxTests.swift
+++ b/Tests/RxCocoaTests/UISearchBar+RxTests.swift
@@ -16,7 +16,7 @@ import XCTest
 class UISearchBarTests : RxTest {
     func testText_completesOnDealloc() {
         let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, "a") { (view: UISearchBar) in view.rx_text }
+        ensurePropertyDeallocated(createView, "a") { (view: UISearchBar) in view.rx.text }
     }
 
     func testText_changeEventWorks() {
@@ -25,7 +25,7 @@ class UISearchBarTests : RxTest {
         var latestText: String! = nil
 
         // search bar should dispose this itself
-        _ = searchBar.rx_text.subscribe(onNext: { text in
+        _ = searchBar.rx.text.subscribe(onNext: { text in
             latestText = text
         })
 
@@ -41,13 +41,13 @@ class UISearchBarTests : RxTest {
         let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
 
         XCTAssertNotEqual(searchBar.text, "value")
-        _ = Observable.just("value").bindTo(searchBar.rx_text)
+        _ = Observable.just("value").bindTo(searchBar.rx.text)
         XCTAssertEqual(searchBar.text, "value")
     }
 
     func testSelectedScopeButtonIndex_completesOnDealloc() {
         let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, 1) { (view: UISearchBar) in view.rx_selectedScopeButtonIndex }
+        ensurePropertyDeallocated(createView, 1) { (view: UISearchBar) in view.rx.selectedScopeButtonIndex }
     }
     
     func testSelectedScopeButtonIndex_changeEventWorks() {
@@ -56,7 +56,7 @@ class UISearchBarTests : RxTest {
         
         var latestSelectedScopeIndex: Int = -1
         
-        _ = searchBar.rx_selectedScopeButtonIndex.subscribe(onNext: { index in
+        _ = searchBar.rx.selectedScopeButtonIndex.subscribe(onNext: { index in
             latestSelectedScopeIndex = index
         })
         
@@ -73,7 +73,7 @@ class UISearchBarTests : RxTest {
         searchBar.scopeButtonTitles = [ "One", "Two", "Three" ]
         
         XCTAssertNotEqual(searchBar.selectedScopeButtonIndex, 1)
-        _ = Observable.just(1).bindTo(searchBar.rx_selectedScopeButtonIndex)
+        _ = Observable.just(1).bindTo(searchBar.rx.selectedScopeButtonIndex)
         XCTAssertEqual(searchBar.selectedScopeButtonIndex, 1)
     }
     
@@ -83,7 +83,7 @@ class UISearchBarTests : RxTest {
         
         var tapped = false
         
-        let _ = searchBar.rx_cancelButtonClicked.subscribe(onNext: { _ in
+        let _ = searchBar.rx.cancelButtonClicked.subscribe(onNext: { _ in
             tapped = true
         })
         
@@ -94,7 +94,7 @@ class UISearchBarTests : RxTest {
     
     func testCancelButtonClicked_DelegateEventCompletesOnDealloc() {
         let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx_cancelButtonClicked }
+        ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.cancelButtonClicked }
     }
 #endif
     
@@ -103,7 +103,7 @@ class UISearchBarTests : RxTest {
         
         var tapped = false
         
-        let _ = searchBar.rx_searchButtonClicked.subscribe(onNext: { _ in
+        let _ = searchBar.rx.searchButtonClicked.subscribe(onNext: { _ in
             tapped = true
         })
         
@@ -114,6 +114,6 @@ class UISearchBarTests : RxTest {
     
     func testSearchButtonClicked_DelegateEventCompletesOnDealloc() {
         let createView: () -> UISearchBar = { UISearchBar(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx_searchButtonClicked }
+        ensureEventDeallocated(createView) { (view: UISearchBar) in view.rx.searchButtonClicked }
     }
 }
diff --git a/Tests/RxCocoaTests/UISearchController+RxTests.swift b/Tests/RxCocoaTests/UISearchController+RxTests.swift
index 99ca1ebe..ca259d85 100644
--- a/Tests/RxCocoaTests/UISearchController+RxTests.swift
+++ b/Tests/RxCocoaTests/UISearchController+RxTests.swift
@@ -23,7 +23,7 @@ class UISearchController_RxTests: RxTest {
         autoreleasepool {
             let searchController = UISearchController()
             
-            _ = searchController.rx_didDismiss
+            _ = searchController.rx.didDismiss
                 .subscribe(onNext: {
                         didDismissed = true
                     }, onCompleted: {
@@ -43,7 +43,7 @@ class UISearchController_RxTests: RxTest {
         autoreleasepool {
             let searchController = UISearchController()
             
-            _ = searchController.rx_didPresent
+            _ = searchController.rx.didPresent
                 .subscribe(onNext: {
                     didPresent = true
                     }, onCompleted: {
@@ -63,7 +63,7 @@ class UISearchController_RxTests: RxTest {
         autoreleasepool {
             let searchController = UISearchController()
             
-            _ = searchController.rx_present
+            _ = searchController.rx.present
                 .subscribe(onNext: {
                     presented = true
                     }, onCompleted: {
@@ -83,7 +83,7 @@ class UISearchController_RxTests: RxTest {
         autoreleasepool {
             let searchController = UISearchController()
             
-            _ = searchController.rx_willDismiss
+            _ = searchController.rx.willDismiss
                 .subscribe(onNext: {
                     willDismiss = true
                     }, onCompleted: {
@@ -103,7 +103,7 @@ class UISearchController_RxTests: RxTest {
         autoreleasepool {
             let searchController = UISearchController()
             
-            _ = searchController.rx_willPresent
+            _ = searchController.rx.willPresent
                 .subscribe(onNext: {
                     willPresent = true
                     }, onCompleted: {
diff --git a/Tests/RxCocoaTests/UITabBar+RxTests.swift b/Tests/RxCocoaTests/UITabBar+RxTests.swift
index c24cf326..8366093f 100644
--- a/Tests/RxCocoaTests/UITabBar+RxTests.swift
+++ b/Tests/RxCocoaTests/UITabBar+RxTests.swift
@@ -31,7 +31,7 @@ extension UITabBarTests {
         let items = [UITabBarItem()]
         var returnedItems: [UITabBarItem]!
 
-        _ = subject.rx_willBeginCustomizing
+        _ = subject.rx.willBeginCustomizing
             .subscribe(onNext: { i in
                 returnedItems = i
             })
@@ -46,7 +46,7 @@ extension UITabBarTests {
         let items = [UITabBarItem()]
         var returnedItems: [UITabBarItem]!
 
-        _ = subject.rx_didBeginCustomizing
+        _ = subject.rx.didBeginCustomizing
             .subscribe(onNext: { i in
                 returnedItems = i
             })
@@ -63,7 +63,7 @@ extension UITabBarTests {
         var returnedItems: [UITabBarItem]!
         var changed: Bool!
 
-        _ = subject.rx_willEndCustomizing
+        _ = subject.rx.willEndCustomizing
             .subscribe(onNext: { (i, c) in
                 returnedItems = i
                 changed = c
@@ -81,7 +81,7 @@ extension UITabBarTests {
         var returnedItems: [UITabBarItem]!
         var changed: Bool!
 
-        _ = subject.rx_didEndCustomizing
+        _ = subject.rx.didEndCustomizing
             .subscribe(onNext: { (i, c) in
                 returnedItems = i
                 changed = c
@@ -107,7 +107,7 @@ extension UITabBarTests {
         let item = UITabBarItem()
         var returnedItem: UITabBarItem!
 
-        _ = subject.rx_didSelectItem
+        _ = subject.rx.didSelectItem
             .subscribe(onNext: { i in
                 returnedItem = i
             })
diff --git a/Tests/RxCocoaTests/UITabBarItem+RxTests.swift b/Tests/RxCocoaTests/UITabBarItem+RxTests.swift
index 1310a728..0e92b9b3 100644
--- a/Tests/RxCocoaTests/UITabBarItem+RxTests.swift
+++ b/Tests/RxCocoaTests/UITabBarItem+RxTests.swift
@@ -19,14 +19,14 @@ class UITabBarItemTests : RxTest {
 extension UITabBarItemTests {
     func testBadgetValue_Text() {
         let subject = UITabBarItem(tabBarSystemItem: .more, tag: 0)
-        Observable.just("5").subscribe(subject.rx_badgeValue).dispose()
+        Observable.just("5").subscribe(subject.rx.badgeValue).dispose()
         
         XCTAssertTrue(subject.badgeValue == "5")
     }
     
     func testBadgetValue_Empty() {
         let subject = UITabBarItem(tabBarSystemItem: .more, tag: 0)
-        Observable.just(nil).subscribe(subject.rx_badgeValue).dispose()
+        Observable.just(nil).subscribe(subject.rx.badgeValue).dispose()
         
         XCTAssertTrue(subject.badgeValue == nil)
     }
diff --git a/Tests/RxCocoaTests/UITableView+RxTests.swift b/Tests/RxCocoaTests/UITableView+RxTests.swift
index 09d54f25..701c1d84 100644
--- a/Tests/RxCocoaTests/UITableView+RxTests.swift
+++ b/Tests/RxCocoaTests/UITableView+RxTests.swift
@@ -15,17 +15,17 @@ class UITableViewTests : RxTest {
     func testTableView_DelegateEventCompletesOnDealloc() {
         let createView: () -> UITableView = { UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
 
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemSelected }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemDeselected }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemAccessoryButtonTapped }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemDeleted }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemMoved }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_itemInserted }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelDeselected(Int.self) }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_willDisplayCell }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_didEndDisplayingCell }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.itemSelected }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.itemDeselected }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.itemAccessoryButtonTapped }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.itemDeleted }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.itemMoved }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.itemInserted }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.modelDeselected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.willDisplayCell }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.didEndDisplayingCell }
     }
 
     func testTableView_itemSelected() {
@@ -33,7 +33,7 @@ class UITableViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = tableView.rx_itemSelected
+        let subscription = tableView.rx.itemSelected
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -50,7 +50,7 @@ class UITableViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = tableView.rx_itemDeselected
+        let subscription = tableView.rx.itemDeselected
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -67,7 +67,7 @@ class UITableViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = tableView.rx_itemAccessoryButtonTapped
+        let subscription = tableView.rx.itemAccessoryButtonTapped
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -84,7 +84,7 @@ class UITableViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = tableView.rx_itemDeleted
+        let subscription = tableView.rx.itemDeleted
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -101,7 +101,7 @@ class UITableViewTests : RxTest {
 
         var resultIndexPath: IndexPath? = nil
 
-        let subscription = tableView.rx_itemInserted
+        let subscription = tableView.rx.itemInserted
             .subscribe(onNext: { indexPath in
                 resultIndexPath = indexPath
             })
@@ -119,7 +119,7 @@ class UITableViewTests : RxTest {
         var resultIndexPath: IndexPath? = nil
         var resultCell: UITableViewCell? = nil
 
-        let subscription = tableView.rx_willDisplayCell
+        let subscription = tableView.rx.willDisplayCell
             .subscribe(onNext: { (cell, indexPath) in
                 resultIndexPath = indexPath
                 resultCell = cell
@@ -140,7 +140,7 @@ class UITableViewTests : RxTest {
         var resultIndexPath: IndexPath? = nil
         var resultCell: UITableViewCell? = nil
 
-        let subscription = tableView.rx_didEndDisplayingCell
+        let subscription = tableView.rx.didEndDisplayingCell
             .subscribe(onNext: { (cell, indexPath) in
                 resultIndexPath = indexPath
                 resultCell = cell
@@ -161,7 +161,7 @@ class UITableViewTests : RxTest {
         var resultIndexPath: IndexPath? = nil
         var resultIndexPath2: IndexPath? = nil
 
-        let subscription = tableView.rx_itemMoved
+        let subscription = tableView.rx.itemMoved
             .subscribe(onNext: { (indexPath, indexPath2) in
                 resultIndexPath = indexPath
                 resultIndexPath2 = indexPath2
@@ -181,13 +181,13 @@ class UITableViewTests : RxTest {
 
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
-            let dataSourceSubscription = items.bindTo(tableView.rx_items) { (tv, index: Int, item: Int) -> UITableViewCell in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items) { (tv, index: Int, item: Int) -> UITableViewCell in
                 return UITableViewCell(style: .default, reuseIdentifier: "Identity")
             }
 
             return (tableView, dataSourceSubscription)
         }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.modelSelected(Int.self) }
     }
 
     func testTableView_DelegateEventCompletesOnDealloc2() {
@@ -196,13 +196,13 @@ class UITableViewTests : RxTest {
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
             tableView.register(NSClassFromString("UITableViewCell"), forCellReuseIdentifier: "a")
-            let dataSourceSubscription = items.bindTo(tableView.rx_items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
 
             }
 
             return (tableView, dataSourceSubscription)
         }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.modelSelected(Int.self) }
     }
 
     func testTableView_DelegateEventCompletesOnDealloc2_cellType() {
@@ -211,13 +211,13 @@ class UITableViewTests : RxTest {
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
             tableView.register(NSClassFromString("UITableViewCell"), forCellReuseIdentifier: "a")
-            let dataSourceSubscription = items.bindTo(tableView.rx_items(cellIdentifier: "a", cellType: UITableViewCell.self)) { (index: Int, item: Int, cell) in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items(cellIdentifier: "a", cellType: UITableViewCell.self)) { (index: Int, item: Int, cell) in
 
             }
 
             return (tableView, dataSourceSubscription)
         }
-        ensureEventDeallocated(createView) { (view: UITableView) in view.rx_modelSelected(Int.self) }
+        ensureEventDeallocated(createView) { (view: UITableView) in view.rx.modelSelected(Int.self) }
     }
 
     func testTableView_ModelSelected_rx_itemsWithCellFactory() {
@@ -225,7 +225,7 @@ class UITableViewTests : RxTest {
         
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
-            let dataSourceSubscription = items.bindTo(tableView.rx_items) { (tv, index: Int, item: Int) -> UITableViewCell in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items) { (tv, index: Int, item: Int) -> UITableViewCell in
                 return UITableViewCell(style: .default, reuseIdentifier: "Identity")
             }
             
@@ -236,7 +236,7 @@ class UITableViewTests : RxTest {
         
         var selectedItem: Int? = nil
         
-        let s = tableView.rx_modelSelected(Int.self)
+        let s = tableView.rx.modelSelected(Int.self)
             .subscribe(onNext: { item in
                 selectedItem = item
             })
@@ -255,7 +255,7 @@ class UITableViewTests : RxTest {
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
             tableView.register(NSClassFromString("UITableViewCell"), forCellReuseIdentifier: "a")
-            let dataSourceSubscription = items.bindTo(tableView.rx_items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
 
             }
 
@@ -266,7 +266,7 @@ class UITableViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = tableView.rx_modelSelected(Int.self)
+        let s = tableView.rx.modelSelected(Int.self)
             .subscribe(onNext: { item in
                 selectedItem = item
             })
@@ -284,7 +284,7 @@ class UITableViewTests : RxTest {
 
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
-            let dataSourceSubscription = items.bindTo(tableView.rx_items) { (tv, index: Int, item: Int) -> UITableViewCell in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items) { (tv, index: Int, item: Int) -> UITableViewCell in
                 return UITableViewCell(style: .default, reuseIdentifier: "Identity")
             }
 
@@ -295,7 +295,7 @@ class UITableViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = tableView.rx_modelDeselected(Int.self)
+        let s = tableView.rx.modelDeselected(Int.self)
             .subscribe(onNext: { item in
                 selectedItem = item
             })
@@ -314,7 +314,7 @@ class UITableViewTests : RxTest {
         let createView: () -> (UITableView, Disposable) = {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
             tableView.register(NSClassFromString("UITableViewCell"), forCellReuseIdentifier: "a")
-            let dataSourceSubscription = items.bindTo(tableView.rx_items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
+            let dataSourceSubscription = items.bindTo(tableView.rx.items(cellIdentifier: "a")) { (index: Int, item: Int, cell) in
 
             }
 
@@ -325,7 +325,7 @@ class UITableViewTests : RxTest {
 
         var selectedItem: Int? = nil
 
-        let s = tableView.rx_modelDeselected(Int.self)
+        let s = tableView.rx.modelDeselected(Int.self)
             .subscribe(onNext: { item in
                 selectedItem = item
             })
@@ -345,14 +345,14 @@ class UITableViewTests : RxTest {
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
             tableView.register(NSClassFromString("UITableViewCell"), forCellReuseIdentifier: "a")
             let dataSource = SectionedViewDataSourceMock()
-            let dataSourceSubscription = items.bindTo(tableView.rx_items(dataSource: dataSource))
+            let dataSourceSubscription = items.bindTo(tableView.rx.items(dataSource: dataSource))
 
             return (tableView, dataSourceSubscription)
         }
 
         let (tableView, dataSourceSubscription) = createView()
 
-        let model: Int = try! tableView.rx_modelAtIndexPath(IndexPath(item: 1, section: 0))
+        let model: Int = try! tableView.rx.modelAtIndexPath(IndexPath(item: 1, section: 0))
 
         XCTAssertEqual(model, 2)
         
@@ -370,15 +370,15 @@ extension UITableViewTests {
             let items: Observable<[Int]> = Observable.just([1, 2, 3])
             let dataSource = SectionedViewDataSourceMock()
             let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
-            dataSourceSubscription = items.bindTo(tableView.rx_items(dataSource: dataSource))
+            dataSourceSubscription = items.bindTo(tableView.rx.items(dataSource: dataSource))
 
-            _ = dataSource.rx_deallocated.subscribe(onNext: { _ in
+            _ = dataSource.rx.deallocated.subscribe(onNext: { _ in
                 dataSourceDeallocated = true
             })
         }
 
         XCTAssert(dataSourceDeallocated == false)
-        dataSourceSubscription.dispose()
+        autoreleasepool { dataSourceSubscription.dispose() }
         XCTAssert(dataSourceDeallocated == true)
     }
 
@@ -392,9 +392,9 @@ extension UITableViewTests {
 
             let items: Observable<[Int]> = Observable.just([1, 2, 3])
             let dataSource = SectionedViewDataSourceMock()
-            _ = items.bindTo(tableView.rx_items(dataSource: dataSource))
+            _ = items.bindTo(tableView.rx.items(dataSource: dataSource))
 
-            _ = dataSource.rx_deallocated.subscribe(onNext: { _ in
+            _ = dataSource.rx.deallocated.subscribe(onNext: { _ in
                 dataSourceDeallocated = true
             })
 
@@ -412,9 +412,9 @@ extension UITableViewTests {
 
         autoreleasepool {
             let dataSource = SectionedViewDataSourceMock()
-            _ = tableView.rx_setDataSource(dataSource)
+            _ = tableView.rx.setDataSource(dataSource)
 
-            _ = dataSource.rx_deallocated.subscribe(onNext: { _ in
+            _ = dataSource.rx.deallocated.subscribe(onNext: { _ in
                 dataSourceDeallocated = true
             })
 
diff --git a/Tests/RxCocoaTests/UITextField+RxTests.swift b/Tests/RxCocoaTests/UITextField+RxTests.swift
index 03b38af1..b5ebc27d 100644
--- a/Tests/RxCocoaTests/UITextField+RxTests.swift
+++ b/Tests/RxCocoaTests/UITextField+RxTests.swift
@@ -14,7 +14,7 @@ import XCTest
 // UITextField
 class UITextFieldTests : RxTest {
     func testTextCompletesOnDealloc() {
-        ensurePropertyDeallocated({ UITextField() }, "a") { (view: UITextField) in view.rx_text }
+        ensurePropertyDeallocated({ UITextField() }, "a") { (view: UITextField) in view.rx.text }
     }
 
     func testSettingTextDoesntClearMarkedText() {
@@ -22,9 +22,9 @@ class UITextFieldTests : RxTest {
 
         textField.text = "Text1"
         textField.set = false
-        textField.rx_text.on(.next("Text1"))
+        textField.rx.text.on(.next("Text1"))
         XCTAssertTrue(!textField.set)
-        textField.rx_text.on(.next("Text2"))
+        textField.rx.text.on(.next("Text2"))
         XCTAssertTrue(textField.set)
     }
 }
diff --git a/Tests/RxCocoaTests/UITextView+RxTests.swift b/Tests/RxCocoaTests/UITextView+RxTests.swift
index e32ff972..938e1134 100644
--- a/Tests/RxCocoaTests/UITextView+RxTests.swift
+++ b/Tests/RxCocoaTests/UITextView+RxTests.swift
@@ -15,7 +15,7 @@ import XCTest
 class UITextViewTests : RxTest {
     func testText_DelegateEventCompletesOnDealloc() {
         let createView: () -> UITextView = { UITextView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
-        ensurePropertyDeallocated(createView, "text") { (view: UITextView) in view.rx_text }
+        ensurePropertyDeallocated(createView, "text") { (view: UITextView) in view.rx.text }
     }
 
     func testSettingTextDoesntClearMarkedText() {
@@ -23,9 +23,9 @@ class UITextViewTests : RxTest {
 
         textView.text = "Text1"
         textView.set = false
-        textView.rx_text.on(.next("Text1"))
+        textView.rx.text.on(.next("Text1"))
         XCTAssertTrue(!textView.set)
-        textView.rx_text.on(.next("Text2"))
+        textView.rx.text.on(.next("Text2"))
         XCTAssertTrue(textView.set)
     }
 }
diff --git a/Tests/RxCocoaTests/UIView+RxTests.swift b/Tests/RxCocoaTests/UIView+RxTests.swift
index 16a23474..6f6704ef 100644
--- a/Tests/RxCocoaTests/UIView+RxTests.swift
+++ b/Tests/RxCocoaTests/UIView+RxTests.swift
@@ -19,14 +19,14 @@ class UIViewTests : RxTest {
 extension UIViewTests {
     func testHidden_True() {
         let subject = UIView(frame: CGRect.zero)
-        Observable.just(true).subscribe(subject.rx_hidden).dispose()
+        Observable.just(true).subscribe(subject.rx.hidden).dispose()
 
         XCTAssertTrue(subject.isHidden == true)
     }
 
     func testEnabled_False() {
         let subject = UIView(frame: CGRect.zero)
-        Observable.just(false).subscribe(subject.rx_hidden).dispose()
+        Observable.just(false).subscribe(subject.rx.hidden).dispose()
 
         XCTAssertTrue(subject.isHidden == false)
     }
@@ -35,14 +35,14 @@ extension UIViewTests {
 extension UIViewTests {
     func testAlpha_0() {
         let subject = UIView(frame: CGRect.zero)
-        Observable.just(0).subscribe(subject.rx_alpha).dispose()
+        Observable.just(0).subscribe(subject.rx.alpha).dispose()
 
         XCTAssertTrue(subject.alpha == 0.0)
     }
 
     func testAlpha_1() {
         let subject = UIView(frame: CGRect.zero)
-        Observable.just(1).subscribe(subject.rx_alpha).dispose()
+        Observable.just(1).subscribe(subject.rx.alpha).dispose()
 
         XCTAssertTrue(subject.alpha == 1.0)
     }
diff --git a/Tests/RxCocoaTests/UIViewControler+RxTests.swift b/Tests/RxCocoaTests/UIViewControler+RxTests.swift
index 15d1a1fc..13bce2c1 100644
--- a/Tests/RxCocoaTests/UIViewControler+RxTests.swift
+++ b/Tests/RxCocoaTests/UIViewControler+RxTests.swift
@@ -17,8 +17,8 @@ class UITViewControllerTests : RxTest {
   func testRxTitle() {
     let viewController = UIViewController()
 
-    _ = Observable.just("title").bindTo(viewController.rx_title)
+    _ = Observable.just("title").bindTo(viewController.rx.title)
 
     XCTAssertEqual("title", viewController.title)
   }
-}
\ No newline at end of file
+}