Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Parser/DeclarationNode.cc	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -279,10 +279,12 @@
 } // DeclarationNode::newEnum
 
-DeclarationNode * DeclarationNode::newADT( const string * name, DeclarationNode * constructors ) {
-	DeclarationNode * newnode = newEnum( name, nullptr, true, false );
-	newnode->type->enumeration.isData = true;
-	newnode->type->enumeration.data_constructors = constructors;
-	return newnode;
-}
+DeclarationNode * DeclarationNode::newAdt( const string * name, DeclarationNode * constructors ) {
+	assert( name );
+	DeclarationNode * newnode = new DeclarationNode;
+	newnode->type = new TypeData( TypeData::Adt );
+	newnode->type->adt.name = name;
+	newnode->type->adt.data_constructors = constructors;
+	return newnode;
+} // DeclarationNode::newAdt
 
 
@@ -1098,5 +1100,6 @@
 }
 
-void buildDataConstructors( DeclarationNode * firstNode, std::vector<ast::ptr<ast::StructDecl>> & outputList ) {
+std::vector<ast::ptr<ast::StructDecl>> buildDataConstructors( DeclarationNode * firstNode ) {
+	std::vector<ast::ptr<ast::StructDecl>> outputList;
 	std::back_insert_iterator<std::vector<ast::ptr<ast::StructDecl>>> out( outputList );
 	for ( const DeclarationNode * cur = firstNode; cur; cur = strict_next( cur ) ) {
@@ -1124,8 +1127,9 @@
 		*out++ = ctor;		
 	}
-}
-
-ast::UnionDecl * buildDataUnion( ast::EnumDecl * data, const std::vector<ast::ptr<ast::StructDecl>> & typeList ) {
-	ast::UnionDecl * out = new ast::UnionDecl( data->location, "temp_data_union" );
+	return outputList;
+}
+
+ast::UnionDecl * buildDataUnion( const CodeLocation & loc, const std::vector<ast::ptr<ast::StructDecl>> & typeList ) {
+	ast::UnionDecl * out = new ast::UnionDecl( loc, "temp_data_union" );
 	// size_t index = 0;
 	if ( typeList.size() > 0 ) out->set_body( true );
@@ -1145,6 +1149,6 @@
 }
 
-ast::EnumDecl * buildTag( ast::EnumDecl * data, const std::vector<ast::ptr<ast::StructDecl>> & typeList ) {
-	ast::EnumDecl * out = new ast::EnumDecl( data->location, "temp_data_tag" );
+ast::EnumDecl * buildTag( const CodeLocation & loc, std::vector<ast::ptr<ast::StructDecl>> & 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 ) {
@@ -1161,8 +1165,8 @@
 }
 
-ast::StructDecl * buildTaggedUnions( const ast::EnumDecl * data, const ast::EnumDecl * tags, const ast::UnionDecl * data_union ) {
+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->name );
-	out->kind = ast::AggregateDecl::ADT;
+	ast::StructDecl * out = new ast::StructDecl( data->location, *(data->adt.name) );
+	out->kind = ast::AggregateDecl::Adt;
 
 	out->set_body( true );
Index: src/Parser/DeclarationNode.h
===================================================================
--- src/Parser/DeclarationNode.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Parser/DeclarationNode.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -77,5 +77,5 @@
 
 	// Experimental algebric data type
-	static DeclarationNode * newADT( const std::string * name, DeclarationNode * constructors );
+	static DeclarationNode * newAdt( const std::string * name, DeclarationNode * constructors );
 	static DeclarationNode * newDataConstructor( const std::string * name );
 	// static DeclarationNode * newDataConstructor( const std::string * name, DeclarationNode * typeSpecifiers );
@@ -216,8 +216,9 @@
 void buildList( DeclarationNode * firstNode, std::vector<ast::ptr<ast::DeclWithType>> & outputList );
 void buildTypeList( const DeclarationNode * firstNode, std::vector<ast::ptr<ast::Type>> & outputList );
-void buildDataConstructors( DeclarationNode * firstNode, std::vector<ast::ptr<ast::StructDecl>> & outputList );
-ast::UnionDecl * buildDataUnion( ast::EnumDecl * data, const std::vector<ast::ptr<ast::StructDecl>> & typeList );
-ast::EnumDecl * buildTag( ast::EnumDecl * data, const std::vector<ast::ptr<ast::StructDecl>> & typeList );
-ast::StructDecl * buildTaggedUnions( const ast::EnumDecl * data, const ast::EnumDecl * tags, const ast::UnionDecl * data_union );
+
+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 );
+ast::StructDecl * buildTaggedUnions( const TypeData * data, const ast::EnumDecl * tag, const ast::UnionDecl * data_union );
 
 template<typename AstType, typename NodeType,
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Parser/TypeData.cc	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -59,4 +59,8 @@
 		enumeration.anon = false;
 		break;
+	case Adt:
+		adt.name = nullptr;
+		adt.data_constructors = nullptr;
+		break;
 	case Aggregate:
 		aggregate.kind = ast::AggregateDecl::NoAggregate;
@@ -160,4 +164,8 @@
 		delete qualified.child;
 		break;
+	case Adt:
+		delete adt.data_constructors;
+		delete adt.name;
+		break;
 	} // switch
 } // TypeData::~TypeData
