Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ libcfa/src/enum.hfa	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -66,4 +66,24 @@
 		return l;
 	}
+
+	E ?+=? ( E & l, one_t ) {
+		l = succ(l);
+		return l;
+	}
+	
+	E ?-=? ( E & l, one_t ) {
+		l = pred(l);
+		return l;
+	}
+
+	E ?+=? ( E & l, int i ) {
+		int pos = posn(l) + i;
+		return fromInt(pos);
+	}
+
+	E ?-=? ( E & l, int i ) {
+		int pos = posn(l) - i;
+		return fromInt(pos);
+	}
 	
 	E ?++( E & l ) {
Index: src/ControlStruct/TranslateEnumRange.cpp
===================================================================
--- src/ControlStruct/TranslateEnumRange.cpp	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ src/ControlStruct/TranslateEnumRange.cpp	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -5,8 +5,4 @@
 
 namespace ControlStruct {
-
-struct addInitType {
-    const ast::Stmt * postvisit( const ast::ForStmt * stmt );
-};
 
 struct addInit {
@@ -17,26 +13,4 @@
     const ast::Stmt * postvisit( const ast::ForStmt * stmt );
 };
-
-const ast::Stmt* addInitType::postvisit( const ast::ForStmt * stmt ) {
-    if ( stmt->range_over ) {
-        auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
-        auto type = typeExpr->type;
-
-        auto objInit = stmt->inits.front();
-        assert( stmt->inits.size() == 1 );
-
-        if (auto declStmt = objInit.as<ast::DeclStmt>()) {
-            auto decl = declStmt->decl;
-            if ( auto objDecl = decl.as<ast::ObjectDecl>()) {
-                if ( !objDecl->type && type ) {
-                    auto objDeclWithType = ast::mutate_field( objDecl, &ast::ObjectDecl::type, type );
-                    auto declWithType = ast::mutate_field( declStmt, &ast::DeclStmt::decl, objDeclWithType );
-                    stmt = ast::mutate_field_index( stmt, &ast::ForStmt::inits, 0, declWithType );
-                }
-            }
-        }
-    }
-    return stmt;
-}
 
 const ast::Stmt* addInit::postvisit( const ast::ForStmt * stmt ) {
@@ -87,5 +61,5 @@
     mut = ast::mutate_field(stmt, &ast::ForStmt::inc, assig );
     return mut;
-}
+}  
 
 void translateEnumRange( ast::TranslationUnit & translationUnit ) {
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -938,5 +938,5 @@
 			addAggMembers( unionInst, aggrExpr, *cand, Cost::unsafe, "" );
 		} else if ( auto enumInst = aggrExpr->result.as< ast::EnumInstType >() ) {
-			addEnumValueAsCandidate(enumInst, aggrExpr, Cost::unsafe);
+			addEnumValueAsCandidate( enumInst, aggrExpr, Cost::implicit );
 		}
 	}
Index: src/ResolvExpr/Cost.hpp
===================================================================
--- src/ResolvExpr/Cost.hpp	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ src/ResolvExpr/Cost.hpp	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -31,5 +31,4 @@
 		#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
 			// Little-endian => first value is low priority and last is high priority.
-			unsigned char padding;					///< unused
 			unsigned char referenceCost;			///< reference conversions
 			unsigned char specCost;					///< Polymorphic type specializations (type assertions), negative cost
@@ -38,4 +37,5 @@
 			unsigned char safeCost;					///< Safe (widening) conversions
 			unsigned char polyCost;					///< Count of parameters and return values bound to some poly type
+			unsigned char implicitCost;				///< Aggregate implicit cost
 			unsigned char unsafeCost;				///< Unsafe (narrowing) conversions
 		#else
@@ -46,25 +46,25 @@
 	};
 	static const unsigned char correctb = 0xff;		// byte correction for negative spec cost
