diff --git a/lib/fibers/transform.js b/lib/fibers/transform.js
index <HASH>..<HASH> 100644
--- a/lib/fibers/transform.js
+++ b/lib/fibers/transform.js
@@ -255,7 +255,8 @@ function transform(source, options) {
 
 			// Close up the function
 			body.map(walk);
-			if (options.generators && async) {
+			// we don't need the extra `yield undefined;` for harmony generators because they signal the end with a done flag instead of an exception
+			if (false && options.generators && async) {
 				// add yield if necessary -- could do a smarter flow analysis but an extra yield won't hurt
 				var end = this.end - 1;
 				while (source[end] !== '}') end--;
diff --git a/lib/generators/runtime.js b/lib/generators/runtime.js
index <HASH>..<HASH> 100644
--- a/lib/generators/runtime.js
+++ b/lib/generators/runtime.js
@@ -53,7 +53,7 @@ var globals = require('streamline/lib/globals');
 			while (g) {
 				try {
 					val = err ? g.throw(err) : g.send(val);
-					val = val.value;
+					val = val.done ? undefined : val.value;
 					err = null;
 					// if we get PENDING, the current call completed with a pending I/O
 					// resume will be called again when the I/O completes. So just save the context and return here.
issue #<I> - do not generate 'yield undefined' at the end of functions