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 56189e3190bce3a4a2fd9c744e3fff1e8c69debe..a2184b044860ac0ce2a0ca7823e788c2b7b40d26 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
@@ -75,6 +75,9 @@ class Generator(config: GeneratorConfig) {
           new SModelSUMCorePreparationService prepareModel (sm._1)
           //add sync stuff
           new SModelOnlySyncService prepareModel (sm._1)
+          //create the EMF Ecore reading models
+          new SModelSUMReadEMFService prepareModel (sm._1)
+          
           //instance generation for combi means rsum
           if (sm._2.obj != null) {
             new SModelCombiInstanceService prepareModel(sm._1, sm._2)
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala
index d174073777ccb2f7fc03e02aa7117133ab31bf10..96b9467e7d7cd779ea967ae48c42f64ee0e2214d 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala
@@ -4,7 +4,7 @@ object PackageNames {
   
   val multiInhertitanceWithTraits = false
   
-  val sourcePkgPrefix: String = ""
+  val sourcePkgPrefix: String = "sum."
   
   val viewPkgName: String = "view"
   val viewPostName: String = "View"
@@ -19,4 +19,6 @@ object PackageNames {
   
   val examplePkgName: String = "example"
   
+  val creationPkgName: String = "creation"
+  
 }
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMReadEMFService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMReadEMFService.scala
new file mode 100644
index 0000000000000000000000000000000000000000..ca6f6a800787e120b3dfdf00f1702c58a2c53882
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMReadEMFService.scala
@@ -0,0 +1,20 @@
+package org.rosi_project.model_sync.generator
+
+import org.rosi_project.model_sync.generator.sync.SumModelReadingVisitor
+import org.rosi_project.model_sync.generator.acr_model.SModel
+
+/** Simple service to create the new emf ecore model instances.
+  *
+  * @author Christopher Werner
+  */
+class SModelSUMReadEMFService {
+  
+  /** Add classes to read emf and ecore models.
+    *
+    * @param sModel the model to augment
+    */
+  def prepareModel(sModel: SModel): Unit = {
+    val sumModelReadingVisitor = new SumModelReadingVisitor
+    sModel.accept(sumModelReadingVisitor)    
+  }
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala
index d9c0e0d875ae5c41b5002712d32b68e7d21d7c95..88f4c2acd8ba80b38579ed0e54d4684f9b1b8f4d 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala
@@ -4,6 +4,7 @@ import org.rosi_project.model_sync.generator.acr_model._
 import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression
 import org.rosi_project.model_management.sum.join.RsumJoinType
 import org.rosi_project.model_sync.model_join.representation.grammar.JoinExpression.JoinType
+import org.rosi_project.model_sync.model_join.representation.grammar.ThetaJoinExpression
 
 class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelVisitor {
 
@@ -21,7 +22,7 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV
       val baseType: Option[STypedElement] = STypeRegistry.query(j.getBaseModel().getResourceName, j.getBaseModel().getResourcePath)
       val otherType: Option[STypedElement] = STypeRegistry.query(j.getOtherModel().getResourceName, j.getOtherModel().getResourcePath)
       var targetType: Option[STypedElement] = STypeRegistry.query(j.getTarget().getResourceName, j.getTarget().getResourcePath)
-
+      
       println("B: " + baseType + " O: " + otherType + " T: " + targetType + " Same: " + j.isSameElement)
       
       if (j.isSameElement || baseType.isEmpty || otherType.isEmpty || !targetType.isEmpty) {
@@ -30,12 +31,16 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV
 
       val baseClass = baseType.get.asInstanceOf[SClass]
       val otherClass = otherType.get.asInstanceOf[SClass]
+      
       var rsumJoinType = RsumJoinType.natural
+      var compareString: String = null 
       
       j.getType match {
         case JoinType.NATURAL => rsumJoinType = RsumJoinType.natural
         case JoinType.OUTER => rsumJoinType = RsumJoinType.outer
-        case JoinType.THETA => rsumJoinType = RsumJoinType.theta
+        case JoinType.THETA => 
+          rsumJoinType = RsumJoinType.theta
+          compareString = j.asInstanceOf[ThetaJoinExpression].getCondition.get
       }
       
       var otherAttsBase: Set[SStructuralFeature] = Set.empty
@@ -86,7 +91,7 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV
       joinObject.addMethod(JoinMethods.getInstanceOtherModelMethod(otherClass))
       joinObject.addMethod(JoinMethods.getNewInstanceMethod(joinClass))
       joinObject.addMethod(JoinMethods.getInstanceOfMethod(joinClass))
-      joinObject.addMethod(JoinMethods.getMatchMethod(baseClass, otherClass, joinAtts)) //TODO: for theta join
+      joinObject.addMethod(JoinMethods.getMatchMethod(baseClass, otherClass, joinAtts, compareString))
       joinObject.addMethod(ToStringMethods.onlyStringToStringMethod(joinObject.getName))
       
       //add functions to the join class
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala
index ae184409362b0b9c265d3d3898fcc962d58247b1..335b5b3e9e001d16227442c17fb385bb994e0dda 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala
@@ -6,7 +6,7 @@ import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes
 import org.rosi_project.model_sync.generator.support.ExtendedString.stringToExtended
 
 object JoinMethods {
-  
+
   //JOIN OBJECT METHODS
   def getJoinTypeMethod(joinType: JoinType): SMethod = {
     val met = new SMethod(
@@ -25,63 +25,66 @@ object JoinMethods {
     }
     met
   }
-  
+
   def getInstanceBaseModelMethod(cls: SClass): SMethod = {
     new SMethod(
       name = "isInstanceBaseModel",
       result = PredefTypes.Boolean,
       params = Seq(SMethodParameter("obj", PredefTypes.Object)),
-      implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls))))    
+      implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls))))
   }
-  
+
   def getInstanceOtherModelMethod(cls: SClass): SMethod = {
     new SMethod(
       name = "isInstanceOtherModel",
       result = PredefTypes.Boolean,
       params = Seq(SMethodParameter("obj", PredefTypes.Object)),
-      implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls))))    
+      implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls))))
   }
