Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 9d5eacb77f6659b84df326bf35fe21bcde7e425b)
+++ libcfa/src/enum.cfa	(revision 236f13390c74aff36386095c9fc9fff394243822)
@@ -10,5 +10,5 @@
 } // scmp
 
-forall( istype & | istream( istype ), E, V | CfaEnum( E, V ) )
+forall( istype & | istream( istype ), E | CfaEnum( E ) )
 istype & ?|?( istype & is, E & e ) {
 //	printf( "here0\n" );
@@ -70,5 +70,12 @@
 }
 
-forall( ostype & | ostream( ostype ), E, V | CfaEnum( E, V ) ) {
+// forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
+// 	ostype & ?|?( ostype & os, E e ) {
+// 		return os | label( e );
+// 	}
+// 	OSTYPE_VOID_IMPL( E )
+// }
+
+forall( ostype & | ostream( ostype ), E | CfaEnum( E ) ) {
 	ostype & ?|?( ostype & os, E e ) {
 		return os | label( e );
@@ -77,8 +84,3 @@
 }
 
-forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
-	ostype & ?|?( ostype & os, E e ) {
-		return os | label( e );
-	}
-	OSTYPE_VOID_IMPL( E )
-}
+// 
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 9d5eacb77f6659b84df326bf35fe21bcde7e425b)
+++ libcfa/src/enum.hfa	(revision 236f13390c74aff36386095c9fc9fff394243822)
@@ -15,8 +15,10 @@
 };
 
