Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 044ae62f3758370207e9bd48aa003fbc826b3d4d)
+++ src/Parser/DeclarationNode.cc	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -1104,5 +1104,5 @@
 	std::back_insert_iterator<std::vector<ast::ptr<ast::StructDecl>>> out( outputList );
 	for ( const DeclarationNode * cur = firstNode; cur; cur = strict_next( cur ) ) {
-		// td->kind == TypeData::Symbolic
+
 		assert( cur->type->kind == TypeData::Symbolic );
 		const std::string * name = cur->name;
@@ -1125,4 +1125,5 @@
 			member->name = "field_" + std::to_string(i);
 		}
+
 		*out++ = ctor;		
 	}
@@ -1130,11 +1131,40 @@
 }
 
-ast::UnionDecl * buildDataUnion( const CodeLocation & loc, const std::vector<ast::ptr<ast::StructDecl>> & typeList ) {
+void buildDataConstructorsAsMember( DeclarationNode * firstNode, ast::AdtDecl * adtDecl ) {
+	std::back_insert_iterator<std::vector<ast::ptr<ast::Decl>>> out( adtDecl->members );
+	for ( const DeclarationNode * cur = firstNode; cur; cur = strict_next( cur ) ) {
+
+		assert( cur->type->kind == TypeData::Symbolic );
+		const std::string * name = cur->name;
+		auto ctor = new ast::StructDecl( cur->location,
+			std::string(*name),
+			ast::AggregateDecl::Aggregate::Struct
+		);
+		ctor->set_body(true);
+		TypeData * td = cur->type;
+		TypeData::Symbolic_t st = td->symbolic;
+		DeclarationNode * params = st.params;
+		
+		if ( params ) {
+			buildList( params, ctor->members );
+		}
+
+		for ( std::size_t i = 0; i < ctor->members.size(); ++i ) {
+			assert(ctor->members[i]->name == "");
+			ast::Decl * member = ctor->members[i].get_and_mutate();
+			member->name = "field_" + std::to_string(i);
+		}
+
+		*out++ = ctor;		
+	}
+}
+
+ast::UnionDecl * buildDataUnion( const CodeLocation & loc, const std::vector<ast::ptr<ast::Decl>> & typeList ) {
 	ast::UnionDecl * out = new ast::UnionDecl( loc, "temp_data_union" );
 	// size_t index = 0;
 	if ( typeList.size() > 0 ) out->set_body( true );
 	size_t i = 0;
-	for (const ast::ptr<ast::StructDecl> structDecl : typeList ) {
-		ast::StructInstType * inst = new ast::StructInstType(structDecl);
+	for (const ast::ptr<ast::Decl> structDecl : typeList ) {
+		ast::StructInstType * inst = new ast::StructInstType( structDecl.as< ast::StructDecl >() );
 		ast::ObjectDecl * instObj = new ast::ObjectDecl(
 			structDecl->location,
@@ -1149,8 +1179,8 @@
 }
 
-ast::EnumDecl * buildTag( const CodeLocation & loc, std::vector<ast::ptr<ast::StructDecl>> & typeList ) {
+ast::EnumDecl * buildTag( const CodeLocation & loc, std::vector<ast::ptr<ast::Decl>> & typeList ) {
 	ast::EnumDecl * out = new ast::EnumDecl( loc, "temp_data_tag" );
 	if ( typeList.size() > 0 ) out->set_body( true );
-	for ( const ast::ptr<ast::StructDecl> structDecl : typeList ) {
+	for ( const ast::ptr<ast::Decl> structDecl : typeList ) {
 		ast::EnumInstType * inst = new ast::EnumInstType( out );
 		assert( inst->base != nullptr );
@@ -1167,5 +1197,5 @@
 ast::StructDecl * buildTaggedUnions( const TypeData * data, const ast::EnumDecl * tags, const ast::UnionDecl * data_union ) {
 	assert( tags->members.size() == data_union->members.size() );
-	ast::StructDecl * out = new ast::StructDecl( data->location, *(data->adt.name) );
+	ast::StructDecl * out = new ast::StructDecl( data->location, (*(data->adt.name)) + "_tag_union" );
 	out->kind = ast::AggregateDecl::Adt;
 
Index: src/Parser/DeclarationNode.h
===================================================================
--- src/Parser/DeclarationNode.h	(revision 044ae62f3758370207e9bd48aa003fbc826b3d4d)
+++ src/Parser/DeclarationNode.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -218,6 +218,7 @@
 
 std::vector<ast::ptr<ast::StructDecl>> buildDataConstructors( DeclarationNode * firstNode );
-ast::UnionDecl * buildDataUnion( const CodeLocation & loc, const std::vector<ast::ptr<ast::StructDecl>> & typeList );
-ast::EnumDecl * buildTag( const CodeLocation & loc, std::vector<ast::ptr<ast::StructDecl>> & typeList );
+void buildDataConstructorsAsMember( DeclarationNode * firstNode, ast::AdtDecl * adtDecl );
+ast::UnionDecl * buildDataUnion( const CodeLocation & loc, const std::vector<ast::ptr<ast::Decl>> & typeList );
+ast::EnumDecl * buildTag( const CodeLocation & loc, std::vector<ast::ptr<ast::Decl>> & typeList );
 ast::StructDecl * buildTaggedUnions( const TypeData * data, const ast::EnumDecl * tag, const ast::UnionDecl * data_union );
 
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 044ae62f3758370207e9bd48aa003fbc826b3d4d)
+++ src/Parser/TypeData.cc	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -81,4 +81,6 @@
 	case Symbolic:
 	case SymbolicInst:
+		aggregate.kind =  ast::AggregateDecl::Aggregate::Undecided;
+		
 		symbolic.name = nullptr;
 		symbolic.params = nullptr;
@@ -225,8 +227,7 @@
 		newtype->enumeration.body = enumeration.body;
 		newtype->enumeration.anon = enumeration.anon;
-		newtype->enumeration.data_constructors = maybeClone( enumeration.data_constructors );
 		break;
 	case Adt:
-		newtype->adt.data_constructors = maybeClone( enumeration.data_constructors );
+		newtype->adt.data_constructors = maybeClone( adt.data_constructors );
 		newtype->adt.name = new string ( *adt.name );
 		break;
@@ -1276,13 +1277,5 @@
 	);
 	buildList( td->enumeration.constants, ret->members );
-	if ( td->enumeration.data_constructors != nullptr ) {
-		assert( false );
-		// ret->data_constructors = buildDataConstructors( td->enumeration.data_constructors );
-		// ret->data_union = buildDataUnion( td->location, ret->data_constructors );
-		// ret->tag = buildTag( td->location, ret->data_constructors );
-		// ret->tag_union = buildTaggedUnions( td, ret->tag.get(), ret->data_union.get() );
-	}
-
-	// if ( ret->data_constructors.size() > 0 ) ret->isData = true;
+
 	auto members = ret->members.begin();
 	ret->hide = td->enumeration.hiding == EnumHiding::Hide ? ast::EnumDecl::EnumHiding::Hide : ast::EnumDecl::EnumHiding::Visible;
@@ -1317,7 +1310,9 @@
 	assert( td->kind == TypeData::Adt );
 	ast::AdtDecl * ret = new ast::AdtDecl( td->location, *(td->adt.name) );
-	ret->data_constructors = buildDataConstructors( td->adt.data_constructors );
-	ret->data_union = buildDataUnion( td->location, ret->data_constructors );
-	ret->tag = buildTag( td->location, ret->data_constructors );
+
+	buildDataConstructorsAsMember( td->adt.data_constructors, ret );
+
+	ret->data_union = buildDataUnion( td->location, ret->members );
+	ret->tag = buildTag( td->location, ret->members );
 	ret->tag_union = buildTaggedUnions( td, ret->tag.get(), ret->data_union.get() );
 	return ret;
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 044ae62f3758370207e9bd48aa003fbc826b3d4d)
+++ src/Parser/TypeData.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -25,5 +25,5 @@
 struct TypeData {
 	enum Kind { Basic, Pointer, Reference, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
-				SymbolicInst, Tuple, Basetypeof, Typeof, Vtable, Builtin, GlobalScope, Qualified, Adt, Ctor, Unknown };
+				SymbolicInst, Tuple, Basetypeof, Typeof, Vtable, Builtin, GlobalScope, Qualified, Adt, Unknown };
 
 	struct Aggregate_t {
@@ -59,6 +59,4 @@
 		EnumHiding hiding;
 		bool isData = false;
-
-		DeclarationNode * data_constructors = nullptr;
 	};
 
