diff --git a/Parser/Makefile b/Parser/Makefile
index ec6608ba0ed3eff06d8168d56753373def4ba545..27b7fb61e9b91c25611ae7d8b9b9baedaacc189a 100644
--- a/Parser/Makefile
+++ b/Parser/Makefile
@@ -11,7 +11,7 @@ jastadd: ast
 	rm -f src-gen/org/tud/forty/ast/*
 	sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/Printing.jadd
 	sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/OmpPrinting.jadd
-	cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --package="org.tud.forty.ast" --indent='2space' --rewrite=regular ../spec-gen/*.ast ../spec/*.jadd ../spec/*.jrag
+	cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --package="org.tud.forty.ast" --indent='2space' --rewrite=regular ../spec/*.ast ../spec-gen/*.ast ../spec/*.jadd ../spec/*.jrag
 	sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/Printing.jadd
 	sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/OmpPrinting.jadd
 
@@ -32,7 +32,7 @@ clean:
 dot:
 	sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/Printing.jadd
 	sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/OmpPrinting.jadd
-	cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --dot --package="org.tud.forty.ast" --indent='4space' ../spec-gen/*.ast ../spec/*.jadd
+	cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --dot --package="org.tud.forty.ast" --indent='4space' ../spec/*.ast ../spec-gen/*.ast ../spec/*.jadd
 	sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/Printing.jadd
 	sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/OmpPrinting.jadd
 
diff --git a/Parser/spec/ExprRewrites.jrag b/Parser/spec/ExprRewrites.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..55ef8a0feb2e1e37e7c419ce5b208a4b2b0cf3b8
--- /dev/null
+++ b/Parser/spec/ExprRewrites.jrag
@@ -0,0 +1,110 @@
+aspect ExprRewrites {
+
+  rewrite Level6Expr {
+    when (getDefBinOpExprList().numChildren() == 0)
+    to AbstractLevel5Expr {
+      return getLevel5Expr();
+    }
+  }
+
+  // TODO check if actually can be rewritten!
+  rewrite Level5Expr {
+    when (getAbstractEquivOperandList().numChildren() == 1)
+    to AbstractAbstractEquivOperand {
+      return getAbstractEquivOperand(0).getEquivOperand();
+    }
+  }
+
+  rewrite EquivOperand {
+    when (getOrOperandList().numChildren() == 1)
+    to AbstractOrOperand {
+      return getOrOperand(0);
+    }
+  }
+
+  rewrite OrOperand {
+    when (getAndOperandList().numChildren() == 1)
+    to AbstractAndOperand {
+      return getAndOperand(0);
+    }
+  }
+
+  rewrite AndOperand {
+    when (!(this instanceof NotAndOperand))
+    to AbstractLevel4Expr {
+      return getLevel4Expr();
+    }
+  }
+
+  rewrite AtomicLevel4Expr {
+    // when (true) // condition encoded in 'Atomic'
+    to AbstractLevel3Expr {
+      return getLevel3Expr();
+    }
+  }
+
+  rewrite Level3Expr {
+    when (getLevel2ExprList().numChildren() == 1)
+    to AbstractLevel2Expr {
+      return getLevel2Expr(0);
+    }
+  }
+
+  rewrite Level2Expr {
+    when (getAbstractAddOperandList().numChildren() == 1 && (getAbstractAddOperand(0) instanceof SimpleAddOperand))
+    to AbstractAbstractAddOperand {
+      return getAbstractAddOperand(0).getAddOperand();
+    }
+  }
+
+  rewrite AddOperand {
+    when (getAbstractMultOperandList().numChildren() == 1 && (getAbstractMultOperand(0) instanceof SimpleMultOperand))
+        to AbstractAbstractMultOperand {
+      return getAbstractMultOperand(0).getMultOperand();
+    }
+  }
+
+  rewrite MultOperand {
+    when (getLevel1ExprList().numChildren() == 1)
+    to AbstractLevel1Expr {
+      return getLevel1Expr(0);
+    }
+  }
+
+  rewrite Level1Expr {
+    when (!hasDefinedUnaryOp())
+    to Primary {
+      return getPrimary();
+    }
+  }
+
+
+
+ //  rewrite Level5Expr {
+ //    to SimpleExpr {
+ //      List<OpOp> operands = new List<OpOp>();
+ //      for (AbstractEquivOperand eo : getAbstractEquivOperandList()) {
+ //        if (eo instanceof SimpleEquivOperand) {
+ //          operands.add(new OpOpOperand(eo.getEquivOperand()));
+ //        } else if (eo instanceof EqEquivOperand) {
+ //          operands.add(new OpOpPair(new EqvOp(), eo.getEquivOperand()));
+ //        } else if (eo instanceof NeqEquivOperand) {
+ //          operands.add(new OpOpPair(new EqvOp(), eo.getEquivOperand()));
+ //        }
+ //      }
+ //      return new ComplexExpr(operands);
+ //    }
+ //  }
+//
+ //  syn boolean OpOp.isOperand();
+ //  eq OpOpPair.isOperand() = false;
+ //  eq OpOpOperand.isOperand() = true;
+//
+ //  rewrite ComplexExpr {
+ //    when (getOpOpList().numChildren() == 1 && getOpOp(0).isOperand())
+ //    to AbstractExpr {
+ //      return getOpOp(0).getAbstractExpr();
+ //    }
+ //  }
+
+}
\ No newline at end of file
diff --git a/Parser/spec/Fortran2008.rats b/Parser/spec/Fortran2008.rats
index bbe8c1ed8644e97b408f07a0a50f02e47371f28a..9cc8d467a09decbea700f1569ff1434b7c1fffc5 100644
--- a/Parser/spec/Fortran2008.rats
+++ b/Parser/spec/Fortran2008.rats
@@ -131,7 +131,7 @@ ProgramUnit program_unit =
 ;
 
 //// // R203
-//// ExternalSubprogram:ProgramUnit ;
+//// abstract ExternalSubprogram:ProgramUnit ;
 //// FunctionSubprogram_ExternalSubprogram:ExternalSubprogram ::= FunctionSubprogram ;
 //// SubroutineSubprogram_ExternalSubprogram:ExternalSubprogram ::= SubroutineSubprogram ;
 ExternalSubprogram external_subprogram =
@@ -576,7 +576,8 @@ IntConstant int_constant =
 //// // TODO MISSING RULE 308
 
 //// // R309
-//// abstract IntrinsicOperator ;
+//// abstract Operator ;
+//// abstract IntrinsicOperator:Operator ;
 IntrinsicOperator intrinsic_operator =
     power_op
 /   concat_op
@@ -590,7 +591,7 @@ IntrinsicOperator intrinsic_operator =
 ;
 
 //// // R310
-//// abstract DefinedOperator ;
+//// abstract DefinedOperator:Operator ;
 DefinedOperator defined_operator =
     defined_unary_op
 /   defined_binary_op
@@ -801,8 +802,7 @@ KindSelector kind_selector =
             OrOperand oo = new OrOperand(new List().add(ao));
             EquivOperand eo = new EquivOperand(new List().add(oo));
             Level5Expr l5e = new Level5Expr(new List().add(new SimpleEquivOperand(eo)));
-            Level6Expr l6e = new Level6Expr(l5e, new List());
-            Expr e = new Level6ExprExpr(l6e);
+            Expr e = new Level6Expr(l5e, new List());
             yyValue = new KindSelector(e);
         }
 ;
@@ -3165,7 +3165,7 @@ DeallocOpt dealloc_opt =
 // =============================================================================
 
 //// // R701
-//// abstract Primary ;
+//// abstract Primary:AbstractLevel1Expr ;
 //// TypeParamName_Primary:Primary ::= Name ;
 //// ExprPrimary_Primary:Primary ::= Expr ;
 // ! Modified!
@@ -3257,7 +3257,8 @@ GenericPrimary generic_primary =
 
 
 //// // R702
-//// Level1Expr ::= [DefinedUnaryOp] Primary ;
+//// abstract AbstractLevel1Expr:AbstractAbstractMultOperand ;
+//// Level1Expr:AbstractLevel1Expr ::= [DefinedUnaryOp] Primary ;
 Level1Expr level_1_expr =
     u:(yyValue:defined_unary_op)? p:primary
         {
@@ -3282,8 +3283,9 @@ DefinedUnaryOp defined_unary_op =
         }
 ;
 
-//// // R704
-//// MultOperand ::= Level1Expr* ;
+//// // R704]
+//// abstract AbstractAbstractMultOperand:AbstractAbstractAddOperand ;
+//// MultOperand:AbstractAbstractMultOperand ::= Level1Expr:AbstractLevel1Expr* ;
 MultOperand mult_operand =
     l:level_1_expr POW r:mult_operand
         {
@@ -3310,8 +3312,9 @@ MultOperand mult_operand_without_dot =
 ;
 
 //// // R705
-//// AddOperand ::= AbstractMultOperand*;
-//// abstract AbstractMultOperand ::= MultOperand ;
+//// abstract AbstractAbstractAddOperand:AbstractLevel2Expr ;
+//// AddOperand:AbstractAbstractAddOperand ::= AbstractMultOperand*;
+//// abstract AbstractMultOperand:AbstractAbstractMultOperand ::= MultOperand:AbstractAbstractMultOperand ;
 //// SimpleMultOperand:AbstractMultOperand ;
 //// MultMultOperand:AbstractMultOperand ;
 //// DivMultOperand:AbstractMultOperand ;
@@ -3389,8 +3392,9 @@ AddOperand add_operand_rest_without_dot =
 ;
 
 //// // R706
-//// Level2Expr ::= AbstractAddOperand* ;
-//// abstract AbstractAddOperand ::= AddOperand ;
+//// abstract AbstractLevel2Expr:AbstractLevel3Expr ;
+//// Level2Expr:AbstractLevel2Expr ::= AbstractAddOperand* ;
+//// abstract AbstractAddOperand:AbstractAbstractAddOperand ::= AddOperand:AbstractAbstractAddOperand ;
 //// SimpleAddOperand:AbstractAddOperand ;
 //// PlusAddOperand:AbstractAddOperand ;
 //// MinusAddOperand:AbstractAddOperand ;
@@ -3508,7 +3512,8 @@ AddOp add_op =
 ;
 
 //// // R710
-//// Level3Expr ::= Level2Expr* ;
+//// abstract AbstractLevel3Expr:AbstractLevel4Expr ;
+//// Level3Expr:AbstractLevel3Expr ::= Level2Expr:AbstractLevel2Expr* ;
 Level3Expr level_3_expr =
     e:level_2_expr el:(DOUBLESLASH yyValue:level_2_expr)*
         {
@@ -3538,9 +3543,10 @@ ConcatOp concat_op =
 ;
 
 //// // R712
-//// abstract Level4Expr ;
-//// AtomicLevel4Expr:Level4Expr ::= Level3Expr ;
-//// abstract BinaryLevel4Expr:Level4Expr ::= Left:Level3Expr Right:Level3Expr ;
+//// abstract AbstractLevel4Expr:AbstractAndOperand ;
+//// abstract Level4Expr:AbstractLevel4Expr ;
+//// AtomicLevel4Expr:Level4Expr ::= Level3Expr:AbstractLevel3Expr ;
+//// abstract BinaryLevel4Expr:Level4Expr ::= Left:AbstractLevel3Expr Right:AbstractLevel3Expr ;
 //// EQLevel4Expr:BinaryLevel4Expr ;
 //// NELevel4Expr:BinaryLevel4Expr ;
 //// LTLevel4Expr:BinaryLevel4Expr ;
@@ -3764,7 +3770,8 @@ RelOp rel_op =
 ;
 
 //// // R714
-//// AndOperand ::= Level4Expr ;
+//// abstract AbstractAndOperand:AbstractOrOperand ;
+//// AndOperand:AbstractAndOperand ::= Level4Expr:AbstractLevel4Expr ;
 //// NotAndOperand:AndOperand ;
 AndOperand and_operand =
     NOT o:level_4_expr
@@ -3789,7 +3796,8 @@ AndOperand and_operand_without_dot =
 
 
 //// // R715
-//// OrOperand ::= AndOperand* ;
+//// abstract AbstractOrOperand:AbstractAbstractEquivOperand ;
+//// OrOperand:AbstractOrOperand ::= AndOperand:AbstractAndOperand* ;
 OrOperand or_operand =
     a:and_operand r:or_operand_rest
         {
@@ -3865,7 +3873,8 @@ OrOperand or_operand_rest_without_dot =
 
 
 //// // R716
-//// EquivOperand ::= OrOperand*;
+//// abstract AbstractAbstractEquivOperand:AbstractLevel5Expr ;
+//// EquivOperand:AbstractAbstractEquivOperand ::= OrOperand:AbstractOrOperand*;
 EquivOperand equiv_operand =
     o:or_operand r:equiv_operand_rest
         {
@@ -3940,8 +3949,9 @@ EquivOperand equiv_operand_rest_without_dot =
 ;
 
 //// // R717
-//// Level5Expr ::= AbstractEquivOperand* ;
-//// abstract AbstractEquivOperand ::= EquivOperand ;
+//// abstract AbstractLevel5Expr:AbstractLevel6Expr ;
+//// Level5Expr:AbstractLevel5Expr ::= AbstractEquivOperand* ;
+//// AbstractEquivOperand:AbstractAbstractEquivOperand ::= EquivOperand:AbstractAbstractEquivOperand ;
 //// SimpleEquivOperand:AbstractEquivOperand ;
 //// EqEquivOperand:AbstractEquivOperand ;
 //// NeqEquivOperand:AbstractEquivOperand ;
@@ -4101,11 +4111,11 @@ EquivOp equiv_op =
 ;
 
 //// // R722
-//// Level6Expr ::= Level5Expr DefBinOpExpr* ;
-//// DefBinOpExpr ::= DefinedBinaryOp Level5Expr ;
+//// abstract AbstractLevel6Expr:Expr ;
+//// Level6Expr:AbstractLevel6Expr ::= Level5Expr:AbstractLevel5Expr DefBinOpExpr* ;
+//// DefBinOpExpr ::= DefinedBinaryOp Level5Expr:AbstractLevel5Expr ;
 //// // splitting Expr is necessary because of the inheritance in rules 724-731
 //// abstract Expr ;
-//// Level6ExprExpr:Expr ::= Level6Expr ;
 Level6Expr level_6_expr =
     e:level_5_expr r:level_6_expr_rest
         {
@@ -4142,10 +4152,7 @@ List<DefBinOpExpr> level_6_expr_rest =
 
 Expr expr =
 <BEGINNING>
-    e:level_6_expr
-        {
-            yyValue = new Level6ExprExpr(e);
-        }
+    yyValue:level_6_expr
 ;
 
 // // R723
@@ -7039,7 +7046,8 @@ PrefixSpec prefix_spec =
 ;
 
 //// // R1227
-//// FunctionSubprogram ::= FunctionStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndFunctionStmt ;
+//// abstract ProcedureSubprogram ;
+//// FunctionSubprogram:ProcedureSubprogram ::= FunctionStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndFunctionStmt ;
 FunctionSubprogram function_subprogram =
     f:function_stmt
     s:specification_part
@@ -7114,7 +7122,7 @@ EndFunctionStmt end_function_stmt =
 ;
 
 //// // R1233
-//// SubroutineSubprogram ::= SubroutineStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndSubroutineStmt ;
+//// SubroutineSubprogram:ProcedureSubprogram ::= SubroutineStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndSubroutineStmt ;
 SubroutineSubprogram subroutine_subprogram =
     f:subroutine_stmt
     s:specification_part
@@ -7178,7 +7186,7 @@ EndSubroutineStmt end_subroutine_stmt =
 ;
 
 //// // R1237
-//// SeparateModuleSubprogram ::= [MpSubprogramStmt] [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndMpSubprogramStmt ;
+//// SeparateModuleSubprogram:ProcedureSubprogram ::= [MpSubprogramStmt] [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndMpSubprogramStmt ;
 SeparateModuleSubprogram separate_module_subprogram =
     p:mp_subprogram_stmt s:specification_part e:execution_part? i:internal_subprogram_part? x:end_mp_subprogram_stmt
         {
diff --git a/Parser/spec/Printing.jadd b/Parser/spec/Printing.jadd
index 6c05dcd68a40762a9b9efa1990f3b9cbe34311d1..d28ebe2503f52d15817a947b6b90759600c54e31 100644
--- a/Parser/spec/Printing.jadd
+++ b/Parser/spec/Printing.jadd
@@ -2382,7 +2382,7 @@ class PrettyPrint {
     // R710
     public void Level3Expr.prettyPrint(PrettyPrinter s) {
         boolean first = true;
-        for (Level2Expr o : getLevel2ExprList()) {
+        for (AbstractLevel2Expr o : getLevel2ExprList()) {
             if (first) {
                 first = false;
             } else {
@@ -2471,7 +2471,7 @@ class PrettyPrint {
     // R715
     public void OrOperand.prettyPrint(PrettyPrinter s) {
         boolean first = true;
-        for (AndOperand o : getAndOperandList()) {
+        for (AbstractAndOperand o : getAndOperandList()) {
             if (first) {
                 first = false;
             } else {
@@ -2549,9 +2549,6 @@ class PrettyPrint {
         getDefinedBinaryOp().prettyPrint(s);
         getLevel5Expr().prettyPrint(s);
     }
-    public void Level6ExprExpr.prettyPrint(PrettyPrinter s) {
-        getLevel6Expr().prettyPrint(s);
-    }
 
     // R723
     // DefinedBinaryOp:DefinedOperator ::= <String> ;
diff --git a/Parser/spec/SimpleExpr.ast b/Parser/spec/SimpleExpr.ast
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Parser/spec/Types.jrag b/Parser/spec/Types.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..ab95a14a4d001aa747bc659b32784350622050e8
--- /dev/null
+++ b/Parser/spec/Types.jrag
@@ -0,0 +1,220 @@
+aspect Types {
+
+
+
+  // ===============================================================================================
+  // DECLARATIONS
+  // ===============================================================================================
+
+  syn ASTNode Name.declaration();
+  eq Name.declaration() {
+    java.util.Set<ASTNode> decls = enclosingScope().localDeclarations();
+    for(ASTNode decl : decls) {
+      java.util.Set<Name> names = decl.declaredSimpleNames();
+      for (Name name : names) {
+        if (name.getString().equals(this.getString())) {
+          return decl;
+        }
+      }
+    }
+    return null;
+  }
+
+  // ===============================================================================================
+  // LOCAL DECLARATIONS
+  // ===============================================================================================
+
+  // collection attribute to collect all declarations in the local scope
+  coll java.util.Set<ASTNode> ASTNode.localDeclarations() [new java.util.HashSet<ASTNode>()] with add;
+
+  // everything that is a declared MUST have a name. Of course, the actual name of a thing can be
+  // a complex one (cf. DataRef), but the simple on has to and can be specified in a simple way.
+  syn java.util.Set<Name> ASTNode.declaredSimpleNames();
+  eq ASTNode.declaredSimpleNames() {
+    return java.util.Collections.emptySet();
+  }
+
+  // handle all declaration constructs (R207)
+
+  DerivedTypeDef contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq DerivedTypeDef.declaredSimpleNames() {
+    return java.util.Collections.singleton(getDerivedTypeStmt().getTypeName());
+  }
+
+  EntryStmt contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq EntryStmt.declaredSimpleNames() {
+    return java.util.Collections.singleton(getName());
+  }
+
+  // TODO implement EnumDef
+  // EnumDef contributes this
+  //   to ASTNode.localDeclarations()
+  //   for enclosingScope();
+
+  // FormatStmt is not necessary, because it declares nothing. however, it can be referenced with a
+  // label.
+
+  // not sure how to handle an InterfaceBlock. Currently, all interface bodies are used as
+  // declarations
+  InterfaceBody contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq FunctionInterfaceBody.declaredSimpleNames() {
+    return java.util.Collections.singleton(getFunctionStmt().getName());
+  }
+  eq SubroutineInterfaceBody.declaredSimpleNames() {
+    return java.util.Collections.singleton(getSubroutineStmt().getName());
+  }
+  ProcedureInterfaceSpecification contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq ProcedureInterfaceSpecification.declaredSimpleNames() {
+    java.util.Set<Name> names = new java.util.HashSet<Name>();
+    for (Name name : getProcedureStmt().getNameList()) {
+      names.add(name);
+    }
+    return names;
+  }
+
+  ParameterStmt contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq ParameterStmt.declaredSimpleNames() {
+    java.util.Set<Name> names = new java.util.HashSet<Name>();
+    for (NamedConstantDef def : getNamedConstantDefList()) {
+      names.add(def.getNamedConstant().getName());
+    }
+    return names;
+  }
+
+  ProcedureDeclarationStmt contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq ProcedureDeclarationStmt.declaredSimpleNames() {
+    java.util.Set<Name> names = new java.util.HashSet<Name>();
+    for (ProcDecl decl : getProcDeclList()) {
+      names.add(decl.getName());
+    }
+    return names;
+  }
+
+  // for the OtherSpecificationStmts, see below
+
+  TypeDeclarationStmt contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq TypeDeclarationStmt.declaredSimpleNames() {
+    java.util.Set<Name> names = new java.util.HashSet<Name>();
+    for (EntityDecl decl : getEntityDeclList()) {
+      names.add(decl.getObjectName().getName());
+    }
+    return names;
+  }
+
+  // TODO implement StmtFunctionStmt
+
+  // handle OtherSpecificationStmt (R212)
+
+  // TODO handle OtherSpecificationStmt (R212). These Stmts are not really declarations, I think
+
+  // handle subprograms
+  SubroutineSubprogram contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq SubroutineSubprogram.declaredSimpleNames() {
+    return java.util.Collections.singleton(getSubroutineStmt().getName());
+  }
+
+  FunctionSubprogram contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq FunctionSubprogram.declaredSimpleNames() {
+    return java.util.Collections.singleton(getFunctionStmt().getName());
+  }
+
+  SeparateModuleSubprogram contributes this
+    to ASTNode.localDeclarations()
+    for enclosingScope();
+  eq SeparateModuleSubprogram.declaredSimpleNames() {
+    if (hasMpSubprogramStmt()) {
+      return java.util.Collections.singleton(getMpSubprogramStmt().getName());
+    } else {
+      return java.util.Collections.emptySet();
+    }
+  }
+
+  // TODO think of other things with names
+
+  // ===============================================================================================
+  // SCOPING
+  // ===============================================================================================
+
+  inh ASTNode ASTNode.enclosingScope();
+
+  syn ASTNode Root.enclosingScope() = null;
+
+  // first, the unncessary ones
+  eq Program.getProgramUnit(int i).enclosingScope() {
+    return null; //throw new RuntimeException("Could not find enclosing scope!");
+  }
+  eq Root.getProgram().enclosingScope() {
+    return null; //throw new RuntimeException("Could not find enclosing scope!");
+  }
+  eq Root.getPreamble(int i).enclosingScope() {
+    return null; //throw new RuntimeException("Could not find enclosing scope!");
+  }
+
+  eq SubroutineSubprogram.getSubroutineStmt().enclosingScope() = this;
+  eq SubroutineSubprogram.getSpecificationPart().enclosingScope() = this;
+  eq SubroutineSubprogram.getExecutionPart().enclosingScope() = this;
+  eq SubroutineSubprogram.getInternalSubprogramPart().enclosingScope() = this;
+  eq SubroutineSubprogram.getEndSubroutineStmt().enclosingScope() = this;
+
+  eq FunctionSubprogram.getFunctionStmt().enclosingScope() = this;
+  eq FunctionSubprogram.getSpecificationPart().enclosingScope() = this;
+  eq FunctionSubprogram.getExecutionPart().enclosingScope() = this;
+  eq FunctionSubprogram.getInternalSubprogramPart().enclosingScope() = this;
+  eq FunctionSubprogram.getEndFunctionStmt().enclosingScope() = this;
+
+  eq SeparateModuleSubprogram.getMpSubprogramStmt().enclosingScope() = this;
+  eq SeparateModuleSubprogram.getSpecificationPart().enclosingScope() = this;
+  eq SeparateModuleSubprogram.getExecutionPart().enclosingScope() = this;
+  eq SeparateModuleSubprogram.getInternalSubprogramPart().enclosingScope() = this;
+  eq SeparateModuleSubprogram.getEndMpSubprogramStmt().enclosingScope() = this;
+
+  eq BlockConstruct.getBlockStmt().enclosingScope() = this;
+  eq BlockConstruct.getSpecificationPart().enclosingScope() = this;
+  eq BlockConstruct.getBlock().enclosingScope() = this;
+  eq BlockConstruct.getEndBlockStmt().enclosingScope() = this;
+
+  eq MainProgram.getProgramStmt().enclosingScope() = this;
+  eq MainProgram.getSpecificationPart().enclosingScope() = this;
+  eq MainProgram.getExecutionPart().enclosingScope() = this;
+  eq MainProgram.getInternalSubprogramPart().enclosingScope() = this;
+  eq MainProgram.getEndProgramStmt().enclosingScope() = this;
+
+  eq Module.getModuleStmt().enclosingScope() = this;
+  eq Module.getSpecificationPart().enclosingScope() = this;
+  eq Module.getModuleSubprogramPart().enclosingScope() = this;
+  eq Module.getEndModuleStmt().enclosingScope() = this;
+
+  // questionable interface stuff
+  eq FunctionInterfaceBody.getFunctionStmt().enclosingScope() = this;
+  eq FunctionInterfaceBody.getSpecificationPart().enclosingScope() = this;
+  eq FunctionInterfaceBody.getEndFunctionStmt().enclosingScope() = this;
+
+  eq SubroutineInterfaceBody.getSubroutineStmt().enclosingScope() = this;
+  eq SubroutineInterfaceBody.getSpecificationPart().enclosingScope() = this;
+  eq SubroutineInterfaceBody.getEndSubroutineStmt().enclosingScope() = this;
+
+  // COMMON block bullshit
+  eq BlockData.getBlockDataStmt().enclosingScope() = this;
+  eq BlockData.getSpecificationPart().enclosingScope() = this;
+  eq BlockData.getEndBlockDataStmt().enclosingScope() = this;
+
+  // TODO do not forget the COMMON block
+}
\ No newline at end of file
diff --git a/Parser/src/org/tud/forty/DrFort.java b/Parser/src/org/tud/forty/DrFort.java
index 835854bcc12487a88584557e93104913922e7e13..9c255ce43b25ad35435f837e66bf83d4835056e8 100644
--- a/Parser/src/org/tud/forty/DrFort.java
+++ b/Parser/src/org/tud/forty/DrFort.java
@@ -29,6 +29,7 @@ public class DrFort {
                 Result r = parser.proot(0);
 
                 if (r.hasValue()) {
+                    ((org.tud.forty.ast.ASTNode)(r.semanticValue())).fixTreeStructure();
                     drast.views.gui.DrASTGUI debugger = new drast.views.gui.DrASTGUI(r.semanticValue());
                     debugger.run();
                 } else {
diff --git a/Parser/test-data/rewrites/B_Designator_OR_FunctionReference.f90 b/Parser/test-data/rewrites/B_Designator_OR_FunctionReference.f90
new file mode 100644
index 0000000000000000000000000000000000000000..43d0adf938688d4d7f1f5abe4ede60056233a495
--- /dev/null
+++ b/Parser/test-data/rewrites/B_Designator_OR_FunctionReference.f90
@@ -0,0 +1,3 @@
+real :: a(10)
+a(2) = a(1)
+end