Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/SynTree/Declaration.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -342,9 +342,4 @@
 	enum EnumHiding { Visible, Hide } hide;
 
-	std::list<StructDecl*> data_constructors;
-	UnionDecl * data_union;
-	EnumDecl * tags;
-	StructDecl * tag_union;
-
 	EnumDecl( const std::string & name,
 	 const std::list< Attribute * > & attributes = std::list< class Attribute * >(),
@@ -367,4 +362,38 @@
 };
 
+class AdtDecl : public AggregateDecl {
+	typedef AggregateDecl Parent;
+  public:
+	std::list<StructDecl*> data_constructors;
+	UnionDecl * data_union;
+	EnumDecl * tag;
+	StructDecl * tag_union;
+
+	AdtDecl( const std::string & name,
+	 const std::list< Attribute * > & attributes = std::list< class Attribute * >(),
+	 LinkageSpec::Spec linkage = LinkageSpec::Cforall, 
+	 const std::list< StructDecl* > data_constructors = std::list< StructDecl * >(),
+	 UnionDecl * data_union = nullptr, EnumDecl * tag = nullptr, StructDecl * tag_union = nullptr )
+	 : Parent( name, attributes, linkage ), data_constructors(data_constructors), 
+	 data_union( data_union ), tag( tag ), tag_union( tag_union ) {}
+
+	AdtDecl( const AdtDecl & other )
+	 : Parent( other ) {}
+
+	virtual AdtDecl * clone() const override { return new AdtDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override final {
+		os << "AdtDecl ... " << indent;
+	}
+	
+private:
+	virtual const char * typeString() const override {
+		return "AdtDecl";
+	}
+};
+
 class TraitDecl : public AggregateDecl {
 	typedef AggregateDecl Parent;
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/SynTree/Mutator.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -30,4 +30,5 @@
 	virtual Declaration * mutate( UnionDecl * aggregateDecl ) = 0;
 	virtual Declaration * mutate( EnumDecl * aggregateDecl ) = 0;
+	virtual Declaration * mutate( AdtDecl * aggregateDecl ) = 0;
 	virtual Declaration * mutate( TraitDecl * aggregateDecl ) = 0;
 	virtual Declaration * mutate( TypeDecl * typeDecl ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/SynTree/SynTree.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -31,4 +31,5 @@
 class UnionDecl;
 class EnumDecl;
+class AdtDecl;
 class TraitDecl;
 class NamedTypeDecl;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/SynTree/Visitor.h	(revision f4e01f1a8e29b20d612b65cba4f4f8908d914ba8)
@@ -37,4 +37,6 @@
 	virtual void visit( EnumDecl * node ) { visit( const_cast<const EnumDecl *>(node) ); }
 	virtual void visit( const EnumDecl * aggregateDecl ) = 0;
+	virtual void visit( AdtDecl * node ) { visit( const_cast<const AdtDecl *>(node) ); }
+	virtual void visit( const AdtDecl * node ) = 0;
 	virtual void visit( TraitDecl * node ) { visit( const_cast<const TraitDecl *>(node) ); }
 	virtual void visit( const TraitDecl * aggregateDecl ) = 0;
