diff --git a/ast/Ast.jjt b/ast/Ast.jjt
old mode 100755
new mode 100644
index fdfed9f121c636915183788df770fd71acf46f49..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
--- a/ast/Ast.jjt
+++ b/ast/Ast.jjt
@@ -1,488 +0,0 @@
-options {
-  MULTI=true;
-  VISITOR=true;
-  NODE_DEFAULT_VOID=true;
-  NODE_PACKAGE="ast.AST";
-  STATIC=false;
-  NODE_SCOPE_HOOK= true;	//added!
-}
-
-PARSER_BEGIN(Ast)
-
-package ast.AST;
-
-import java.util.*;
-
-public class Ast {
-
-  private LinkedList errorList = new LinkedList();
-  public String fileName;
-  
-  public Iterator getErrors() {
-    return errorList.iterator();
-  }
-
-  public Collection parseErrors() {
-    return errorList;
-  }
-  
-  private void error_skipto(int kind) {
-    ParseException e = generateParseException();
-
-    StringBuffer msg = new StringBuffer();
-    
-    msg.append(Integer.toString(e.currentToken.next.beginLine));
-    msg.append(";");
-    msg.append(Integer.toString(e.currentToken.next.beginColumn));
-    msg.append(";");
-
-    /*
-
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for(int i = 0; i < e.expectedTokenSequences.length; i++) {
-      if(maxSize < e.expectedTokenSequences[i].length) {
-        maxSize = e.expectedTokenSequences[i].length;
-      }
-      for(int j = 0; j < e.expectedTokenSequences[i].length; j++) {
-        expected.append(e.tokenImage[e.expectedTokenSequences[i][j]] + " ");
-      }
-      if(e.expectedTokenSequences[i][e.expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(", ");
-    }
-
-    Token prev = e.currentToken;
-    Token tok = e.currentToken.next;
-    for(int i = 0; i < maxSize; i++) {
-      prev = tok;
-      if(tok.kind == 0) {
-        break;
-      }
-      tok = tok.next;
-    }
-
-    msg.append(Integer.toString(prev.endLine));
-    msg.append(";");
-    msg.append(Integer.toString(prev.endColumn));
-    msg.append(";");
-
-    msg.append(expected.toString());
-    */
-
-    msg.append(Integer.toString(e.currentToken.next.endLine));
-    msg.append(";");
-    msg.append(Integer.toString(e.currentToken.next.endColumn));
-    msg.append(";");
-    msg.append("Syntax error");
-    errorList.add(msg.toString());
-    
-    //System.err.println(e.toString());
-    Token t;
-    do {
-      t = getNextToken();
-    } while(t.kind != AstConstants.EOF && t.kind != kind);
-  }
-
-  /* ------ Added methods for NODE_SCOPE_HOOKS ---------*/
-  public  void jjtreeOpenNodeScope(Node n) {
-    ((SimpleNode) n).firstToken = getToken(1);
-  }
-
-  public void jjtreeCloseNodeScope(Node n) {
-    ((SimpleNode) n).lastToken = getToken(0);
-  }
-
-}
-
-PARSER_END(Ast)
-/* WHITE SPACE */
-
-SPECIAL_TOKEN :
-{
-  " "
-| "\t"
-| "\n"
-| "\r"
-| "\f"
-}
-
-/* COMMENTS */
-
-MORE :
-{
-  "//" : IN_SINGLE_LINE_COMMENT
-|
-  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
-|
-  "/*" : IN_MULTI_LINE_COMMENT
-}
-<IN_SINGLE_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-  <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT
-}
-
-<IN_FORMAL_COMMENT>
-SPECIAL_TOKEN :
-{
-  <FORMAL_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_MULTI_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
-MORE :
-{
-  < ~[] >
-}
-
-/*
-SKIP :
-{
-  " "
-| "\t"
-| "\n"
-| "\r"
-| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")>
-}
-*/
-
-TOKEN : /* Reserved words */
-{
-  < ABSTRACT: "abstract" >
-  | < SEMICOLON: ";" >
-  | < BOOLEAN: "boolean" >
-  | < CHAR: "char" >
-  | < BYTE: "byte" >
-  | < SHORT: "short" >
-  | < INT: "int" >
-  | < LONG: "long" >
-  | < FLOAT: "float" >
-  | < DOUBLE: "double" >
-  | < SUPER: "super" >
-  | < EXTENDS: "extends" >
-  // EMMA_2011-12-05: Adding words "region" for grammar annotations for coarse dependency tracking
-  | < REGION: "region" >
-  //
-}
-
-TOKEN : /* Literals */
-{ < ID: <LETTER> (<LETTER>|<DIGIT>)* >
-| < #LETTER: ["_","a"-"z","A"-"Z"] >
-| < #DIGIT: ["0"-"9"] >
-}
-
-Grammar Grammar() #Grammar: {}
-{
-  ClassList()
-  // EMMA_2011-12-05: Coarse dependency tracking, allow a list of region declarations in the grammar
-  RegionList()
-  // 
-  { return jjtThis; }
-}
-
-// EMMA_2011-12-05: Coarse dependency tracking, region declaration list and region declaration
-void RegionList() #List : {}
-{
-	( RegionDecl() )*
-}
-void RegionDecl() #RegionDecl : {}
-{
-	<REGION> IdUse() <SEMICOLON>
-}
-//
-
-
-void ClassList() #List: {}
-{
-  (
-  try {
-    Class()
-  } catch(ParseException e) {
-  }
-  )*
-  //  (Class())*
-}
-
-void Class() #ASTDecl : { Token first = null, last; }
-{
-  try {
-  ((Abstract() { first = token; } #Opt(1)) | ({} #Opt(0)))
-//  [Abstract() { first = token; }] #Opt
-  IdDecl() { if(first == null)  first = token; }
-  OptSuperClass() ComponentsList() Attributes()
-  <SEMICOLON> {
-    last = token;
-    jjtThis.setFileName(fileName);
-    jjtThis.setStartLine(first.beginLine);
-    jjtThis.setEndLine(last.endLine);
-    jjtThis.setComment(jjtThis.unparseComment());
-  }
-  } catch(ParseException e) {
-    error_skipto(SEMICOLON);
-    throw e;
-//    jjtree.clearNodeScope(jjtThis);
-//    jjtc000 = false;
-  }
-}
-
-void Attributes() : {}
-{
-  {} #List(0) // SynAttrDecl
-  {} #List(0) // SynEq
-  {} #List(0) // InhAttrDecl
-  {} #List(0) // InhEq
-  {} #List(0) // ClassBodyDecl
-  {} #List(0) // Rewrite
-  {} #List(0) // CollDecl
-  {} #List(0) // CollEq
-}
-
-void OptAbstract() #Opt: {}
-{ [Abstract()]
-}
-
-void Abstract() #Abstract: {}
-{ "abstract"
-}
-
-void OptSuperClass() #Opt: {}
-{ [":" IdUse()]
-}
-
-void ComponentsList() #List: {}
-{ [ "::=" (Components())* ]
-}
-
-void Components(): {}
-{
-  
-  LOOKAHEAD(OptName() IdUse() "*")
-  ListComponents()
-| OptionalComponent()
-| TokenComponent()
-| AggregateComponents()
-| LOOKAHEAD("/" OptName() IdUse() "*")
-  ListComponentsNTA()
-| LOOKAHEAD("/" "[")
-  OptionalComponentNTA()
-| LOOKAHEAD("/" "<")
-  TokenComponentNTA()
-| AggregateComponentsNTA()
-}
-
-void ListComponents() #ListComponents: {}
-{ Id() "*"
-}
-
-void ListComponentsNTA() #ListComponentsNTA: {}
-{ "/" Id() "*" "/"
-}
-
-void OptionalComponent() #OptionalComponent: {}
-{ "[" Id() "]"
-}
-
-void OptionalComponentNTA() #OptionalComponentNTA: {}
-{ "/" "[" Id() "]" "/"
-}
-
-void TokenComponent() #TokenComponent:{}
-{ "<" TokenId() ">"
-}
-
-void TokenComponentNTA() #TokenComponentNTA:{}
-{ "/" "<" TokenId() ">" "/"
-}
-
-void AggregateComponents() #AggregateComponents:{}
-{ Id()
-}
-
-void AggregateComponentsNTA() #AggregateComponentsNTA:{}
-{ "/" Id() "/"
-}
-
-void Id() #Id: {}
-{ OptName() IdUse()
-}
-
-void OptName() #Opt: {}
-{ [LOOKAHEAD(NameNode() ":") NameNode() ":"]
-}
-
-void NameNode() #NameNode:
-{ Token t;
-}
-{ t = <ID>
-  {
-    jjtThis.setID(t.image);
-  }
-}
-
-void IdUse() #IdUse():
-{ Token t;
-}
-{ t = <ID>
-  {
-    jjtThis.setID(t.image);
-  }
-}
-
-void IdDecl() #IdDecl():
-{ Token t;
-}
-{ t = <ID>
-  { jjtThis.setID(t.image);
-  }
-}
-
-
-void TokenId() #TokenId():
-{ Token t;
-  String type = null;
-  boolean hasType = false;
-}
-{ t = <ID> [ ":" type = Type() { hasType = true; } ]
-// Default type is String for backward compability
-  { jjtThis.setID(t.image);
-    jjtThis.setTYPE(hasType ? type : "String");
-  }
-}
-/*Changed to return string */
-String Type():
-{ String s; }
-{
- (
-   LOOKAHEAD(2) s = ReferenceType()
- |
-   s = PrimitiveType()
- )
- { return s; }
-}
-
-String ReferenceType():
-{ String s; }
-{
-  (
-   s = PrimitiveType() ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )+
-  |
-   ( s = ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )*
-  )
-  { return s; }
-}
-
-String ClassOrInterfaceType():
-{ Token t; String s; String u; }
-{
-  t = <ID> { s = t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ]
-  ( LOOKAHEAD(2) "." t = <ID> { s += "." + t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ] )*
-  { return s; }
-}
-
-String TypeArguments():
-{ String s; String t; }
-{
-   "<" { s = "<"; } t = TypeArgument() { s += t; } ( "," { s += ","; } t = TypeArgument() { s += t; } )* ">" { s+=">"; }
-   { return s; }
-}
-
-String TypeArgument():
-{ String s; String t; }
-{
- (
-   s = ReferenceType()
- |
-   "?" { s = "?"; } [ t = WildcardBounds() { s += t; } ]
- )
- { return s; }
-}
-
-String WildcardBounds():
-{ String s; String t; }
-{
- (
-   "extends" t = ReferenceType() { s = " extends " + t; }
- |
-   "super" t = ReferenceType() { s = " super " + t; }
- )
- { return s; }
-}
-
-String PrimitiveType():
-{ Token t; }
-{
-(
-  t = "boolean"
-|
-  t = "char"
-|
-  t = "byte"
-|
-  t = "short"
-|
-  t = "int"
-|
-  t = "long"
-|
-  t = "float"
-|
-  t = "double"
-)
-{ return t.image; }
-}
-
-/*
-String Type() :
-{
-  String t;
-  StringBuffer b = new StringBuffer();
-}
-{
-  (( t = PrimitiveType() | t = Name() ) { b.append(t); }  ( "[" "]" { b.append("[]");} )*)
-{return b.toString();}
-
-}
-
-String PrimitiveType() :
-{Token t;}
-{
-  (t = "boolean"
-|
-  t = "char"
-|
-  t = "byte"
-|
-  t = "short"
-|
-  t = "int"
-|
-  t = "long"
-|
-  t = "float"
-|
-  t = "double")
-{return t.image; }
-}
-*/
-
-/* Changed to return token */
-String  Name() :
-/*
- * A lookahead of 2 is required below since "Name" can be followed
- * by a ".*" when used in the context of an "ImportDeclaration".
- */
-{Token t; StringBuffer s = new StringBuffer();}
-{
-  t = <ID> { s.append(t.image); }
-  ( LOOKAHEAD(2) "." t = <ID> { s.append("." + t.image); }
-  )*
-{ return s.toString();}
-}
-
diff --git a/build.xml b/build.xml
index 4169a34e4092f7e0f9605e23e23dd932bdbeda20..8f4e6b77f7784736db379f92b09b646835bd0c41 100644
--- a/build.xml
+++ b/build.xml
@@ -1,6 +1,6 @@
 <project name="JastAdd2" default="build">
 
-	<property name="spec.dir" location="${basedir}"/>
+	<property name="spec.dir" location="spec"/>
 	<property name="src.dir" location="src"/>
 	<property name="gen.dir" location="${src.dir}/gen"/>
 	<property name="bin.dir" location="bin"/>
@@ -28,23 +28,18 @@
 
 	<target name="build" description="generate sources and build JastAdd2"
 		depends="build-resources">
-		<mkdir dir="${gen.dir}/ast/AST"/>
+		<mkdir dir="${gen.dir}/ast"/>
 		<mkdir dir="${gen.dir}/jrag/AST"/>
 		<mkdir dir="${bin.dir}"/>
-		<copy todir="${gen.dir}/ast">
-		  <fileset dir="${basedir}/ast">
-		    <include name="**/*.java"/>
-		  </fileset>
-		</copy>
 		<copy todir="${gen.dir}/jrag">
-		  <fileset dir="${basedir}/jrag">
-		    <include name="**/*.java"/>
-		  </fileset>
+			<fileset dir="${spec.dir}/javacc/jrag">
+				<include name="**/*.java"/>
+			</fileset>
 		</copy>
 		<jastadd java14="true" jjtree="true" rewrite="true"
 			grammar="Ast" package="ast.AST" outdir="${gen.dir}"
 			lazyMaps="false">
-			<fileset dir="ast" includes="*.jrag,*.jadd,*.ast"/>
+			<fileset dir="${spec.dir}/jastadd/ast" includes="*.jrag,*.jadd,*.ast"/>
 		</jastadd>
 		<mkdir dir="ast/AST"/>
 		<!-- Ast.jjt must be touched, or Ant will not run jjtree -->
@@ -52,20 +47,20 @@
 		<java classpath="${tools.dir}/javacc.jar" classname="org.javacc.jjtree.Main">
 			<arg value="-OUTPUT_DIRECTORY=${gen.dir}/ast/AST"/>
 			<arg value="-NODE_PREFIX=&quot;&quot;"/>
-			<arg value="${spec.dir}/ast/Ast.jjt"/>
+			<arg value="${spec.dir}/javacc/ast/Ast.jjt"/>
 		</java>
 		<!-- NODE_PREFIX is not set correctly on Windows: -->
 		<!--jjtree javacchome="${tools.dir}" nodeprefix="&quot;&quot;"
 			outputdirectory="${gen.dir}/ast/AST"
-			target="${spec.dir}/ast/Ast.jjt"/-->
+			target="${spec.dir}/javacc/ast/Ast.jjt"/-->
 		<javacc javacchome="${tools.dir}" jdkversion="1.4"
 			outputdirectory="${gen.dir}/ast/AST"
 			target="${gen.dir}/ast/AST/Ast.jj"/>
 		<!-- Ast.jjt must be touched, or Ant will not run jjtree -->
-		<touch file="jrag/Jrag.jjt"/>
+		<touch file="${spec.dir}/javacc/jrag/Jrag.jjt"/>
 		<jjtree javacchome="${tools.dir}"
 			outputdirectory="${gen.dir}/jrag/AST"
-			target="${spec.dir}/jrag/Jrag.jjt"/>
+			target="${spec.dir}/javacc/jrag/Jrag.jjt"/>
 		<javacc javacchome="${tools.dir}" jdkversion="1.4"
 			outputdirectory="${gen.dir}/jrag/AST"
 			target="${gen.dir}/jrag/AST/Jrag.jj"/>
diff --git a/ast/ASTCopyNode.jadd b/spec/jastadd/ast/ASTCopyNode.jadd
similarity index 100%
rename from ast/ASTCopyNode.jadd
rename to spec/jastadd/ast/ASTCopyNode.jadd
diff --git a/ast/ASTErrors.jrag b/spec/jastadd/ast/ASTErrors.jrag
similarity index 100%
rename from ast/ASTErrors.jrag
rename to spec/jastadd/ast/ASTErrors.jrag
diff --git a/ast/ASTNameBinding.jrag b/spec/jastadd/ast/ASTNameBinding.jrag
similarity index 100%
rename from ast/ASTNameBinding.jrag
rename to spec/jastadd/ast/ASTNameBinding.jrag
diff --git a/ast/Ast.ast b/spec/jastadd/ast/Ast.ast
similarity index 100%
rename from ast/Ast.ast
rename to spec/jastadd/ast/Ast.ast
diff --git a/ast/Attributes.jrag b/spec/jastadd/ast/Attributes.jrag
similarity index 100%
rename from ast/Attributes.jrag
rename to spec/jastadd/ast/Attributes.jrag
diff --git a/ast/Circular.jrag b/spec/jastadd/ast/Circular.jrag
similarity index 100%
rename from ast/Circular.jrag
rename to spec/jastadd/ast/Circular.jrag
diff --git a/ast/ClassRelations.jrag b/spec/jastadd/ast/ClassRelations.jrag
similarity index 100%
rename from ast/ClassRelations.jrag
rename to spec/jastadd/ast/ClassRelations.jrag
diff --git a/ast/CollectionAttributes.jrag b/spec/jastadd/ast/CollectionAttributes.jrag
similarity index 100%
rename from ast/CollectionAttributes.jrag
rename to spec/jastadd/ast/CollectionAttributes.jrag
diff --git a/ast/ComponentsUtil.jrag b/spec/jastadd/ast/ComponentsUtil.jrag
similarity index 100%
rename from ast/ComponentsUtil.jrag
rename to spec/jastadd/ast/ComponentsUtil.jrag
diff --git a/ast/FileNameEscape.jrag b/spec/jastadd/ast/FileNameEscape.jrag
similarity index 100%
rename from ast/FileNameEscape.jrag
rename to spec/jastadd/ast/FileNameEscape.jrag
diff --git a/ast/IncrementalDumpCache.jadd b/spec/jastadd/ast/IncrementalDumpCache.jadd
similarity index 100%
rename from ast/IncrementalDumpCache.jadd
rename to spec/jastadd/ast/IncrementalDumpCache.jadd
diff --git a/ast/IncrementalEval.jadd b/spec/jastadd/ast/IncrementalEval.jadd
similarity index 100%
rename from ast/IncrementalEval.jadd
rename to spec/jastadd/ast/IncrementalEval.jadd
diff --git a/ast/IncrementalTracking.jadd b/spec/jastadd/ast/IncrementalTracking.jadd
similarity index 100%
rename from ast/IncrementalTracking.jadd
rename to spec/jastadd/ast/IncrementalTracking.jadd
diff --git a/ast/JaddCodeGen.jrag b/spec/jastadd/ast/JaddCodeGen.jrag
similarity index 100%
rename from ast/JaddCodeGen.jrag
rename to spec/jastadd/ast/JaddCodeGen.jrag
diff --git a/ast/JastAddCodeGen.jadd b/spec/jastadd/ast/JastAddCodeGen.jadd
similarity index 100%
rename from ast/JastAddCodeGen.jadd
rename to spec/jastadd/ast/JastAddCodeGen.jadd
diff --git a/ast/JragCodeGen.jrag b/spec/jastadd/ast/JragCodeGen.jrag
similarity index 100%
rename from ast/JragCodeGen.jrag
rename to spec/jastadd/ast/JragCodeGen.jrag
diff --git a/ast/JragErrors.jrag b/spec/jastadd/ast/JragErrors.jrag
similarity index 100%
rename from ast/JragErrors.jrag
rename to spec/jastadd/ast/JragErrors.jrag
diff --git a/ast/NameBinding.jrag b/spec/jastadd/ast/NameBinding.jrag
similarity index 100%
rename from ast/NameBinding.jrag
rename to spec/jastadd/ast/NameBinding.jrag
diff --git a/ast/SimpleNode.jadd b/spec/jastadd/ast/SimpleNode.jadd
similarity index 100%
rename from ast/SimpleNode.jadd
rename to spec/jastadd/ast/SimpleNode.jadd
diff --git a/ast/Unparse.jadd b/spec/jastadd/ast/Unparse.jadd
similarity index 100%
rename from ast/Unparse.jadd
rename to spec/jastadd/ast/Unparse.jadd
diff --git a/spec/javacc/ast/Ast.jjt b/spec/javacc/ast/Ast.jjt
new file mode 100755
index 0000000000000000000000000000000000000000..fdfed9f121c636915183788df770fd71acf46f49
--- /dev/null
+++ b/spec/javacc/ast/Ast.jjt
@@ -0,0 +1,488 @@
+options {
+  MULTI=true;
+  VISITOR=true;
+  NODE_DEFAULT_VOID=true;
+  NODE_PACKAGE="ast.AST";
+  STATIC=false;
+  NODE_SCOPE_HOOK= true;	//added!
+}
+
+PARSER_BEGIN(Ast)
+
+package ast.AST;
+
+import java.util.*;
+
+public class Ast {
+
+  private LinkedList errorList = new LinkedList();
+  public String fileName;
+  
+  public Iterator getErrors() {
+    return errorList.iterator();
+  }
+
+  public Collection parseErrors() {
+    return errorList;
+  }
+  
+  private void error_skipto(int kind) {
+    ParseException e = generateParseException();
+
+    StringBuffer msg = new StringBuffer();
+    
+    msg.append(Integer.toString(e.currentToken.next.beginLine));
+    msg.append(";");
+    msg.append(Integer.toString(e.currentToken.next.beginColumn));
+    msg.append(";");
+
+    /*
+
+    StringBuffer expected = new StringBuffer();
+    int maxSize = 0;
+    for(int i = 0; i < e.expectedTokenSequences.length; i++) {
+      if(maxSize < e.expectedTokenSequences[i].length) {
+        maxSize = e.expectedTokenSequences[i].length;
+      }
+      for(int j = 0; j < e.expectedTokenSequences[i].length; j++) {
+        expected.append(e.tokenImage[e.expectedTokenSequences[i][j]] + " ");
+      }
+      if(e.expectedTokenSequences[i][e.expectedTokenSequences[i].length - 1] != 0) {
+        expected.append("...");
+      }
+      expected.append(", ");
+    }
+
+    Token prev = e.currentToken;
+    Token tok = e.currentToken.next;
+    for(int i = 0; i < maxSize; i++) {
+      prev = tok;
+      if(tok.kind == 0) {
+        break;
+      }
+      tok = tok.next;
+    }
+
+    msg.append(Integer.toString(prev.endLine));
+    msg.append(";");
+    msg.append(Integer.toString(prev.endColumn));
+    msg.append(";");
+
+    msg.append(expected.toString());
+    */
+
+    msg.append(Integer.toString(e.currentToken.next.endLine));
+    msg.append(";");
+    msg.append(Integer.toString(e.currentToken.next.endColumn));
+    msg.append(";");
+    msg.append("Syntax error");
+    errorList.add(msg.toString());
+    
+    //System.err.println(e.toString());
+    Token t;
+    do {
+      t = getNextToken();
+    } while(t.kind != AstConstants.EOF && t.kind != kind);
+  }
+
+  /* ------ Added methods for NODE_SCOPE_HOOKS ---------*/
+  public  void jjtreeOpenNodeScope(Node n) {
+    ((SimpleNode) n).firstToken = getToken(1);
+  }
+
+  public void jjtreeCloseNodeScope(Node n) {
+    ((SimpleNode) n).lastToken = getToken(0);
+  }
+
+}
+
+PARSER_END(Ast)
+/* WHITE SPACE */
+
+SPECIAL_TOKEN :
+{
+  " "
+| "\t"
+| "\n"
+| "\r"
+| "\f"
+}
+
+/* COMMENTS */
+
+MORE :
+{
+  "//" : IN_SINGLE_LINE_COMMENT
+|
+  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+|
+  "/*" : IN_MULTI_LINE_COMMENT
+}
+<IN_SINGLE_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+  <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : DEFAULT
+}
+
+<IN_FORMAL_COMMENT>
+SPECIAL_TOKEN :
+{
+  <FORMAL_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_MULTI_LINE_COMMENT>
+SPECIAL_TOKEN :
+{
+  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+/*
+SKIP :
+{
+  " "
+| "\t"
+| "\n"
+| "\r"
+| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")>
+}
+*/
+
+TOKEN : /* Reserved words */
+{
+  < ABSTRACT: "abstract" >
+  | < SEMICOLON: ";" >
+  | < BOOLEAN: "boolean" >
+  | < CHAR: "char" >
+  | < BYTE: "byte" >
+  | < SHORT: "short" >
+  | < INT: "int" >
+  | < LONG: "long" >
+  | < FLOAT: "float" >
+  | < DOUBLE: "double" >
+  | < SUPER: "super" >
+  | < EXTENDS: "extends" >
+  // EMMA_2011-12-05: Adding words "region" for grammar annotations for coarse dependency tracking
+  | < REGION: "region" >
+  //
+}
+
+TOKEN : /* Literals */
+{ < ID: <LETTER> (<LETTER>|<DIGIT>)* >
+| < #LETTER: ["_","a"-"z","A"-"Z"] >
+| < #DIGIT: ["0"-"9"] >
+}
+
+Grammar Grammar() #Grammar: {}
+{
+  ClassList()
+  // EMMA_2011-12-05: Coarse dependency tracking, allow a list of region declarations in the grammar
+  RegionList()
+  // 
+  { return jjtThis; }
+}
+
+// EMMA_2011-12-05: Coarse dependency tracking, region declaration list and region declaration
+void RegionList() #List : {}
+{
+	( RegionDecl() )*
+}
+void RegionDecl() #RegionDecl : {}
+{
+	<REGION> IdUse() <SEMICOLON>
+}
+//
+
+
+void ClassList() #List: {}
+{
+  (
+  try {
+    Class()
+  } catch(ParseException e) {
+  }
+  )*
+  //  (Class())*
+}
+
+void Class() #ASTDecl : { Token first = null, last; }
+{
+  try {
+  ((Abstract() { first = token; } #Opt(1)) | ({} #Opt(0)))
+//  [Abstract() { first = token; }] #Opt
+  IdDecl() { if(first == null)  first = token; }
+  OptSuperClass() ComponentsList() Attributes()
+  <SEMICOLON> {
+    last = token;
+    jjtThis.setFileName(fileName);
+    jjtThis.setStartLine(first.beginLine);
+    jjtThis.setEndLine(last.endLine);
+    jjtThis.setComment(jjtThis.unparseComment());
+  }
+  } catch(ParseException e) {
+    error_skipto(SEMICOLON);
+    throw e;
+//    jjtree.clearNodeScope(jjtThis);
+//    jjtc000 = false;
+  }
+}
+
+void Attributes() : {}
+{
+  {} #List(0) // SynAttrDecl
+  {} #List(0) // SynEq
+  {} #List(0) // InhAttrDecl
+  {} #List(0) // InhEq
+  {} #List(0) // ClassBodyDecl
+  {} #List(0) // Rewrite
+  {} #List(0) // CollDecl
+  {} #List(0) // CollEq
+}
+
+void OptAbstract() #Opt: {}
+{ [Abstract()]
+}
+
+void Abstract() #Abstract: {}
+{ "abstract"
+}
+
+void OptSuperClass() #Opt: {}
+{ [":" IdUse()]
+}
+
+void ComponentsList() #List: {}
+{ [ "::=" (Components())* ]
+}
+
+void Components(): {}
+{
+  
+  LOOKAHEAD(OptName() IdUse() "*")
+  ListComponents()
+| OptionalComponent()
+| TokenComponent()
+| AggregateComponents()
+| LOOKAHEAD("/" OptName() IdUse() "*")
+  ListComponentsNTA()
+| LOOKAHEAD("/" "[")
+  OptionalComponentNTA()
+| LOOKAHEAD("/" "<")
+  TokenComponentNTA()
+| AggregateComponentsNTA()
+}
+
+void ListComponents() #ListComponents: {}
+{ Id() "*"
+}
+
+void ListComponentsNTA() #ListComponentsNTA: {}
+{ "/" Id() "*" "/"
+}
+
+void OptionalComponent() #OptionalComponent: {}
+{ "[" Id() "]"
+}
+
+void OptionalComponentNTA() #OptionalComponentNTA: {}
+{ "/" "[" Id() "]" "/"
+}
+
+void TokenComponent() #TokenComponent:{}
+{ "<" TokenId() ">"
+}
+
+void TokenComponentNTA() #TokenComponentNTA:{}
+{ "/" "<" TokenId() ">" "/"
+}
+
+void AggregateComponents() #AggregateComponents:{}
+{ Id()
+}
+
+void AggregateComponentsNTA() #AggregateComponentsNTA:{}
+{ "/" Id() "/"
+}
+
+void Id() #Id: {}
+{ OptName() IdUse()
+}
+
+void OptName() #Opt: {}
+{ [LOOKAHEAD(NameNode() ":") NameNode() ":"]
+}
+
+void NameNode() #NameNode:
+{ Token t;
+}
+{ t = <ID>
+  {
+    jjtThis.setID(t.image);
+  }
+}
+
+void IdUse() #IdUse():
+{ Token t;
+}
+{ t = <ID>
+  {
+    jjtThis.setID(t.image);
+  }
+}
+
+void IdDecl() #IdDecl():
+{ Token t;
+}
+{ t = <ID>
+  { jjtThis.setID(t.image);
+  }
+}
+
+
+void TokenId() #TokenId():
+{ Token t;
+  String type = null;
+  boolean hasType = false;
+}
+{ t = <ID> [ ":" type = Type() { hasType = true; } ]
+// Default type is String for backward compability
+  { jjtThis.setID(t.image);
+    jjtThis.setTYPE(hasType ? type : "String");
+  }
+}
+/*Changed to return string */
+String Type():
+{ String s; }
+{
+ (
+   LOOKAHEAD(2) s = ReferenceType()
+ |
+   s = PrimitiveType()
+ )
+ { return s; }
+}
+
+String ReferenceType():
+{ String s; }
+{
+  (
+   s = PrimitiveType() ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )+
+  |
+   ( s = ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { s += "[]"; } )*
+  )
+  { return s; }
+}
+
+String ClassOrInterfaceType():
+{ Token t; String s; String u; }
+{
+  t = <ID> { s = t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ]
+  ( LOOKAHEAD(2) "." t = <ID> { s += "." + t.image; } [ LOOKAHEAD(2) u = TypeArguments() { s += u; } ] )*
+  { return s; }
+}
+
+String TypeArguments():
+{ String s; String t; }
+{
+   "<" { s = "<"; } t = TypeArgument() { s += t; } ( "," { s += ","; } t = TypeArgument() { s += t; } )* ">" { s+=">"; }
+   { return s; }
+}
+
+String TypeArgument():
+{ String s; String t; }
+{
+ (
+   s = ReferenceType()
+ |
+   "?" { s = "?"; } [ t = WildcardBounds() { s += t; } ]
+ )
+ { return s; }
+}
+
+String WildcardBounds():
+{ String s; String t; }
+{
+ (
+   "extends" t = ReferenceType() { s = " extends " + t; }
+ |
+   "super" t = ReferenceType() { s = " super " + t; }
+ )
+ { return s; }
+}
+
+String PrimitiveType():
+{ Token t; }
+{
+(
+  t = "boolean"
+|
+  t = "char"
+|
+  t = "byte"
+|
+  t = "short"
+|
+  t = "int"
+|
+  t = "long"
+|
+  t = "float"
+|
+  t = "double"
+)
+{ return t.image; }
+}
+
+/*
+String Type() :
+{
+  String t;
+  StringBuffer b = new StringBuffer();
+}
+{
+  (( t = PrimitiveType() | t = Name() ) { b.append(t); }  ( "[" "]" { b.append("[]");} )*)
+{return b.toString();}
+
+}
+
+String PrimitiveType() :
+{Token t;}
+{
+  (t = "boolean"
+|
+  t = "char"
+|
+  t = "byte"
+|
+  t = "short"
+|
+  t = "int"
+|
+  t = "long"
+|
+  t = "float"
+|
+  t = "double")
+{return t.image; }
+}
+*/
+
+/* Changed to return token */
+String  Name() :
+/*
+ * A lookahead of 2 is required below since "Name" can be followed
+ * by a ".*" when used in the context of an "ImportDeclaration".
+ */
+{Token t; StringBuffer s = new StringBuffer();}
+{
+  t = <ID> { s.append(t.image); }
+  ( LOOKAHEAD(2) "." t = <ID> { s.append("." + t.image); }
+  )*
+{ return s.toString();}
+}
+
diff --git a/jrag/AST/SimpleNode.java b/spec/javacc/jrag/AST/SimpleNode.java
similarity index 100%
rename from jrag/AST/SimpleNode.java
rename to spec/javacc/jrag/AST/SimpleNode.java
diff --git a/jrag/AST/Token.java b/spec/javacc/jrag/AST/Token.java
similarity index 100%
rename from jrag/AST/Token.java
rename to spec/javacc/jrag/AST/Token.java
diff --git a/jrag/ClassBodyDeclUnparser.java b/spec/javacc/jrag/ClassBodyDeclUnparser.java
similarity index 100%
rename from jrag/ClassBodyDeclUnparser.java
rename to spec/javacc/jrag/ClassBodyDeclUnparser.java
diff --git a/jrag/ClassBodyObject.java b/spec/javacc/jrag/ClassBodyObject.java
similarity index 100%
rename from jrag/ClassBodyObject.java
rename to spec/javacc/jrag/ClassBodyObject.java
diff --git a/jrag/Jrag.jjt b/spec/javacc/jrag/Jrag.jjt
similarity index 100%
rename from jrag/Jrag.jjt
rename to spec/javacc/jrag/Jrag.jjt
diff --git a/jrag/SignatureUnparser.java b/spec/javacc/jrag/SignatureUnparser.java
similarity index 100%
rename from jrag/SignatureUnparser.java
rename to spec/javacc/jrag/SignatureUnparser.java
diff --git a/jrag/Unparser.java b/spec/javacc/jrag/Unparser.java
similarity index 100%
rename from jrag/Unparser.java
rename to spec/javacc/jrag/Unparser.java
diff --git a/jrag/Util.java b/spec/javacc/jrag/Util.java
similarity index 100%
rename from jrag/Util.java
rename to spec/javacc/jrag/Util.java