Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
+++ src/AST/Pass.proto.hpp	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -430,4 +430,20 @@
 
 	template<typename core_t>
+	static inline auto addAdtFwd( core_t & core, int, const ast::AdtDecl * decl ) -> decltype( core.symtab.addAdt( decl ), void() ) {
+		ast::AdtDecl * fwd = new ast::AdtDecl( decl->location, decl->name );
+		for ( const auto & param : decl->params ) {
+			fwd->params.push_back( deepCopy( param.get() ) );
+		}
+		// Experimental
+		for ( const auto & ctor : decl->data_constructors ) {
+			addStructFwd( core, 0, ctor  );
+		} 
+		core.symtab.addAdt( fwd );
+	}
+
+	template<typename core_t>
+	static inline auto addAdtFwd( core_t &, long, const ast::AdtDecl) {}
+
+	template<typename core_t>
 	static inline auto addStruct( core_t & core, int, const std::string & str ) -> decltype( core.symtab.addStruct( str ), void() ) {
 		if ( ! core.symtab.lookupStruct( str ) ) {
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
+++ src/CodeGen/CodeGenerator.cc	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -295,5 +295,5 @@
 	}
 
-	void CodeGenerator::handleData( EnumDecl * dataDecl ) {
+	void CodeGenerator::handleData( EnumDecl * ) {
 		// output << " /** data type */" << endl;
 		// for ( StructDecl * decl : dataDecl->data_constructors ) {
@@ -348,4 +348,8 @@
 			} // if
 		} // if
+	}
+
+	void CodeGenerator::postvisit( AdtDecl * ) {
+		// TODO
 	}
 
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
+++ src/CodeGen/CodeGenerator.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -53,4 +53,5 @@
 		void postvisit( UnionDecl * aggregateDecl );
 		void postvisit( EnumDecl * aggregateDecl );
+		void postvisit( AdtDecl * AggregateDecl );
 		void postvisit( TraitDecl * aggregateDecl );
 		void postvisit( TypedefDecl * typeDecl );
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
+++ src/Common/PassVisitor.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -443,4 +443,5 @@
 	void indexerAddEnum     ( const EnumDecl            * node  ) { indexer_impl_addEnum     ( pass, 0, node ); }
 	void indexerAddAdt		( const AdtDecl				* node  ) { indexer_impl_addAdt		 ( pass, 0, node ); }
+	void indexerAddAdtFwd	( const AdtDecl				* node  ) { indexer_impl_addAdtFwd   ( pass, 0, node  ); }
 	void indexerAddUnion    ( const std::string         & id    ) { indexer_impl_addUnion    ( pass, 0, id   ); }
 	void indexerAddUnion    ( const UnionDecl           * node  ) { indexer_impl_addUnion    ( pass, 0, node ); }
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
+++ src/Common/PassVisitor.impl.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -793,5 +793,5 @@
 	VISIT_START( node );
 
-	indexerAddAdt( node );
+	indexerAddAdtFwd( node );
 
 	// unlike structs, traits, and unions, enums inject their members into the global scope
@@ -811,4 +811,6 @@
 	VISIT_START( node );
 
+	indexerAddAdtFwd( node );
+
 	maybeAccept_impl( node->data_constructors, *this );
 	maybeAccept_impl( node->data_union, *this );
@@ -826,4 +828,6 @@
 Declaration * PassVisitor< pass_type >::mutate( AdtDecl * node ) {
 	MUTATE_START( node );
+	
+	indexerAddAdtFwd( node );
 
 	maybeMutate_impl( node->data_constructors, *this );
Index: src/Common/PassVisitor.proto.h
===================================================================
--- src/Common/PassVisitor.proto.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
+++ src/Common/PassVisitor.proto.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -252,4 +252,20 @@
 
 template<typename pass_type>
+static inline auto indexer_impl_addAdtFwd( pass_type & pass, int, const AdtDecl * decl ) -> decltype( pass.indexer.addAdt( decl ), void() ) {
+	AdtDecl * fwd = new AdtDecl( decl->name );
+	cloneAll( decl->parameters, fwd->parameters );
+
+	// Experimental
+	for ( const StructDecl * ctor : fwd->data_constructors ) {
+		indexer_impl_addStructFwd( pass, 0, ctor );
+	}
+
+	pass.indexer.addAdt( fwd );
+} 
+
+template<typename pass_type>
+static inline auto indexer_impl_addAdtFwd( pass_type &, long, const AdtDecl * ) {}
+
+template<typename pass_type>
 static inline auto indexer_impl_addUnionFwd( pass_type & pass, int, const UnionDecl * decl ) -> decltype( pass.indexer.addUnion( decl ), void() ) {
 	UnionDecl * fwd = new UnionDecl( decl->name );
