I'm sure there is a way to do that. You will likely need a ConnectableObservable in some form so you don't need a subscriber to fire it, and you can call connect() to start firing. Caching part might be slightly tricky, but I'm sure somebody on here can can give some insight. Whatever Rx can't do you can implement your own operators.