-  
+
   def getInstanceOfMethod(cls: SClass): SMethod = {
     new SMethod(
       name = "isInstanceOf",
       result = PredefTypes.Boolean,
       params = Seq(SMethodParameter("obj", PredefTypes.Object)),
-      implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls))))    
+      implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls))))
   }
-  
+
   def getNewInstanceMethod(cls: SClass): SMethod = {
     new SMethod(
       name = "getNewInstance",
       result = PredefRsumTypes.IJOIN_COMPARTMENT_STYPE,
       params = Seq(SMethodParameter("b", PredefTypes.Object), SMethodParameter("o", PredefTypes.Object)),
       implementation = Seq(SMethodStatement(content = s"val j = new ${cls.getName}(null, null)", usedTypes = Set(cls)),
-          SMethodStatement(content = "objectInitialize(j, b, o)", usedTypes = Set()),
-          SMethodStatement(content = "j", usedTypes = Set())))    
+        SMethodStatement(content = "objectInitialize(j, b, o)", usedTypes = Set()),
+        SMethodStatement(content = "j", usedTypes = Set())))
   }
-  
-  def getMatchMethod(base: SClass, other: SClass, joinAtts: Set[SStructuralFeature]): SMethod = {
+
+  def getMatchMethod(base: SClass, other: SClass, joinAtts: Set[SStructuralFeature], joinString: String): SMethod = {
     val met = new SMethod(
       name = "matchTwoObjects",
       result = PredefTypes.Boolean,
       params = Seq(SMethodParameter("b", PredefTypes.Object), SMethodParameter("o", PredefTypes.Object)),
       implementation = Seq())
     met.implementation = Seq(SMethodStatement(content = s"val base = b.asInstanceOf[${base.getName}]", usedTypes = Set(base)),
-        SMethodStatement(content = s"val other = o.asInstanceOf[${other.getName}]", usedTypes = Set(other)),
-        SMethodStatement(content = s"${joinAtts.map(HelperFunctions.attributeEqualCreation(_)).mkString(" && ")}", usedTypes = Set()))
+      SMethodStatement(content = s"val other = o.asInstanceOf[${other.getName}]", usedTypes = Set(other)))
+    if (joinString == null) {
+      met.implementation = met.implementation :+ SMethodStatement(content = s"${joinAtts.map(HelperFunctions.attributeEqualCreation(_)).mkString(" && ")}")
+    } else {
+      met.implementation = met.implementation :+ SMethodStatement(content = joinString)
+    }
     met
-  } 
-  
-  
+  }
+
   //JOIN CLASS METHODS
   def getJoinInfoMethod(obj: SClass): SMethod = {
     new SMethod(
       name = "getJoinInfo",
       result = PredefRsumTypes.JOIN_INFO_STYPE,
       params = Seq.empty,
-      implementation = Seq(SMethodStatement(content = s"${obj.getName}", usedTypes = Set(obj))))    
+      implementation = Seq(SMethodStatement(content = s"${obj.getName}", usedTypes = Set(obj))))
   }
