diff --git a/src/main/grammar/Aspect.bnf b/src/main/grammar/Aspect.bnf
index da2d4a51a058d6cc0214a78e0ba613e3b1b85c9f..c8885804b1b3bc4202ed34439788d51afa75890a 100644
--- a/src/main/grammar/Aspect.bnf
+++ b/src/main/grammar/Aspect.bnf
@@ -89,8 +89,16 @@ aspect_interface_member_declaration ::= ( aspect_nested_class_declaration
                                         | aspect_interface_field_declaration )
 
 aspect_interface_syn_attribute_declaration ::= annotation* SYN LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? SEMICOLON
+{
+  implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute"
+  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectSynAttributeImpl"
+}
 
 aspect_interface_inh_attribute_declaration ::= annotation* INH LAZY? FINAL? aspect_type attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? SEMICOLON
+{
+  implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute"
+  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectInhAttributeImpl"
+}
 
 aspect_interface_method_declaration ::= (PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED )* aspect_result_type method_declarator (THROWS name_list ) SEMICOLON
 
@@ -111,22 +119,35 @@ 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 expression SEMICOLON | block | SEMICOLON )
+{
+  implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute"
+  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectSynAttributeImpl"
+}
 
-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_inh_attribute_declaration ::= annotation* INH NTA? LAZY? FINAL? aspect_type IDENTIFIER DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)* )? RPAREN (CIRCULAR expression_in_brackets)? SEMICOLON
+{
+  implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute"
+  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectInhAttributeImpl"
+}
 
+// FIXME parentheses are not required around the WHEN expression?
 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 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 expression | block)
+aspect_inh_equation ::= annotation* EQUATION IDENTIFIER DOT IDENTIFIER LPAREN (INT IDENTIFIER)? RPAREN DOT attribute_name LPAREN (type IDENTIFIER (COMMA type IDENTIFIER)*)? RPAREN (ASSIGN expression SEMICOLON | 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)
+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 SEMICOLON | block)
 
 collection_attribute ::= annotation* COLL aspect_type IDENTIFIER DOT attribute_name LPAREN RPAREN CIRCULAR? (expression_in_brackets)? (WITH IDENTIFIER)? (ROOT IDENTIFIER)? SEMICOLON
+{
+  implements="org.jastadd.tooling.aspect.psi.JastAddAspectAttribute"
+  extends="org.jastadd.tooling.aspect.psi.impl.JastAddAspectCollAttributeImpl"
+}
 
-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
+collection_contribution ::= annotation* IDENTIFIER 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
 
@@ -192,7 +213,7 @@ assignment_operator ::= ASSIGN | STARASSIGN | SLASHASSIGN | REMASSIGN | PLUSASSI
 
 conditional_expression ::= conditional_or_expression ( QUESTIONMARK expression COLON conditional_expression)?
 
-conditional_or_expression ::= conditional_and_expression ( SC_OR expression COLON conditional_expression )*
+conditional_or_expression ::= conditional_and_expression ( SC_OR conditional_and_expression )*
 
 conditional_and_expression ::= inclusive_or_expression ( SC_AND inclusive_or_expression )*
 
@@ -238,7 +259,7 @@ boolean_literal ::= TRUE | FALSE
 
 null_literal ::= NULL
 
-arguments ::= LPAREN argument_list RPAREN
+arguments ::= LPAREN argument_list? RPAREN
 
 argument_list ::= expression (COMMA expression)*
 
