diff --git a/.bzrignore b/.bzrignore
index 9b23f913cd3a2cae9a85ca0a043292b8486e834b..fee425d2685296d46602374e7bbf2cfdd77779b5 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -5,3 +5,4 @@ x3d/GeneratedAspects.jrag
 x3d/Parser.java
 x3d/x3d.ast
 x3d/x3d.jjt
+javadoc
diff --git a/CompilerGeneration.jrag b/CompilerGeneration.jrag
index 301db3260de3f2c35af91344e34e1c9bdd36dee3..a38e5e9da2e0a5e3945e462733d9a10342b44e28 100644
--- a/CompilerGeneration.jrag
+++ b/CompilerGeneration.jrag
@@ -67,6 +67,7 @@ aspect GenJavaCC {
 
 	public void Start.genJavaCC(PrintStream pStream) {
         genJavaCCHeader(pStream);
+        genJavaCCTokens(pStream);
         genJavaCCLiterals(pStream);
         genJavaCCIdentifiers(pStream);
         genJavaCCSeparators(pStream);
@@ -98,41 +99,176 @@ aspect GenJavaCC {
         pStream.println("  (Attribute())*");
         pStream.println("}");
         pStream.println();
+        pStream.println("void AttValue() #AttValue : { Token t; }");
+        pStream.println("{");
+        pStream.println("    t = <STRING_LITERAL>");
+        pStream.println("        {jjtThis.setSTRING_LITERAL(t.image);}");
+        pStream.println("}");
         pStream.println("void Element()  : {}");
         pStream.println("{");
-        ListIterator<Element> iter = elementTypes().listIterator();
-        while (iter.hasNext) {
-            pStream.println("  "+iter.next().name()+"()");
+        pStream.println("  \"<\"");
+        Iterator iter = elementTypes().values().iterator();
+        if (iter.hasNext()) {
+            pStream.println("  "+fixName(((XsElement) iter.next()).name())+"()");
+        }
+        while (iter.hasNext()) {
+            pStream.println("  | "+fixName(((XsElement) iter.next()).name())+"()");
         }
         pStream.println("  ");
         pStream.println("}");
         pStream.println();
         pStream.println("void Attribute()  : {}");
         pStream.println("{");
+        iter = attributeTypes().values().iterator();
+        if (iter.hasNext()) {
+            pStream.println("  "+fixName(((XsAttribute) iter.next()).name())+"()");
+        }
+        while (iter.hasNext()) {
+            pStream.println("  | "+fixName(((XsAttribute) iter.next()).name())+"()");
+        }
         pStream.println("  ");
         pStream.println("}");
-        super.genJavaCC(pStream);
+        pStream.println();
+
+        // This is somewhat of a hack, but seems to work work as an
+        // easy way to eliminate duplicate attribute
+        // declarations. Anders Nilsson 070808.
+        Hashtable h = elementTypes();
+        h.putAll(attributeTypes());
+        iter = h.values().iterator();
+        while (iter.hasNext()) {
+            ((ASTNode) iter.next()).genJavaCC(pStream);
+        }
+//         super.genJavaCC(pStream);
 	}
 
     void XsElement.genJavaCC(PrintStream pStream) {
-        String name = getName();
-        pStream.println("void "+name+"() #"+name+" : {}");
-        pStream.println("{");
-        pStream.println("  \"<\" <"+name.toUpperCase()+"> AttributeList() \">\"");
-        pStream.println("  ElementList()");
-        pStream.println("  \"</\" <"+name.toUpperCase()+">  \">\"");
-        pStream.println("}");
+        if (hasName()) { // If not, it's just a reference to an element declaration
+            String name = name();
+            pStream.println("void "+name+"() #"+name+" : {}");
+            pStream.println("{");
+
+            pStream.println("   <"+name+"> AttributeList() \">\"");
+//             pStream.println("  \"<\" <"+name+"> AttributeList() \">\"");
+            pStream.println("  ElementList()");
+            pStream.println("  \"</\" <"+name+">  \">\"");
+//             pStream.println("  \"<\" <"+name.toUpperCase()+"> AttributeList() \">\"");
+//             pStream.println("  ElementList()");
+//             pStream.println("  \"</\" <"+name.toUpperCase()+">  \">\"");
+            pStream.println("}");
+        }
+    }
+
+    void XsAttribute.genJavaCC(PrintStream pStream) {
+        if (hasName()) { // If not, it's just a reference to an attribute declaration
+            String name = fixName(name());
+            pStream.println("void "+name+"() #"+name+" : {}");
+            pStream.println("{");
+            pStream.println("  <"+name+"> \"=\" AttValue()");
+//             pStream.println("  <"+name.toUpperCase()+"> \"=\" AttValue()");
+            pStream.println("}");
+        }
     }
 
+    void Start.genJavaCCTokens(PrintStream pStream) {
+		pStream.println("<DEFAULT, BOUNDS> TOKEN : /* Reserved Words */");
+		pStream.println("{");
+        Hashtable h = elementTypes();
+        h.putAll(attributeTypes());
+        Iterator iter = h.values().iterator();
+        pStream.println("   <XML\t\t: \"XML\">");
+        while (iter.hasNext()) {
+            String name = ((ComplexElement) iter.next()).name();
+            pStream.println(" | <"+fixName(name)+
+//             pStream.println(" | <"+fixName(name).toUpperCase()+
+                            "\t\t: \""+name+"\" >");
+        }
+//         iter = attributeTypes().iterator();
+//         while (iter.hasNext()) {            
+//             String name = ((ComplexElement) iter.next()).name();
+//             pStream.println(" | <"+fixName(name).toUpperCase()+
+//                             "\t\t: \""+name+"\" >");
+//         }        
+		pStream.println("}// Reserved Words");
+        pStream.println();
+    }
 }
 
 aspect Types {
-    syn LinkedList<XsElement> Element.elementTypes() {
-        return l;
+    Hashtable Start.elementTypes() {
+        Hashtable h = new Hashtable();
+        return elementTypes(h);
+    }
+
+    syn Hashtable ASTNode.elementTypes(Hashtable h) {
+        for (int i=0; i<getNumChild(); i++) {
+            getChild(i).elementTypes(h);
+        }
+        return h;
+    }
+
+    eq XsElement.elementTypes(Hashtable h) {
+        if (hasName()) {
+            h.put(name(),this);
+        }
+        super.elementTypes(h);
+        return h;
+    }
+    
+    Hashtable Start.attributeTypes() {
+        Hashtable h = new Hashtable();
+        return attributeTypes(h);
+    }
+
+    syn Hashtable ASTNode.attributeTypes(Hashtable h) {
+        for (int i=0; i<getNumChild(); i++) {
+            getChild(i).attributeTypes(h);
+        }
+        return h;
+    }
+
+    eq XsAttribute.attributeTypes(Hashtable h) {
+        if (hasName()) {
+            h.put(name(),this);
+        }
+        super.attributeTypes(h);
+        return h;
     }
     
 }
 
+aspect Misc {
+	syn String ComplexElement.name() {
+		for (int i=0; i<getNumAttribute(); i++) {
+			if (getAttribute(i) instanceof Name) {
+				return getAttribute(i).getAttValue().getSTRING_LITERAL().
+                    replace("\""," ").trim();
+			}
+		}
+		// OK, no name found so let's report that
+		return "NoNameFound";
+	}
+
+	syn boolean ComplexElement.hasName() {
+		for (int i=0; i<getNumAttribute(); i++) {
+			if (getAttribute(i) instanceof Name) {
+				return true;
+			}
+		}
+		// OK, no name found so let's report that
+		return false;
+	}
+
+    static String ASTNode.fixName(String s) {
+        if (s.equals("class")) {
+            return "clazz";
+        }
+        s = s.replace("-","_");
+        return s;
+    }
+}
+
+
 // aspect GenAspects {
 // 	public void Start.genAspects(PrintStream pStream) {
 // 		pStream.println();
@@ -382,7 +518,7 @@ aspect ParserGen {
 		pStream.println("import java.io.InputStreamReader;");
 		pStream.println("import java.io.Reader;");
 		pStream.println("");
-		pStream.println("import AST.X3dParser;");
+		pStream.println("import AST.XmlParser;");
 		pStream.println("import AST.ParseException;");
 		pStream.println("import AST.Start;");
 		pStream.println("");
@@ -392,7 +528,7 @@ aspect ParserGen {
 		pStream.println("		Reader r = getReader(args);");
 		pStream.println("		Start ast = null;");
 		pStream.println("		try {");
-		pStream.println("			SiarasParser parser = new SiarasParser(r);");
+		pStream.println("			XmlParser parser = new XmlParser(r);");
 		pStream.println();
 		pStream.println("			ast = parser.Start();");
 		pStream.println("		} catch (ParseException e) {");
diff --git a/PrettyPrinter.jrag b/PrettyPrinter.jrag
index 0951a535912c0364e7a2c575651114743f27b403..94b26a898056258b7d36941bc4423fbb03c42262 100644
--- a/PrettyPrinter.jrag
+++ b/PrettyPrinter.jrag
@@ -17,29 +17,8 @@ aspect PrettyPrinter {
 
 	public void XsElement.prettyPrint(String ind, PrintStream pStream) {
 		if (hasName()) {
-			pStream.println(ind+"Element: "+getName());
+			pStream.println(ind+"Element: "+name());
 		}
 	}
 }
 
-aspect Misc {
-	syn String XsElement.getName() {
-		for (int i=0; i<getNumAttribute(); i++) {
-			if (getAttribute(i) instanceof Name) {
-				return getAttribute(i).getAttValue().getSTRING_LITERAL();
-			}
-		}
-		// OK, no name found so let's report that
-		return "NoNameFound";
-	}
-
-	syn boolean XsElement.hasName() {
-		for (int i=0; i<getNumAttribute(); i++) {
-			if (getAttribute(i) instanceof Name) {
-				return true;
-			}
-		}
-		// OK, no name found so let's report that
-		return false;
-	}
-}
diff --git a/x3d/build.xml b/x3d/build.xml
index 763f39333cb363d9f4dff067c3751bfad6634cdf..da1cd828ff607cc558276717aea6731b6bcacdea 100644
--- a/x3d/build.xml
+++ b/x3d/build.xml
@@ -16,7 +16,7 @@
 
   <property name="javacc.home" value="../tools/javacc-4.0"/>
   
-  <property name="parser.name" value="Parser"/>
+  <property name="parser.name" value="XmlParser"/>
   
   <!-- "jflex" is an ant task class for the scanner generator in JFlex.jar -->
 <!--   <taskdef name="jflex" classname="JFlex.anttask.JFlexTask" classpath="tools/JFlex.jar"/> -->