Index: libcfa/src/enum.cfa
===================================================================
--- libcfa/src/enum.cfa	(revision 7ab24fef69c59b4648fd96ee951c48fd05deee47)
+++ libcfa/src/enum.cfa	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -6,5 +6,5 @@
 
 forall( E | Serial( E ) ) {
-	E fromInt( unsigned i ) {
+	E fromInt( int i ) {
 		E upper = upperBound();
 		E lower = lowerBound();
Index: libcfa/src/enum.hfa
===================================================================
--- libcfa/src/enum.hfa	(revision 7ab24fef69c59b4648fd96ee951c48fd05deee47)
+++ libcfa/src/enum.hfa	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -9,6 +9,6 @@
 
 forall( E | Bounded( E ) ) trait Serial {
-	unsigned fromInstance( E e );
-	E fromInt_unsafe( unsigned i );
+	int fromInstance( E e );
+	E fromInt_unsafe( int i );
 	E succ_unsafe( E e );
 	E pred_unsafe( E e );
@@ -16,5 +16,5 @@
 
 forall( E | Serial( E ) ) {
-	E fromInt( unsigned i );
+	E fromInt( int i );
 	E succ( E e );
 	E pred( E e );
@@ -36,5 +36,5 @@
 forall( E ) trait CfaEnum {
 	const char * label( E e );
-	unsigned int posn( E e );
+	int posn( E e );
 };
 
@@ -63,43 +63,49 @@
 
 	E ++?( E & l ) { 									// increment operators
-		l = succ( l );
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+1);
+		return l;
+	}
+
+	E --?( E & l ) {
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-1);
 		return l;
 	}
 
 	E ?+=? ( E & l, one_t ) {
-		l = succ(l);
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+1);
 		return l;
 	}
-	
+
 	E ?-=? ( E & l, one_t ) {
-		l = pred(l);
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-1);
 		return l;
 	}
 
 	E ?+=? ( E & l, int i ) {
-		int pos = posn(l) + i;
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+i);
 		return fromInt(pos);
 	}
 
 	E ?-=? ( E & l, int i ) {
-		int pos = posn(l) - i;
-		return fromInt(pos);
-	}
-	
-	E ?++( E & l ) {
-		E ret = l;
-		l = succ( l );
-		return ret;
-	}
-
-	E --?( E & l ) {
-		l = pred( l );
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-i);
 		return l;
 	}
 
+	E ?++( E & l ) {
+		int pos = posn(l);
+		l = fromInt_unsafe(pos+1);
+		return fromInt_unsafe(pos);
+	}
+
 	E ?--( E & l ) {
-		E ret = l;
-		l = pred( l );
-		return ret;
+		int pos = posn(l);
+		l = fromInt_unsafe(pos-1);
+		return fromInt_unsafe(pos);
 	}
 }
Index: src/ControlStruct/TranslateEnumRange.cpp
===================================================================
--- src/ControlStruct/TranslateEnumRange.cpp	(revision 7ab24fef69c59b4648fd96ee951c48fd05deee47)
+++ src/ControlStruct/TranslateEnumRange.cpp	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -51,7 +51,10 @@
     // it wraps around and become unsigned max
     ast::UntypedExpr * condition = ast::UntypedExpr::createCall( location,
-        "?<=?",
+        stmt->is_inc? "?<=?": "?>=?",
         {   new ast::NameExpr( location, indexName ),
-            ast::UntypedExpr::createCall( location, "upperBound", {} )  });
+            stmt->is_inc?
+                ast::UntypedExpr::createCall( location, "upperBound", {} ):
+                ast::UntypedExpr::createCall( location, "lowerBound", {} )
+        });
     auto increment = ast::UntypedExpr::createCall( location, 
         stmt->is_inc? "succ_unsafe": "pred_unsafe",
Index: src/Validate/ImplementEnumFunc.cpp
===================================================================
--- src/Validate/ImplementEnumFunc.cpp	(revision 7ab24fef69c59b4648fd96ee951c48fd05deee47)
+++ src/Validate/ImplementEnumFunc.cpp	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -25,7 +25,4 @@
 		: decl(decl),
 		  functionNesting{functionNesting},
-		//   quasi_void_decl(new ast::StructDecl(decl->location,
-		//   	"quasi_void", ast::AggregateDecl::Struct,
-		// 	{}, ast::Linkage::AutoGen)),
 		  proto_linkage{ast::Linkage::Cforall} {}
 
@@ -194,5 +191,5 @@
         {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
         {new ast::ObjectDecl(getLocation(), "_ret",
-            new ast::BasicType(ast::BasicKind::UnsignedInt))});
+            new ast::BasicType(ast::BasicKind::SignedInt))});
 }
 
