diff --git a/build.sbt b/build.sbt
index ae62066d319f9339ab556f2b0c5e9f2c4a76ed44..debe606bae3468688b9662c6932d5b116928ff50 100644
--- a/build.sbt
+++ b/build.sbt
@@ -9,6 +9,8 @@ val gsonVersion = "2.8.5"
 
 val modelmanagementprovider = ProjectRef(uri("https://git-st.inf.tu-dresden.de/cwerner/role_model_management_provider.git#master"), "modelmanagementprovider")
 val uiProvider = ProjectRef(uri("https://git-st.inf.tu-dresden.de/cwerner/role_ui_provider.git#master"), "uiprovider")
+val modeljoin = ProjectRef(uri("https://git-st.inf.tu-dresden.de/cwerner/model_join.git"), "model_join")
+
 
 javacOptions ++= Seq("-encoding", "UTF-8")
 
@@ -52,6 +54,7 @@ lazy val generator = (project in file("."))
         oldStrategy(x)
     },
   ).dependsOn(
+    modeljoin,
     modelmanagementprovider,
     uiProvider
   )
diff --git a/lib/modeljoin.jar b/lib/modeljoin.jar
deleted file mode 100644
index f8f8f1c984bdb976963788009f4efb26734c4e40..0000000000000000000000000000000000000000
Binary files a/lib/modeljoin.jar and /dev/null differ
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala b/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala
index 34deddbeeb653dd9cca21460ed752bd94ca91f24..56189e3190bce3a4a2fd9c744e3fff1e8c69debe 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala
@@ -81,6 +81,8 @@ class Generator(config: GeneratorConfig) {
           }
           else
           {
+            //add ref methods
+            new SModelCombiRefMethodService prepareModel (sm._1)
             //remove references
             new SModelSUMRemoveRefService prepareModel (sm._1)
           }
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala b/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala
index abcd564426912f437e3bdb022225dcd0a16e372f..681ed98699eb040a9ee54995ed4e157c85fc167a 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala
@@ -1,8 +1,5 @@
 package org.rosi_project.model_sync.generator
 
