 <p>I've tried to produce a "simpler" query that works and so far nothing.</p> <p>If I stick with your basic structure I can offer a slight improvement. Try this:</p> <pre><code>public static IObservable&lt;T&gt; FirstOrLastAsync&lt;T&gt;( this IObservable&lt;T&gt; source, Func&lt;T, bool&gt; pred) { return Observable.Create&lt;T&gt;(o =&gt; { var hot = source.Publish(); var store = new AsyncSubject&lt;T&gt;(); var d1 = hot.Subscribe(store); var d2 = hot .Where(x =&gt; pred(x)) .Concat(store) .Take(1) .Subscribe(o); var d3 = hot.Connect(); return new CompositeDisposable(d1, d2, d3); }); } </code></pre> <p>It's not hugely better, but I like it better than using <code>Amb</code>. It's just a tad cleaner I think.</p>