diff --git a/src/main/grammar/Aspect.flex b/src/main/grammar/Aspect.flex
index a1c903670e01782ff14f62265eeb0b52016c2b38..a99a55c79c683cd139ace8c6ce05758b09516d33 100644
--- a/src/main/grammar/Aspect.flex
+++ b/src/main/grammar/Aspect.flex
@@ -28,6 +28,7 @@ MultiLineComment    = "/*"  [^*]+ [*]+([^*/][^*]*[*]+)*[/]
 
 
 NotBrace          = ( [^{}/]+ | [/][^{}/*] )+
+NotBracket        = ( [^\[\]/]+ | [/][^\[\]/*] )+
 
 // from jjt
 DecimalLiteral    = [1-9] [0-9]*
@@ -50,6 +51,7 @@ Identifier           = [:jletter:] [:jletterdigit:]*
 %state EXPECT_CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
 %state CLASS_ANYTHING_LBRACE_ANYTHING_RBRACE
 %state LBRACE_ANYTHING_RBRACE
+%state LBRACKET_ANYTHING_RBRACKET
 %state JAVA_IN_PAREN
 %state COLLECTION_DECL
 %state ATTRIBUTE_DEFINITION
@@ -94,6 +96,17 @@ Identifier           = [:jletter:] [:jletterdigit:]*
   {NotBrace}                     {}
 }
 
+<LBRACKET_ANYTHING_RBRACKET> {
+  {SingleLineComment}            {}
+  {FormalComment}                {}
+  {MultiLineComment}             {}
+  {CharacterLiteral}             {}
+  {StringLiteral}                {}
+  "["                            { counter++; System.out.println("<INC>"); }
+  "]"                            { System.out.println("<DEC>"); counter--; if (counter==0) { System.out.println("<EXIT>"); yybegin(COLLECTION_DECL); return AspectTypes.LBRACKET_ANYTHING_RBRACKET; } }
+  {NotBracket}                   {System.out.println("<NB>" + yytext());}
+}
+
 <YYINITIAL,COLLECTION_DECL,ATTRIBUTE_DEFINITION> {
   "abstract"                    { return AspectTypes.ABSTRACT; }
 //"assert"                      { return AspectTypes.ASSERT; }
@@ -126,7 +139,7 @@ Identifier           = [:jletter:] [:jletterdigit:]*
   "interface"                   { return AspectTypes.INTERFACE; }
   "long"                        { return AspectTypes.LONG; }
   "native"                      { return AspectTypes.NATIVE; }
-//"new"                         { return AspectTypes.NEW; }
+  "new"                         { return AspectTypes.NEW; }
   "null"                        { return AspectTypes.NULL; }
 //"package"                     { return AspectTypes.PACKAGE; }
   "private"                     { return AspectTypes.PRIVATE; }
@@ -139,7 +152,7 @@ Identifier           = [:jletter:] [:jletterdigit:]*
   "super"                       { return AspectTypes.SUPER; }
 //"switch"                      { return AspectTypes.SWITCH; }
   "synchronized"                { return AspectTypes.SYNCHRONIZED; }
-//"this"                        { return AspectTypes.THIS; }
+  "this"                        { return AspectTypes.THIS; }
 //"throw"                       { return AspectTypes.THROW; }
   "throws"                      { return AspectTypes.THROWS; }
   "transient"                   { return AspectTypes.TRANSIENT; }
@@ -174,6 +187,7 @@ Identifier           = [:jletter:] [:jletterdigit:]*
 <COLLECTION_DECL> {
   "with"                        { return AspectTypes.WITH; }
   "root"                        { return AspectTypes.ROOT; }
+  "["                           { yybegin(LBRACKET_ANYTHING_RBRACKET); System.out.println("<ENTER>"); counter = 1; }
 }
 
 <ATTRIBUTE_DEFINITION> {
diff --git a/src/main/java/org/jastadd/tooling/aspect/psi/JastAddAspectAttribute.java b/src/main/java/org/jastadd/tooling/aspect/psi/JastAddAspectAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..3641ed2542495ddb249c07539fc6864e8dea5a3b
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/JastAddAspectAttribute.java
@@ -0,0 +1,6 @@
+package org.jastadd.tooling.aspect.psi;
+
+import com.intellij.psi.PsiElement;
+
+public interface JastAddAspectAttribute extends PsiElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectCollAttributeImpl.java b/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectCollAttributeImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..0381a57e809a9634499c5ec46b31445f8c8e5abd
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectCollAttributeImpl.java
@@ -0,0 +1,12 @@
+package org.jastadd.tooling.aspect.psi.impl;
+
+import com.intellij.extapi.psi.ASTWrapperPsiElement;
+import com.intellij.lang.ASTNode;
+import org.jastadd.tooling.aspect.psi.JastAddAspectAttribute;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class JastAddAspectCollAttributeImpl extends ASTWrapperPsiElement implements JastAddAspectAttribute {
+  public JastAddAspectCollAttributeImpl(@NotNull ASTNode node) {
+    super(node);
+  }
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectInhAttributeImpl.java b/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectInhAttributeImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6bd54d13cdaebb6413cf846e395df22a82685f8c
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectInhAttributeImpl.java
@@ -0,0 +1,12 @@
+package org.jastadd.tooling.aspect.psi.impl;
+
+import com.intellij.extapi.psi.ASTWrapperPsiElement;
+import com.intellij.lang.ASTNode;
+import org.jastadd.tooling.aspect.psi.JastAddAspectAttribute;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class JastAddAspectInhAttributeImpl extends ASTWrapperPsiElement implements JastAddAspectAttribute {
+  public JastAddAspectInhAttributeImpl(@NotNull ASTNode node) {
+    super(node);
+  }
+}
diff --git a/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectSynAttributeImpl.java b/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectSynAttributeImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b9443a44f50f29ddaa1ac17b7df717f12f4c78a
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/aspect/psi/impl/JastAddAspectSynAttributeImpl.java
@@ -0,0 +1,12 @@
+package org.jastadd.tooling.aspect.psi.impl;
+
+import com.intellij.extapi.psi.ASTWrapperPsiElement;
+import com.intellij.lang.ASTNode;
+import org.jastadd.tooling.aspect.psi.JastAddAspectAttribute;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class JastAddAspectSynAttributeImpl extends ASTWrapperPsiElement implements JastAddAspectAttribute {
+  public JastAddAspectSynAttributeImpl(@NotNull ASTNode node) {
+    super(node);
+  }
+}