-  
+
   //GETTER
   def getBaseAttributeGetter(struc: SStructuralFeature): SMethod = {
     new SMethod(
@@ -90,18 +93,18 @@ object JoinMethods {
       params = Seq.empty,
       implementation = Seq(SMethodStatement(content = s"+baseRole get${struc.getName.firstLetterToUpperCase}()", usedTypes = Set(struc.getTypeElement))))
   }
-  
+
   def getOtherAttributeGetter(struc: SStructuralFeature): SMethod = {
     new SMethod(
       name = s"get${struc.getName.firstLetterToUpperCase}",
       result = struc.getTypeElement,
       params = Seq.empty,
       implementation = Seq(SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()),
-          SMethodStatement(content = s"return +otherRole get${struc.getName.firstLetterToUpperCase}()", usedTypes = Set(struc.getTypeElement)),
-          SMethodStatement(content = "}", usedTypes = Set()),
-          SMethodStatement(content = s"return ${HelperFunctions.classEmptyType(struc.getTypeElement.getName)}", usedTypes = Set())))
+        SMethodStatement(content = s"return +otherRole get${struc.getName.firstLetterToUpperCase}()", usedTypes = Set(struc.getTypeElement)),
+        SMethodStatement(content = "}", usedTypes = Set()),
+        SMethodStatement(content = s"return ${HelperFunctions.classEmptyType(struc.getTypeElement.getName)}", usedTypes = Set())))
   }
-  
+
   //SETTER  
   def getBaseAttributeSetter(struc: SStructuralFeature): SMethod = {
     new SMethod(
@@ -110,25 +113,25 @@ object JoinMethods {
       params = Seq(SMethodParameter(struc.getName.toLowerCase(), struc.getTypeElement)),
       implementation = Seq(SMethodStatement(content = s"+baseRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement))))
   }
-  
+
   def getMixedAttributeSetter(struc: SStructuralFeature): SMethod = {
     new SMethod(
       name = s"set${struc.getName.firstLetterToUpperCase}View",
       result = PredefTypes.Unit,
       params = Seq(SMethodParameter(struc.getName.toLowerCase(), struc.getTypeElement)),
       implementation = Seq(SMethodStatement(content = s"+baseRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)),
-          SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()),
-          SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), 
-          SMethodStatement(content = "}", usedTypes = Set.empty)))
+        SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()),
+        SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)),
+        SMethodStatement(content = "}", usedTypes = Set.empty)))
   }
