Index: src/Validate/EliminateTypedef.cpp
===================================================================
--- src/Validate/EliminateTypedef.cpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/EliminateTypedef.cpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -31,4 +31,5 @@
 	ast::StructDecl const * previsit( ast::StructDecl const * decl );
 	ast::UnionDecl const * previsit( ast::UnionDecl const * decl );
+	ast::AdtDecl const * previsit( ast::AdtDecl const * decl );
 	// Remove typedefs from statement lists.
 	ast::CompoundStmt const * previsit( ast::CompoundStmt const * stmt );
@@ -65,4 +66,8 @@
 }
 
+ast::AdtDecl const * EliminateTypedefCore::previsit( ast::AdtDecl const * decl ) {
+	return field_erase_if( decl, &ast::AdtDecl::members, isTypedef );
+}
+
 ast::CompoundStmt const * EliminateTypedefCore::previsit( ast::CompoundStmt const * stmt ) {
 	return field_erase_if( stmt, &ast::CompoundStmt::kids, isTypedefStmt );
Index: src/Validate/FixQualifiedTypes.cpp
===================================================================
--- src/Validate/FixQualifiedTypes.cpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/FixQualifiedTypes.cpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -59,4 +59,7 @@
 				instp = inst;
 			} else if ( auto inst = parent.as<ast::UnionInstType>() ) {
+				aggr = inst->base;
+				instp = inst;
+			} else if ( auto inst = parent.as<ast::AdtInstType>() ) {
 				aggr = inst->base;
 				instp = inst;
Index: src/Validate/HoistStruct.cpp
===================================================================
--- src/Validate/HoistStruct.cpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/HoistStruct.cpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -28,5 +28,6 @@
 	return dynamic_cast< ast::StructDecl const * >( decl )
 		|| dynamic_cast< ast::UnionDecl const * >( decl )
-		|| dynamic_cast< ast::StaticAssertDecl const * >( decl );
+		|| dynamic_cast< ast::StaticAssertDecl const * >( decl )
+		|| dynamic_cast< ast::AdtDecl const * >( decl );
 }
 
@@ -45,4 +46,6 @@
 	ast::UnionInstType const * previsit( ast::UnionInstType const * type );
 	ast::EnumInstType const * previsit( ast::EnumInstType const * type );
+	ast::AdtDecl const * previsit( ast::AdtDecl const * decl );
+	ast::AdtDecl const * postvisit( ast::AdtDecl const * decl );
 
 private:
@@ -100,4 +103,12 @@
 }
 
+ast::AdtDecl const * HoistStructCore::previsit( ast::AdtDecl const * decl ) {
+	return preAggregate( decl );
+}
+
+ast::AdtDecl const * HoistStructCore::postvisit( ast::AdtDecl const * decl ) {
+	return postAggregate( decl );
+}
+
 ast::StructDecl const * HoistStructCore::postvisit( ast::StructDecl const * decl ) {
 	return postAggregate( decl );
@@ -138,8 +149,4 @@
 }
 
-void hoistAdt( [[maybe_unused]] ast::TranslationUnit & trnaslationUnit ) {
-	
-}
-
 } // namespace Validate
 
Index: src/Validate/HoistStruct.hpp
===================================================================
--- src/Validate/HoistStruct.hpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/HoistStruct.hpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -24,5 +24,4 @@
 /// Flattens nested type declarations. (Run right after Fix Qualified Types.)
 void hoistStruct( ast::TranslationUnit & translationUnit );
-void hoistAdt( ast::TranslationUnit & trnaslationUnit );
 
 }
Index: src/Validate/LinkReferenceToTypes.cpp
===================================================================
--- src/Validate/LinkReferenceToTypes.cpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/LinkReferenceToTypes.cpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -20,4 +20,5 @@
 #include "Validate/ForallPointerDecay.hpp"
 #include "Validate/NoIdSymbolTable.hpp"
