diff --git a/src/main/antlr4/ModelJoin.g4 b/src/main/antlr4/ModelJoin.g4
index 3446a6d0696db9e948e660bfdbb756a80baf234d..864a32f4549d7fa6dcd213c9755b3077f931e1ba 100644
--- a/src/main/antlr4/ModelJoin.g4
+++ b/src/main/antlr4/ModelJoin.g4
@@ -10,58 +10,96 @@ grammar ModelJoin;
 /*
  * Parser
  */
+modeljoin : join+ EOF ;
+join : (naturaljoin | thetajoin | outerjoin) AS classres
+  ( OPENCURLYBRAKET
+    keepattributesexpr*
+    keepaggregatesexpr*
+    keepexpr*
+  CLOSEDCURLYBRAKET )? ;
+naturaljoin : NATURAL JOIN classres WITH classres ;
+thetajoin : THETA JOIN classres WITH classres WHERE oclcond;
+outerjoin : (leftouterjoin | rightouterjoin) OUTER JOIN WITH classres;
+leftouterjoin : LEFT ;
+rightouterjoin : RIGHT ;
 
-modeljoin : join+ EOF;
-join  : (naturaljoin | thetajoin | outerjoin) 'as' CLASSRES
-  ( '{'
-  keepattributes*
-  keepaggregate*
-  keepexpressions*
-  '}' )? ;
+keepattributesexpr : KEEP ATTRIBUTES attrres (COMMA attrres)* ;
+keepaggregatesexpr : KEEP AGGREGATE aggrtype
+                      OPENBRAKET relattr CLOSEDBRAKET
+                      OVER classres AS attrres;
+keepexpr : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr)
+  ( OPENCURLYBRAKET
+    keepattributesexpr*
+    keepaggregatesexpr*
+    keepexpr*
+  CLOSEDCURLYBRAKET)? ;
+keeptypeexpr : keepsupertypeexpr | keepsubtypeexpr ;
+keepsupertypeexpr : KEEP SUPERTYPE ( AS TYPE classres )? ;
+keepsubtypeexpr : KEEP SUBTYPE ( AS TYPE classres )? ;
+keepoutgoingexpr : KEEP OUTGOING attrres ( AS TYPE classres )? ;
+keepincomingexpr : KEEP INCOMING attrres (AS TYPE classres )? ;
 
-naturaljoin : 'natural' 'join' CLASSRES 'with' CLASSRES ;
-thetajoin : 'theta' 'join' CLASSRES 'with' CLASSRES 'where' OCLCOND ;
-outerjoin : (leftouterjoin | rightouterjoin) 'outer' 'join' CLASSRES 'with' CLASSRES ;
-leftouterjoin : 'left' ;
-rightouterjoin  : 'right' ;
+classres : WORD (DOT WORD)* ;
+attrres : WORD (DOT WORD)+ ;
+relattr : WORD ;
+oclcond : (WORD | NUMBER | specialchar | WHITESPACE | NEWLINE)+;
+aggrtype : SUM | AVG | MIN | MAX | SIZE ;
 
-keepattributes  : 'keep' 'attributes' ATTRRES ( ',' ATTRRES )* ;
-keepaggregate : 'keep' 'aggregate' aggrtype '(' RELATTRRES ')' 'over' ATTRRES 'as' CLASSRES ;
-keepexpressions : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr)
- ( '{'
-  keepattributes*
-  keepaggregate*
-  keepexpressions*
- '}' )? ;
-keeptypeexpr  :  keepsupertypeexpr | keepsubtypeexpr ;
-keepsupertypeexpr : 'keep' 'supertype' CLASSRES ( 'as' 'type' CLASSRES )? ;
-keepsubtypeexpr : 'keep' 'subtype' CLASSRES ( 'as' 'type' CLASSRES )? ;
-keepoutgoingexpr  : 'keep' 'outgoing' ATTRRES ( 'as' 'type' CLASSRES )? ;
-keepincomingexpr  : 'keep' 'incoming' ATTRRES ( 'as' 'type' CLASSRES )? ;
-
-aggrtype : SUMAGGR | AVGAGGR | MINAGGR | MAXAGGR | SIZEAGGR ;
+specialchar : DOT
+              | OPENBRAKET
+              | CLOSEDBRAKET
+              | OPENCURLYBRAKET
+              | CLOSEDCURLYBRAKET
+              | COMMA
+              | UNDERSCORE
+              | SPECIALCHAR ;
 
 /*
  * Lexer
  */
 
-fragment LOWERCASE  : [a-z] ;
-fragment UPPERCASE  : [A-Z] ;
-fragment ANYCASE  : LOWERCASE | UPPERCASE ;
-fragment DIGIT  : [0-9] ;
+fragment LOWERCASE  : [a-z]                 ;
+fragment UPPERCASE  : [A-Z]                 ;
+fragment ANYCASE    : LOWERCASE | UPPERCASE ;
+fragment DIGIT      : [0-9]                 ;
+
+OPENBRAKET        : '('         ;
+CLOSEDBRAKET      : ')'         ;
+OPENCURLYBRAKET   : '{'         ;
+CLOSEDCURLYBRAKET : '}'         ;
+DOT               : '.'         ;
+COMMA             : ','         ;
+UNDERSCORE        : '_'         ;
+SPECIALCHAR       : [-><!="'] ;
+
+JOIN    : 'join'    ;
+NATURAL : 'natural' ;
+THETA   : 'theta'   ;
+WHERE   : 'where'   ;
+OUTER   : 'outer'   ;
+RIGHT   : 'right'   ;
+LEFT    : 'left'    ;
+WITH    : 'with'    ;
+AS      : 'as'      ;
 
-fragment EELEMENTID  : ANYCASE | (ANYCASE | '_')+(ANYCASE | DIGIT | '_')+ ;
+KEEP        : 'keep'        ;
+ATTRIBUTES  : 'attributes'  ;
+AGGREGATE   : 'aggregate'   ;
+SUPERTYPE   : 'supertype'   ;
+SUBTYPE     : 'subtype'     ;
+OUTGOING    : 'outgoing'    ;
+INCOMING    : 'incoming'    ;
+TYPE        : 'type'        ;
+OVER        : 'over'        ;
 
-CLASSRES  : EELEMENTID ( '.' EELEMENTID )* ;
-RELATTRRES  : EELEMENTID ;
-ATTRRES : CLASSRES '.' RELATTRRES ;
-OCLCOND : .+? ;
+SUM   : 'sum'   ;
+AVG   : 'avg'   ;
+MIN   : 'min'   ;
+MAX   : 'max'   ;
+SIZE  : 'size'  ;
 
-SUMAGGR : 'sum' ;
-AVGAGGR : 'avg' ;
-MINAGGR : 'min' ;
-MAXAGGR : 'max' ;
-SIZEAGGR  : 'size' ;
+WORD    : ANYCASE (ANYCASE | DIGIT | UNDERSCORE)* ;
+NUMBER  : [+-]? DIGIT+ DOT? DIGIT* ;
 
-WHITESPACE  : ' ' -> skip ;
-NEWLINE : ('\r'? '\n' | '\r')+ -> skip ;
+WHITESPACE  : ' ' -> skip                   ;
+NEWLINE     : ('\r'? '\n' | '\r')+ -> skip  ;