Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision f8965f4f89bb1fdec3be05df05ef73c194a09ea5)
+++ src/SynTree/Declaration.h	(revision 996c8edd3d4b0aa7c204a324b34611112cf96308)
@@ -145,5 +145,4 @@
 	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 
-	// TODO: Move to the right place
 	void checkAssignedValue() const;
 };
@@ -338,18 +337,21 @@
 	typedef AggregateDecl Parent;
   public:
+  	bool isTyped;
+	Type * base;
+
 	EnumDecl( const std::string & name,
 	 const std::list< Attribute * > & attributes = std::list< class Attribute * >(),
-	  LinkageSpec::Spec linkage = LinkageSpec::Cforall,
-	  Type * baseType = nullptr ) : Parent( name, attributes, linkage ) , base( baseType ){}
-	EnumDecl( const EnumDecl & other ) : Parent( other ), base( other.base ) {}
-
+	  bool isTyped = false, LinkageSpec::Spec linkage = LinkageSpec::Cforall,
+	  Type * baseType = nullptr ) 
+	  : Parent( name, attributes, linkage ),isTyped(isTyped), base( baseType ) {}
+	EnumDecl( const EnumDecl & other ) 
+	  : Parent( other ), isTyped( other.isTyped), base( other.base ) {}
 	bool valueOf( Declaration * enumerator, long long int & value );
-
 	virtual EnumDecl * clone() const override { return new EnumDecl( *this ); }
 	virtual void accept( Visitor & v ) override { v.visit( this ); }
 	virtual void accept( Visitor & v ) const override { v.visit( this ); }
 	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
-	Type * base;
-	std::unordered_map< std::string, long long int > enumValues;
+
+	std::unordered_map< std::string, long long int > enumValues; // This attribute is unused
 	virtual void print( std::ostream & os, Indenter indent = {} ) const override final;
   private:
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision f8965f4f89bb1fdec3be05df05ef73c194a09ea5)
+++ src/SynTree/Expression.h	(revision 996c8edd3d4b0aa7c204a324b34611112cf96308)
@@ -163,4 +163,36 @@
 };
 
+// [Qualifier].name; Qualifier is the type_name from the parser
+class QualifiedNameExpr : public Expression {
+  public:
+	Declaration * type_decl;
+	std::string name;
+	DeclarationWithType * var;
+
+	QualifiedNameExpr( Declaration * decl, std::string name): Expression(), type_decl(decl), name(name) {}
+	QualifiedNameExpr( const QualifiedNameExpr & other): Expression(other), type_decl(other.type_decl), name(other.name), var(other.var) {}
+	DeclarationWithType * get_var() const { return var; }
+	void set_var( DeclarationWithType * newValue ) { var = newValue; }
+
+	virtual ~QualifiedNameExpr() {
+		delete var;
+		delete type_decl;
+	}
+
+	virtual QualifiedNameExpr * clone() const override {
+		return new QualifiedNameExpr( * this );
+	}
+	virtual void accept( Visitor & v ) override { v.visit(this); }
+	virtual void accept( Visitor & v ) const override { v.visit(this); }
+	virtual Expression * acceptMutator( Mutator & m ) override { 
+		return m.mutate( this ); 
+	}
+	
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override {
+		type_decl->print( os, indent );
+		os << name << std::endl;
+	}
+};
+
 /// VariableExpr represents an expression that simply refers to the value of a named variable.
 /// Does not take ownership of var.
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision f8965f4f89bb1fdec3be05df05ef73c194a09ea5)
+++ src/SynTree/Mutator.h	(revision 996c8edd3d4b0aa7c204a324b34611112cf96308)
@@ -98,4 +98,5 @@
 	virtual Expression * mutate( DefaultArgExpr * argExpr ) = 0;
 	virtual Expression * mutate( GenericExpr * genExpr ) = 0;
+	virtual Expression * mutate( QualifiedNameExpr * qualifiedNameExpr ) = 0;
 
 	virtual Type * mutate( VoidType * basicType ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision f8965f4f89bb1fdec3be05df05ef73c194a09ea5)
+++ src/SynTree/SynTree.h	(revision 996c8edd3d4b0aa7c204a324b34611112cf96308)
@@ -103,4 +103,5 @@
 class DefaultArgExpr;
 class GenericExpr;
+class QualifiedNameExpr;
 
 class Type;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision f8965f4f89bb1fdec3be05df05ef73c194a09ea5)
+++ src/SynTree/Type.h	(revision 996c8edd3d4b0aa7c204a324b34611112cf96308)
@@ -345,5 +345,4 @@
 	Type * parent;
 	Type * child;
-
 	QualifiedType( const Type::Qualifiers & tq, Type * parent, Type * child );
 	QualifiedType( const QualifiedType & tq );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision f8965f4f89bb1fdec3be05df05ef73c194a09ea5)
+++ src/SynTree/Visitor.h	(revision 996c8edd3d4b0aa7c204a324b34611112cf96308)
@@ -101,4 +101,6 @@
 	virtual void visit( NameExpr * node ) { visit( const_cast<const NameExpr *>(node) ); }
 	virtual void visit( const NameExpr * nameExpr ) = 0;
+	virtual void visit( QualifiedNameExpr * node ) { visit( const_cast<const QualifiedNameExpr*>(node) );}
+	virtual void visit( const QualifiedNameExpr* qualifiednameExpr ) = 0;
 	virtual void visit( CastExpr * node ) { visit( const_cast<const CastExpr *>(node) ); }
 	virtual void visit( const CastExpr * castExpr ) = 0;
