Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/Common/PassVisitor.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -133,4 +133,5 @@
 	virtual void visit( ArrayType * arrayType ) override final;
 	virtual void visit( ReferenceType * referenceType ) override final;
+	virtual void visit( QualifiedType * qualType ) override final;
 	virtual void visit( FunctionType * functionType ) override final;
 	virtual void visit( StructInstType * aggregateUseType ) override final;
@@ -233,4 +234,5 @@
 	virtual Type * mutate( ArrayType * arrayType ) override final;
 	virtual Type * mutate( ReferenceType * referenceType ) override final;
+	virtual Type * mutate( QualifiedType * qualType ) override final;
 	virtual Type * mutate( FunctionType * functionType ) override final;
 	virtual Type * mutate( StructInstType * aggregateUseType ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/Common/PassVisitor.impl.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -2262,4 +2262,26 @@
 
 //--------------------------------------------------------------------------
+// QualifiedType
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( QualifiedType * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->forall, *this );
+	maybeAccept_impl( node->types, *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Type * PassVisitor< pass_type >::mutate( QualifiedType * node ) {
+	MUTATE_START( node );
+
+	maybeMutate_impl( node->forall, *this );
+	maybeMutate_impl( node->types, *this );
+
+	MUTATE_END( Type, node );
+}
+
+//--------------------------------------------------------------------------
 // FunctionType
 template< typename pass_type >
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/Parser/DeclarationNode.cc	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -253,4 +253,9 @@
 	return newnode;
 } // DeclarationNode::newFromTypedef
+
+DeclarationNode * DeclarationNode::newQualifiedType( DeclarationNode * parent, DeclarationNode * child) {
+	return child;
+	// return parent->add_last( child );
+}
 
 DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/Parser/ParseNode.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -231,4 +231,5 @@
 	static DeclarationNode * newForall( DeclarationNode * );
 	static DeclarationNode * newFromTypedef( const std::string * );
+	static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );
 	static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
 	static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/Parser/parser.yy	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -1794,10 +1794,10 @@
 		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
 	| type_name '.' TYPEDEFname
-		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = DeclarationNode::newQualifiedType( $1, DeclarationNode::newFromTypedef( $3 ) ); }
 	| typegen_name
 	| '.' typegen_name
 		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
 	| type_name '.' typegen_name
-		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = DeclarationNode::newQualifiedType( $1, $3 ); }
 	;
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/SynTree/Mutator.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -101,4 +101,5 @@
 	virtual Type * mutate( ArrayType * arrayType ) = 0;
 	virtual Type * mutate( ReferenceType * refType ) = 0;
+	virtual Type * mutate( QualifiedType * qualType ) = 0;
 	virtual Type * mutate( FunctionType * functionType ) = 0;
 	virtual Type * mutate( StructInstType * aggregateUseType ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/SynTree/SynTree.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -110,4 +110,5 @@
 class ArrayType;
 class ReferenceType;
+class QualifiedType;
 class FunctionType;
 class ReferenceToType;
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/SynTree/Type.cc	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -105,4 +105,23 @@
 }
 
+
+QualifiedType::QualifiedType( const Type::Qualifiers & tq, const std::list< Type * > & types ) : Type( tq, {} ), types( types ) {
+}
+
+QualifiedType::QualifiedType( const QualifiedType & other ) : Type( other ) {
+	cloneAll( other.types, types );
+}
+
+QualifiedType::~QualifiedType() {
+	deleteAll( types );
+}
+
+void QualifiedType::print( std::ostream & os, Indenter indent ) const {
+	os << "Qualified Type: ";
+	printAll( types, os, indent+1 );
+	Type::print( os, indent+1 );
+}
+
+
 // Empty Variable declarations:
 const Type::FuncSpecifiers noFuncSpecifiers;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/SynTree/Type.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -315,4 +315,18 @@
 };
 
+class QualifiedType : public Type {
+public:
+	std::list<Type *> types;
+
+	QualifiedType( const Type::Qualifiers & tq, const std::list< Type * > & types );
+	QualifiedType( const QualifiedType & tq );
+	virtual ~QualifiedType();
+
+	virtual QualifiedType *clone() const override { return new QualifiedType( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+};
+
 class ReferenceType : public Type {
 public:
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 29f9e20c3cabdb3ee724c7e3c4b6cc97003758c9)
+++ src/SynTree/Visitor.h	(revision c5d7701933b319f37bdfd125567ff5ffc52d83ef)
@@ -103,4 +103,5 @@
 	virtual void visit( ArrayType * arrayType ) = 0;
 	virtual void visit( ReferenceType * refType ) = 0;
+	virtual void visit( QualifiedType * qualType ) = 0;
 	virtual void visit( FunctionType * functionType ) = 0;
 	virtual void visit( StructInstType * aggregateUseType ) = 0;
