 	 Immediately after that `.Complete` is emitted.
 	 */
 	public func discoverServices(serviceUUIDs: [CBUUID]?) -> Observable<[Service]> {
-		let observable = peripheral.rx_didDiscoverServices
+        if let identifiers = serviceUUIDs, let services = self.services?.filter({ identifiers.contains($0.UUID) })
+            where identifiers.count == services.count {
+            return ensureValidPeripheralState(Observable.just(services))
+        } else {
+            let observable = peripheral.rx_didDiscoverServices
 			.flatMap {
 				(_, error) -> Observable<[Service]> in
-				if let cachedRxServices = self.peripheral.services  {
-					let cachedServices = cachedRxServices.map { Service(peripheral: self, service: $0) }
+				if let cachedServices = self.services  {
 					guard let identifiers = serviceUUIDs else { return Observable.just(cachedServices) }
 					let uuids = cachedServices.map { $0.service.uuid }
 					if Set(identifiers).isSubsetOf(Set(uuids)) {

	 */
	public func discoverIncludedServices(includedServiceUUIDs: [CBUUID]?,
		forService service: Service) -> Observable<[Service]> {
			let observable = peripheral
				.rx_didDiscoverIncludedServicesForService
				.filter { $0.0 == service.service }

            }
			.take(1)

            return Observable.create { observer in
                let disposable = self.ensureValidPeripheralState(observable).subscribe(observer)
                self.peripheral.discoverServices(serviceUUIDs)
                return AnonymousDisposable {
                    disposable.dispose()
                }
            }
        }
	}

	/**