@@ -217,4 +225,9 @@
 		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.name = new string ( *adt.name );
 		break;
 	case Symbolic:
@@ -459,4 +472,6 @@
 	case Enum:
 		return enumeration.name;
+	case Adt:
+		return adt.name;
 	case Symbolic:
 	case SymbolicInst:
@@ -822,4 +837,5 @@
 	case TypeData::Symbolic:
 	case TypeData::Enum:
+	case TypeData::Adt:
 	case TypeData::Aggregate:
 		assert( false );
@@ -1261,11 +1277,12 @@
 	buildList( td->enumeration.constants, ret->members );
 	if ( td->enumeration.data_constructors != nullptr ) {
-		buildDataConstructors( td->enumeration.data_constructors, ret->data_constructors );
-		ret->data_union = buildDataUnion( ret, ret->data_constructors );
-		ret->tag = buildTag( ret, ret->data_constructors );
-		ret->tag_union = buildTaggedUnions( ret, ret->tag.get(), ret->data_union.get() );
+		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;
+	// 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;
@@ -1294,4 +1311,16 @@
 	return ret;
 } // buildEnum
+
+ast::AdtDecl * buildAdt(const TypeData * td,
+	std::vector<ast::ptr<ast::Attribute>> && attributes,
+	ast::Linkage::Spec linkage ) {
+	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 );
+	ret->tag_union = buildTaggedUnions( td, ret->tag.get(), ret->data_union.get() );
+	return ret;
+}
 
 
@@ -1437,4 +1466,6 @@
 	} else if ( td->kind == TypeData::Enum ) {
 		return buildEnum( td, std::move( attributes ), linkage );
+	} else if ( td->kind == TypeData::Adt) {
+		return buildAdt( td, std::move( attributes), linkage );
 	} else if ( td->kind == TypeData::Symbolic ) {
 		return buildSymbolic( td, std::move( attributes ), name, scs, linkage );
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Parser/TypeData.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -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, Ctor, Unknown };
 
 	struct Aggregate_t {
@@ -65,10 +65,5 @@
 	struct ADT_t {
 		const std::string * name = nullptr;
-		DeclarationNode * constructors;
-	};
-
-	struct Constructor_t {
-		const std::string * name;
-		DeclarationNode * type; // types?
+		DeclarationNode * data_constructors;
 	};
 
@@ -112,5 +107,4 @@
 	Enumeration_t enumeration;
 	ADT_t adt;
-	Constructor_t data_constructor;
 
 	Function_t function;
@@ -140,4 +134,5 @@
 ast::TypeDecl * buildVariable( const TypeData * );
 ast::EnumDecl * buildEnum( const TypeData *, std::vector<ast::ptr<ast::Attribute>> &&, ast::Linkage::Spec );
+ast::EnumDecl * buildAst( const TypeData *, std::vector<ast::ptr<ast::Attribute>> &&, ast::Linkage::Spec );
 ast::TypeInstType * buildSymbolicInst( const TypeData * );
 ast::TupleType * buildTuple( const TypeData * );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Parser/parser.yy	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -2702,5 +2702,5 @@
 	 '{' value_list '}'
 	 {
-		$$ = DeclarationNode::newADT( $2, $5 );
+		$$ = DeclarationNode::newAdt( $2, $5 );
 	 }
 	;
