Index: libcfa/src/concurrency/cofor.cfa
===================================================================
--- libcfa/src/concurrency/cofor.cfa	(revision 72b518fc0f393f86bf6bb43b0dd79189e24e9cf3)
+++ libcfa/src/concurrency/cofor.cfa	(revision ee9ad4067d87f93f95150db093d5d9dc0266eecd)
@@ -4,10 +4,10 @@
 // cofor ( uC++ COFOR )
 
-thread co_runner {
+thread cofor_runner {
 	ssize_t low, high;
 	__cofor_body_t loop_body;
 };
 
-static void ?{}( co_runner & this, ssize_t low, ssize_t high, __cofor_body_t loop_body ) {
+static void ?{}( cofor_runner & this, ssize_t low, ssize_t high, __cofor_body_t loop_body ) {
 	this.low = low;
 	this.high = high;
@@ -15,5 +15,5 @@
 }
 
-void main( co_runner & this ) with( this ) {
+void main( cofor_runner & this ) with( this ) {
 	for ( ssize_t i = low; i < high; i++ )
 		loop_body(i);
@@ -29,5 +29,5 @@
 	ssize_t i = 0;
 	ssize_t stride_iter = low;
-	co_runner * runners[ threads ];
+	cofor_runner * runners[ threads ];
 	for ( i; threads ) {
 		runners[i] = alloc();
@@ -45,25 +45,3 @@
 }
 
-//////////////////////////////////////////////////////////////////////////////////////////
-// parallel (COBEGIN/COEND)
 
-thread para_runner {
-	parallel_stmt_t body;
-	void * arg;
-};
-
-static void ?{}( para_runner & this, parallel_stmt_t body, void * arg ) { 
-	this.body = body;
-	this.arg = arg;
-}
-
-void main( para_runner & this ) with( this ) { body( arg ); }
-
-void parallel( parallel_stmt_t * stmts, void ** args, size_t num ) libcfa_public {
-	para_runner * runners[ num ];
-	for ( i; num )
-		(*(runners[i] = malloc())){ stmts[i], args[i] };
-	for ( i; num )
-		delete( runners[i] );
-}
-
Index: libcfa/src/concurrency/cofor.hfa
===================================================================
--- libcfa/src/concurrency/cofor.hfa	(revision 72b518fc0f393f86bf6bb43b0dd79189e24e9cf3)
+++ libcfa/src/concurrency/cofor.hfa	(revision ee9ad4067d87f93f95150db093d5d9dc0266eecd)
@@ -16,6 +16,29 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
-// parallel (COBEGIN/COEND)
-typedef void (*parallel_stmt_t)( void * );
+// corun
 
-void parallel( parallel_stmt_t * stmts, void ** args, size_t num );
+// 
+typedef void (*__CFA_corun_lambda_t)( void );
+
+// used to run a corun statement in parallel
+thread co_runner {
+	__CFA_corun_lambda_t body;
+};
+
+// wraps a co_runner to provide RAII deallocation
+struct runner_block {
+    co_runner * runner;
+};
+static inline void ?{}( co_runner & this, __CFA_corun_lambda_t body ) { this.body = body; }
+
+void main( co_runner & this ) with( this ) { body(); }
+
+static inline void ?{}( runner_block & this ) {}
+static inline void ?{}( runner_block & this, __CFA_corun_lambda_t body ) {
+    (*(this.runner = malloc())){ body };
+}
+
+static inline void ^?{}( runner_block & this ) {
+    delete( this.runner );
+}
+
