Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision c7a30813626cbca3ee08af1e72db028b89e73881)
+++ src/SynTree/Declaration.h	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -194,8 +194,12 @@
 	};
 
-	TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind );
+	TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, Type * init = nullptr );
 	TypeDecl( const TypeDecl &other );
+	virtual ~TypeDecl();
 
 	Kind get_kind() const { return kind; }
+
+	Type * get_init() const { return init; }
+	TypeDecl * set_init( Type * newValue ) { init = newValue; return this; }
 
 	bool isComplete() const { return kind == Any || sized; }
@@ -209,6 +213,9 @@
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual TypeDecl *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+
   private:
 	Kind kind;
+	Type * init;
 	bool sized;
 };
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision c7a30813626cbca3ee08af1e72db028b89e73881)
+++ src/SynTree/Mutator.cc	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -77,4 +77,5 @@
 TypeDecl *Mutator::mutate( TypeDecl *typeDecl ) {
 	handleNamedTypeDecl( typeDecl );
+	typeDecl->set_init( maybeMutate( typeDecl->get_init(), *this ) );
 	return typeDecl;
 }
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision c7a30813626cbca3ee08af1e72db028b89e73881)
+++ src/SynTree/TypeDecl.cc	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -18,8 +18,12 @@
 #include "Common/utility.h"
 
-TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind ) : Parent( name, scs, type ), kind( kind ), sized( kind == Any || kind == Ttype ) {
+TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, Type * init ) : Parent( name, scs, type ), kind( kind ), init( init ), sized( kind == Any || kind == Ttype ) {
 }
 
-TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), kind( other.kind ), sized( other.sized ) {
+TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), kind( other.kind ), init( maybeClone( other.init ) ), sized( other.sized ) {
+}
+
+TypeDecl::~TypeDecl() {
+  delete init;
 }
 
@@ -34,4 +38,13 @@
 }
 
+void TypeDecl::print( std::ostream &os, int indent ) const {
+  NamedTypeDecl::print( os, indent );
+  if ( init ) {
+    os << std::endl << std::string( indent, ' ' ) << "with type initializer: ";
+    init->print( os, indent + 2 );
+  }
+}
+
+
 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ) {
   return os << data.kind << ", " << data.isComplete;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision c7a30813626cbca3ee08af1e72db028b89e73881)
+++ src/SynTree/Visitor.cc	(revision 67cf18c3e5b8ae6e923fa93e69357ba5e746bf57)
@@ -67,4 +67,5 @@
 void Visitor::visit( TypeDecl *typeDecl ) {
 	handleNamedTypeDecl( static_cast< NamedTypeDecl* >( typeDecl ) );
+	maybeAccept( typeDecl->get_init(), *this );
 }
 
