Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 9ddcee10f8009f7d349eb15c2cfa983e3265d88e)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision e11cdc0a5ff47ae542d05ae7f3c78c0d944761df)
@@ -672,4 +672,5 @@
 		void postvisit( const ast::StmtExpr * stmtExpr );
 		void postvisit( const ast::UntypedInitExpr * initExpr );
+		void postvisit( const ast::QualifiedNameExpr * qualifiedExpr );
 
 		void postvisit( const ast::InitExpr * ) {
@@ -890,5 +891,6 @@
 		} else if ( auto unionInst = aggrExpr->result.as< ast::UnionInstType >() ) {
 			addAggMembers( unionInst, aggrExpr, *cand, Cost::unsafe, "" );
-		} else if ( auto enumInst = aggrExpr->result.as< ast::EnumInstType >() ) {
+		} 
+		else if ( auto enumInst = aggrExpr->result.as< ast::EnumInstType >() ) {
 			// The Attribute Arrays are not yet generated, need to proxy them
 			// as attribute function call
@@ -1401,35 +1403,5 @@
 	void Finder::postvisit( const ast::VariableExpr * variableExpr ) {
 		// not sufficient to just pass `variableExpr` here, type might have changed since
-		// creation
-		if ( auto obj = dynamic_cast<const ast::ObjectDecl *>( variableExpr->var.get() )) {
-			if ( auto enumInstType = dynamic_cast<const ast::EnumInstType *>( obj->type.get() ) ) {
-				if ( enumInstType->base && enumInstType->base->base ) {
-					const CodeLocation & location = variableExpr->location;
-					auto ids = symtab.lookupId( "valueE" );
-						for ( ast::SymbolTable::IdData & id : ids ) {
-							if ( auto func = id.id.as<ast::FunctionDecl>() ) {
-								if ( func->params.size() == 1 ) {
-									ast::ptr<ast::DeclWithType> valueEParam = func->params.front();
-									auto valueEParamType = valueEParam->get_type();
-									ast::OpenVarSet funcOpen;
-									ast::AssertionSet funcNeed, funcHave;
-									ast::TypeEnvironment funcEnv{ tenv };
-									ast::ptr<ast::Type> common;
-									if ( unifyInexact( valueEParamType, enumInstType, funcEnv, funcNeed, funcHave, funcOpen, WidenMode{ true, true }, common ) ) {
-										auto appl = new ast::ApplicationExpr( location,
-											ast::VariableExpr::functionPointer( location,  func), { variableExpr } );
-										// addCandidate( appl, copy( tenv ),  );
-										Candidate cand {appl, copy( tenv )};
-										addCandidate( cand, appl, Cost::safe );
-									}
-								}
-							}
-						}
-				}
-			
-			}
-		} 
-		addCandidate( variableExpr, tenv );
-		
+		addCandidate( variableExpr, tenv );		
 	}
 
@@ -1807,4 +1779,37 @@
 	}
 
+	void Finder::postvisit( const ast::QualifiedNameExpr * expr ) {
+		std::vector< ast::SymbolTable::IdData > declList = symtab.lookupId( expr->name );
+		if ( declList.empty() ) return;
+
+		for ( ast::SymbolTable::IdData & data: declList ) {
+			const ast::Type * t = data.id->get_type()->stripReferences();
+			if ( const ast::EnumInstType * enumInstType =
+				dynamic_cast<const ast::EnumInstType *>( t ) ) {
+				if ( enumInstType->base->name == expr->type_decl->name ) {
+					Cost cost = Cost::zero;
+					ast::Expr * newExpr = data.combine( expr->location, cost );
+					CandidateRef newCand =
+						std::make_shared<Candidate>(
+							newExpr, copy( tenv ), ast::OpenVarSet{}, 
+							ast::AssertionSet{}, Cost::zero, cost
+						);
+					
+					if (newCand->expr->env) {
+						newCand->env.add(*newCand->expr->env);
+						auto mutExpr = newCand->expr.get_and_mutate();
+						mutExpr->env  = nullptr;
+						newCand->expr = mutExpr;
+					}
+
+					newCand->expr = ast::mutate_field(
+						newCand->expr.get(), &ast::Expr::result,
+						renameTyVars( newCand->expr->result ) );
+					addAnonConversions( newCand );
+					candidates.emplace_back( std::move( newCand ) );
+				}
+			}
+		}
+	}
 	// size_t Finder::traceId = Stats::Heap::new_stacktrace_id("Finder");
 	/// Prunes a list of candidates down to those that have the minimum conversion cost for a given
