 <p>Maybe this is what you're trying to do:</p> <pre><code>def finalFuture(): Future[Option[(A1, Option[B1])]] = for ( o1 &lt;- outerFuture(); o2 &lt;- o1 match { case Some(a) =&gt; innerFuture(a.id).map(b =&gt; Some(a, b)) case _ =&gt; Future(None) } ) yield o2 </code></pre>