@@ -229,5 +226,5 @@
 	return genProto(
 		"fromInt_unsafe",
-		{new ast::ObjectDecl(getLocation(), "_i", new ast::BasicType(ast::BasicKind::UnsignedInt))},
+		{new ast::ObjectDecl(getLocation(), "_i", new ast::BasicType(ast::BasicKind::SignedInt))},
 		{new ast::ObjectDecl(getLocation(), "_ret", new ast::EnumInstType(decl))}
 	);
@@ -238,5 +235,5 @@
 		"fromInstance",
 		{new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))},
-		{new ast::ObjectDecl(getLocation(), "_ret", new ast::BasicType(ast::BasicKind::UnsignedInt))}
+		{new ast::ObjectDecl(getLocation(), "_ret", new ast::BasicType(ast::BasicKind::SignedInt))}
 	);
 }
@@ -285,5 +282,5 @@
 		func->location,
 		new ast::VariableExpr(func->location, param),
-		new ast::BasicType(ast::BasicKind::UnsignedInt),
+		new ast::BasicType(ast::BasicKind::SignedInt),
 		ast::GeneratedFlag::ExplicitCast
 	);
@@ -383,5 +380,5 @@
 			func->location,
 			new ast::VariableExpr( func->location, func->params.front() ),
-			new ast::BasicType( ast::BasicKind::UnsignedInt ),
+			new ast::BasicType( ast::BasicKind::SignedInt ),
 			ast::GeneratedFlag::ExplicitCast
 		)});
@@ -407,5 +404,5 @@
 		func->location,
 		new ast::VariableExpr(func->location, func->params.front()),
-		new ast::BasicType( ast::BasicKind::UnsignedInt ),
+		new ast::BasicType( ast::BasicKind::SignedInt ),
 			ast::GeneratedFlag::ExplicitCast);
 	func->stmts = new ast::CompoundStmt(
Index: tests/ctrl-flow/.expect/loopctrl.txt
===================================================================
--- tests/ctrl-flow/.expect/loopctrl.txt	(revision 7ab24fef69c59b4648fd96ee951c48fd05deee47)
+++ tests/ctrl-flow/.expect/loopctrl.txt	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -119,4 +119,7 @@
 0 -2 -4 -6 -8
 0 1 2 3 4 5 6 7 8 9
+A B C
+A B C D
+D B
 A B C D
 D C B A
Index: tests/ctrl-flow/loopctrl.cfa
===================================================================
--- tests/ctrl-flow/loopctrl.cfa	(revision 7ab24fef69c59b4648fd96ee951c48fd05deee47)
+++ tests/ctrl-flow/loopctrl.cfa	(revision 5f210c08ab78098d82c19b6a8bfa3d0be728f733)
@@ -83,7 +83,7 @@
 
 	enum(int) E { A, B, C, D };
-//	for ( E e; A ~= C ) { sout | e; } sout | nl;
-//	for ( e; A ~= D ) { sout | e; } sout | nl;
-//	for ( e; A -~= D ~ 2 ) { sout | e; } sout | nl;
+	for ( E e; A ~= C ) { sout | e; } sout | nl;
+	for ( e; A ~= D ) { sout | e; } sout | nl;
+	for ( e; A -~= D ~ 2 ) { sout | e; } sout | nl;
 	for ( e; E ) { sout | e; } sout | nl;
 	for ( e; -~= E ) { sout | e; } sout | nl;
