Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision b9f827433276c429e2d2dc4909601d95a06f6d0f)
+++ src/SymTab/Mangler.cc	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -65,4 +65,6 @@
 				void postvisit( const QualifiedType * qualType );
 
+				void postvisit( const QualifiedNameExpr * qualNameExpr );
+
 				std::string get_mangleName() { return mangleName; }
 			  private:
@@ -305,4 +307,8 @@
 					mangleName += Encoding::qualifiedTypeEnd;
 				}
+			}
+
+			void Mangler_old::postvisit( const QualifiedNameExpr * qual ) {
+				maybeAccept( qual->var, *visitor );
 			}
 
@@ -417,4 +423,5 @@
 			void postvisit( const ast::OneType * oneType );
 			void postvisit( const ast::QualifiedType * qualType );
+			void postvisit( const ast::QualifiedNameExpr * qualNameExpr );
 
 			std::string get_mangleName() { return mangleName; }
@@ -645,4 +652,7 @@
 				mangleName += Encoding::qualifiedTypeEnd;
 			}
+		}
+		void Mangler_new::postvisit( const ast::QualifiedNameExpr * qual ) {
+			maybeAccept( qual->var.get(), *visitor );
 		}
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision b9f827433276c429e2d2dc4909601d95a06f6d0f)
+++ src/SymTab/Validate.cc	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -857,10 +857,11 @@
 		} else if ( UnionInstType * aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {
 			declsToAddBefore.push_back( new UnionDecl( aggDecl->name, noAttributes, tyDecl->linkage ) );
-		} else if ( EnumInstType * enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) {
+		} else if ( EnumInstType * enumInst = dynamic_cast< EnumInstType * >( designatorType ) ) {
 			// declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage, enumDecl->baseEnum->base ) );
-			if (enumDecl->baseEnum) {
-				declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage, enumDecl->baseEnum->base ) );
+			if ( enumInst->baseEnum ) {
+				const EnumDecl * enumDecl = enumInst->baseEnum;
+				declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, enumDecl->isTyped, tyDecl->linkage, enumDecl->base ) );
 			} else {
-				declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage ) );
+				declsToAddBefore.push_back( new EnumDecl( enumInst->name, noAttributes, tyDecl->linkage ) );
 			}
 		} // if
Index: src/SymTab/ValidateType.cc
===================================================================
--- src/SymTab/ValidateType.cc	(revision b9f827433276c429e2d2dc4909601d95a06f6d0f)
+++ src/SymTab/ValidateType.cc	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -82,4 +82,6 @@
 	void postvisit( QualifiedType * qualType );
 
+	void postvisit( QualifiedNameExpr * qualExpr );
+
 	void postvisit( EnumDecl * enumDecl );
 	void postvisit( StructDecl * structDecl );
@@ -157,4 +159,9 @@
 	// linking only makes sense for the 'oldest ancestor' of the qualified type
 	qualType->parent->accept( * visitor );
+}
+
+void LinkReferenceToTypes_old::postvisit( QualifiedNameExpr * qualExpr ) {
+	const EnumDecl * st = local_indexer->lookupEnum( qualExpr->type_decl->name );
+	qualExpr->type_decl = const_cast<EnumDecl *>(st);
 }
 