+#include <assert.h>
 
 namespace Validate {
@@ -35,4 +36,5 @@
 	ast::UnionInstType const * postvisit( ast::UnionInstType const * type );
 	ast::TraitInstType const * postvisit( ast::TraitInstType const * type );
+	ast::AdtInstType const * postvisit( ast::AdtInstType const * type );
 	void previsit( ast::QualifiedType const * type );
 	void postvisit( ast::QualifiedType const * type );
@@ -107,4 +109,15 @@
 		auto mut = ast::mutate( type );
 		forwardStructs[ mut->name ].push_back( mut );
+		type = mut;
+	}
+	return type;
+}
+
+ast::AdtInstType const * LinkTypesCore::postvisit( ast::AdtInstType const * type ) {
+	ast::AdtDecl const * decl = symtab.lookupAdt( type->name );
+	assert( decl != nullptr );
+	if ( decl ) {
+		auto mut = ast::mutate( type );
+		mut->base = const_cast<ast::AdtDecl *>( decl );
 		type = mut;
 	}
Index: src/Validate/NoIdSymbolTable.hpp
===================================================================
--- src/Validate/NoIdSymbolTable.hpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/NoIdSymbolTable.hpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -41,4 +41,5 @@
 	FORWARD_1( lookupUnion , const std::string & )
 	FORWARD_1( lookupTrait , const std::string & )
+	FORWARD_1( lookupAdt   , const std::string & )
 	FORWARD_1( addType  , const ast::NamedTypeDecl * )
 	FORWARD_1( addStruct, const ast::StructDecl *    )
@@ -49,4 +50,5 @@
 	FORWARD_1( addStruct, const std::string &        )
 	FORWARD_1( addUnion , const std::string &        )
+	FORWARD_1( addAdt   , const std::string &		 )
 	FORWARD_2( addWith  , const std::vector< ast::ptr<ast::Expr> > &, const ast::Decl * )
 
Index: src/Validate/ReplaceTypedef.cpp
===================================================================
--- src/Validate/ReplaceTypedef.cpp	(revision 3a513d8965c8c10afd1ac0dd69e86eee5e6cd6e2)
+++ src/Validate/ReplaceTypedef.cpp	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -60,4 +60,5 @@
 	ast::StructDecl const * previsit( ast::StructDecl const * );
 	ast::UnionDecl const * previsit( ast::UnionDecl const * );
+	ast::AdtDecl const * previsit( ast::AdtDecl const * );
 	void previsit( ast::EnumDecl const * );
 	void previsit( ast::TraitDecl const * );
@@ -90,9 +91,10 @@
 }
 
+// Here, 5/30
 ast::Type const * ReplaceTypedefCore::postvisit(
 		ast::TypeInstType const * type ) {
 	// Instances of typedef types will come here. If it is an instance
 	// of a typedef type, link the instance to its actual type.
-	TypedefMap::const_iterator def = typedefNames.find( type->name );
+	TypedefMap::const_iterator def = typedefNames.find( type->name ); // because of this
 	if ( def != typedefNames.end() ) {
 		ast::Type * ret = ast::deepCopy( def->second.first->base );
@@ -260,4 +262,10 @@
 }
 
+ast::AdtDecl const * ReplaceTypedefCore::previsit( ast::AdtDecl const * decl ) {
+	visit_children = false;
+	addImplicitTypedef( decl );
+	return handleAggregate( decl );
+}
+
 ast::UnionDecl const * ReplaceTypedefCore::previsit( ast::UnionDecl const * decl ) {
 	visit_children = false;
@@ -287,4 +295,6 @@
 	} else if ( auto enumDecl = dynamic_cast<const ast::EnumDecl *>( aggrDecl ) ) {
 		type = new ast::EnumInstType( enumDecl->name );
+	} else if ( auto adtDecl = dynamic_cast<const ast::AdtDecl *>( aggrDecl )) {
+		type = new ast::AdtInstType( adtDecl->name );
 	}
 	assert( type );
