Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 73d0e3f4e0ab67804cda0bdfa2660e3905620544)
+++ libcfa/src/enum.cfa	(revision 64eeb06f9e2ea8935a52bacf0f358cc774221c00)
@@ -4,6 +4,21 @@
 #pragma GCC visibility push(default)
 
-forall( ostype & | basic_ostream(ostype), E, V | CfaEnum(E, V) ) {
-	ostype & ?|?( ostype& os, E e ) {
+forall( istype & | istream( istype ), E, V | CfaEnum( E, V ) )
+istype & ?|?( istype & is, E & e ) {
+	if ( eof( is ) ) throwResume ExceptionInst( missing_data );
+	char val[256];
+	int args = fmt( is, "%255s", val );
+	if ( ! eof( is ) && args != 1 ) throwResume ExceptionInst( missing_data );
+	for ( s; E ) {
+		if ( val == label( s ) ) { e = s; break; }
+	} else {
+		fprintf( stderr, "invalid enumeration constant\n" );
+		abort();									// cannot use abort stream
+	} // for
+	return is;
+}
+
+forall( ostype & | ostream( ostype ), E, V | CfaEnum( E, V ) ) {
+	ostype & ?|?( ostype & os, E e ) {
 		return os | label( e );
 	}
@@ -11,36 +26,38 @@
 }
 
-forall( ostype & | basic_ostream(ostype), E | CfaEnum(E, quasi_void) )
-ostype & ?|?( ostype & os, E e ) {
-    return os | label( e );
+forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
+	ostype & ?|?( ostype & os, E e ) {
+		return os | label( e );
+	}
+	OSTYPE_VOID_IMPL( E )
 }
 
-forall( E, V | CfaEnum(E, V) ) {						// relational operators
-    int ?==?(E l, E r) { return posn(l) == posn(r); }
-    int ?!=?(E l, E r) { return posn(l) != posn(r); }
-    int ?<?(E l, E r) { return posn(l) < posn(r); }
-    int ?<=?(E l, E r) { return posn(l) <= posn(r); }
-    int ?>?(E l, E r) { return posn(l) > posn(r); }
-    int ?>=?(E l, E r) { return posn(l) >= posn(r); }
+forall( E, V | CfaEnum( E, V ) ) {						// relational operators
+    int ?==?( E l, E r ) { return posn( l ) == posn( r ); }
+    int ?!=?( E l, E r ) { return posn( l ) != posn( r ); }
+    int ?<?( E l, E r ) { return posn( l ) < posn( r ); }
+    int ?<=?( E l, E r ) { return posn( l ) <= posn( r ); }
+    int ?>?( E l, E r ) { return posn( l ) > posn( r ); }
+    int ?>=?( E l, E r ) { return posn( l ) >= posn( r ); }
 
-    E ++?(E& l) { 
-        l = succ(l);
+    E ++?( E & l ) { 
+        l = succ( l );
         return l;
     }
     
-    E ?++(E& l) {
+    E ?++( E & l ) {
         E ret = l;
-        l = succ(l);
+        l = succ( l );
         return ret;
     }
 
-    E --?(E& l) {
-        l = pred(l);
+    E --?( E & l ) {
+        l = pred( l );
         return l;
     }
 
-    E ?--(E& l) {
+    E ?--( E & l ) {
         E ret = l;
-        l = pred(l);
+        l = pred( l );
         return ret;
     }
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 73d0e3f4e0ab67804cda0bdfa2660e3905620544)
+++ libcfa/src/enum.hfa	(revision 64eeb06f9e2ea8935a52bacf0f358cc774221c00)
@@ -8,5 +8,5 @@
 };
 
-forall( E | Bounded(E) ) trait Serial {
+forall( E | Bounded( E ) ) trait Serial {
     unsigned fromInstance( E e );
     E fromInt( unsigned i );
@@ -16,5 +16,5 @@
 
 // Design one
-forall( E, V | Serial(E) ) trait CfaEnum {
+forall( E, V | Serial( E ) ) trait CfaEnum {
     char * label( E e );
     unsigned int posn( E e );
@@ -24,33 +24,38 @@
 // I/O
 
-forall( ostype & | basic_ostream(ostype), E, V | CfaEnum(E, V) ) {
+forall( istype & | istream( istype ), E, V | CfaEnum( E, V ) )
+istype & ?|?( istype &, E );
+
+forall( ostype & | ostream( ostype ), E, V | CfaEnum( E, V ) ) {
 	ostype & ?|?( ostype &, E );
 	OSTYPE_VOID( E );
 }
 
-forall( ostype & | basic_ostream(ostype), E | CfaEnum(E, quasi_void) )
-ostype & ?|?( ostype &, E );
+forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
+	ostype & ?|?( ostype &, E );
+	OSTYPE_VOID( E );
+}
 
 // Design two <- should go for this if we have change the cost model
-// forall(E | Serial(E)) trait CfaEnum {
-//     char * label(E e);
-//     unsigned int posn(E e);
+// forall( E | Serial( E ) ) trait CfaEnum {
+//     char * label( E e );
+//     unsigned int posn( E e );
 // };
 
-// forall(E, V| CfaEnum(E)) trait TypedEnum {
-//     V value(E e);
+// forall( E, V| CfaEnum( E)) trait TypedEnum {
+//     V value( E e);
 // };
 
-forall( E, V | CfaEnum(E, V) ) {						// relational operators
-    int ?==?(E, E);
-    int ?!=?(E, E);
-    int ?<?(E, E);
-    int ?<=?(E, E);
-    int ?>?(E, E);
-    int ?>=?(E, E);
+forall( E, V | CfaEnum( E, V ) ) {						// relational operators
+    int ?==?( E, E );
+    int ?!=?( E, E );
+    int ?<?( E, E );
+    int ?<=?( E, E );
+    int ?>?( E, E );
+    int ?>=?( E, E );
 
-    int ++?(E&);
-    int ?++(E&);
-    int --?(E&);
-    int ?--(E&);
+    int ++?( E &);
+    int ?++( E &);
+    int --?( E &);
+    int ?--( E &);
 }
