coroutine: merge from trunk
coroutine: merge from trunk
coroutine: merge from trunk (fix)