Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision ab780e6afda20d69d650b2152ea5f5988f5f85e0)
+++ src/Parser/ExpressionNode.cc	(revision 7a780ad23506507b6a1feccc46d18e12da183ceb)
@@ -23,6 +23,7 @@
 #include <string>                  // for string, operator+, operator==
 
+#include "AST/BasicKind.hpp"       // for BasicKind
 #include "AST/Expr.hpp"            // for NameExpr
-#include "AST/Type.hpp"            // for BaseType, SueInstType
+#include "AST/Type.hpp"            // for Type, LengthFlag, DimentionFlag
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for maybeMoveBuild, maybeBuild, CodeLo...
@@ -126,8 +127,8 @@
 ast::Expr * build_constantInteger(
 		const CodeLocation & location, string & str ) {
-	static const ast::BasicType::Kind kind[2][6] = {
+	static const ast::BasicKind kind[2][6] = {
 		// short (h) must be before char (hh) because shorter type has the longer suffix
-		{ ast::BasicType::ShortSignedInt, ast::BasicType::SignedChar, ast::BasicType::SignedInt, ast::BasicType::LongSignedInt, ast::BasicType::LongLongSignedInt, /* BasicType::SignedInt128 */ ast::BasicType::LongLongSignedInt, },
-		{ ast::BasicType::ShortUnsignedInt, ast::BasicType::UnsignedChar, ast::BasicType::UnsignedInt, ast::BasicType::LongUnsignedInt, ast::BasicType::LongLongUnsignedInt, /* BasicType::UnsignedInt128 */ ast::BasicType::LongLongUnsignedInt, },
+		{ ast::BasicKind::ShortSignedInt, ast::BasicKind::SignedChar, ast::BasicKind::SignedInt, ast::BasicKind::LongSignedInt, ast::BasicKind::LongLongSignedInt, /* BasicKind::SignedInt128 */ ast::BasicKind::LongLongSignedInt, },
+		{ ast::BasicKind::ShortUnsignedInt, ast::BasicKind::UnsignedChar, ast::BasicKind::UnsignedInt, ast::BasicKind::LongUnsignedInt, ast::BasicKind::LongLongUnsignedInt, /* BasicKind::UnsignedInt128 */ ast::BasicKind::LongLongUnsignedInt, },
 	};
 
@@ -313,5 +314,5 @@
 		if ( ltype == 6 ) {								// int128, (int128)constant
 			ret2 = new ast::ConstantExpr( location,
-				new ast::BasicType( ast::BasicType::LongLongSignedInt ),
+				new ast::BasicType( ast::BasicKind::LongLongSignedInt ),
 				str2,
 				v2 );
@@ -379,7 +380,7 @@
 ast::Expr * build_constantFloat(
 		const CodeLocation & location, string & str ) {
-	static const ast::BasicType::Kind kind[2][12] = {
-		{ ast::BasicType::Float, ast::BasicType::Double, ast::BasicType::LongDouble, ast::BasicType::uuFloat80, ast::BasicType::uuFloat128, ast::BasicType::uFloat16, ast::BasicType::uFloat32, ast::BasicType::uFloat32x, ast::BasicType::uFloat64, ast::BasicType::uFloat64x, ast::BasicType::uFloat128, ast::BasicType::uFloat128x },
-		{ ast::BasicType::FloatComplex, ast::BasicType::DoubleComplex, ast::BasicType::LongDoubleComplex, ast::BasicType::NUMBER_OF_BASIC_TYPES, ast::BasicType::NUMBER_OF_BASIC_TYPES, ast::BasicType::uFloat16Complex, ast::BasicType::uFloat32Complex, ast::BasicType::uFloat32xComplex, ast::BasicType::uFloat64Complex, ast::BasicType::uFloat64xComplex, ast::BasicType::uFloat128Complex, ast::BasicType::uFloat128xComplex },
+	static const ast::BasicKind kind[2][12] = {
+		{ ast::BasicKind::Float, ast::BasicKind::Double, ast::BasicKind::LongDouble, ast::BasicKind::uuFloat80, ast::BasicKind::uuFloat128, ast::BasicKind::uFloat16, ast::BasicKind::uFloat32, ast::BasicKind::uFloat32x, ast::BasicKind::uFloat64, ast::BasicKind::uFloat64x, ast::BasicKind::uFloat128, ast::BasicKind::uFloat128x },
+		{ ast::BasicKind::FloatComplex, ast::BasicKind::DoubleComplex, ast::BasicKind::LongDoubleComplex, ast::BasicKind::NUMBER_OF_BASIC_TYPES, ast::BasicKind::NUMBER_OF_BASIC_TYPES, ast::BasicKind::uFloat16Complex, ast::BasicKind::uFloat32Complex, ast::BasicKind::uFloat32xComplex, ast::BasicKind::uFloat64Complex, ast::BasicKind::uFloat64xComplex, ast::BasicKind::uFloat128Complex, ast::BasicKind::uFloat128xComplex },
 	};
 
@@ -447,5 +448,5 @@
 
 	ast::Expr * ret = new ast::ConstantExpr( location,
-		new ast::BasicType( ast::BasicType::Char ),
+		new ast::BasicType( ast::BasicKind::Char ),
 		str,
 		(unsigned long long int)(unsigned char)str[1] );
@@ -482,5 +483,5 @@
 	Default:											// char default string type
 	default:
-		strtype = new ast::BasicType( ast::BasicType::Char );
+		strtype = new ast::BasicType( ast::BasicKind::Char );
 	} // switch
 	ast::ArrayType * at = new ast::ArrayType(
@@ -664,5 +665,5 @@
 		member->name
 	);
-	ret->result = new ast::BasicType( ast::BasicType::LongUnsignedInt );
+	ret->result = new ast::BasicType( ast::BasicKind::LongUnsignedInt );
 	delete member;
 	return ret;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision ab780e6afda20d69d650b2152ea5f5988f5f85e0)
+++ src/Parser/TypeData.cc	(revision 7a780ad23506507b6a1feccc46d18e12da183ceb)
@@ -19,8 +19,9 @@
 #include <ostream>                 // for operator<<, ostream, basic_ostream
 
+#include "AST/Attribute.hpp"       // for Attribute
 #include "AST/Decl.hpp"            // for AggregateDecl, ObjectDecl, TypeDe...
-#include "AST/Attribute.hpp"       // for Attribute
 #include "AST/Init.hpp"            // for SingleInit, ListInit
 #include "AST/Print.hpp"           // for print
+#include "AST/Type.hpp"            // for Type
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for splice, spliceBegin
@@ -1010,5 +1011,5 @@
 		// fill in implicit int
 		return new ast::BasicType(
-			ast::BasicType::SignedInt,
+			ast::BasicKind::SignedInt,
 			buildQualifiers( td )
 		);
@@ -1095,5 +1096,5 @@
 
 ast::Type * buildBasicType( const TypeData * td ) {
-	ast::BasicType::Kind ret;
+	ast::BasicKind ret;
 
 	switch ( td->basictype ) {
@@ -1116,5 +1117,5 @@
 		} // if
 
-		ret = ast::BasicType::Bool;
+		ret = ast::BasicKind::Bool;
 		break;
 
@@ -1123,5 +1124,5 @@
 		// character types. The implementation shall define char to have the same range, representation, and behavior as
 		// either signed char or unsigned char.
-		static ast::BasicType::Kind chartype[] = { ast::BasicType::SignedChar, ast::BasicType::UnsignedChar, ast::BasicType::Char };
+		static ast::BasicKind chartype[] = { ast::BasicKind::SignedChar, ast::BasicKind::UnsignedChar, ast::BasicKind::Char };
 
 		if ( td->length != TypeData::NoLength ) {
@@ -1133,7 +1134,7 @@
 
 	case TypeData::Int:
-		static ast::BasicType::Kind inttype[2][4] = {
-			{ ast::BasicType::ShortSignedInt, ast::BasicType::LongSignedInt, ast::BasicType::LongLongSignedInt, ast::BasicType::SignedInt },
-			{ ast::BasicType::ShortUnsignedInt, ast::BasicType::LongUnsignedInt, ast::BasicType::LongLongUnsignedInt, ast::BasicType::UnsignedInt },
+		static ast::BasicKind inttype[2][4] = {
+			{ ast::BasicKind::ShortSignedInt, ast::BasicKind::LongSignedInt, ast::BasicKind::LongLongSignedInt, ast::BasicKind::SignedInt },
+			{ ast::BasicKind::ShortUnsignedInt, ast::BasicKind::LongUnsignedInt, ast::BasicKind::LongLongUnsignedInt, ast::BasicKind::UnsignedInt },
 		};
 
@@ -1146,5 +1147,5 @@
 
 	case TypeData::Int128:
-		ret = td->signedness == TypeData::Unsigned ? ast::BasicType::UnsignedInt128 : ast::BasicType::SignedInt128;
+		ret = td->signedness == TypeData::Unsigned ? ast::BasicKind::UnsignedInt128 : ast::BasicKind::SignedInt128;
 		if ( td->length != TypeData::NoLength ) {
 			genTSError( TypeData::lengthNames[ td->length ], td->basictype );
@@ -1164,7 +1165,7 @@
 	case TypeData::uFloat128:
 	case TypeData::uFloat128x:
-		static ast::BasicType::Kind floattype[2][12] = {
-			{ ast::BasicType::FloatComplex, ast::BasicType::DoubleComplex, ast::BasicType::LongDoubleComplex, (ast::BasicType::Kind)-1, (ast::BasicType::Kind)-1, ast::BasicType::uFloat16Complex, ast::BasicType::uFloat32Complex, ast::BasicType::uFloat32xComplex, ast::BasicType::uFloat64Complex, ast::BasicType::uFloat64xComplex, ast::BasicType::uFloat128Complex, ast::BasicType::uFloat128xComplex, },
-			{ ast::BasicType::Float, ast::BasicType::Double, ast::BasicType::LongDouble, ast::BasicType::uuFloat80, ast::BasicType::uuFloat128, ast::BasicType::uFloat16, ast::BasicType::uFloat32, ast::BasicType::uFloat32x, ast::BasicType::uFloat64, ast::BasicType::uFloat64x, ast::BasicType::uFloat128, ast::BasicType::uFloat128x, },
+		static ast::BasicKind floattype[2][12] = {
+			{ ast::BasicKind::FloatComplex, ast::BasicKind::DoubleComplex, ast::BasicKind::LongDoubleComplex, (ast::BasicKind)-1, (ast::BasicKind)-1, ast::BasicKind::uFloat16Complex, ast::BasicKind::uFloat32Complex, ast::BasicKind::uFloat32xComplex, ast::BasicKind::uFloat64Complex, ast::BasicKind::uFloat64xComplex, ast::BasicKind::uFloat128Complex, ast::BasicKind::uFloat128xComplex, },
+			{ ast::BasicKind::Float, ast::BasicKind::Double, ast::BasicKind::LongDouble, ast::BasicKind::uuFloat80, ast::BasicKind::uuFloat128, ast::BasicKind::uFloat16, ast::BasicKind::uFloat32, ast::BasicKind::uFloat32x, ast::BasicKind::uFloat64, ast::BasicKind::uFloat64x, ast::BasicKind::uFloat128, ast::BasicKind::uFloat128x, },
 		};
 
@@ -1213,5 +1214,5 @@
 
 static ast::Type * buildDefaultType( const TypeData * td ) {
-	return ( td ) ? typebuild( td ) : new ast::BasicType( ast::BasicType::SignedInt );
+	return ( td ) ? typebuild( td ) : new ast::BasicType( ast::BasicKind::SignedInt );
 } // buildDefaultType
 
@@ -1579,5 +1580,5 @@
 			td->location,
 			"",
-			new ast::BasicType( ast::BasicType::SignedInt ),
+			new ast::BasicType( ast::BasicKind::SignedInt ),
 			(ast::Init *)nullptr,
 			ast::Storage::Classes(),
@@ -1667,5 +1668,5 @@
 	} else {
 		ft->returns.push_back(
-			new ast::BasicType( ast::BasicType::SignedInt ) );
+			new ast::BasicType( ast::BasicKind::SignedInt ) );
 	} // if
 	return ft;
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision ab780e6afda20d69d650b2152ea5f5988f5f85e0)
+++ src/Parser/TypeData.h	(revision 7a780ad23506507b6a1feccc46d18e12da183ceb)
@@ -20,5 +20,6 @@
 #include <string>                                   // for string
 
-#include "AST/Type.hpp"                             // for Type
+#include "AST/CVQualifiers.hpp"                     // for CV
+#include "AST/Fwd.hpp"                              // for Type
 #include "DeclarationNode.h"                        // for DeclarationNode
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision ab780e6afda20d69d650b2152ea5f5988f5f85e0)
+++ src/Parser/parser.yy	(revision 7a780ad23506507b6a1feccc46d18e12da183ceb)
@@ -55,4 +55,5 @@
 #include "TypedefTable.h"
 #include "TypeData.h"
+#include "AST/Type.hpp"                                 // for BasicType, BasicKind
 #include "Common/SemanticError.h"						// error_str
 #include "Common/utility.h"								// for maybeMoveBuild, maybeBuild, CodeLo...
@@ -260,5 +261,5 @@
 	ast::ConstantExpr * constant = dynamic_cast<ast::ConstantExpr *>(type->expr.get());
 	if ( constant && (constant->rep == "0" || constant->rep == "1") ) {
-		type = new ExpressionNode( new ast::CastExpr( location, maybeMoveBuild(type), new ast::BasicType( ast::BasicType::SignedInt ) ) );
+		type = new ExpressionNode( new ast::CastExpr( location, maybeMoveBuild(type), new ast::BasicType( ast::BasicKind::SignedInt ) ) );
 	} // if
 	DeclarationNode * initDecl = distAttr(
