diff --git a/src/main/grammar/JastAddAspect.bnf b/src/main/grammar/JastAddAspect.bnf
index d967e0e51bf9d7992b01310ec78f7025b4b1ad3f..4fa13c65044f060688e8f338c8a259415ed8871c 100644
--- a/src/main/grammar/JastAddAspect.bnf
+++ b/src/main/grammar/JastAddAspect.bnf
@@ -110,23 +110,23 @@ aspect_refine_constructor_declaration ::= REFINE IDENTIFIER (PUBLIC | PROTECTED
 
 aspect_field_declaration ::= modifiers aspect_type IDENTIFIER DOT variable_declarator (COMMA variable_declarator)* SEMICOLON
 
-aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? ( ASSIGN JAVA_EXPRESSION SEMICOLON | block | SEMICOLON )
+aspect_syn_attribute_declaration ::= annotation* SYN NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? ( ASSIGN expression SEMICOLON | block | SEMICOLON )
 
 aspect_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? (CIRCULAR expression_in_brackets)? SEMICOLON
 
-aspect_rewrite ::= REWRITE IDENTIFIER (IDENTIFIER DOT IDENTIFIER LPAREN RPAREN)? LBRACE ((WHEN LPAREN JAVA_EXPRESSION RPAREN)? TO aspect_type ( JAVA_EXPRESSION SEMICOLON | block ))+ RBRACE
+aspect_rewrite ::= REWRITE IDENTIFIER (IDENTIFIER DOT IDENTIFIER LPAREN RPAREN)? LBRACE ((WHEN LPAREN expression RPAREN)? TO aspect_type ( expression SEMICOLON | block ))+ RBRACE
 
-aspect_syn_equation ::= annotation* EQUATION IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN ( ASSIGN JAVA_EXPRESSION SEMICOLON | block )
+aspect_syn_equation ::= annotation* EQUATION IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN ( ASSIGN expression SEMICOLON | block )
 
-aspect_refine_syn_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION SEMICOLON | block)
+aspect_refine_syn_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression SEMICOLON | block)
 
-aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION | block)
+aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression | block)
 
-aspect_refine_inh_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? RPAREN DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN JAVA_EXPRESSION | block)
+aspect_refine_inh_equation ::= REFINE IDENTIFIER EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? RPAREN DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression | block)
 
 collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (expression_in_brackets)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON
 
-collection_contribution ::= annotation* CONTRIBUTES ( NTA JAVA_EXPRESSION TO IDENTIFIER DOT attribute_name LPAREN RPAREN | EACH? JAVA_EXPRESSION (WHEN JAVA_EXPRESSION)? TO IDENTIFIER DOT attribute_name LPAREN RPAREN (FOR  EACH? JAVA_EXPRESSION)? | block TO IDENTIFIER DOT attribute_name LPAREN RPAREN ) SEMICOLON
+collection_contribution ::= annotation* CONTRIBUTES ( NTA expression TO IDENTIFIER DOT attribute_name LPAREN RPAREN | EACH? expression (WHEN expression)? TO IDENTIFIER DOT attribute_name LPAREN RPAREN (FOR  EACH? expression)? | block TO IDENTIFIER DOT attribute_name LPAREN RPAREN ) SEMICOLON
 
 aspect_add_interface ::= IO IMPLEMENTS type_name_list SEMICOLON
 
@@ -228,7 +228,7 @@ cast_expression ::= LPAREN type RPAREN unary_expression_not_plus_minus
 
 primary_expression ::= primary_prefix (primary_suffix)*
 
-primary_prefix ::= literal | THIS | (SUPER DOT java_identifier) | (LPAREN expression RPAREN) | allocation_expression | (result_type DOT CLASS) | name_name
+primary_prefix ::= literal | THIS | (SUPER DOT java_identifier) | (LPAREN expression RPAREN) | allocation_expression | (result_type DOT_CLASS) | name_name
 
 primary_suffix ::= (DOT THIS) | (DOT allocation_expression) | (DOT type_arguments java_identifier) | (LBRACKET expression RBRACKET) | (DOT java_identifier) | arguments | DOUBLECOLON NEW | DOUBLECOLON java_identifier
 
@@ -299,9 +299,10 @@ class_declaration ::= CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE // CLASS IDENTIFIER
 interface_declaration ::= INTERFACE_ANYTHING_LBRACE_ANYTHING_RBRACE // INTERFACE java_indentifier LBRACE interface_member_declaration RBRACE
 
 // can be anywhere
