Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ src/SynTree/Declaration.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -365,5 +365,4 @@
 	typedef AggregateDecl Parent;
   public:
-	std::list<StructDecl*> data_constructors;
 	UnionDecl * data_union;
 	EnumDecl * tag;
@@ -373,7 +372,6 @@
 	 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), 
+	 : Parent( name, attributes, linkage ), 
 	 data_union( data_union ), tag( tag ), tag_union( tag_union ) {}
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ src/SynTree/Mutator.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -110,4 +110,5 @@
 	virtual Type * mutate( FunctionType * functionType ) = 0;
 	virtual Type * mutate( StructInstType * aggregateUseType ) = 0;
+	virtual Type * mutate( AdtInstType * aggregateUseType ) = 0;
 	virtual Type * mutate( UnionInstType * aggregateUseType ) = 0;
 	virtual Type * mutate( EnumInstType * aggregateUseType ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ src/SynTree/SynTree.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -119,4 +119,5 @@
 class UnionInstType;
 class EnumInstType;
+class AdtInstType;
 class TraitInstType;
 class TypeInstType;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ src/SynTree/Type.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -476,4 +476,37 @@
 };
 
+class AdtInstType : public ReferenceToType {
+	typedef ReferenceToType  Parent;
+  public:
+	AdtDecl * baseAdt;
+
+	AdtInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseAdt( 0 ) {}
+	AdtInstType( const Type::Qualifiers & tq, AdtDecl * baseAdt, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
+	AdtInstType( const AdtInstType & other ) : Parent( other ), baseAdt( other.baseAdt ) {}
+
+	AdtDecl * get_baseAdt() const { return baseAdt; }
+	void set_baseAdt( AdtDecl * newValue ) { baseAdt = newValue; }
+	
+	std::list<TypeDecl*> * get_baseParameters();
+	const std::list<TypeDecl*> * get_baseParameters() const;
+
+	virtual bool isComplete() const override;
+
+	virtual AggregateDecl * getAggr() const override;
+	
+	virtual TypeSubstitution genericSubstitution() const override;
+
+	void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const override;
+
+	virtual AdtInstType * clone() const override { return new AdtInstType( * this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Type * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
+
+	virtual void print( std::ostream & os, Indenter indenter = {} ) const override;
+  private:
+	virtual std::string typeString() const override;
+};
+
 class UnionInstType : public ReferenceToType {
 	typedef ReferenceToType Parent;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 561354fd73c46eb32cf2feb6781d0a72427490ac)
+++ src/SynTree/Visitor.h	(revision fa2c005cdb7210e3aaf9b1170f05fbc75444ece7)
@@ -196,4 +196,6 @@
 	virtual void visit( UnionInstType * node ) { visit( const_cast<const UnionInstType *>(node) ); }
 	virtual void visit( const UnionInstType * aggregateUseType ) = 0;
+	virtual void visit( AdtInstType * node ) { visit( const_cast<const AdtInstType *>(node) ); }
+	virtual void visit( const AdtInstType * node ) = 0;
 	virtual void visit( EnumInstType * node ) { visit( const_cast<const EnumInstType *>(node) ); }
 	virtual void visit( const EnumInstType * aggregateUseType ) = 0;
