diff --git a/CompilerGeneration.jrag b/CompilerGeneration.jrag
index 8cc005500c8f1fe86b5219a199c194f390e9c4bd..138ff1e4dbf9fd9c49f0256a700de7efdb7a0573 100644
--- a/CompilerGeneration.jrag
+++ b/CompilerGeneration.jrag
@@ -10,6 +10,8 @@ aspect AbsGrammarGeneration {
     }
 
     public void Start.genAbsGrammar(PrintStream pStream) {
+		pStream.println("Start ::= Device*");
+		pStream.println("abstract Thing ::=;");
 		super.genAbsGrammar(pStream);
     }
 
@@ -79,19 +81,67 @@ aspect JavaCCGen {
 	}
 
 	public void Start.genJavaCC(PrintStream pStream) {
-		pStream.println("options {");
-		pStream.println("    MULTI                       = true;");
-		pStream.println("    VISITOR                     = true;");
-		pStream.println("    NODE_DEFAULT_VOID           = true;");
-		pStream.println("    NODE_SCOPE_HOOK             = false;");
-		pStream.println("    NODE_PREFIX                 = \"\";");
-		pStream.println("    JAVA_UNICODE_ESCAPE         = true;");
-		pStream.println("    STATIC                      = false;");
-		pStream.println("} ");
-		pStream.println("PARSER_BEGIN(OwlParser)");
-		pStream.println("package AST;");
-		pStream.println("public class OwlParser {");
+		genJavaCCHeader(pStream);
+		pStream.println();
+		genTokenDefs(pStream);
+		pStream.println();
+		genJavaCCLiterals(pStream);
+		pStream.println();
+		genJavaCCIdentifiers(pStream);
+		pStream.println();
+		genJavaCCSeparators(pStream);
+		pStream.println();
+		genJavaCCOperators(pStream);
+		pStream.println();
+
+		// OK, so now it's time to start generating some real grammar
+		// productions.
+		genJavaCCGrammar(pStream);
+	}
+
+	void ASTNode.genTokenDefs(PrintStream pStream) {
+		for (int i=0; i<getNumChild(); i++) {
+			getChild(i).genTokenDefs(pStream);
+		}		
+	}
+
+	void Start.genTokenDefs(PrintStream pStream) {
+		pStream.println("<DEFAULT, BOUNDS> TOKEN : /* RESERVED WORDS */");
+		pStream.println("{");
+		pStream.println("  <XML \t : \"xml\" >");
+		super.genTokenDefs(pStream);
+		pStream.println("}");
+		pStream.println();
+	}
+
+	void OwlClassDecl.genTokenDefs(PrintStream pStream) {
+		pStream.println(" |<"+getId().toUpperCase()+" \t : \""+getId()+"\">");
+	}
+
+	void ASTNode.genJavaCCGrammar(PrintStream pStream) {
+		for (int i=0; i<getNumChild(); i++) {
+			getChild(i).genJavaCCGrammar(pStream);
+		}		
+	}
+
+	void Start.genJavaCCGrammar(PrintStream pStream) {
+		pStream.println("Start Start() #Start : {}");
+		pStream.println("{");
+		pStream.println("    (Device())*");
+		pStream.println("    { return jjtThis; }");
+		pStream.println("}");
+		pStream.println();
+		super.genJavaCCGrammar(pStream);
+	}
+	
+	void OwlClassDecl.genJavaCCGrammar(PrintStream pStream) {
+		pStream.println("void "+getId()+" : {}");
+		pStream.println("{");
+		if (getId().equals("Device")) {
+			pStream.print("\"<\" <DEVICE> \">\"");
+			pStream.print("Property()* Skill()* MainFunction() #");
+			pStream.println("Device(3)");
+		}
 		pStream.println("}");
-		pStream.println("PARSER_END(OwlParser)");
 	}
 }