-enum_declaration ::= ENUM_ANYTHING_LPAREN_ANYTHING_RPAREN // ENUM java_identifier (implements type_name_list)? LBRACE enum_constant (COMMA enum_constant)* (SEMICOLON class_body_declaration* )? RBRACE
-
+enum_declaration ::= ENUM_ANYTHING_LBRACE_ANYTHING_RBRACE // ENUM java_identifier (implements type_name_list)? LBRACE enum_constant (COMMA enum_constant)* (SEMICOLON class_body_declaration* )? RBRACE
 
+// only within attribute equations
+block ::= LBRACE_ANYTHING_RBRACE
 
 // TODO unsupported
 
diff --git a/src/main/grammar/JastAddAspect.flex b/src/main/grammar/JastAddAspect.flex
index 07135a56e8ba0861a53ef315c810c47862aedb76..a8b0b39c46ff8a828f81d8f7eee3b4d53130fc35 100644
--- a/src/main/grammar/JastAddAspect.flex
+++ b/src/main/grammar/JastAddAspect.flex
@@ -27,7 +27,7 @@ FormalComment       = "/**" [^*]* [*]+([^*/][^*]*[*]+)*[/]
 MultiLineComment    = "/*"  [^*]+ [*]+([^*/][^*]*[*]+)*[/]
 
 
