Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/CodeGen/GenType.cc	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -48,6 +48,8 @@
 		void postvisit( ZeroType * zeroType );
 		void postvisit( OneType * oneType );
+		void postvisit( GlobalScopeType * globalType );
 		void postvisit( TraitInstType * inst );
 		void postvisit( TypeofType * typeof );
+		void postvisit( QualifiedType * qualType );
 
 	  private:
@@ -291,4 +293,9 @@
 	}
 
+	void GenType::postvisit( GlobalScopeType * globalType ) {
+		assertf( ! genC, "Global scope type should not reach code generation." );
+		handleQualifiers( globalType );
+	}
+
 	void GenType::postvisit( TraitInstType * inst ) {
 		assertf( ! genC, "Trait types should not reach code generation." );
@@ -307,4 +314,12 @@
 	}
 
+	void GenType::postvisit( QualifiedType * qualType ) {
+		assertf( ! genC, "Qualified types should not reach code generation." );
+		std::ostringstream os;
+		os << genType( qualType->parent, "", pretty, genC, lineMarks ) << "." << genType( qualType->child, "", pretty, genC, lineMarks );
+		typeString = os.str();
+		handleQualifiers( qualType );
+	}
+
 	void GenType::handleQualifiers( Type * type ) {
 		if ( type->get_const() ) {
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/Common/PassVisitor.impl.h	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -2268,5 +2268,6 @@
 
 	maybeAccept_impl( node->forall, *this );
-	maybeAccept_impl( node->types, *this );
+	maybeAccept_impl( node->parent, *this );
+	maybeAccept_impl( node->child, *this );
 
 	VISIT_END( node );
@@ -2278,5 +2279,6 @@
 
 	maybeMutate_impl( node->forall, *this );
-	maybeMutate_impl( node->types, *this );
+	maybeMutate_impl( node->parent, *this );
+	maybeMutate_impl( node->child, *this );
 
 	MUTATE_END( Type, node );
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/Parser/DeclarationNode.cc	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -261,6 +261,13 @@
 
 DeclarationNode * DeclarationNode::newQualifiedType( DeclarationNode * parent, DeclarationNode * child) {
-	return child;
-	// return parent->add_last( child );
+	DeclarationNode * newnode = new DeclarationNode;
+	newnode->type = new TypeData( TypeData::Qualified );
+	newnode->type->qualified.parent = parent->type;
+	newnode->type->qualified.child = child->type;
+	parent->type = nullptr;
+	child->type = nullptr;
+	delete parent;
+	delete child;
+	return newnode;
 }
 
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/Parser/TypeData.cc	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -99,4 +99,7 @@
 	  case Builtin:
 		// builtin = new Builtin_t;
+		case Qualified:
+		qualified.parent = nullptr;
+		qualified.child = nullptr;
 		break;
 	} // switch
@@ -167,4 +170,7 @@
 		// delete builtin;
 		break;
+	  case Qualified:
+		delete qualified.parent;
+		delete qualified.child;
 	} // switch
 } // TypeData::~TypeData
@@ -240,4 +246,8 @@
 		assert( builtintype == DeclarationNode::Zero || builtintype == DeclarationNode::One );
 		newtype->builtintype = builtintype;
+		break;
+		case Qualified:
+		newtype->qualified.parent = maybeClone( qualified.parent );
+		newtype->qualified.child = maybeClone( qualified.child );
 		break;
 	} // switch
@@ -468,5 +478,5 @@
 		return new EnumInstType( buildQualifiers( td ), "" );
 	  case TypeData::SymbolicInst:
-		return buildSymbolicInst( td );;
+		return buildSymbolicInst( td );
 	  case TypeData::Tuple:
 		return buildTuple( td );
@@ -483,4 +493,8 @@
 			return new VarArgsType( buildQualifiers( td ) );
 		}
+	  case TypeData::GlobalScope:
+		return new GlobalScopeType();
+		case TypeData::Qualified:
+		return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
 	  case TypeData::Symbolic:
 	  case TypeData::Enum:
@@ -488,4 +502,5 @@
 		assert( false );
 	} // switch
+
 	return nullptr;
 } // typebuild
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/Parser/TypeData.h	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -27,5 +27,5 @@
 struct TypeData {
 	enum Kind { Basic, Pointer, Array, Reference, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
-				SymbolicInst, Tuple, Typeof, Builtin, GlobalScope, Unknown };
+				SymbolicInst, Tuple, Typeof, Builtin, GlobalScope, Qualified, Unknown };
 
 	struct Aggregate_t {
@@ -75,4 +75,9 @@
 	};
 
+	struct Qualified_t { // qualified type S.T
+		TypeData * parent;
+		TypeData * child;
+	};
+
 	CodeLocation location;
 
@@ -94,4 +99,5 @@
 	Function_t function;
 	Symbolic_t symbolic;
+	Qualified_t qualified;
 	DeclarationNode * tuple;
 	ExpressionNode * typeexpr;
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/SynTree/Type.cc	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -106,18 +106,22 @@
 
 
-QualifiedType::QualifiedType( const Type::Qualifiers & tq, const std::list< Type * > & types ) : Type( tq, {} ), types( types ) {
+QualifiedType::QualifiedType( const Type::Qualifiers & tq, Type * parent, Type * child ) : Type( tq, {} ), parent( parent ), child( child ) {
 }
 
-QualifiedType::QualifiedType( const QualifiedType & other ) : Type( other ) {
-	cloneAll( other.types, types );
+QualifiedType::QualifiedType( const QualifiedType & other ) : Type( other ), parent( maybeClone( other.parent ) ), child( maybeClone( other.child ) ) {
 }
 
 QualifiedType::~QualifiedType() {
-	deleteAll( types );
+	delete parent;
+	delete child;
 }
 
 void QualifiedType::print( std::ostream & os, Indenter indent ) const {
 	os << "Qualified Type: " << endl;
-	printAll( types, os, indent+1 );
+	os << indent+1;
+	parent->print( os, indent+1 );
+	os << endl << indent+1;
+	child->print( os, indent+1 );
+	os << endl;
 	Type::print( os, indent+1 );
 }
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 9a7a3b6c9f6f1ee9bd0189a208bca78854db3d93)
+++ src/SynTree/Type.h	(revision c194661e377fb587400b93fef5a817d3d77ac641)
@@ -317,7 +317,8 @@
 class QualifiedType : public Type {
 public:
-	std::list<Type *> types;
-
-	QualifiedType( const Type::Qualifiers & tq, const std::list< Type * > & types );
+	Type * parent;
+	Type * child;
+
+	QualifiedType( const Type::Qualifiers & tq, Type * parent, Type * child );
 	QualifiedType( const QualifiedType & tq );
 	virtual ~QualifiedType();