-  
+
   def getOtherAttributeSetter(struc: SStructuralFeature): SMethod = {
     new SMethod(
       name = s"set${struc.getName.firstLetterToUpperCase}View",
       result = PredefTypes.Unit,
       params = Seq(SMethodParameter(struc.getName.toLowerCase(), struc.getTypeElement)),
       implementation = Seq(SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()),
-          SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), 
-          SMethodStatement(content = "}", usedTypes = Set.empty)))
+        SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)),
+        SMethodStatement(content = "}", usedTypes = Set.empty)))
   }
 }
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala
index 560a1fe00dffb3e6620f0d8650a700db3e93fa20..4251a5fdbf145f2864f3d3591d7e774731775675 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala
@@ -18,7 +18,7 @@ object QueryMethods  {
             name = s"create${nr.sumSource.getName}",
             result = nr,
             params = Seq.empty,
-            implementation = Seq(SMethodStatement(content = s"return new ${nr.getName}()", usedTypes = Set.empty)))
+            implementation = Seq(SMethodStatement(content = s"return new ${nr.getName}()")))
         methods = methods :+ method
       }
     })
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala
new file mode 100644
index 0000000000000000000000000000000000000000..9e9822c9da268296f219c47b2082bab8cae73648
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala
@@ -0,0 +1,113 @@
+package org.rosi_project.model_sync.generator.sync
+
+import org.rosi_project.model_sync.generator.acr_model._
+import org.rosi_project.model_sync.generator.PackageNames
+import org.rosi_project.model_sync.generator.acr_model.types.PredefEcoreTypes
+import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes
+
+/**
+ * Read EMF and Ecore models.
+ * 
+ * @author Christopher Werner
+ */
+class SumModelReadingVisitor() extends SModelVisitor {
+
+  override def visit(sModel: SModel): Unit = {
+    //println("++++++++++++++++++++++++++++++++++++++++++++++")
+    val example = new SClass("Creation" + sModel.getName, PackageNames.creationPkgName)
+    example.augmentConstructor(SMethodStatement(content = s"var mapping: Map[EObject, Object] = Map.empty", usedTypes = Set(PredefEcoreTypes.EcoreObject)))
+    
+    sModel.getAllClasses.filter(c => !c.isAbstract && !c.isInterface).foreach(c => {
+      
+      val metod = new SMethod(
+        name = s"create${c.getName}",
+        result = PredefTypes.Unit,
+        params = c.getAllConstructorParameters :+ SMethodParameter("id", PredefEcoreTypes.EcoreObject),
+        implementation = Seq(
+            SMethodStatement(content = s"mapping += (id -> new ${c.getName}(name, Set.empty, Set.empty, null))", usedTypes = Set.empty)))
+    })
+    
+    sModel.getRelationalCompartments.foreach(r => {
+      var rc = r.asInstanceOf[SRelationalCompartmentClass]
+      val metod = new SMethod(
+        name = s"create${r.getName}",
+        result = PredefTypes.Unit,
+        params = Seq(SMethodParameter("s", PredefEcoreTypes.EcoreObject), SMethodParameter("t", PredefEcoreTypes.EcoreObject)),
+        implementation = Seq(
+            SMethodStatement(content = s"val s1 = mapping.get(s).get.asInstanceOf[${rc.sClass.getName}]"),
+            SMethodStatement(content = s"val t1 = mapping.get(t).get.asInstanceOf[${rc.tClass.getName}]"),
+            SMethodStatement(content = s"(new ${rc.getName}(s1, t1)).initialize()")))
+    })
+         
+    //add values for instances    
+    /*lines.foreach(l => {
+      l.usedType.getAllConstructorParameters.foreach(cp => {
+        if (!STypeRegistry.isDefaultType(cp.getType.getName)) {
+          val structs: Seq[EStructuralFeature] = l.obj.eClass().getEAllStructuralFeatures.asScala
+          structs.foreach(att => {
+            if (att.getName == cp.getName) {
+              val obj = l.obj.eGet(att)
+              if (obj.isInstanceOf[EObject]) {
+                lines.foreach(lnow => {
+                  if (lnow.obj == obj.asInstanceOf[EObject]) {
+                    //println("Found: " + lnow.counter) .filter(_.isInstanceOf[SRelationalCompartmentClass])
+                    sModel.getRelationalCompartments.foreach(rc => {
+                      val realRc = rc.asInstanceOf[SRelationalCompartmentClass]
+                      //println(" AN: " + att.getName + " l1: " + l.usedType.getName + " l2: " + lnow.usedType.getName + " RC: " + realRc.connectedRef.getName + " SN: " + realRc.sClass.getName + " TN: " + realRc.tClass.getName)
+                      if (realRc.connectedRef.getName == att.getName && l.usedType.proofHierarchicalEquality(realRc.sClass) && lnow.usedType.proofHierarchicalEquality(realRc.tClass)) {
+                        val s = s"(new ${realRc.getName}(${l.getName()}, ${lnow.getName()})).initialize()"
+                        generationLines = generationLines :+ new InstanceLine(0, null, realRc, s)
+                      }
+                    })
+                  }
+                })
+              } else {
+                val listi: List[EObject] = EMFUtilForGenerator.getList(obj)
+                val liste = listi.asScala
+                liste.foreach(eo => {
+                  lines.foreach(lnow => {
+                    if (lnow.obj == eo) {
+                      sModel.getRelationalCompartments.foreach(rc => {
+                        val realRc = rc.asInstanceOf[SRelationalCompartmentClass]
+                        //println(" AN: " + att.getName + " l1: " + l.usedType.getName + " l2: " + lnow.usedType.getName + " RC: " + realRc.connectedRef.getName + " SN: " + realRc.sClass.getName + " TN: " + realRc.tClass.getName)
+                        if (realRc.connectedRef.getName == att.getName && l.usedType.proofHierarchicalEquality(realRc.sClass) && lnow.usedType.proofHierarchicalEquality(realRc.tClass)) {
+                          val s = s"(new ${realRc.getName}(${l.getName()}, ${lnow.getName()})).initialize()"
+                          generationLines = generationLines :+ new InstanceLine(0, null, realRc, s)
+                        }
+                      })
+                    }
+                  })
+                })
+              }
+            }
+          })
+        }
+      })
+    })*/
+    
+    sModel.addModelClass(example)
+    // pass
+
+  }
+
+  override def visit(sClass: SClass): Unit = {
+    // pass
+  }
+
+  override def visit(sAttr: SAttribute): Unit = {
+    // pass
+  }
+
+  override def visit(sRef: SReference): Unit = {
+    // pass
+  }
+
+  override def visit(sMethod: SMethod): Unit = {
+    // pass
+  }
+
+  override def visit(sType: SType): 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 ebe73fd71a945e24bf51ebaef9bd4f1c1d39a8f6..ebabed59bf3321ddfbae841d97536b36a773dd36 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,13 +8,13 @@ import org.rosi_project.model_sync.generator.Creation
 object ApplicationTest extends App {
       
   //runTestLibrary(Creation.rolesum)
-  runCombinedTest(Creation.rolecomb)
+  //runCombinedTest(Creation.rolecomb)
   //runShrinkingModel(Creation.rolesum)
   //runTestAML(Creation.rolesum)
   
   //TTC Case examples
   //runTTC2019(Creation.rolecomb)
-  //runTTC2019(Creation.rolesync)  
+  runTTC2019(Creation.rolesync)  
   //runTTCLive2019(Creation.rolesync)
 
   //Run all tests