diff --git a/libs/RoleRag-0.2.0.jar b/libs/RoleRag-0.2.0.jar
index 9b3d8ed209be404da82b804f00ffb27608f02d54..17844fcd2eaa13c43797d2b703e63b4702ddd94f 100644
Binary files a/libs/RoleRag-0.2.0.jar and b/libs/RoleRag-0.2.0.jar differ
diff --git a/statemachine.solution/build.gradle b/statemachine.solution/build.gradle
index 4fb46120bd6bdc2271d6b377df225f6797e98a4c..09083c152829d2ca1d539a4d76cfa8d7ac34dce4 100644
--- a/statemachine.solution/build.gradle
+++ b/statemachine.solution/build.gradle
@@ -24,7 +24,7 @@ sourceSets.main.java.srcDir genSrc
 
 jar {
     from { sourceSets.main.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
-    manifest.attributes('Main-Class': 'de.tudresden.inf.st.statemachine.BankMain')
+    manifest.attributes('Main-Class': 'de.tudresden.inf.st.bank.BankMain')
 }
 
 dependencies {
@@ -38,7 +38,7 @@ dependencies {
 
 // Default run configuration
 run {
-    mainClassName = 'de.tudresden.inf.st.statemachine.BankMain'
+    mainClassName = 'de.tudresden.inf.st.bank.BankMain'
 }
 
 // Generated files
@@ -144,7 +144,7 @@ jastadd {
 
     module = "bank"
 
-    astPackage = 'de.tudresden.inf.st.statemachine.jastadd.model'
+    astPackage = 'de.tudresden.inf.st.bank.jastadd.model'
 
     parser.name = 'BankParser'
 
@@ -152,8 +152,8 @@ jastadd {
 
     buildInfoDir = 'src/gen-res'
 
-    scanner.genDir = "src/gen/java/de/tudresden/inf/st/statemachine/jastadd/scanner"
-    parser.genDir = "src/gen/java/de/tudresden/inf/st/statemachine/jastadd/parser"
+    scanner.genDir = "src/gen/java/de/tudresden/inf/st/bank/jastadd/scanner"
+    parser.genDir = "src/gen/java/de/tudresden/inf/st/bank/jastadd/parser"
 
 //  default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
     extraJastAddOptions = ['--List=JastAddList', '--incremental=param']
diff --git a/statemachine.solution/src/main/jastadd/AttributeTransfer.jadd b/statemachine.solution/src/main/jastadd/AttributeTransfer.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..d9a2b7c0aa19dce7429fde9aeb2c9412a14558fe
--- /dev/null
+++ b/statemachine.solution/src/main/jastadd/AttributeTransfer.jadd
@@ -0,0 +1,85 @@
+aspect AttributeTransfer {
+
+  public NaturalType NaturalType.plays(RoleType rt) {
+    // check for fulfillment
+
+    // add roletype to roles
+    this.getRolesList().insertChild(rt, 0);
+
+    // transfer attributes
+    boolean attributeExists;
+    int attributeIndex;
+    for (Attribute rtAttribute : rt.getAttributeList()) {
+      attributeExists = false;
+      attributeIndex = 0;
+      for (Attribute ntAttribute : this.getAttributeList()) {
+        if (ntAttribute.getName() == rtAttribute.getName()) {
+          attributeExists = true;
+          this.getAttributeList().removeChild(attributeIndex);
+          this.getAttributeList().insertChild(rtAttribute, 0);
+          break;
+        }
+        attributeIndex++;
+      }
+      if (!attributeExists) this.getAttributeList().insertChild(rtAttribute, 0);
+    }
+
+    return this;
+  }
+
+  public NaturalType NaturalType.unplays(String rtString) {
+    // find removeRt and rtIndex
+    RoleType removeRt = new RoleType();
+    int removeRtIndex = -1;
+    int rtCounter = 0;
+    for (RoleType r : this.getRolesList()) {
+      if (r.getName() == rtString) {
+        removeRtIndex = rtCounter;
+        removeRt = r;
+      }
+      rtCounter++;
+    }
+    if (removeRtIndex == -1) return null; //rt not found
+
+    // remove rt
+    this.getRolesList().removeChild(removeRtIndex);
+
+    // roll back attributes
+    Attribute newestAttribute;
+    int attrIndex = 0;
+    for (Attribute attrRemoveRt : removeRt.getAttributeList()) {
+      // find newest attribute
+      newestAttribute = null;
+      for (RoleType r : this.getRolesList()) {
+        for (Attribute a : r.getAttributeList()) {
+          if (a.getName() == attrRemoveRt.getName()) {
+            newestAttribute = a;
+          }
+        }
+      }
+      // look for NaturalTypes original Attributes
+      if (newestAttribute == null) {
+        for (Attribute originalAttr : this.getOriginalAttributesList()) {
+          if (originalAttr.getName() == attrRemoveRt.getName()) {
+            newestAttribute = originalAttr;
+          }
+        }
+      }
+      // insert newestAttribute into AttributeList
+      for (Attribute attr : getAttributeList()) {
+        if (attr.getName() == attrRemoveRt.getName()) {
+          this.getAttributeList().removeChild(attrIndex);
+          attrIndex++;
+          if (newestAttribute != null) {
+            this.getAttributeList().insertChild(newestAttribute, 0);
+          }
+        }
+      }
+    }
+
+
+
+    return this;
+  }
+
+}
\ No newline at end of file
diff --git a/statemachine.solution/src/main/jastadd/BankParser.parser b/statemachine.solution/src/main/jastadd/BankParser.parser
index ae992c62d8e948ef539224905df5a2ca9bdd3baf..3184682261f3749a5193329cacf637ff9750d308 100644
--- a/statemachine.solution/src/main/jastadd/BankParser.parser
+++ b/statemachine.solution/src/main/jastadd/BankParser.parser
@@ -1,7 +1,7 @@
 %header {:
 // this code is inlined before the generated parser
-package de.tudresden.inf.st.statemachine.jastadd.parser;
-import de.tudresden.inf.st.statemachine.jastadd.model.*;
+package de.tudresden.inf.st.bank.jastadd.parser;
+import de.tudresden.inf.st.bank.jastadd.model.*;
 import java.util.*;
 :};
 // Documentation links: http://beaver.sourceforge.net/spec.html and https://bitbucket.org/jastadd/jastaddparser
@@ -16,11 +16,39 @@ import java.util.*;
 
 // Productions with semantic actions building the JastAdd AST
 
-bank goal =
-  NAME.name
+rolerag goal =
+  naturaltype_list //roletype_list fulfillment_list
     {:
-      Bank result = new Bank();
+      //RoleRag result = new RoleRag(naturaltype_list, roletype_list, fulfillment_list);
+      RoleRag result = new RoleRag();
+      result.treeResolveAll();
+      return result;
+    :}
+  ;
+
+JastAddList naturaltype_list =
+    naturaltype                      {: return new JastAddList().add(naturaltype); :}
+  | naturaltype_list naturaltype     {: return naturaltype_list.add(naturaltype); :}
+  ;
+
+//JastAddList roletype_list =
+//    roletype                   {: return new JastAddList().add(roletype); :}
+//  | roletype_list roletype     {: return roletype_list.add(roletype); :}
+//  ;
+
+//JastAddList fulfillment_list =
+//    fulfillment                      {: return new JastAddList().add(fulfillment); :}
+//  | fulfillment_list fulfillment     {: return fulfillment_list.add(fulfillment); :}
+//  ;
+
+NaturalType naturaltype =
+  NATURALTYPE NAME.name //ASSIGN attribute_list.a
+    {:
+      NaturalType result = new NaturalType();
       result.setName(name);
+      //result.setAttributeList(a);
+      //result.setOriginalAttributesList(a);
+      //result.setRolesList(new JastAddList());
       return result;
     :}
   ;
diff --git a/statemachine.solution/src/main/jastadd/BankScanner.flex b/statemachine.solution/src/main/jastadd/BankScanner.flex
index dcf37d2e0bf7be11f047e87b722c31e6fe3a0e25..953f8bfe47526147c84a8238c9002c5e04579c60 100644
--- a/statemachine.solution/src/main/jastadd/BankScanner.flex
+++ b/statemachine.solution/src/main/jastadd/BankScanner.flex
@@ -1,6 +1,6 @@
-package de.tudresden.inf.st.statemachine.jastadd.scanner;
+package de.tudresden.inf.st.bank.jastadd.scanner;
 
-import de.tudresden.inf.st.statemachine.jastadd.parser.BankParser.Terminals; // The terminals are implicitly defined in the parser
+import de.tudresden.inf.st.bank.jastadd.parser.BankParser.Terminals; // The terminals are implicitly defined in the parser
 %%
 // Documentation links: https://www.jflex.de/manual.html and http://beaver.sourceforge.net/scanners.html
 
@@ -35,5 +35,9 @@ Identifier = [:jletter:][:jletterdigit:]*
 {WhiteSpace}  { }
 
 // token definitions
+"naturaltype" { return sym(Terminals.NATURALTYPE); }
+//"roletype"    { return sym(Terminals.ROLETYPE); }
+//"fulfillment" { return sym(Terminals.FULFILLMENT); }
 {Identifier}  { return sym(Terminals.NAME); }
+//"::="         { return sym(Terminals.ASSIGN); }
 <<EOF>>       { return sym(Terminals.EOF); }
diff --git a/statemachine.solution/src/main/jastadd/DumpTree.jrag b/statemachine.solution/src/main/jastadd/DumpTree.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..4dd3985dc725e1f901499589ed1d471ca7ffa0ac
--- /dev/null
+++ b/statemachine.solution/src/main/jastadd/DumpTree.jrag
@@ -0,0 +1,53 @@
+aspect DumpTree {
+  private static final String ASTNode.DUMP_TREE_INDENT = "  ";
+
+  public String ASTNode.dumpTree() {
+    java.io.ByteArrayOutputStream bytes = new java.io.ByteArrayOutputStream();
+    dumpTree(new java.io.PrintStream(bytes));
+    return bytes.toString();
+  }
+
+  public void ASTNode.dumpTree(java.io.PrintStream out) {
+    dumpTree(out, "");
+    out.flush();
+  }
+
+  public void ASTNode.dumpTree(java.io.PrintStream out, String indent) {
+    out.print(indent + getClass().getSimpleName());
+    out.print(getTokens());
+    String extra = extraDumpInfo();
+    if (!extra.isEmpty()) {
+      out.print(" " + extra);
+    }
+    out.println();
+    String childIndent = indent + DUMP_TREE_INDENT;
+    for (ASTNode<?> child : astChildren()) {
+      if (child == null) {
+        out.println(childIndent + "null");
+      } else {
+        child.dumpTree(out, childIndent);
+      }
+    }
+  }
+
+  public String ASTNode.extraDumpInfo() { return ""; }
+
+  public String ASTNode.getTokens() {
+    java.util.TreeSet<java.lang.reflect.Method> methods = new java.util.TreeSet<>(java.util.Comparator.comparing(java.lang.reflect.Method::getName));
+
+    methods.addAll(java.util.Arrays.asList(getClass().getMethods()));
+
+    StringBuilder result = new StringBuilder();
+    for (java.lang.reflect.Method method : methods) {
+      ASTNodeAnnotation.Token token = method.getAnnotation(ASTNodeAnnotation.Token.class);
+      if (token != null) {
+        try {
+          result.append(String.format(" %s=\"%s\"", token.name(), method.invoke(this)));
+        } catch (IllegalAccessException  ignored) {
+        } catch (java.lang.reflect.InvocationTargetException ignored) {
+        }
+      }
+    }
+    return result.toString();
+  }
+}
diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/BankMain.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/BankMain.java
new file mode 100644
index 0000000000000000000000000000000000000000..163537e8ad5bd9240e9042d7164f6c18d5de301a
--- /dev/null
+++ b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/BankMain.java
@@ -0,0 +1,83 @@
+package de.tudresden.inf.st.bank;
+
+import beaver.Parser;
+//import de.tudresden.inf.st.statemachine.jastadd.model.State;
+//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine;
+//import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
+import de.tudresden.inf.st.bank.jastadd.model.Attribute;
+import de.tudresden.inf.st.bank.jastadd.model.Customer;
+import de.tudresden.inf.st.bank.jastadd.model.Person;
+import de.tudresden.inf.st.bank.jastadd.model.Consultant;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+public class BankMain {
+
+  @SuppressWarnings("WeakerAccess")
+  public static Object DrAST_root_node;
+
+  public static void main(String[] args) throws IOException, Parser.Exception {
+    //Bank bank;
+    if (args.length == 0) {
+      //bank = createExample();
+      createExample();
+    } else {
+      // load the file given as first argument
+      //bank = ParserUtils.load(Paths.get(args[0]));
+    }
+
+    //System.out.println("Bankname: " + bank.getName() + " " + bank.getName2());
+  }
+
+  private static void createExample() {
+    Person Peter = new Person();
+    Peter.setName("Peter");
+    Consultant Con = new Consultant();
+    Con.setName("Con");
+    Customer Cu = new Customer();
+    Cu.setName("Cu");
+
+    Attribute phoneNumber1 = new Attribute();
+    phoneNumber1.setName("PhoneNumber");
+    phoneNumber1.setValue("123");
+    Attribute phoneNumber2 = new Attribute();
+    phoneNumber2.setName("PhoneNumber");
+    phoneNumber2.setValue("234");
+    Attribute phoneNumber3 = new Attribute();
+    phoneNumber3.setName("PhoneNumber");
+    phoneNumber3.setValue("345");
+
+    Attribute addresse2 = new Attribute();
+    addresse2.setName("addresse");
+    addresse2.setValue("bcd");
+
+    Peter.addAttribute(phoneNumber1);
+    Peter.addOriginalAttributes(phoneNumber1);
+    Con.addAttribute(phoneNumber2);
+    Cu.addAttribute(phoneNumber3);
+    Con.addAttribute(addresse2);
+
+    //output
+    //System.out.println(Peter.getChild(0).getChild(0).dumpTree());
+    System.out.println(Peter.dumpTree());
+
+    Peter.plays(Con);
+    System.out.println("Peter plays Con \n");
+    System.out.println(Peter.dumpTree());
+
+    Peter.plays(Cu);
+    System.out.println("Peter plays Cu \n");
+    System.out.println(Peter.dumpTree());
+
+    Peter.unplays("Con");
+    System.out.println("Peter unplays Con \n");
+    System.out.println(Peter.dumpTree());
+
+    Peter.unplays("Cu");
+    System.out.println("Peter unplays Cu \n");
+    System.out.println(Peter.dumpTree());
+
+  }
+
+}
diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/ParserUtils.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/ParserUtils.java
similarity index 53%
rename from statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/ParserUtils.java
rename to statemachine.solution/src/main/java/de/tudresden/inf/st/bank/ParserUtils.java
index f06cf1feb0aeed7fb8d857f55713bd17e1a67845..d3a42d35b55ad3449a06bf56a9c9c625c30674d8 100644
--- a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/ParserUtils.java
+++ b/statemachine.solution/src/main/java/de/tudresden/inf/st/bank/ParserUtils.java
@@ -1,9 +1,10 @@
-package de.tudresden.inf.st.statemachine;
+package de.tudresden.inf.st.bank;
 
 import beaver.Parser;
-import de.tudresden.inf.st.statemachine.jastadd.model.Bank;
-import de.tudresden.inf.st.statemachine.jastadd.parser.BankParser;
-import de.tudresden.inf.st.statemachine.jastadd.scanner.BankScanner;
+//import de.tudresden.inf.st.bank.jastadd.model.Bank;
+import de.tudresden.inf.st.bank.jastadd.model.RoleRag;
+import de.tudresden.inf.st.bank.jastadd.parser.BankParser;
+import de.tudresden.inf.st.bank.jastadd.scanner.BankScanner;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -16,11 +17,11 @@ import java.nio.file.Path;
  * @author rschoene - Initial contribution
  */
 public class ParserUtils {
-  static Bank load(Path path) throws IOException, Parser.Exception {
+  static RoleRag load(Path path) throws IOException, Parser.Exception {
     Reader reader = Files.newBufferedReader(path);
     BankScanner scanner = new BankScanner(reader);
     BankParser parser = new BankParser();
-    Bank result = (Bank) parser.parse(scanner);
+    RoleRag result = (RoleRag) parser.parse(scanner);
     reader.close();
     return result;
   }
diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java
deleted file mode 100644
index d6e16f8202012549f8544e5fd3d9b20ee1a13fe0..0000000000000000000000000000000000000000
--- a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package de.tudresden.inf.st.statemachine;
-
-import beaver.Parser;
-import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
-//import de.tudresden.inf.st.statemachine.jastadd.model.State;
-//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine;
-//import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
-import de.tudresden.inf.st.statemachine.jastadd.model.Bank;
-
-import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.Set;
-
-public class BankMain {
-
-  @SuppressWarnings("WeakerAccess")
-  public static Object DrAST_root_node;
-
-  public static void main(String[] args) throws IOException, Parser.Exception {
-    Bank bank;
-    if (args.length == 0) {
-      bank = createExample();
-    } else {
-      // load the file given as first argument
-      bank = ParserUtils.load(Paths.get(args[0]));
-    }
-
-    System.out.println("Bankname: " + bank.getName());
-  }
-
-  private static Bank createExample() {
-    // manual construction of a simple statemachine
-    // (S) -- e --> (B) -- 1 --> (E)
-    //  ^            |
-    //  \            /
-    //  `---- 2 ----*
-    Bank b = new Bank();
-    b.setName("Peters Bank");
-
-    return b;
-  }
-
-}
diff --git a/statemachine.solution/src/main/resources/Bank.relast b/statemachine.solution/src/main/resources/Bank.relast
index 7446e71dcdada607ed03681bcb8e803755a54e2b..c96b21fd79058a29a17ef2a6f82cdd22892232b8 100644
--- a/statemachine.solution/src/main/resources/Bank.relast
+++ b/statemachine.solution/src/main/resources/Bank.relast
@@ -1 +1,16 @@
-Bank ::= <Name>;
+RoleRag ::= NaturalType* RoleType* Fulfillment*;
+Attribute ::= <Name> <Value>;
+RoleType ::= <Name> Attribute*;
+NaturalType ::= <Name> Attribute* OriginalAttributes:Attribute* Roles:RoleType*;
+Fulfillment;
+
+Person : NaturalType;
+Consultant : RoleType;
+Customer : RoleType;
+
+PersonFillsConsultant : Fulfillment ::= Filler:Person Filled:Consultant;
+//PersonFillsConsultant;
+//rel PersonFillsConsultant.Filler -> Person;
+//rel PersonFillsConsultant.Filled -> Consultant;
+
+PersonFillsCustomer : Fulfillment ::= Filler:Person Filled:Customer;
diff --git a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java
index 28969a58d1e39f2864510089ac6d86928f394ee1..8d8b782c345ec823a6f75d87d6f9536d60978d8d 100644
--- a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java
+++ b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/AnalysisTest.java
@@ -1,9 +1,10 @@
 package de.tudresden.inf.st.statemachine;
 
 import beaver.Parser;
-import de.tudresden.inf.st.statemachine.jastadd.model.State;
-import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine;
-import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
+import de.tudresden.inf.st.bank.ParserUtils;
+//import de.tudresden.inf.st.statemachine.jastadd.model.State;
+//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine;
+//import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -18,7 +19,7 @@ import static org.junit.Assert.assertEquals;
  * @author rschoene - Initial contribution
  */
 public class AnalysisTest {
-
+/*
   @Test
   public void test1() throws IOException, Parser.Exception {
     StateMachine stateMachine = ParserUtils.load(Paths.get("src", "test", "resources", "machine_one.sm"));
@@ -112,5 +113,5 @@ public class AnalysisTest {
       System.out.println("initial state "+ stateMachine.getInitial() + " to " + finalState + " in " +
           stateMachine.getInitial().minDistTo(finalState) + " step(s)");
     }
-  }
+  }*/
 }
diff --git a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java
index 16a6344661f21f81096f4223186bd6bf51877663..cac0cc6ba5d0e48e88037683c7ffcdaa8370b68d 100644
--- a/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java
+++ b/statemachine.solution/src/test/java/de/tudresden/inf/st/statemachine/ParserTest.java
@@ -1,9 +1,10 @@
 package de.tudresden.inf.st.statemachine;
 
 import beaver.Parser;
-import de.tudresden.inf.st.statemachine.jastadd.model.State;
-import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine;
-import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
+import de.tudresden.inf.st.bank.ParserUtils;
+//import de.tudresden.inf.st.statemachine.jastadd.model.State;
+//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine;
+//import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -21,7 +22,7 @@ import static org.junit.Assert.*;
  * @author rschoene - Initial contribution
  */
 public class ParserTest {
-
+/*
   @Test
   public void test1() throws IOException, Parser.Exception {
     StateMachine stateMachine = ParserUtils.load(Paths.get("src", "test", "resources", "machine_one.sm"));
@@ -81,5 +82,5 @@ public class ParserTest {
   private List<State> outgoingConnectedStates(State s) {
     return s.getOutgoingList().stream().map(Transition::getTo).collect(Collectors.toList());
   }
-
+*/
 }