diff --git a/CompilerGeneration.jrag b/CompilerGeneration.jrag
index 2ade2e8d1314205f65f4a907006d546c551e9cec..c277c988ab50d84806ec0a67450a41b9ab0783cb 100644
--- a/CompilerGeneration.jrag
+++ b/CompilerGeneration.jrag
@@ -91,6 +91,14 @@ aspect AbsGrammarGeneration {
 // 		}
     }
 
+	void ClassDeclaration.genAbsGrammar(PrintStream pStream) {
+		pStream.print(name());
+		pStream.print(" : "+getSuperClass().name());	
+		pStream.print(" ::=");
+		getProperties().genAbsGrammar(pStream);
+		pStream.println(";");
+	}
+
 	void Properties.genAbsGrammar(PrintStream pStream) {
 		for (int i=0; i<getNumProperty(); i++) {
 			pStream.print(" ");
diff --git a/GenCompiler.java b/GenCompiler.java
index 0a53d87bb23c7620112bb0ed0109a1fa9e003739..589a5d313ff27a29071787e14be99b359a607c96 100644
--- a/GenCompiler.java
+++ b/GenCompiler.java
@@ -43,6 +43,7 @@ public class GenCompiler extends Parser {
 		}
 
 		Start ast = parse(owlFile);
+		ast.setGrammarName(name);
 
 		File siarasDir = new File(dirName);
 		if (!siarasDir.isDirectory()) {
diff --git a/JavaCCChunks.jrag b/JavaCCChunks.jrag
index 7e5c25694bd0517f4b50bc32bc2e8bb6258329e6..7a8c942251cd27b43d1e568e1d90cd0a9d1ee218 100644
--- a/JavaCCChunks.jrag
+++ b/JavaCCChunks.jrag
@@ -31,11 +31,11 @@ aspect JavaCCChunks {
 		pStream.println("    STATIC                      = false;");
 		pStream.println("} ");
 		pStream.println();
-		pStream.println("PARSER_BEGIN("+name()+"Parser)");
+		pStream.println("PARSER_BEGIN("+grammarName()+"Parser)");
 		pStream.println("    package AST;");
-		pStream.println("    public class "+name()+"Parser {");
+		pStream.println("    public class "+grammarName()+"Parser {");
 		pStream.println("}");
-		pStream.println("PARSER_END("+name()+"Parser)");
+		pStream.println("PARSER_END("+grammarName()+"Parser)");
 		pStream.println();
 		pStream.println("//----------------------------------------------//");
 		pStream.println("//                LEXICAL TOKENS                //");
diff --git a/Misc.jrag b/Misc.jrag
index d4775d6f183005e4177395bda7e252c8ce2923fc..99bb3956079735c884c32ba8d6fad305237a248b 100644
--- a/Misc.jrag
+++ b/Misc.jrag
@@ -31,4 +31,16 @@ aspect Misc {
 		}
 		return s.toString();
 	}
+
+
+	syn Attribute Element.iri() = null;
+	eq ComplexElement.iri() {
+		for (int i=0; i<getNumAttribute(); i++) {
+			Attribute a = getAttribute(i);
+			if (a instanceof IRI) {
+				return a;
+			}
+		}
+		return null;
+	}
 }
diff --git a/Names.jrag b/Names.jrag
index ec7fcc8af7f4f3df5aefa56e621878f607aeea8d..100864c39e72df494169797ff445b598ce2f08aa 100644
--- a/Names.jrag
+++ b/Names.jrag
@@ -20,7 +20,16 @@
  */
 
 aspect Names {
-	syn String OClass.name() = getId();
-	syn String OwlProperty.name() = getId();
-	syn String OwlRestriction.name() = getRestrictionClassId();
+	syn String Element.name() = "";
+	eq OClass.name() = getId();
+	eq OwlProperty.name() = getId();
+	eq OwlRestriction.name() = getRestrictionClassId();
+	eq Declaration.name() = getElement(0).name();
+	eq Clazz.name() = iri().name();
+	eq NamedIndividual.name() = iri().trim();
+
+
+	static String ASTNode.gName = "owl";
+	public void ASTNode.setGrammarName(String s) {gName = s;}
+	public String ASTNode.grammarName() {return gName;}
 }
diff --git a/Rewrites.jrag b/Rewrites.jrag
index c62fc43785cf39842175819cb838c6b645b39179..48169f591f9465ce271c5a895a72473c7f73acc2 100644
--- a/Rewrites.jrag
+++ b/Rewrites.jrag
@@ -224,6 +224,20 @@ aspect MiscUtilities {
 		}
 		return (ComplexElement) e;
     }
+
+	syn boolean Declaration.isClassDecl() = getElement(0).isClass();
+	eq ClassDeclaration.isClassDecl() = true;
+	eq IndividualDeclaration.isClassDecl() = false;
+	syn boolean Declaration.isIndividualDecl() = getElement(0).isIndividual();
+	eq IndividualDeclaration.isIndividualDecl() = true;
+	eq ClassDeclaration.isIndividualDecl() = false;
+
+	syn boolean Element.isClass() = false;
+	eq Clazz.isClass() = true;
+
+	syn boolean Element.isIndividual() = false;
+	eq NamedIndividual.isIndividual() = true;
+
 }
 
 aspect RewriteClasses {