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 be3416ddba79f884d9277e46720fed68f698c5dd)
@@ -0,0 +1,29 @@
+
+
+auto result = co_await expression;
+
+//   |  |
+//   |  |
+//  \    /
+//   \  /
+//    \/
+
+auto&& __a = expression;
+if (!__a.await_ready()) {
+	__a.await_suspend(coroutine-handle)
+	// ...suspend/resume point...
+}
+auto result = __a.await_resume();
+
+//==================================================
+
+
+co_yield i;
+
+//   |  |
+//   |  |
+//  \    /
+//   \  /
+//    \/
+
+co_await __promise.yield_value(i);
Index: doc/papers/concurrency/c++-cor/base.hpp
===================================================================
--- doc/papers/concurrency/c++-cor/base.hpp	(revision be3416ddba79f884d9277e46720fed68f698c5dd)
+++ doc/papers/concurrency/c++-cor/base.hpp	(revision be3416ddba79f884d9277e46720fed68f698c5dd)
@@ -0,0 +1,20 @@
+#include <iostream>
+#include <experimental/coroutine>
+
+struct suspend_never {
+	bool await_ready() noexcept {
+		return true;
+	}
+
+	void await_suspend(std::experimental::coroutine_handle<>) noexcept {}
+	void await_resume() noexcept {}
+};
+
+struct suspend_always {
+	bool await_ready() noexcept {
+		return false;
+	}
+
+	void await_suspend(std::experimental::coroutine_handle<>) noexcept {}
+	void await_resume() noexcept {}
+};
Index: doc/papers/concurrency/c++-cor/counter.cpp
===================================================================
--- doc/papers/concurrency/c++-cor/counter.cpp	(revision f1c1339e829313edbd1b7faa98f6529025d7f5db)
+++ doc/papers/concurrency/c++-cor/counter.cpp	(revision be3416ddba79f884d9277e46720fed68f698c5dd)
@@ -1,22 +1,3 @@
-#include <iostream>
-#include <experimental/coroutine>
-
-struct suspend_never {
-	bool await_ready() noexcept {
-		return true;
-	}
-
-	void await_suspend(std::experimental::coroutine_handle<>) noexcept {}
-	void await_resume() noexcept {}
-};
-
-struct suspend_always {
-	bool await_ready() noexcept {
-		return false;
-	}
-
-	void await_suspend(std::experimental::coroutine_handle<>) noexcept {}
-	void await_resume() noexcept {}
-};
+#include "base.hpp"
 
 struct counter_cor {
Index: doc/papers/concurrency/c++-cor/fib.cpp
===================================================================
--- doc/papers/concurrency/c++-cor/fib.cpp	(revision f1c1339e829313edbd1b7faa98f6529025d7f5db)
+++ doc/papers/concurrency/c++-cor/fib.cpp	(revision be3416ddba79f884d9277e46720fed68f698c5dd)
@@ -1,22 +1,7 @@
-#include <iostream>
-#include <experimental/coroutine>
+#include "base.hpp"
 
-struct suspend_never {
-	bool await_ready() noexcept {
-		return true;
-	}
-
-	void await_suspend(std::experimental::coroutine_handle<>) noexcept {}
-	void await_resume() noexcept {}
-};
-
-struct suspend_always {
-	bool await_ready() noexcept {
-		return false;
-	}
-
-	void await_suspend(std::experimental::coroutine_handle<>) noexcept {}
-	void await_resume() noexcept {}
-};
+#include <algorithm>
+#include <iterator>
+#include <vector>
 
 template<typename T>
@@ -29,6 +14,6 @@
 		}
 
-		auto initial_suspend() { return suspend_never(); }
-		auto final_suspend()   { return suspend_never(); }
+		auto initial_suspend() { return suspend_always(); }
+		auto final_suspend()   { return suspend_always(); }
 
 		void return_value(T value) {
@@ -74,4 +59,33 @@
 		return _coroutine.promise()._value;
 	}
+
+	struct iterator : std::iterator<std::input_iterator_tag, T> {
+		std::experimental::coroutine_handle<promise_type> _coroutine = nullptr;
+
+		iterator() = default;
+		explicit iterator(std::experimental::coroutine_handle<promise_type> coroutine)
+			: _coroutine(coroutine)
+		{}
+
+		iterator& operator++() {
+			_coroutine.resume();
+			return *this;
+		}
+
+		T const & operator*() const {
+			return _coroutine.promise()._value;
+		}
+	};
+
+	iterator begin() {
+		if(_coroutine) {
+			_coroutine.resume();
+			if(_coroutine.done()) { return end(); }
+		}
+
+		return iterator{ _coroutine };
+	}
+
+	iterator end() { return iterator{}; }
 };
 
@@ -86,8 +100,20 @@
 
 int main() {
-	auto f1 = fib();
-	auto f2 = fib();
-	for(int i = 0; i < 10; i++) {
-		std::cout << f1.next() << " " << f2.next() << std::endl;
+	{
+		auto f1 = fib();
+		auto f2 = fib();
+		for(int i = 0; i < 10; i++) {
+			std::cout << f1.next() << " " << f2.next() << std::endl;
+		}
+	}
+
+	{
+		auto f1 = fib();
+		std::vector<int> fibs;
+		std::copy_n(f1.begin(), 10, std::back_inserter(fibs));
+
+		for(auto i : fibs) {
+			std::cout << i << std::endl;
+		}
 	}
 }
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 be3416ddba79f884d9277e46720fed68f698c5dd)
@@ -0,0 +1,80 @@
+
+#include "base.hpp"
+
+struct fmt_cor {
+	struct promise_type {
+		char * _value = nullptr;
+
+		fmt_cor get_return_object() {
+			return fmt_cor(std::experimental::coroutine_handle<promise_type>::from_promise(*this));
+		}
+
+		auto initial_suspend() { return suspend_never(); }
+		auto final_suspend()   {
+			return suspend_always();
+		}
+
+		void return_void() {}
+
+		auto yield_value(char & value) {
+			_value = &value;
+			return suspend_always();
+		}
+
+		void unhandled_exception() {}
+	};
+
+	std::experimental::coroutine_handle<promise_type> _coroutine = nullptr;
+
+	explicit fmt_cor(std::experimental::coroutine_handle<promise_type> coroutine)
+		: _coroutine(coroutine)
+	{}
+
+	~fmt_cor() {
+		if(_coroutine) { _coroutine.destroy(); }
+	}
+
+	fmt_cor() = default;
+	fmt_cor(fmt_cor const &) = delete;
+	fmt_cor& operator=(fmt_cor const &) = delete;
+
+	fmt_cor(fmt_cor&& other) {
+		std::swap(_coroutine, other._coroutine);
+	}
+
+	fmt_cor& operator=(fmt_cor&& other) {
+		if(&other != this) {
+			_coroutine = other._coroutine;
+			other._coroutine = nullptr;
+		}
+		return *this;
+	}
+
+	void send(char a) {
+		assert(_coroutine.promise()._value);
+		*_coroutine.promise()._value = a;
+		_coroutine.resume();
+	}
+};
+
+fmt_cor Fmt() {
+	char c;
+	int g, b;
+	for(;;) {
+		for(g = 0; g < 5; g++) {
+			for(b = 0; b < 4; b++) {
+				co_yield c;
+				std::cout << c;
+			}
+			std::cout << "  ";
+		}
+		std::cout << std::endl;
+	}
+}
+
+int main() {
+	auto fmt = Fmt();
+	for(int i = 0; i < 41; i++) {
+		fmt.send('a');
+	}
+}
