Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Convert.cpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -310,4 +310,5 @@
 			node->name,
 			get<Attribute>().acceptL( node->attributes ),
+			false, // Temporary
 			LinkageSpec::Spec( node->linkage.val ),
 			get<Type>().accept1(node->base)
@@ -731,4 +732,17 @@
 	}
 
+	const ast::Expr * visit( const ast::QualifiedNameExpr * node ) override final {
+		auto temp = new QualifiedNameExpr(
+				get<Declaration>().accept1(node->type_decl),
+				node->name
+		);
+		temp->var = get<DeclarationWithType>().accept1(node->var);
+		auto expr = visitBaseExpr( node,
+			temp
+		);
+		this->node = expr;
+		return nullptr;
+	}
+
 	const ast::Expr * visit( const ast::AddressExpr * node ) override final {
 		auto expr = visitBaseExpr( node,
@@ -1740,4 +1754,5 @@
 			old->location,
 			old->name,
+			old->isTyped,
 			GET_ACCEPT_V(attributes, Attribute),
 			{ old->linkage.val },
@@ -2266,4 +2281,17 @@
 	}
 
+	/// xxx - type_decl should be DeclWithType in the final design
+	/// type_decl is set to EnumDecl as a temporary fix
+	virtual void visit( const QualifiedNameExpr * old ) override final {
+		this->node = visitBaseExpr( old,
+			new ast::QualifiedNameExpr (
+				old->location,
+				GET_ACCEPT_1(type_decl, Decl),
+				GET_ACCEPT_1(var, DeclWithType),
+				old->name
+			)
+		);
+	}
+
 	virtual void visit( const CastExpr * old ) override final {
 		this->node = visitBaseExpr( old,
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Decl.hpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -312,10 +312,12 @@
 class EnumDecl final : public AggregateDecl {
 public:
+	bool isTyped;
 	ptr<Type> base;
 
-	EnumDecl( const CodeLocation& loc, const std::string& name,
-		std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall, Type const * base = nullptr,
+	EnumDecl( const CodeLocation& loc, const std::string& name, bool isTyped = false, 
+		std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall,
+		Type const * base = nullptr,
 		std::unordered_map< std::string, long long > enumValues = std::unordered_map< std::string, long long >() )
-	: AggregateDecl( loc, name, std::move(attrs), linkage ), base(base), enumValues(enumValues) {}
+	: AggregateDecl( loc, name, std::move(attrs), linkage ), isTyped(isTyped), base(base), enumValues(enumValues) {}
 
 	/// gets the integer value for this enumerator, returning true iff value found
@@ -327,5 +329,4 @@
 	const char * typeString() const override { return aggrString( Enum ); }
 
-	bool isTyped() {return base && base.get();}
 
 private:
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Expr.hpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -254,4 +254,19 @@
 };
 
+class QualifiedNameExpr final : public Expr {
+public:
+	ptr<Decl> type_decl;
+	ptr<DeclWithType> var;
+	std::string name;
+
+	QualifiedNameExpr( const CodeLocation & loc, const Decl * d, const DeclWithType * r, const std::string & n ) 
+	: Expr( loc ), type_decl( d ), var(r), name( n ) {}
+
+	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	QualifiedNameExpr * clone() const override { return new QualifiedNameExpr{ *this }; }
+	MUTATE_FRIEND
+};
+
 /// A reference to a named variable.
 class VariableExpr final : public Expr {
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Fwd.hpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -67,4 +67,5 @@
 class UntypedExpr;
 class NameExpr;
+class QualifiedNameExpr;
 class AddressExpr;
 class LabelAddressExpr;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Pass.hpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -167,4 +167,5 @@
 	const ast::Expr *             visit( const ast::UntypedExpr          * ) override final;
 	const ast::Expr *             visit( const ast::NameExpr             * ) override final;
+	const ast::Expr *			  visit( const ast::QualifiedNameExpr	 * ) override final;
 	const ast::Expr *             visit( const ast::AddressExpr          * ) override final;
 	const ast::Expr *             visit( const ast::LabelAddressExpr     * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Pass.impl.hpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -1199,4 +1199,17 @@
 
 //--------------------------------------------------------------------------
+// QualifiedNameExpr
+template< typename core_t >
+const ast::Expr * ast::Pass< core_t >::visit( const ast::QualifiedNameExpr * node ) {
+	VISIT_START( node );
+	if ( __visit_children() ) {
+		guard_symtab guard { *this };
+		maybe_accept( node, &QualifiedNameExpr::var );
+		maybe_accept( node, &QualifiedNameExpr::type_decl );
+	}
+	VISIT_END( Expr, node );
+}
+
+//--------------------------------------------------------------------------
 // CastExpr
 template< typename core_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Print.cpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -899,4 +899,15 @@
 		postprint( node );
 
+		return node;
+	}
+
+	virtual const ast::Expr * visit( const ast::QualifiedNameExpr * node ) override final {
+		os << "QualifiedNameExpr: " << std::endl;
+		os << ++indent << "Type: ";
+		safe_print( node->type_decl );
+		os << std::endl;
+		os <<  indent << "Name: " << node->name  << std::endl;
+		--indent;
+		postprint( node );
 		return node;
 	}
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision 09f34a84d91d0f6c3dcd80079886a3a4dd8e7ec7)
+++ src/AST/Visitor.hpp	(revision 4520b77e192c372763501afd950a0f1452141b3b)
@@ -59,4 +59,5 @@
     virtual const ast::Expr *             visit( const ast::UntypedExpr          * ) = 0;
     virtual const ast::Expr *             visit( const ast::NameExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::QualifiedNameExpr    * ) = 0;
     virtual const ast::Expr *             visit( const ast::AddressExpr          * ) = 0;
     virtual const ast::Expr *             visit( const ast::LabelAddressExpr     * ) = 0;
