Index: src/libcfa/concurrency/invoke.c
===================================================================
--- src/libcfa/concurrency/invoke.c	(revision a68caae22d277c0074021f06f7c4eea08c9c9c10)
+++ src/libcfa/concurrency/invoke.c	(revision 80d9e49c456e684d40f6c36e46ac4cd4b438d54c)
@@ -13,21 +13,34 @@
 // Called from the kernel when starting a coroutine or task so must switch back to user mode.
 
-void invokeCoroutine(covptr_t* vthis)
-{
-      LIB_DEBUG_PRINTF("Invoke : Received %p (v %p)\n", vthis, *vthis);
+extern void __suspend__F___1(void);
 
-      struct coroutine* cor = get_coroutine( vthis );
+void invokeCoroutine(
+      void (*main)(void *), 
+      struct coroutine *(*get_coroutine)(void *), 
+      void *this
+) {
+      LIB_DEBUG_PRINTF("Invoke : Received %p (main %p, get_c %p)\n", this, main, get_coroutine);
+
+      struct coroutine* cor = get_coroutine( this );
+
+      if(cor->state == Primed) {
+            __suspend__F___1();
+      }
 
       cor->state = Active;
 
-      (*vthis)->main( get_object(vthis) );
+      main( this );
 }
 
 
-void startCoroutine(covptr_t* vthis, void (*invoke)(covptr_t*)) {
-      LIB_DEBUG_PRINTF("StartCoroutine : Passing in %p (v %p) to %p\n", vthis, *vthis, invoke);
+void startCoroutine(
+      void (*main)(void *), 
+      struct coroutine *(*get_coroutine)(void *), 
+      void *this, 
+      void (*invoke)(void *)
+) {
+      LIB_DEBUG_PRINTF("StartCoroutine : Passing in %p (main %p, get_c %p) to %p\n", this, main, get_coroutine, invoke);
 
-      struct coroutine* this = get_coroutine( vthis );
-      struct coStack_t* stack = &this->stack;
+      struct coStack_t* stack = &get_coroutine( this )->stack;
 
 #if defined( __i386__ )
@@ -37,6 +50,6 @@
 	    void *rturn;				      // where to go on return from uSwitch
 	    void *dummyReturn;				// fake return compiler would have pushed on call to uInvoke
-	    void *argument;				// for 16-byte ABI, 16-byte alignment starts here
-	    void *padding[3];				// padding to force 16-byte alignment, as "base" is 16-byte aligned
+	    void *argument[3];				// for 16-byte ABI, 16-byte alignment starts here
+	    void *padding;				// padding to force 16-byte alignment, as "base" is 16-byte aligned
 	};
 
@@ -45,5 +58,5 @@
 
 	((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->dummyReturn = NULL;
-	((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->argument = vthis;     // argument to invoke
+	((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->argument[0] = this;     // argument to invoke
 	((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->rturn = invoke;
 
@@ -61,5 +74,5 @@
       ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->dummyReturn = NULL;
       ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->rturn = coInvokeStub;
-      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[0] = vthis;
+      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[0] = this;
       ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[1] = invoke;
 #else
Index: src/libcfa/concurrency/invoke.h
===================================================================
--- src/libcfa/concurrency/invoke.h	(revision a68caae22d277c0074021f06f7c4eea08c9c9c10)
+++ src/libcfa/concurrency/invoke.h	(revision 80d9e49c456e684d40f6c36e46ac4cd4b438d54c)
@@ -10,24 +10,5 @@
 #define _INVOKE_H_
 
-      #define OFFSET_OF(type, field) ((intptr_t)( &((type*)0)->field))
-      #define VPTR_OFFSET(type, vptr, field) (OFFSET_OF(type, field) - OFFSET_OF(type, vptr))
-
-      struct coVtable_t { 
-            void (*main)(void*);
-            intptr_t offset_coroutine;
-            intptr_t offset_object;
-      };
-
-      typedef struct coVtable_t* covptr_t;
-
-      static inline struct coroutine* get_coroutine(covptr_t* vthis) {
-            return (struct coroutine*) ( ((intptr_t)vthis) + ((intptr_t)(*vthis)->offset_coroutine) ); 
-      }
-
-      static inline void* get_object(covptr_t* vthis) {
-            return (void*) ( ((intptr_t)vthis) + ((intptr_t)(*vthis)->offset_object) ); 
-      }
-
-      struct coStack_t {
+     struct coStack_t {
             unsigned int size;		// size of stack
             void *storage;			// pointer to stack
@@ -39,5 +20,5 @@
       };
 
-      enum coroutine_state { Start, Inactive, Active, Halt };
+      enum coroutine_state { Start, Inactive, Active, Halt, Primed };
 
       struct coroutine {
@@ -52,6 +33,4 @@
       };
 
-      void invokeCoroutine(covptr_t* this);
-      void startCoroutine(covptr_t* this, void (*invoke)(covptr_t*));
 #endif //_INVOKE_H_
 #else //! defined(__CFA_INVOKE_PRIVATE__)
Index: src/libcfa/concurrency/threads
===================================================================
--- src/libcfa/concurrency/threads	(revision a68caae22d277c0074021f06f7c4eea08c9c9c10)
+++ src/libcfa/concurrency/threads	(revision 80d9e49c456e684d40f6c36e46ac4cd4b438d54c)
@@ -23,15 +23,17 @@
 
 void ?{}(coroutine* this);
-void ?{}(coroutine* this, covptr_t* object);
 
-trait coroutine_t(dtype T) {
+trait is_coroutine(dtype T) {
       void co_main(T* this);
-      covptr_t* vtable(T* this);
+      coroutine* get_coroutine(T* this);
 };
 
 void suspend(void);
 
-forall(dtype T | coroutine_t(T))
+forall(dtype T | is_coroutine(T))
 void resume(T* cor);
+
+forall(dtype T | is_coroutine(T))
+void prime(T* cor);
 
 #endif //__THREADS_H__
Index: src/libcfa/concurrency/threads.c
===================================================================
--- src/libcfa/concurrency/threads.c	(revision a68caae22d277c0074021f06f7c4eea08c9c9c10)
+++ src/libcfa/concurrency/threads.c	(revision 80d9e49c456e684d40f6c36e46ac4cd4b438d54c)
@@ -34,5 +34,8 @@
 static size_t pageSize = 0;				// architecture pagesize
 
-static coroutine main_coroutine;
+void ?{}(coStack_t* this, size_t size);
+void ?{}(coroutine* this, size_t size);
+
+static coroutine main_coroutine = { 1000 };
 static coroutine* current_coroutine = &main_coroutine;
 
@@ -43,4 +46,12 @@
 void ctxSwitchDirect(coroutine* src, coroutine* dst);
 void create_stack( coStack_t* this, unsigned int storageSize );	// used by all constructors
+
+extern "C" {
+      forall(dtype T | is_coroutine(T))
+      void invokeCoroutine(T* this);
+
+      forall(dtype T | is_coroutine(T))
+      void startCoroutine(T* this, void (*invoke)(T*));
+}
 
 void ?{}(coStack_t* this) {
@@ -52,4 +63,9 @@
 	this->top		= NULL;	// address of top of storage
 	this->userStack	= false;	
+}
+
+void ?{}(coStack_t* this, size_t size) {
+	this{};
+	this->size = size;
 
 	create_stack(this, this->size);
@@ -66,9 +82,8 @@
 }
 
-void ?{}(coroutine* this, covptr_t* object)
+void ?{}(coroutine* this, size_t size)
 {
 	this{};
-
-	startCoroutine(object, invokeCoroutine);
+	(&this->stack){size};
 }
 
@@ -88,8 +103,13 @@
 }
 
-forall(dtype T | coroutine_t(T))
+forall(dtype T | is_coroutine(T))
 void resume(T* cor) {
 	coroutine* src = this_coroutine();		// optimization
-	coroutine* dst = get_coroutine(vtable(cor));
+	coroutine* dst = get_coroutine(cor);
+
+	if( ((intptr_t)dst->stack.base) == 0 ) {
+		create_stack(&dst->stack, dst->stack.size);
+		startCoroutine(cor, invokeCoroutine);
+	}
 
 	if ( src != dst ) {				// not resuming self ?
@@ -103,4 +123,13 @@
 }
 
+forall(dtype T | is_coroutine(T))
+void prime(T* cor) {
+	coroutine* this = get_coroutine(cor);
+	assert(this->state == Start);
+
+	this->state = Primed;
+	resume(cor);
+}
+
 void ctxSwitchDirect(coroutine* src, coroutine* dst) {
 	// THREAD_GETMEM( This )->disableInterrupts();
Index: src/tests/coroutine.c
===================================================================
--- src/tests/coroutine.c	(revision a68caae22d277c0074021f06f7c4eea08c9c9c10)
+++ src/tests/coroutine.c	(revision 80d9e49c456e684d40f6c36e46ac4cd4b438d54c)
@@ -4,27 +4,13 @@
 struct Fibonacci {
       int fn; // used for communication
-      covptr_t v;
       coroutine c;
-};
-
-void co_main(Fibonacci* this);
-covptr_t* vtable(Fibonacci* this);
-
-//GENERATED in proposal for virtuals
-void co_main_fib(void* this) {
-      co_main( (Fibonacci*) this );
-}
-
-//GENERATED in proposal for virtuals
-static coVtable_t FibonacciVtable = {
-      co_main_fib,
-      VPTR_OFFSET(Fibonacci, v, c),
-      VPTR_OFFSET(Fibonacci, v, fn)      
 };
 
 void ?{}(Fibonacci* this) {
       this->fn = 0;
-      this->v = &FibonacciVtable;  //GENERATED in proposal for virtuals
-      (&this->c) { &this->v };
+}
+
+coroutine* get_coroutine(Fibonacci* this) {
+      return &this->c;
 }
 
@@ -57,8 +43,4 @@
 }
 
-covptr_t* vtable(Fibonacci* this) {
-      return &this->v;
-}
-
 int main() {
       Fibonacci f1, f2;
