coroutine: merge from trunk
coroutine: merge from trunk