-	static const uint64_t correctw = 0x00'00'00'00'00'ff'00'00; //' word correction for negative spec cost
+	static const uint64_t correctw = 0x00'00'00'00'00'00'ff'00; //' word correction for negative spec cost
   public:
 	// Compiler adjusts constants for correct endian.
 	enum : uint64_t {
-		zero      = 0x00'00'00'00'00'ff'00'00,
-		infinity  = 0xff'ff'ff'ff'ff'00'ff'ff,
-		unsafe    = 0x01'00'00'00'00'ff'00'00,
-		poly      = 0x00'01'00'00'00'ff'00'00,
-		safe      = 0x00'00'01'00'00'ff'00'00,
-		sign      = 0x00'00'00'01'00'ff'00'00,
-		var       = 0x00'00'00'00'01'ff'00'00,
-		spec      = 0x00'00'00'00'00'fe'00'00,
-		reference = 0x00'00'00'00'00'ff'01'00,
+		zero      = 0x00'00'00'00'00'00'ff'00,
+		infinity  = 0xff'ff'ff'ff'ff'ff'00'ff,
+		unsafe    = 0x01'00'00'00'00'00'ff'00,
+		implicit  = 0x00'01'00'00'01'00'ff'00,
+		poly      = 0x00'00'01'00'00'00'ff'00,
+		safe      = 0x00'00'00'01'00'00'ff'00,
+		sign      = 0x00'00'00'00'01'00'ff'00,
+		var       = 0x00'00'00'00'00'01'ff'00,
+		spec      = 0x00'00'00'00'00'00'fe'00,
+		reference = 0x00'00'00'00'00'00'ff'01,
 	}; //'
 
 	Cost( uint64_t all ) { Cost::all = all; }