-NotParenthesis    = [^{}]+
+NotBrace          = ( [^{}/]+ | [/][^{}/*] )*
 
 // from jjt
 DecimalLiteral    = [1-9] [0-9]*
@@ -47,37 +47,54 @@ StringLiteral        = \" ( [^\"\\\n\r] | ( \\ ( [ntbrf\\'\"] | [0-7][0-7?] | [0
 Identifier           = [:jletter:] [:jletterdigit:]*
 
 %state JASTADD
-%state EXPECT_JAVA_IN_PAREN
+%state EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
+%state CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
+%state LBRACE_ANYTHING_RBRACE
 %state JAVA_IN_PAREN
 %state COLLECTION_DECL
+%state ATTRIBUTE_DEFINITION
+%state LPAREN_ANYTHING_RPAREN
 
 %%
 
-<YYINITIAL> {
- {WhiteSpace}+                  { return TokenType.WHITE_SPACE; }
- {SingleLineComment}            { return JastAddAspectTypes.SINGLE_LINE_COMMENT; }
- {FormalComment}                { return JastAddAspectTypes.FORMAL_COMMENT; }
- {MultiLineComment}             { return JastAddAspectTypes.MULTI_LINE_COMMENT; }
-// "EQ"                           { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; }
-// "{"                            { yybegin(JAVA); counter = 1;  }
+<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
+  {WhiteSpace}+                  { return TokenType.WHITE_SPACE; }
+  {SingleLineComment}            { return JastAddAspectTypes.SINGLE_LINE_COMMENT; }
+  {FormalComment}                { return JastAddAspectTypes.FORMAL_COMMENT; }
+  {MultiLineComment}             { return JastAddAspectTypes.MULTI_LINE_COMMENT; }
+//  "EQ"                           { yybegin(YYINITIAL); return JastAddAspectTypes.EQ; }
+//  "{"                            { yybegin(JAVA); counter = 1;  }
+  "class"                        { yybegin(EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); }
 }
 
-<EXPECT_JAVA_IN_PAREN> {
- "{"                            { yybegin(JAVA_IN_PAREN); counter = 1;  }
+<EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> {
+  "{"                            { yybegin(CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE); counter = 1;  }
+  {NotBrace}                     {} // skip over everything
 }
 
-<JAVA_IN_PAREN> {
- {SingleLineComment}            {}
- {FormalComment}                {}
- {MultiLineComment}             {}
- {CharacterLiteral}             {}
- {StringLiteral}                {}
- {NotParenthesis}               {}
- "{"                            { counter++; }
- "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.JAVA_IN_PAREN; } }
+<CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE> {
+  {SingleLineComment}            {}
+  {FormalComment}                {}
+  {MultiLineComment}             {}
+  {CharacterLiteral}             {}
+  {StringLiteral}                {}
+  "{"                            { counter++; }
+  "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE; } }
+  {NotBrace}                     {}
 }
 
-<YYINITIAL,COLLECTION_DECL> {
+<LBRACE_ANYTHING_RBRACE> {
+  {SingleLineComment}            {}
+  {FormalComment}                {}
+  {MultiLineComment}             {}
+  {CharacterLiteral}             {}
+  {StringLiteral}                {}
+  "{"                            { counter++; }
+  "}"                            { counter--; if (counter==0) { yybegin(YYINITIAL); return JastAddAspectTypes.LBRACE_ANYTHING_RBRACE; } }
+  {NotBrace}                     {}
+}
+
+<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
   "abstract"                    { return JastAddAspectTypes.ABSTRACT; }
 //"assert"                      { return JastAddAspectTypes.ASSERT; }
   "boolean"                     { return JastAddAspectTypes.BOOLEAN; }
@@ -86,7 +103,7 @@ Identifier           = [:jletter:] [:jletterdigit:]*
 //"case"                        { return JastAddAspectTypes.CASE; }
 //"catch"                       { return JastAddAspectTypes.CATCH; }
   "char"                        { return JastAddAspectTypes.CHAR; }
-  "class"                       { return JastAddAspectTypes.CLASS; }
+//"class"                       { return JastAddAspectTypes.CLASS; }
 //"const"                       { return JastAddAspectTypes.CONST; }
 //"continue"                    { return JastAddAspectTypes.CONTINUE; }
 //"default"                     { return JastAddAspectTypes._DEFAULT; }
@@ -133,14 +150,14 @@ Identifier           = [:jletter:] [:jletterdigit:]*
 //"while"                       { return JastAddAspectTypes.WHILE; }
 
   // JastAdd
-  "inh"                         { return JastAddAspectTypes.INH; }
-  "syn"                         { return JastAddAspectTypes.SYN; }
+  "inh"                         { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.INH; }
+  "syn"                         { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.SYN; }
   "lazy"                        { return JastAddAspectTypes.LAZY; }
   "rewrite"                     { return JastAddAspectTypes.REWRITE; }
   "to"                          { return JastAddAspectTypes.TO; }
   "when"                        { return JastAddAspectTypes.WHEN; }
   "aspect"                      { return JastAddAspectTypes.ASPECT; }
-  "eq"                          { return JastAddAspectTypes.EQUATION; }
+  "eq"                          { yybegin(ATTRIBUTE_DEFINITION); return JastAddAspectTypes.EQUATION; }
   "circular"                    { return JastAddAspectTypes.CIRCULAR; }
   "refine"                      { return JastAddAspectTypes.REFINE; }
   "contributes"                 { return JastAddAspectTypes.CONTRIBUTES; }
@@ -159,7 +176,16 @@ Identifier           = [:jletter:] [:jletterdigit:]*
   "root"                        { return JastAddAspectTypes.ROOT; }
 }
 
-<YYINITIAL, COLLECTION_DECL> {
+<ATTRIBUTE_DEFINITION> {
+  "{"                           { yybegin(LBRACE_ANYTHING_RBRACE); counter = 1; }
+}
+
+// a semicolon exits the COLLECTION_DECL (because we ignore semicolons in expressions)
+<COLLECTION_DECL, ATTRIBUTE_DEFINITION> {
+  ";"                           { yybegin(YYINITIAL); return JastAddAspectTypes.SEMICOLON; }
+}
+
+<YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
   // LITERALS
   {IntegerLiteral}              { return JastAddAspectTypes.INTEGER_LITERAL; }
   {FloatingPointLiteral}        { return JastAddAspectTypes.FLOATING_POINT_LITERAL; }
@@ -169,17 +195,22 @@ Identifier           = [:jletter:] [:jletterdigit:]*
   // IDENTIFIERS
   {Identifier}                  { return JastAddAspectTypes.IDENTIFIER; }
 
+  // COMBINED TOKENS
+  ".class"                      { return JastAddAspectTypes.DOT_CLASS; }
+
   // SEPARATORS
+
   "("                           { return JastAddAspectTypes.LPAREN; }
   ")"                           { return JastAddAspectTypes.RPAREN; }
   "{"                           { return JastAddAspectTypes.LBRACE; }
   "}"                           { return JastAddAspectTypes.RBRACE; }
   "["                           { return JastAddAspectTypes.LBRACKET; }
   "]"                           { return JastAddAspectTypes.RBRACKET; }
+
   ";"                           { return JastAddAspectTypes.SEMICOLON; }
   ","                           { return JastAddAspectTypes.COMMA; }
   "."                           { return JastAddAspectTypes.DOT; }
-  "@"                           { return JastAddAspectTypes.AT; }
+//"@"                           { return JastAddAspectTypes.AT; }
 
   // OPERATORS
   "="                           { return JastAddAspectTypes.ASSIGN; }