diff --git a/JavaCCChunks.jrag b/JavaCCChunks.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..61786fcd81b66eaa837ce1fc788d8d0ac751f338
--- /dev/null
+++ b/JavaCCChunks.jrag
@@ -0,0 +1,170 @@
+/* -*-Java-*- */
+
+aspect JavaCCChunks {
+	void Start.genJavaCCHeader(PrintStream pStream) {
+		pStream.println("options {");
+		pStream.println("    MULTI                       = true;");
+		pStream.println("    VISITOR                     = true;");
+		pStream.println("    NODE_DEFAULT_VOID           = true;");
+		pStream.println("    NODE_SCOPE_HOOK             = false;");
+		pStream.println("    NODE_PREFIX                 = \"\";");
+		pStream.println("    JAVA_UNICODE_ESCAPE         = true;");
+		pStream.println("    STATIC                      = false;");
+		pStream.println("} ");
+		pStream.println();
+		pStream.println("PARSER_BEGIN(SiarasParser)");
+		pStream.println("    package siaras;");
+		pStream.println("    public class SiarasParser {");
+		pStream.println("}");
+		pStream.println("PARSER_END(SiarasParser)");
+		pStream.println();
+		pStream.println("//----------------------------------------------//");
+		pStream.println("//                LEXICAL TOKENS                //");
+		pStream.println("//----------------------------------------------//");
+		pStream.println("<DEFAULT, BOUNDS> SKIP : /* WHITE SPACE */");
+		pStream.println("{");
+		pStream.println("    \" \"");
+		pStream.println("    |");
+		pStream.println("    \"\\t\"");
+		pStream.println("    |");
+		pStream.println("    \"\\n\"");
+		pStream.println("    |");
+		pStream.println("    \"\\r\"");
+		pStream.println("    |");
+		pStream.println("    \"\\f\"");
+		pStream.println("}// WHITE SPACE");
+		pStream.println();
+		pStream.println("SPECIAL_TOKEN : /* COMMENTS */ ");
+		pStream.println("{");
+		pStream.println("    < \"<!--\" ( ~[\"-\"] | ( \"-\" ~[\"-\"] ) )* \"-->\">");
+		pStream.println("  | < \"<rdfs:comment\" ( ~[\"<\"] | ( \"<\" ~[\"/\"] ) )* \"</rdfs:comment>\" >");
+		pStream.println("}// COMMENTS");
+		pStream.println();
+	}
+
+	void Start.genJavaCCLiterals(PrintStream pStream) {
+		pStream.println("<DEFAULT, BOUNDS> TOKEN : /* LITERALS */");
+		pStream.println("{");
+		pStream.println("    < INTEGER_LITERAL:");
+		pStream.println("        <DECIMAL_LITERAL> ([\"l\",\"L\"])?");
+		pStream.println("        |");
+		pStream.println("        <HEX_LITERAL> ([\"l\",\"L\"])?");
+		pStream.println("        |");
+		pStream.println("        <OCTAL_LITERAL> ([\"l\",\"L\"])?");
+		pStream.println("    >");
+		pStream.println("    |");
+		pStream.println("    < #DECIMAL_LITERAL: [\"1\"-\"9\"] ([\"0\"-\"9\"])* >");
+		pStream.println("    |");
+		pStream.println("    < #HEX_LITERAL: \"0\" [\"x\",\"X\"] ([\"0\"-\"9\",\"a\"-\"f\",\"A\"-\"F\"])+ >");
+		pStream.println("    |");
+		pStream.println("    < #OCTAL_LITERAL: \"0\" ([\"0\"-\"7\"])* >");
+		pStream.println("    |");
+		pStream.println("    < FLOAT_LITERAL:");
+		pStream.println("        ([\"0\"-\"9\"])+ \".\" ([\"0\"-\"9\"])* (<EXPONENT>)? ([\"f\",\"F\",\"d\",\"D\"])?");
+		pStream.println("        |");
+		pStream.println("        \".\" ([\"0\"-\"9\"])+ (<EXPONENT>)? ([\"f\",\"F\",\"d\",\"D\"])?");
+		pStream.println("        |");
+		pStream.println("        ([\"0\"-\"9\"])+ <EXPONENT> ([\"f\",\"F\",\"d\",\"D\"])?");
+		pStream.println("        |");
+		pStream.println("        ([\"0\"-\"9\"])+ (<EXPONENT>)? [\"f\",\"F\",\"d\",\"D\"]");
+		pStream.println("    >");
+		pStream.println("    |");
+		pStream.println("    < #EXPONENT: [\"e\",\"E\"] ([\"+\",\"-\"])? ([\"0\"-\"9\"])+ >");
+		pStream.println("    |");
+		pStream.println("    < CHARACTER_LITERAL:");
+		pStream.println("        \"\'\"");
+		pStream.println("        (   (~[\"\'\",\"\\\",\"\n\",\"\r\"])");
+		pStream.println("            |");
+		pStream.println("            (\"\\\"");
+		pStream.println("                (   [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\",\"'\",\"\\\"\"]");
+		pStream.println("                    |");
+		pStream.println("                    [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?");
+		pStream.println("                    |");
+		pStream.println("                    [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]");
+		pStream.println("                )");
+		pStream.println("            )");
+		pStream.println("        )");
+		pStream.println("        \"'\"");
+		pStream.println("    >");
+		pStream.println("    |");
+		pStream.println("    < STRING_LITERAL:");
+		pStream.println("        \"\\\"\"");
+		pStream.println("        (   (~[\"\\\"\",\"\\\",\"\n\",\"\r\"])");
+		pStream.println("            |");
+		pStream.println("            (\"\\\"");
+		pStream.println("                (    [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\",\"'\",\"\\\"\"]");
+		pStream.println("                     |");
+		pStream.println("                     [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?");
+		pStream.println("                     |");
+		pStream.println("                     [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]");
+		pStream.println("                )");
+		pStream.println("            )");
+		pStream.println("        )*");
+		pStream.println("        \"\\\"\"");
+		pStream.println("    >");
+		pStream.println("}// LITERALS");
+	}
+
+	void Start.genJavaCCIdentifiers(PrintStream pStream) {
+		pStream.println("<DEFAULT, BOUNDS> TOKEN : /* IDENTIFIERS */");
+		pStream.println("{");
+		pStream.println("    < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>|\"-\")* >");
+		pStream.println("    |");
+		pStream.println("    < #LETTER:");
+		pStream.println("        [");
+		pStream.println("        \"\\u0024\",");
+		pStream.println("        \"\\u0041\"-\"\\u005a\",");
+		pStream.println("        \"\\u005f\",");
+		pStream.println("        \"\\u0061\"-\"\\u007a\",");
+		pStream.println("        \"\\u00c0\"-\"\\u00d6\",");
+		pStream.println("        \"\\u00d8\"-\"\\u00f6\",");
+		pStream.println("        \"\\u00f8\"-\"\\u00ff\",");
+		pStream.println("        \"\\u0100\"-\"\\u1fff\",");
+		pStream.println("        \"\\u3040\"-\"\\u318f\",");
+		pStream.println("        \"\\u3300\"-\"\\u337f\",");
+		pStream.println("        \"\\u3400\"-\"\\u3d2d\",");
+		pStream.println("        \"\\u4e00\"-\"\\u9fff\",");
+		pStream.println("        \"\\uf900\"-\"\\ufaff\"");
+		pStream.println("        ]");
+		pStream.println("    >");
+		pStream.println("    |");
+		pStream.println("    < #DIGIT:");
+		pStream.println("        [");
+		pStream.println("        \"\\u0030\"-\"\\u0039\",");
+		pStream.println("        \"\\u0660\"-\"\\u0669\",");
+		pStream.println("        \"\\u06f0\"-\"\\u06f9\",");
+		pStream.println("        \"\\u0966\"-\"\\u096f\",");
+		pStream.println("        \"\\u09e6\"-\"\\u09ef\",");
+		pStream.println("        \"\\u0a66\"-\"\\u0a6f\",");
+		pStream.println("        \"\\u0ae6\"-\"\\u0aef\",");
+		pStream.println("        \"\\u0b66\"-\"\\u0b6f\",");
+		pStream.println("        \"\\u0be7\"-\"\\u0bef\",");
+		pStream.println("        \"\\u0c66\"-\"\\u0c6f\",");
+		pStream.println("        \"\\u0ce6\"-\"\\u0cef\",");
+		pStream.println("        \"\\u0d66\"-\"\\u0d6f\",");
+		pStream.println("        \"\\u0e50\"-\"\\u0e59\",");
+		pStream.println("        \"\\u0ed0\"-\"\\u0ed9\",");
+		pStream.println("        \"\\u1040\"-\"\\u1049\"");
+		pStream.println("        ]");
+		pStream.println("    >");
+		pStream.println("}// IDENTIFIERS");
+	}
+
+	void Start.genJavaCCSeparators(PrintStream pStream) {
+		pStream.println("<DEFAULT,BOUNDS> TOKEN : /* SEPARATORS */");
+		pStream.println("{");
+		pStream.println("     < LBRACE               : \"{\"    >");
+		pStream.println("    | < RBRACE               : \"}\"    >");
+		pStream.println("    | < LBRACKET             : \"[\"    >");
+		pStream.println("    | < RBRACKET             : \"]\"    >");
+		pStream.println("    | < SEMICOLON            : \";\"    >");
+		pStream.println("}// SEPARATORS");
+	}
+
+	void Start.genJavaCCOperators(PrintStream pStream) {
+		pStream.println("<DEFAULT,BOUNDS> TOKEN : /* OPERATORS */");
+		pStream.println("{");
+		pStream.println("      < ASSIGN               : \"=\"    >");
+		pStream.println("}// OPERATORS");
+	}
+}