Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision bf4fe05647e7351daf6f9c05c3737ed92ea225e0)
+++ libcfa/src/enum.cfa	(revision 348f8992a1804b5bc5ecd4646bcdffd6293aa9f0)
@@ -1,16 +1,14 @@
 #include "enum.hfa"
+#include "fstream.hfa"
 
 #pragma GCC visibility push(default)
 
-forall(T, E| TypedEnum(T, E)) {
-    // constructors
+forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V))
+ostype & ?|?(ostype& os, E e) {
+    return os | type_name(e) | "." | labelE(e);
+}
 
-    // comparison
-    int ?==?(E l, E r) { return posE(l) == posE(r); }
-    int ?!=?(E l, E r) { return posE(l) != posE(r); }
-    int ?!=?(E l, zero_t) { return !( posE(l) == 0 ); }
-    int ?<?(E l, E r) { return posE(l) < posE(r); }
-    int ?<=?(E l, E r) { return posE(l) <= posE(r); }
-    int ?>?(E l, E r) { return posE(l) > posE(r); }
-    int ?>=?(E l, E r) {  return posE(l) >= posE(r); }
+forall(ostype & | basic_ostream(ostype), E| CfaEnum(E, quasi_void))
+ostype & ?|?(ostype& os, E e) {
+    return os | type_name(e) | "." | labelE(e);
 }
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision bf4fe05647e7351daf6f9c05c3737ed92ea225e0)
+++ libcfa/src/enum.hfa	(revision 348f8992a1804b5bc5ecd4646bcdffd6293aa9f0)
@@ -1,36 +1,39 @@
 #pragma once
 
-forall(T) { // T is the based type of enum(T)
-    forall(E) trait Bounded {
-        E lowerBound();
-        E upperBound();
-    };
+#include "iostream.hfa"
 
-    forall(E| Bounded(T, E)) trait Serial {
-        unsigned fromInstance(E e);
-        E fromInt(unsigned i);
-        E succ(E e);
-        E pred(E e);
-    };
+forall(E) trait Bounded {
+    E lowerBound();
+    E upperBound();
+};
 
-    // Opague Enum + TypedEnum
-    forall(E | Serial(T, E)) trait CfaEnum { 
-        char * labelE(E e);
-        unsigned int posE(E e);
-    };
+forall(E | Bounded(E)) trait Serial {
+    unsigned fromInstance(E e);
+    E fromInt(unsigned i);
+    E succ(E e);
+    E pred(E e);
+};
 
-    forall(E| CfaEnum(T, E)) trait TypedEnum {
-        T valueE(E e);
-    };
+// Design one
+forall(E, V | Serial(E)) trait CfaEnum {
+    char* labelE(E e);
+    unsigned int posE(E e);
+    V valueE(E e);
+    char* type_name(E e);
+};
 
-	forall(E | TypedEnum(T, E)) {
-		// comparison
-		int ?==?(E l, E r);								// true if l and r are same enumerators
-		int ?!=?(E l, E r);								// true if l and r are different enumerators
-		int ?!=?(E l, zero_t);							// true if l is not the first enumerator
-		int ?<?(E l, E r);								// true if l is an enuemerator before r
-		int ?<=?(E l, E r);								// true if l before or the same as r
-		int ?>?(E l, E r);								// true if l is an enuemrator after r
-		int ?>=?(E l, E r);								// true if l after or the same as r
-	}
-}
+forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V))
+ostype & ?|?(ostype&, E);
+
+forall(ostype & | basic_ostream(ostype), E| CfaEnum(E, quasi_void))
+ostype & ?|?(ostype&, E);
+
+// Design two <- should go for this if we have change the cost model
+// forall(E | Serial(E)) trait CfaEnum {
+//     char* labelE(E e);
+//     unsigned int posE(E e);
+// };
+
+// forall(E, V| CfaEnum(E)) trait TypedEnum {
+//     V valueE(E e);
+// };
