Index: src/Validate/FixQualifiedTypes.cpp
===================================================================
--- src/Validate/FixQualifiedTypes.cpp	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
+++ src/Validate/FixQualifiedTypes.cpp	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
@@ -19,4 +19,6 @@
 #include "AST/TranslationUnit.hpp"
 #include "Validate/NoIdSymbolTable.hpp"
+#include "SymTab/Mangler.h"            // for Mangler
+#include "AST/LinkageSpec.hpp"			   // for Linkage
 
 namespace Validate {
@@ -89,4 +91,32 @@
 		}
 	}
+
+	ast::Expr const * postvisit( ast::QualifiedNameExpr const * t) {
+		assert( location );
+		if ( t->type_decl ) {
+        	auto enumName = t->type_decl->name;
+        	const ast::EnumDecl * enumDecl = symtab.lookupEnum( enumName );
+			for ( ast::ptr<ast::Decl> const & member : enumDecl->members ) {
+				if ( auto memberAsObj = member.as<ast::ObjectDecl>() ) {
+					if ( memberAsObj->name == t->name ) {
+						return new ast::VariableExpr( t->location, memberAsObj );
+					}
+				} else {
+					assertf( false, "unhandled qualified child type");
+				}
+			}
+
+
+        	auto var = new ast::ObjectDecl( t->var->location, t->name,
+			 new ast::EnumInstType(enumDecl, ast::CV::Const), nullptr, {}, ast::Linkage::Cforall );
+			var->scopeLevel = 1; // 1 for now; should copy the scopeLevel of the enumValue
+			var->mangleName = Mangle::mangle( var );
+			return new ast::VariableExpr( t->location, var );
+        	// return ret;
+        }
+
+		return t;
+	}
+
 };
 
Index: src/Validate/LinkReferenceToTypes.cpp
===================================================================
--- src/Validate/LinkReferenceToTypes.cpp	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
+++ src/Validate/LinkReferenceToTypes.cpp	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
@@ -46,4 +46,5 @@
 	void postvisit( ast::UnionDecl const * decl );
 	ast::TraitDecl const * postvisit( ast::TraitDecl const * decl );
+	ast::QualifiedNameExpr const * previsit( ast::QualifiedNameExpr const * decl);
 
 private:
@@ -292,4 +293,37 @@
 }
 
+ast::QualifiedNameExpr const * LinkTypesCore::previsit( ast::QualifiedNameExpr const * decl ) {
+	// Try to lookup type
+	if ( auto objDecl = decl->type_decl.as<ast::ObjectDecl>() ) {
+		if ( auto inst = objDecl->type.as<ast::TypeInstType>()) {
+			if ( auto enumDecl = symtab.lookupEnum ( inst->name ) ) {
+				auto mut = ast::mutate( decl );
+				mut->type_decl = enumDecl;
+				auto enumInst = new ast::EnumInstType( enumDecl );
+				enumInst->name = decl->name;
+				// Adding result; addCandidate() use result
+				mut->result = enumInst;
+				decl = mut;
+			}
+		}
+	} else if ( auto enumDecl = decl->type_decl.as<ast::EnumDecl>() ) {
+		auto mut = ast::mutate( decl );
+		auto enumInst = new ast::EnumInstType( enumDecl );
+		enumInst->name = decl->name;
+		// Adding result; addCandidate() use result
+		mut->result = enumInst;
+		decl = mut;
+	}
+	// ast::EnumDecl const * decl = symtab.lookupEnum( type->name );
+	// // It's not a semantic error if the enum is not found, just an implicit forward declaration.
+	// if ( decl ) {
+	// 	// Just linking in the node.
+	// 	auto mut = ast::mutate( type );
+	// 	mut->base = const_cast<ast::EnumDecl *>( decl );
+	// 	type = mut;
+	// }
+	return decl;
+}
+
 } // namespace
 
Index: src/Validate/ReplaceTypedef.cpp
===================================================================
--- src/Validate/ReplaceTypedef.cpp	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
+++ src/Validate/ReplaceTypedef.cpp	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
@@ -183,5 +183,5 @@
 	} else if ( auto enumType = dynamic_cast<ast::EnumInstType const *>( designatorType ) ) {
 		declsToAddBefore.push_back( new ast::EnumDecl(
-			decl->location, enumType->name, {}, decl->linkage,
+			decl->location, enumType->name, false, {}, decl->linkage,
 			( (enumType->base) ? enumType->base->base : nullptr )
 			) );