-// Design one
-forall( E, V | Serial( E ) ) trait CfaEnum {
+forall( E | Serial( E ) ) trait CfaEnum {
     const char * label( E e );
     unsigned int posn( E e );
+};
+
+forall( E, V | CfaEnum( E ) ) trait TypedEnum {
     V value( E e );
 };
@@ -24,16 +26,16 @@
 // I/O
 
-forall( istype & | istream( istype ), E, V | CfaEnum( E, V ) )
+forall( istype & | istream( istype ), E | CfaEnum( E ) )
 istype & ?|?( istype &, E & );
 
-forall( ostype & | ostream( ostype ), E, V | CfaEnum( E, V ) ) {
+forall( ostype & | ostream( ostype ), E | CfaEnum( E ) ) {
 	ostype & ?|?( ostype &, E );
 	OSTYPE_VOID( E );
 }
 
-forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
-	ostype & ?|?( ostype &, E );
-	OSTYPE_VOID( 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
@@ -48,5 +50,5 @@
 
 static inline
-forall( E, V | CfaEnum( E, V ) ) {
+forall( E | CfaEnum( E ) ) {
     int ?==?( E l, E r ) { return posn( l ) == posn( r ); }	// relational operators
     int ?!=?( E l, E r ) { return posn( l ) != posn( r ); }
Index: src/Validate/ImplementEnumFunc.cpp
===================================================================
--- src/Validate/ImplementEnumFunc.cpp	(revision 9d5eacb77f6659b84df326bf35fe21bcde7e425b)
+++ src/Validate/ImplementEnumFunc.cpp	(revision 236f13390c74aff36386095c9fc9fff394243822)
@@ -25,7 +25,7 @@
 		: decl(decl),
 		  functionNesting{functionNesting},
-		  quasi_void_decl(new ast::StructDecl(decl->location, 
-		  	"quasi_void", ast::AggregateDecl::Struct,
-			{}, ast::Linkage::AutoGen)),
+		//   quasi_void_decl(new ast::StructDecl(decl->location,
+		//   	"quasi_void", ast::AggregateDecl::Struct,
+		// 	{}, ast::Linkage::AutoGen)),
 		  proto_linkage{ast::Linkage::Cforall} {}
 
@@ -208,21 +208,21 @@
 
 ast::FunctionDecl* EnumAttrFuncGenerator::genValueProto() const {
-	if (decl->isTyped())
-		return genProto(
-			"value",
-			{new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
-			{new ast::ObjectDecl(getLocation(), "_ret",
-								ast::deepCopy(decl->base))});
-	else
-		return genQuasiValueProto();
-}
-
-ast::FunctionDecl* EnumAttrFuncGenerator::genQuasiValueProto() const {
+	assert (decl->isTyped());
 	return genProto(
 		"value",
 		{new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
 		{new ast::ObjectDecl(getLocation(), "_ret",
-		                		new ast::StructInstType(quasi_void_decl))});
-}
+							ast::deepCopy(decl->base))});
+	// else
+	// 	return genQuasiValueProto();
+}
+
+// ast::FunctionDecl* EnumAttrFuncGenerator::genQuasiValueProto() const {
+// 	return genProto(
+// 		"value",
+// 		{new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
+// 		{new ast::ObjectDecl(getLocation(), "_ret",
+// 		                		new ast::StructInstType(quasi_void_decl))});
+// }
 
 ast::FunctionDecl* EnumAttrFuncGenerator::genFromIntProto() const {
@@ -390,16 +390,16 @@
 }
 
-void EnumAttrFuncGenerator::genQuasiValueBody(ast::FunctionDecl* func) const {
-	auto location = func->location;
-	const ast::ObjectDecl * objDecl = new ast::ObjectDecl(
-		location, "_out", new ast::StructInstType( quasi_void_decl ));
-	const ast::DeclStmt * declStmt = new ast::DeclStmt(location, objDecl);
-	const ast::VariableExpr * varExpr = new ast::VariableExpr(location, objDecl);
-	const ast::ReturnStmt * retStmt = new ast::ReturnStmt(location, varExpr);
-
-	func->stmts = new ast::CompoundStmt(
-		location, {declStmt, retStmt}
-	);
-}
+// void EnumAttrFuncGenerator::genQuasiValueBody(ast::FunctionDecl* func) const {
+// 	auto location = func->location;
+// 	const ast::ObjectDecl * objDecl = new ast::ObjectDecl(
+// 		location, "_out", new ast::StructInstType( quasi_void_decl ));
+// 	const ast::DeclStmt * declStmt = new ast::DeclStmt(location, objDecl);
+// 	const ast::VariableExpr * varExpr = new ast::VariableExpr(location, objDecl);
+// 	const ast::ReturnStmt * retStmt = new ast::ReturnStmt(location, varExpr);
+
+// 	func->stmts = new ast::CompoundStmt(
+// 		location, {declStmt, retStmt}
+// 	);
+// }
 
 void EnumAttrFuncGenerator::genPosnBody(ast::FunctionDecl* func) const {
@@ -433,10 +433,11 @@
 			genValueOrLabelBody(funcProto, arrayProto);
 			produceDecl(funcProto);
-		}  else {
-			ast::FunctionDecl* funcProto = genQuasiValueProto();
-			produceForwardDecl(funcProto);
-			genQuasiValueBody(funcProto);
-			produceDecl(funcProto);
-		}
+		}  
+		// else {
+		// 	ast::FunctionDecl* funcProto = genQuasiValueProto();
+		// 	produceForwardDecl(funcProto);
+		// 	// genQuasiValueBody(funcProto);
+		// 	produceDecl(funcProto);
+		// }
 	} else if (attr == ast::EnumAttribute::Label) {
 		std::vector<ast::ptr<ast::Init>> inits = genLabelInit();
Index: tests/enum_tests/.expect/voidEnum.txt
===================================================================
--- tests/enum_tests/.expect/voidEnum.txt	(revision 236f13390c74aff36386095c9fc9fff394243822)
+++ tests/enum_tests/.expect/voidEnum.txt	(revision 236f13390c74aff36386095c9fc9fff394243822)
@@ -0,0 +1,1 @@
+A 0 A
Index: tests/enum_tests/voidEnum.cfa
===================================================================
--- tests/enum_tests/voidEnum.cfa	(revision 9d5eacb77f6659b84df326bf35fe21bcde7e425b)
+++ tests/enum_tests/voidEnum.cfa	(revision 236f13390c74aff36386095c9fc9fff394243822)
@@ -1,32 +1,8 @@
 #include <fstream.hfa>
 #include <enum.hfa>
-enum() voidEnum {
-    a, b, c
-    /*** 
-    * ,d = 10 // Disable; 
-    * //error: Enumerator of enum(void) cannot have an explicit initial value.
-    */
-};
 
-char* a[voidEnum] = {
-    "A",
-    "B",
-    "C"
-};
-
+enum() E { A, B, C };
 int main() {
-    enum voidEnum v_1 = a;
-    enum voidEnum v_2 = b;
-    sout | "Two different Opague Enum Should not be the same:";
-    if ( v_1 == v_2 ) {
-        sout | "a and b are Equal" | nl;
-    } else {
-        sout | "a and b are Not Equal" | nl;
-    }
-    sout | "Default Output:";
-    sout | a;
-    sout | b;
-    
-    sout | label(v_1);
-    sout | label(v_2);
+    E e = A;
+    sout | e | posn( e ) | label( e );
 }