-	Cost( int unsafeCost, int polyCost, int safeCost, int signCost, int varCost, int specCost, int referenceCost ) {
+	Cost( int unsafeCost, int polyCost, int safeCost, int signCost, int implicitCost, int varCost, int specCost, int referenceCost ) {
 		// Assume little-endian => first value is low priority and last is high priority.
 		v = {
 		#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-			(unsigned char)0,						// padding
 			(unsigned char)referenceCost,			// low priority
 			(unsigned char)(specCost + correctb),	// correct for signedness
@@ -73,4 +73,5 @@
 			(unsigned char)safeCost,
 			(unsigned char)polyCost,
+			(unsigned char)implicitCost,
 			(unsigned char)unsafeCost, 				// high priority
 		#else
@@ -81,4 +82,5 @@
 
 	int get_unsafeCost() const { return v.unsafeCost; }
+	int get_implictCost() const { return v.implicitCost; }
 	int get_polyCost() const { return v.polyCost; }
 	int get_safeCost() const { return v.safeCost; }
@@ -112,4 +114,9 @@
 	Cost incUnsafe( int inc = 1 ) {
 		if ( all != infinity ) { assert( v.unsafeCost + inc <= UCHAR_MAX ); v.unsafeCost += inc; }
+		return *this;
+	}
+
+	Cost incImplicit( int inc = 1 ) {
+		if ( all != infinity ) { assert( v.implicitCost + inc <= UCHAR_MAX ); v.implicitCost += inc; }
 		return *this;
 	}
@@ -168,5 +175,5 @@
 
 inline std::ostream & operator<<( std::ostream & os, const Cost cost ) {
-	return os << "( " << cost.get_unsafeCost() << ", " << cost.get_polyCost() << ", " << cost.get_safeCost()
+	return os << "( " << cost.get_unsafeCost() << ", " << cost.get_implictCost() << ", " << cost.get_polyCost() << ", " << cost.get_safeCost()
 			  << ", " << cost.get_signCost() << ", " << cost.get_varCost() << ", " << cost.get_specCost()
 			  << ", " << cost.get_referenceCost() << " )";
Index: src/ResolvExpr/ResolveTypeof.cpp
===================================================================
--- src/ResolvExpr/ResolveTypeof.cpp	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ src/ResolvExpr/ResolveTypeof.cpp	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -130,4 +130,19 @@
 	mutDecl->type = renameTyVars(mutDecl->type, RenameMode::GEN_EXPR_ID);
 	mutDecl->isTypeFixed = true;
+
+	auto enumInst = decl->type.as<ast::EnumInstType>();
+	if ( enumInst && enumInst->base->isCfa ) {
+		if ( auto init = decl->init.as<ast::SingleInit>() ) {
+			if ( auto initExpr = init->value.as<ast::ConstantExpr>() ) {
+				if ( initExpr->result.as<ast::ZeroType>() ) {
+					auto newInit = new ast::SingleInit( init->location, 
+						ast::UntypedExpr::createCall( init->location, "lowerBound", {} )
+					);
+					mutDecl->init = newInit;
+				}
+			}
+		}
+	}
+
 	return mutDecl;
 }
Index: tests/.expect/castError.txt
===================================================================
--- tests/.expect/castError.txt	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ tests/.expect/castError.txt	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -6,5 +6,5 @@
 ... with resolved type:
   char Alternatives are:
-Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
       Variable Expression: f: double
       ... with resolved type:
@@ -19,5 +19,5 @@
   Environment:
 
-Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
       Variable Expression: f: function
         accepting unspecified arguments
@@ -38,5 +38,5 @@
   Environment:
 
-Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
       Variable Expression: f: signed int
       ... with resolved type:
@@ -62,5 +62,5 @@
 ... with resolved type:
   void Alternatives are:
-Cost ( 0, 0, 2, 0, 0, 0, 0 ): Generated Cast of:
+Cost ( 0, 0, 0, 2, 0, 0, 0, 0 ): Generated Cast of:
       Comma Expression:
         Constant Expression (3: signed int)
@@ -80,5 +80,5 @@
   Environment:
 
-Cost ( 0, 0, 2, 0, 0, 0, 0 ): Generated Cast of:
+Cost ( 0, 0, 0, 2, 0, 0, 0, 0 ): Generated Cast of:
       Comma Expression:
         Constant Expression (3: signed int)
Index: tests/errors/.expect/completeType.x64.txt
===================================================================
--- tests/errors/.expect/completeType.x64.txt	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ tests/errors/.expect/completeType.x64.txt	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -9,5 +9,5 @@
 ... with resolved type:
   void Alternatives are:
-Cost ( 0, 1, 2, 0, 1, -1, 0 ): Generated Cast of:
+Cost ( 0, 0, 1, 2, 0, 1, -1, 0 ): Generated Cast of:
       Application of
         Variable Expression: *?: forall
@@ -44,5 +44,5 @@
 
 
-Cost ( 0, 1, 2, 0, 1, -1, 0 ): Generated Cast of:
+Cost ( 0, 0, 1, 2, 0, 1, -1, 0 ): Generated Cast of:
       Application of
         Variable Expression: *?: forall
@@ -111,5 +111,5 @@
 
       Unsatisfiable alternative:
-Cost ( 0, 1, 0, 0, 1, -5, 0 ): Application of
+Cost ( 0, 0, 1, 0, 0, 1, -5, 0 ): Application of
             Variable Expression: baz: forall
               instance of type T (not function type)
Index: tests/meta/.expect/arch.x64.txt
===================================================================
--- tests/meta/.expect/arch.x64.txt	(revision d39d8a4e67710d1f6f040398a7187e6bf7fe82aa)
+++ tests/meta/.expect/arch.x64.txt	(revision 1e12f0708e26cae1f83b14a9266e449b4ecbc545)
@@ -6,5 +6,5 @@
 ... with resolved type:
   char Alternatives are:
-Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
       Variable Expression: FX64: double
       ... with resolved type:
@@ -19,5 +19,5 @@
   Environment:
 
-Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
       Variable Expression: FX64: function
         accepting unspecified arguments
@@ -38,5 +38,5 @@
   Environment:
 
-Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
       Variable Expression: FX64: signed int
       ... with resolved type:
