Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Common/PassVisitor.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -146,4 +146,5 @@
 	virtual void visit( ZeroType * zeroType ) override final;
 	virtual void visit( OneType * oneType ) override final;
+	virtual void visit( GlobalScopeType * globalType ) override final;
 
 	virtual void visit( Designation * designation ) override final;
@@ -247,4 +248,5 @@
 	virtual Type * mutate( ZeroType * zeroType ) override final;
 	virtual Type * mutate( OneType * oneType ) override final;
+	virtual Type * mutate( GlobalScopeType * globalType ) override final;
 
 	virtual Designation * mutate( Designation * designation ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Common/PassVisitor.impl.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -2576,4 +2576,24 @@
 
 //--------------------------------------------------------------------------
+// GlobalScopeType
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( GlobalScopeType * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->forall, *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) {
+	MUTATE_START( node );
+
+	maybeMutate_impl( node->forall, *this );
+
+	MUTATE_END( Type, node );
+}
+
+//--------------------------------------------------------------------------
 // Designation
 template< typename pass_type >
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Parser/DeclarationNode.cc	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -253,4 +253,10 @@
 	return newnode;
 } // DeclarationNode::newFromTypedef
+
+DeclarationNode * DeclarationNode::newFromGlobalScope() {
+	DeclarationNode * newnode = new DeclarationNode;
+	newnode->type = new TypeData( TypeData::GlobalScope );
+	return newnode;
+}
 
 DeclarationNode * DeclarationNode::newQualifiedType( DeclarationNode * parent, DeclarationNode * child) {
@@ -998,20 +1004,20 @@
 		try {
 			Declaration * decl = cur->build();
-			if ( decl ) {
-				if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * >( decl ) ) {
-					dwt->location = cur->location;
-					* out++ = dwt;
-				} else if ( StructDecl * agg = dynamic_cast< StructDecl * >( decl ) ) {
-					StructInstType * inst = new StructInstType( Type::Qualifiers(), agg->name );
-					auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr );
-					obj->location = cur->location;
-					* out++ = obj;
-					delete agg;
-				} else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) {
-					UnionInstType * inst = new UnionInstType( Type::Qualifiers(), agg->name );
-					auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr );
-					obj->location = cur->location;
-					* out++ = obj;
-				} // if
+			assert( decl );
+			if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * >( decl ) ) {
+				dwt->location = cur->location;
+				* out++ = dwt;
+			} else if ( StructDecl * agg = dynamic_cast< StructDecl * >( decl ) ) {
+				// xxx - this might be where anonymous struct members are added - should be conditional on struct name
+				StructInstType * inst = new StructInstType( Type::Qualifiers(), agg->name );
+				auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr );
+				obj->location = cur->location;
+				* out++ = obj;
+				delete agg;
+			} else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) {
+				UnionInstType * inst = new UnionInstType( Type::Qualifiers(), agg->name );
+				auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr );
+				obj->location = cur->location;
+				* out++ = obj;
 			} // if
 		} catch( SemanticErrorException &e ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Parser/ParseNode.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -231,4 +231,5 @@
 	static DeclarationNode * newForall( DeclarationNode * );
 	static DeclarationNode * newFromTypedef( const std::string * );
+	static DeclarationNode * newFromGlobalScope();
 	static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );
 	static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Parser/TypeData.cc	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -37,4 +37,5 @@
 	  case Reference:
 	  case EnumConstant:
+	  case GlobalScope:
 		// nothing else to initialize
 		break;
@@ -112,4 +113,5 @@
 	  case Reference:
 	  case EnumConstant:
+	  case GlobalScope:
 		// nothing to destroy
 		break;
@@ -180,4 +182,5 @@
 	  case Pointer:
 	  case Reference:
+	  case GlobalScope:
 		// nothing else to copy
 		break;
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Parser/TypeData.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -27,5 +27,5 @@
 struct TypeData {
 	enum Kind { Basic, Pointer, Array, Reference, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
-				SymbolicInst, Tuple, Typeof, Builtin, Unknown };
+				SymbolicInst, Tuple, Typeof, Builtin, GlobalScope, Unknown };
 
 	struct Aggregate_t {
@@ -88,10 +88,8 @@
 	DeclarationNode * forall;
 
-	// Basic_t basic;
 	Aggregate_t aggregate;
 	AggInst_t aggInst;
 	Array_t array;
 	Enumeration_t enumeration;
-	// Variable_t variable;
 	Function_t function;
 	Symbolic_t symbolic;
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/Parser/parser.yy	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -1792,10 +1792,10 @@
 		{ $$ = DeclarationNode::newFromTypedef( $1 ); }
 	| '.' TYPEDEFname
-		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = DeclarationNode::newQualifiedType( DeclarationNode::newFromGlobalScope(), DeclarationNode::newFromTypedef( $2 ) ); }
 	| type_name '.' TYPEDEFname
 		{ $$ = DeclarationNode::newQualifiedType( $1, DeclarationNode::newFromTypedef( $3 ) ); }
 	| typegen_name
 	| '.' typegen_name
-		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = DeclarationNode::newQualifiedType( DeclarationNode::newFromGlobalScope(), $2 ); }
 	| type_name '.' typegen_name
 		{ $$ = DeclarationNode::newQualifiedType( $1, $3 ); }
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/SynTree/Mutator.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -114,4 +114,5 @@
 	virtual Type * mutate( ZeroType * zeroType ) = 0;
 	virtual Type * mutate( OneType * oneType ) = 0;
+	virtual Type * mutate( GlobalScopeType * globalType ) = 0;
 
 	virtual Designation * mutate( Designation * designation ) = 0 ;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/SynTree/SynTree.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -124,4 +124,5 @@
 class ZeroType;
 class OneType;
+class GlobalScopeType;
 
 class Designation;
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/SynTree/Type.cc	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -118,7 +118,13 @@
 
 void QualifiedType::print( std::ostream & os, Indenter indent ) const {
-	os << "Qualified Type: ";
+	os << "Qualified Type: " << endl;
 	printAll( types, os, indent+1 );
 	Type::print( os, indent+1 );
+}
+
+GlobalScopeType::GlobalScopeType() : Type( Type::Qualifiers(), {} ) {}
+
+void GlobalScopeType::print( std::ostream & os, Indenter indent ) const {
+	os << "Global Scope Type" << endl;
 }
 
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/SynTree/Type.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -679,4 +679,14 @@
 };
 
+class GlobalScopeType : public Type {
+  public:
+	GlobalScopeType();
+
+	virtual GlobalScopeType *clone() const override { return new GlobalScopeType( *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;
+};
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 704d11e2ffdbb692fc9273100ec7d9ce249c179c)
+++ src/SynTree/Visitor.h	(revision 47498bd8cd902a113be9b4b17ce98ecbdcaea509)
@@ -116,4 +116,5 @@
 	virtual void visit( ZeroType * zeroType ) = 0;
 	virtual void visit( OneType * oneType ) = 0;
+	virtual void visit( GlobalScopeType * globalType ) = 0;
 
 	virtual void visit( Designation * designation ) = 0;
