Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 72713e5bd3cf1fe33bcf6d53d418f97ac9ed6c2c)
+++ libcfa/src/enum.cfa	(revision c333ed2955945a8e97424f193052311ca6b4131f)
@@ -0,0 +1,23 @@
+#include "enum.hfa"
+#include "fstream.hfa"
+
+forall(E, T| TypedEnum(E, T)) {
+    // constructors
+
+    // comparison
+    int ?==?(E l, E r) { return posE(l) == posE(r); }
+    int ?!=?(E l, E r) { return !(l == 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); }
+
+    // for testing; To be removed
+    // #include <string.h>
+    char * typeEnumString(E e) {
+        // char* out = malloc(sizeof(char) * (5 + strlen(labelE(e) + 1)));
+        // return strcat(strcat(out, "Enum "), labelE(e));
+        return labelE(e);
+    }
+}
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 72713e5bd3cf1fe33bcf6d53d418f97ac9ed6c2c)
+++ libcfa/src/enum.hfa	(revision c333ed2955945a8e97424f193052311ca6b4131f)
@@ -6,5 +6,5 @@
 };
 
-forall(E | Bounded(E)) trait Serial {
+forall(E, T| Bounded(E)) trait Serial {
     unsigned fromInstance(E e);
     E fromInt(unsigned i);
@@ -13,8 +13,12 @@
 };
 
-forall(E, T) trait TypedEnum {
-    T valueE(E e);
+// Opague Enum + TypedEnum
+forall(E, T | Serial(E, T)) trait CfaEnum { 
     char * labelE(E e);
     unsigned int posE(E e);
+};
+
+forall(E, T | CfaEnum(E, T)) trait TypedEnum {
+    T valueE(E e);
 };
 
@@ -28,3 +32,6 @@
     int ?>?(E l, E r);
     int ?>=?(E l, E r);
+
+    // for testing; To be removed
+    char * typeEnumString(E e);
 }
