Index: doc/papers/concurrency/c++-cor/C++Cor-ts.cpp
===================================================================
--- doc/papers/concurrency/c++-cor/C++Cor-ts.cpp	(revision be3416ddba79f884d9277e46720fed68f698c5dd)
+++ doc/papers/concurrency/c++-cor/C++Cor-ts.cpp	(revision 8f936bfe68b397cd1aa78e1ca4aa63bd035cedd3)
@@ -18,5 +18,4 @@
 //==================================================
 
-
 co_yield i;
 
@@ -28,2 +27,16 @@
 
 co_await __promise.yield_value(i);
+
+//==================================================
+
+... coroutine() {
+	__coroutine_context* __context = new __coroutine_context{};
+	__return = __context->_promise.get_return_object();
+	co_await   __context->_promise.initial_suspend();
+
+	...
+
+__final_suspend_label:
+	co_await __context->promise.final_suspend();
+	delete __context;
+}
Index: doc/papers/concurrency/c++-cor/fmt.cpp
===================================================================
--- doc/papers/concurrency/c++-cor/fmt.cpp	(revision be3416ddba79f884d9277e46720fed68f698c5dd)
+++ doc/papers/concurrency/c++-cor/fmt.cpp	(revision 8f936bfe68b397cd1aa78e1ca4aa63bd035cedd3)
@@ -4,5 +4,6 @@
 struct fmt_cor {
 	struct promise_type {
-		char * _value = nullptr;
+		char _value;
+		int g, b;
 
 		fmt_cor get_return_object() {
@@ -11,16 +12,24 @@
 
 		auto initial_suspend() { return suspend_never(); }
-		auto final_suspend()   {
-			return suspend_always();
+		auto final_suspend()   { return suspend_always(); }
+
+		void return_void() {}
+		void unhandled_exception() {}
+	};
+
+	struct get {
+		promise_type * _promise = nullptr;
+
+		bool await_ready() noexcept {
+			return false;
 		}
 
-		void return_void() {}
-
-		auto yield_value(char & value) {
-			_value = &value;
-			return suspend_always();
+		void await_suspend(std::experimental::coroutine_handle<promise_type> _coroutine) noexcept {
+			_promise = &_coroutine.promise();
 		}
-
-		void unhandled_exception() {}
+		char await_resume() noexcept {
+			assert(_promise);
+			return _promise->_value;
+		}
 	};
 
@@ -52,6 +61,5 @@
 
 	void send(char a) {
-		assert(_coroutine.promise()._value);
-		*_coroutine.promise()._value = a;
+		_coroutine.promise()._value = a;
 		_coroutine.resume();
 	}
@@ -59,11 +67,10 @@
 
 fmt_cor Fmt() {
-	char c;
-	int g, b;
+	int g; // = co_await fmt_cor::g();
+	int b; // = co_await fmt_cor::b();
 	for(;;) {
 		for(g = 0; g < 5; g++) {
 			for(b = 0; b < 4; b++) {
-				co_yield c;
-				std::cout << c;
+				std::cout << co_await fmt_cor::get();
 			}
 			std::cout << "  ";
