Index: src/tests/coroutine.c
===================================================================
--- src/tests/coroutine.c	(revision d9c44c33df429b559731c041d43b7bee1cfcef97)
+++ src/tests/coroutine.c	(revision 5c811054a9b733b08300e7eaa7910d929010469d)
@@ -3,26 +3,28 @@
 
 struct Fibonacci {
+      int fn; // used for communication
+      covptr_t v;
       coroutine c;
-      coVtable v;
-      int fn; // used for communication
 };
 
-coroutine* this_coroutine(Fibonacci* this);
 void co_main(Fibonacci* this);
-coVtable* vtable(Fibonacci* this);
+covptr_t* vtable(Fibonacci* this);
 
+//GENERATED in proposal for virtuals
 void co_main_fib(void* this) {
       co_main( (Fibonacci*) this );
 }
 
-coroutine* this_coroutine_fib(void* this) {
-      return this_coroutine( (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.main = co_main_fib;
-      this->v.this_coroutine = this_coroutine_fib;
-      start(this);
+      this->v = &FibonacciVtable;  //GENERATED in proposal for virtuals
+      (&this->c) { &this->v };
 }
 
@@ -30,5 +32,5 @@
 #ifdef MORE_DEBUG
       sout | "Starting main of coroutine " | this | endl;
-      sout | "Started from " | this_coroutine(this)->last | endl;
+      sout | "Started from " | this->c.last | endl;
 #endif
       int fn1, fn2; 		// retained between resumes
@@ -55,9 +57,5 @@
 }
 
-coroutine* this_coroutine(Fibonacci* this) {
-      return &this->c;
-}
-
-coVtable* vtable(Fibonacci* this) {
+covptr_t* vtable(Fibonacci* this) {
       return &this->v;
 }
@@ -66,5 +64,15 @@
       Fibonacci f1, f2;
 #ifdef MORE_DEBUG      
-      sout | "User coroutines : " | &f1 | ' ' | &f1 | endl;
+      Fibonacci *pf1 = &f1, *pf2 = &f2;
+      coroutine *cf1 = &f1.c, *cf2 = &f2.c;
+      covptr_t  *vf1 = vtable(pf1), *vf2 = vtable(pf2);
+      coroutine *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 ) {
