Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 31ce3d6b3b66f7fe2acde378a39107b39c636552)
+++ src/Concurrency/Keywords.cc	(revision e04b63656262df0536fe1e7313b9285ad14ac90b)
@@ -150,5 +150,5 @@
 			coroutine_decl = decl;
 		}
-		else if ( false ) {
+		else if ( decl->is_coroutine() ) {
 			handle( decl );
 		}
@@ -178,5 +178,5 @@
 		);
 
-		decl->get_members().push_front( cor );
+		decl->get_members().push_back( cor );
 
 		return cor;
@@ -201,4 +201,20 @@
 			)
 		);
+		type->get_returnVals().push_back(
+			new ObjectDecl(
+				"ret",
+				noStorage,
+				LinkageSpec::Cforall,
+				nullptr,
+				new PointerType(
+					noQualifiers,
+					new StructInstType(
+						noQualifiers,
+						coroutine_decl
+					)
+				),
+				nullptr
+			)
+		);
 
 		CompoundStmt * statement = new CompoundStmt( noLabels );
@@ -206,22 +222,29 @@
 			new ReturnStmt(
 				noLabels,
-				new UntypedMemberExpr(
-					new NameExpr( "__cor" ),
-					new NameExpr( "this" )
+				new AddressExpr(
+					new UntypedMemberExpr(
+						new NameExpr( "__cor" ),
+						new UntypedExpr(
+							new NameExpr( "*?" ),
+							{ new NameExpr( "this" ) }
+						)
+					)
 				)
 			)
 		);
 
-		declsToAddAfter.push_back( 
-			new FunctionDecl(
-				"get_coroutine",
-				Type::Static,
-				LinkageSpec::Cforall,
-				type,
-				statement,
-				noAttributes,
-				Type::Inline
-			)
-		);
+		FunctionDecl * get_decl = new FunctionDecl(
+			"get_coroutine",
+			Type::Static,
+			LinkageSpec::Cforall,
+			type,
+			statement,
+			noAttributes,
+			Type::Inline
+		);
+
+		declsToAddAfter.push_back( get_decl );
+
+		get_decl->fixUniqueId();
 	}
 	
@@ -285,5 +308,5 @@
 
 		//Make sure that typed isn't mutex
-		if( ! base->get_mutex() ) throw SemanticError( "mutex keyword may only appear once per argument ", arg );
+		if( base->get_mutex() ) throw SemanticError( "mutex keyword may only appear once per argument ", arg );
 	}
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 31ce3d6b3b66f7fe2acde378a39107b39c636552)
+++ src/Parser/lex.ll	(revision e04b63656262df0536fe1e7313b9285ad14ac90b)
@@ -202,5 +202,5 @@
 __const__		{ KEYWORD_RETURN(CONST); }				// GCC
 continue		{ KEYWORD_RETURN(CONTINUE); }
-_Coroutine		{ KEYWORD_RETURN(COROUTINE); }			// CFA
+coroutine		{ KEYWORD_RETURN(COROUTINE); }			// CFA
 default			{ KEYWORD_RETURN(DEFAULT); }
 disable			{ KEYWORD_RETURN(DISABLE); }			// CFA
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 31ce3d6b3b66f7fe2acde378a39107b39c636552)
+++ src/SynTree/Type.h	(revision e04b63656262df0536fe1e7313b9285ad14ac90b)
@@ -117,6 +117,8 @@
 		bool operator!=( Qualifiers other ) const { return (val & Mask) != (other.val & Mask); }
 		bool operator<=( Qualifiers other ) const {
-			return is_const <= other.is_const && is_volatile <= other.is_volatile &&
-				is_mutex >= other.is_mutex && is_atomic == other.is_atomic;
+			return is_const    <= other.is_const        //Any non-const converts to const without cost
+					&& is_volatile <= other.is_volatile     //Any non-volatile converts to volatile without cost
+					&& is_mutex    >= other.is_mutex        //Any mutex converts to non-mutex without cost
+					&& is_atomic   == other.is_atomic;      //No conversion from atomic to non atomic is free
 		}
 		bool operator<( Qualifiers other ) const { return *this != other && *this <= other; }
Index: src/tests/coroutine.c
===================================================================
--- src/tests/coroutine.c	(revision 31ce3d6b3b66f7fe2acde378a39107b39c636552)
+++ src/tests/coroutine.c	(revision e04b63656262df0536fe1e7313b9285ad14ac90b)
@@ -2,7 +2,6 @@
 #include <coroutine>
 
-struct Fibonacci {
+coroutine Fibonacci {
       int fn; // used for communication
-      coroutine_desc __cor;
 };
 
@@ -11,13 +10,5 @@
 }
 
-coroutine_desc* get_coroutine(Fibonacci* this) {
-      return &this->__cor;
-}
-
 void main(Fibonacci* this) {
-#ifdef MORE_DEBUG
-      sout | "Starting main of coroutine " | this | endl;
-      sout | "Started from " | this->__cor.last | endl;
-#endif
       int fn1, fn2; 		// retained between resumes
       this->fn = 0;
@@ -45,17 +36,4 @@
 int main() {
       Fibonacci f1, f2;
-#ifdef MORE_DEBUG      
-      Fibonacci *pf1 = &f1, *pf2 = &f2;
-      coroutine_desc *cf1 = &f1.c, *cf2 = &f2.c;
-      covptr_t  *vf1 = vtable(pf1), *vf2 = vtable(pf2);
-      coroutine_desc *cv1 = get_coroutine(vf1), *cv2 = get_coroutine(vf2);
-      Fibonacci *ov1 = (Fibonacci *)get_object(vf1), *ov2 = (Fibonacci *)get_object(vf2);
-
-      sout | "User coroutines : " | pf1 | ' ' | pf2 | endl;
-      sout | "Coroutine data  : " | cf1 | ' ' | cf2 | endl;
-      sout | "Vptr address    : " | vf1 | ' ' | vf2 | endl;
-      sout | "Vptr obj data   : " | ov1 | ' ' | ov2 | endl;
-      sout | "Vptr cor data   : " | cv1 | ' ' | cv2 | endl;
-#endif
       for ( int i = 1; i <= 10; i += 1 ) {
             sout | next(&f1) | ' ' | next(&f2) | endl;
