The implementation details differ considerably. If suspending function A invokes B, then invokes C, which suspends, then both Kotlin and Quasar would keep the A->B->C execution stack on heap while the execution is suspended. The resume behaviour is different, though. Quasar, AFAIK (disclaimer: I have not checked myself) would reconstruct the A->B->C stack and let C resume, while Kotlin restores only C’s frame onto stack keeping A->B on heap until C returns. When C returns to B, then B gets restored onto stack, and so on. This has a benefit that in Kotlin coroutines resume takes O(1) time regardless of the depth of the stack, but has the curious side effect that after deep resume your Java stack can get inverted (you can end up with C.resume->B.resume->A.resume on stack).