-import org.rosi_project.model_sync.provider.DisplayableModel
-import org.rosi_project.model_sync.provider.ModelSyncProvider
-
 /** Representation of a model configuration (i.e. a number of corresponding models). It tells the
   * generator how the model looks like, which types are needed, etc.
   *
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiRefMethodService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiRefMethodService.scala
new file mode 100644
index 0000000000000000000000000000000000000000..1e1e9d9c98d352de643d9e094d783c4d94236e8c
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiRefMethodService.scala
@@ -0,0 +1,25 @@
+package org.rosi_project.model_sync.generator
+
+import org.rosi_project.model_sync.generator.acr_model.SModel
+import org.rosi_project.model_sync.generator.sync.ReferenceMethodCreationVisitor
+
+/**
+ * Add a method to get all references in the RSUM case.
+ *  Sync functions necessary because we need compartment functions in the naturals.
+ *
+ * @author Christopher Werner
+ */
+class SModelCombiRefMethodService {
+
+  /**
+   * Remove reference from model classes.
+   *
+   * @param sModel the model to augment
+   */
+  def prepareModel(sModel: SModel): Unit = {
+    val refMethodVisitor = new ReferenceMethodCreationVisitor
+
+    //order is important !!!!    
+    sModel.accept(refMethodVisitor)
+  }
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala
index c37d1df3cde8ae63007e17a6216c3937a9a7f848..5a3b9f745bd5b0b1adaa79934ac9d8989e6e264a 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala
@@ -7,6 +7,7 @@ import org.rosi_project.model_management.sum.IViewTypeInfo
 import org.rosi_project.model_management.sum.query._
 import org.rosi_project.model_management.sum.join._
 import org.rosi_project.model_management.sum.compartments._
+import org.rosi_project.model_management.sum.roles.IRelationRole
 
 object PredefRsumTypes {
 
@@ -44,6 +45,9 @@ object PredefRsumTypes {
   val         AQUERY_VIEW_ROLE_STYPE = SType(AQUERY_VIEW_ROLE_CLASS.getSimpleName) //, AQUERY_VIEW_ROLE_CLASS.getPackage.getName) 
 
   //RELATIONAL COMPARTMENT TYPES
+  private val IRELATIONROLE_CLASS = classOf[IRelationRole]
+  val         IRELATIONROLE_STYPE = SType(IRELATIONROLE_CLASS.getSimpleName, IRELATIONROLE_CLASS.getPackage.getName)
+  
   private val IAGGREGTATION_CLASS = classOf[IAggregation]
   val         IAGGREGTATION_STYPE = SType(IAGGREGTATION_CLASS.getSimpleName, IAGGREGTATION_CLASS.getPackage.getName)
   
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/ReferenceMethodCreationVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/ReferenceMethodCreationVisitor.scala
new file mode 100644
index 0000000000000000000000000000000000000000..e3ef7b31f16abe2fe6dc2688db98b3326b1edad1
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/ReferenceMethodCreationVisitor.scala
@@ -0,0 +1,86 @@
+package org.rosi_project.model_sync.generator.sync
+
+import org.rosi_project.model_sync.generator.acr_model._
+
+class ReferenceMethodCreationVisitor extends SModelVisitor {
+
+  override def visit(sModel: SModel): Unit = {
+    sModel.getRelationalCompartments.foreach(cls => {
+      val relComp = cls.asInstanceOf[SRelationalCompartmentClass]
+      //iterate over all relational compartments
+      val methodSrc = new SMethod(
+        name = relComp.connectedRef.getName,
+        result = relComp.connectedRef.getTypeElement,
+        params = Seq.empty,
+        implementation = Seq.empty)
+      var implSrc: Seq[SMethodStatement] = Seq.empty
+      implSrc :+ SMethodStatement(content = s"var result: ${relComp.connectedRef.getTypeElement} = Set.empty")
+      implSrc :+ SMethodStatement(content = s"""this.roles.filter(r => r.isInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}] && 
+        r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.isInstanceOf[${relComp.getName}])
+        .foreach(r => {
+          list += r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.getTargetIns.asInstanceOf[${relComp.tClass.getName}]
+        })""")
+      implSrc :+ SMethodStatement(content = "result")
+      methodSrc.implementation = implSrc
+      relComp.sClass.asInstanceOf[SClass].addMethod(methodSrc)
+      //proof opposite reference
+      if (relComp.connectedRef.hasOpposite) {
+        val methodTrg = new SMethod(
+          name = relComp.connectedRef.oppositeRef.getName,
+          result = relComp.connectedRef.oppositeRef.getTypeElement,
+          params = Seq.empty,
+          implementation = Seq.empty)
+        var implTrg: Seq[SMethodStatement] = Seq.empty
+        implTrg :+ SMethodStatement(content = s"var result: ${relComp.connectedRef.oppositeRef.getTypeElement} = Set.empty")
+        implTrg :+ SMethodStatement(content = s"""this.roles.filter(r => r.isInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}] && 
+          r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.isInstanceOf[${relComp.getName}])
+          .foreach(r => {
+            list += r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.getSourceIns.asInstanceOf[${relComp.sClass.getName}]
+          })""")
+        implTrg :+ SMethodStatement(content = "result")
+        methodTrg.implementation = implTrg
+        relComp.tClass.asInstanceOf[SClass].addMethod(methodTrg)
+      }
+    })
+    sModel.getModelClasses.foreach(cls => {
+      //iterate over all references and add new method to class
+      cls.getReferences().foreach(ref => {
+        val method = new SMethod(
+          name = ref.getName,
+          result = ref.getTypeElement,
+          params = Seq.empty,
+          implementation = Seq.empty)
+        var impl: Seq[SMethodStatement] = Seq.empty
+        impl :+ SMethodStatement(content = s"var result: ${ref.getTypeElement} = Set.empty")
+        impl :+ SMethodStatement(content = s"""this.roles.filter(r => r.isInstanceOf[IRelationRole] && 
+        r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.isInstanceOf[VideoCassetteCastPerson])
+        .foreach(r => {
+          list += r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.getTargetIns.asInstanceOf[Person]
+        })""")
+        impl :+ SMethodStatement(content = "result")
+        method.implementation = impl
+        cls.addMethod(method)
+      })
+    })
+  }
+
+  override def visit(sClass: SClass): Unit = {
+    // pass
+  }
+
+  override def visit(sAttr: SAttribute): Unit = {
+    // pass
+  }
+
+  override def visit(sMethod: SMethod): Unit = {
+    // pass
+  }
+
+  override def visit(sType: SType): Unit = {
+    // pass
+  }
+
+  override def visit(sRef: SReference): Unit = {
+    // pass
+  }
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala
index a2c5a44de066da26435ae2b5fad7aad5cf543696..ebe73fd71a945e24bf51ebaef9bd4f1c1d39a8f6 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala
@@ -8,9 +8,9 @@ import org.rosi_project.model_sync.generator.Creation
 object ApplicationTest extends App {
       
   //runTestLibrary(Creation.rolesum)
-  //runCombinedTest(Creation.rolesum)
+  runCombinedTest(Creation.rolecomb)
   //runShrinkingModel(Creation.rolesum)
-  runTestAML(Creation.rolesum)
+  //runTestAML(Creation.rolesum)
   
   //TTC Case examples
   //runTTC2019(Creation.rolecomb)
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala b/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala
index d3d0045bd30c86db93cf60e6ce9991d828919d99..8bac75486976290118f70ad768883b3ab1ad2aa4 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala
@@ -3,12 +3,6 @@ package org.rosi_project.model_sync.generator.ui
 import org.rosi_project.model_sync.generator.acr_model.SType
 import org.rosi_project.model_sync.provider._
 import org.rosi_project.model_sync.instances._
-import org.rosi_project.model_sync.instances.ModelInstanceConstructor
-import org.rosi_project.model_sync.instances.ModelInstanceModifier
-import org.rosi_project.model_sync.provider.DisplayableModel
-import org.rosi_project.model_sync.provider.DisplayableModelForInitialization
-import org.rosi_project.model_sync.provider.DisplayableModelForIntegration
-import org.rosi_project.model_sync.provider.ModelSyncProvider
 
 object PredefUiTypes {
   
@@ -23,7 +17,7 @@ object PredefUiTypes {
   private val DISPLAYABLE_MODEL_FOR_INTEGRATION_CLASS = classOf[DisplayableModelForIntegration]
   val         DISPLAYABLE_MODEL_FOR_INTEGRATION_STYPE = SType(DISPLAYABLE_MODEL_FOR_INTEGRATION_CLASS.getSimpleName, DISPLAYABLE_MODEL_FOR_INTEGRATION_CLASS.getPackage.getName)
   
-  private val MODEL_SYNC_PROVIDER_CLASS = classOf[ModelSyncProvider]
+  private val MODEL_SYNC_PROVIDER_CLASS = classOf[SyncProvider]
   val         MODEL_SYNC_PROVIDER_STYPE = SType(MODEL_SYNC_PROVIDER_CLASS.getSimpleName, MODEL_SYNC_PROVIDER_CLASS.getPackage.getName)
   
   private val MODEL_REGISTRY_CLASS = ModelRegistry.getClass