Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ 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 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ 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 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ 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 );
