Add generic shell coroutines
Rewrite shell