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 a2184b044860ac0ce2a0ca7823e788c2b7b40d26..9067dc95e5bc8700ab365bdc1b2cda0471783c64 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
@@ -48,7 +48,7 @@ class Generator(config: GeneratorConfig) {
       })
 
       //create the new classes for rsum and rsync
-      if (config.getCreate == Creation.rolesync) {
+      if (config.create == Creation.rolesync) {
         sModels.foreach(sm => {
           //instance generation for rsync
           if (sm._2.obj != null) {
@@ -59,7 +59,7 @@ class Generator(config: GeneratorConfig) {
           new SModelSyncUiPreparationService prepareModel (sm._1, config.getModelConfigFromEcore(sm._1.getSourceName))          
         })
       }
-      if (config.getCreate == Creation.rolesum) {
+      if (config.create == Creation.rolesum) {
         sModels.foreach(sm => {
           //create core stuff
           new SModelSUMCorePreparationService prepareModel (sm._1)
@@ -69,7 +69,7 @@ class Generator(config: GeneratorConfig) {
           new SModelSUMPreparationService prepareModel (sm._1)
         })
       }
-      if (config.getCreate == Creation.rolecomb) {
+      if (config.create == Creation.rolecomb) {
         sModels.foreach(sm => {
           //create core stuff
           new SModelSUMCorePreparationService prepareModel (sm._1)
@@ -106,7 +106,7 @@ class Generator(config: GeneratorConfig) {
         }
       })
 
-      if (config.getCreate != Creation.rolesync) {
+      if (config.create != Creation.rolesync) {
         //create join stuff
         val modelJoinFile = config.getModelJoinFile
         if (modelJoinFile != null && modelJoinFile.exists()) {
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/GeneratorConfig.scala b/src/main/scala/org/rosi_project/model_sync/generator/GeneratorConfig.scala
index 375a37e5ce374d6be2ca0fe722675b0ae87fce7d..3a21bea23333ace6a4d033e7c7b4c7a291f02e92 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/GeneratorConfig.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/GeneratorConfig.scala
@@ -13,15 +13,8 @@ case class GeneratorConfig(sources: Seq[String] = Seq(),
     outDir: File = new File(System.getProperty("user.dir")), 
     workDir: File = null,
     modelJoin: String = null, //can be more than one
-    syncLanguage: String = null) { //can be more than one
-
-  private var create = Creation.rolesync
-  
-  def setCreate(d: Creation.Value): Unit = {
-    create = d
-  }
-  
-  def getCreate: Creation.Value = create;
+    syncLanguage: String = null, //can be more than one
+    create: Creation.Value = Creation.rolesync) {
   
   def hasWorkDir: Boolean = workDir != null
   
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/ComplexSModel.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/ComplexSModel.scala
index 5b7bb51b584ba1e68c7b28fafe03bee83d87779d..442b904cc1b67a5b1951d8db6bab0906f265e683 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/ComplexSModel.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/ComplexSModel.scala
@@ -14,7 +14,6 @@ class ComplexSModel(name: String, sourceName: String, nsUri: String) extends SMo
   private var relationalCompartments: Set[SClass] = Set.empty
   private var viewCompartments: Set[SClass] = Set.empty
   private var joinClasses: Set[SClass] = Set.empty
-  private var joinObjects: Set[SClass] = Set.empty
   private var sEnums: Set[SEnum] = Set.empty
 
   /** Provides all model classes in `this` model. */
@@ -32,9 +31,6 @@ class ComplexSModel(name: String, sourceName: String, nsUri: String) extends SMo
   /** Provides all the classes in `this` model. */
   override def getAllClasses: Set[SClass] = modelClasses ++ providerClasses ++ relationalCompartments ++ viewCompartments
 
-  /** Provides all join objects in `this` model. */
-  override def getJoinObjects: Set[SClass] = joinObjects
-
   /** Provides all join classes in `this` model. */
   override def getJoinClasses: Set[SClass] = joinClasses
 
@@ -91,16 +87,6 @@ class ComplexSModel(name: String, sourceName: String, nsUri: String) extends SMo
     joinClasses += mClass
   }
 
-  /**
-   * Extends the model by a new join object.
-   *
-   * @param mClass the class to add. May never `null`.
-   */
-  override def addJoinObject(mClass: SClass): Unit = {
-    Assert.notNull(mClass, "Class may not be null")
-    joinObjects += mClass
-  }
-
   /**
    * Extends the model by a new enum.
    *
@@ -126,7 +112,6 @@ class ComplexSModel(name: String, sourceName: String, nsUri: String) extends SMo
         relationalCompartments == that.relationalCompartments &&
         viewCompartments == that.viewCompartments &&
         joinClasses == that.joinClasses &&
-        joinObjects == that.joinObjects &&
         sEnums == that.sEnums
     case _ => false
   }
@@ -137,7 +122,6 @@ class ComplexSModel(name: String, sourceName: String, nsUri: String) extends SMo
     relationalCompartments = relationalCompartments ++ model.getRelationalCompartments
     viewCompartments = viewCompartments ++ model.getViewCompartments
     joinClasses = joinClasses ++ model.getJoinClasses
-    joinObjects = joinObjects ++ model.getJoinObjects
     sEnums = sEnums ++ model.getModelEnums
     return this
   }
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala
index f6c872e406351fbe7932d722ee71efc6c7ff8784..6d72049eb945dae34de2160f15900234ea868ce4 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala
@@ -15,8 +15,7 @@ import org.rosi_project.model_sync.generator.sync.ToStringMethods
  */
 class SClass(_name: String,
              _sPackage: String = "",
-             val isAbstract: Boolean = false,
-             _isInterface: Boolean = false) extends STypedElement(_name, _sPackage, _isInterface) {
+             _sClassType: SClassType.Value = SClassType.normalClass) extends STypedElement(_name, _sPackage, _sClassType) {
 
   protected var parentClass: STypedElement = null
   protected var parentInterfaces: Seq[STypedElement] = Seq.empty
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClassType.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClassType.scala
new file mode 100644
index 0000000000000000000000000000000000000000..50ad1d74a477abf4cd9106759470ce269141301a
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClassType.scala
@@ -0,0 +1,5 @@
+package org.rosi_project.model_sync.generator.acr_model
+
+object SClassType extends Enumeration {
+  val normalClass, caseClass, abstactClass, normalTrait, normalObject = Value
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SEnum.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SEnum.scala
index ad1a398c2bc2782d742d2f2498c37f8602d9812f..a0f6271b6a30005d3e23ee878d1120bf79891e7b 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SEnum.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SEnum.scala
@@ -1,6 +1,6 @@
 package org.rosi_project.model_sync.generator.acr_model
 
-class SEnum (_name: String, _sPackage: String, val enums: Set[String]) extends STypedElement(_name, _sPackage, false) {
+class SEnum (_name: String, _sPackage: String, val enums: Set[String]) extends STypedElement(_name, _sPackage, SClassType.normalClass) {
     
   override def getDeepName: String = _name + ".Value"
   
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerClass.scala
index 899b42ac8e343f090d43f85d68339b900dace822..a9433f70e8a196db8ea96f576aac2dcf3e2eebe0 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerClass.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerClass.scala
@@ -4,9 +4,8 @@ import java.util.Objects
 
 class SInnerClass(_name: String,
              _sPackage: String = "",
-             _isAbstract: Boolean = false,
-             _isInterface: Boolean = false,
-             val externalClass: SClass) extends SClass(_name, _sPackage, _isAbstract, _isInterface) {
+             _sClassType: SClassType.Value = SClassType.normalClass,
+             val externalClass: SClass) extends SClass(_name, _sPackage, _sClassType) {
   
   Objects.requireNonNull(externalClass, "External class may not be null")
   
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewNaturalClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewNaturalClass.scala
index 1093d9988b0c97f14c8e57ce6198b0838f41078f..38fe319e6469452bec98b0b22d6773f8062eadbc 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewNaturalClass.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewNaturalClass.scala
@@ -4,10 +4,9 @@ import java.util.Objects
 
 class SInnerViewNaturalClass(_name: String,
              _sPackage: String = "",
-             _isAbstract: Boolean = false,
-             _isInterface: Boolean = false,
+             _sClassType: SClassType.Value = SClassType.normalClass,
              _externalClass: SClass,
-             val sumSource: SClass) extends SInnerClass(_name, _sPackage, _isAbstract, _isInterface, _externalClass) {
+             val sumSource: SClass) extends SInnerClass(_name, _sPackage, _sClassType, _externalClass) {
   
   Objects.requireNonNull(sumSource, "SUM Source class may not be null")
   
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewRelationalClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewRelationalClass.scala
index eb966274561fb9e128f2f203b3e186f419256671..97feb240a538d46c4b06bc042838070aee814b1d 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewRelationalClass.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SInnerViewRelationalClass.scala
@@ -4,12 +4,11 @@ import java.util.Objects
 
 class SInnerViewRelationalClass(_name: String,
              _sPackage: String = "",
-             _isAbstract: Boolean = false,
-             _isInterface: Boolean = false,
+             _sClassType: SClassType.Value = SClassType.normalClass,
              _externalClass: SClass,
              val sumSource: SRelationalCompartmentClass,
              val viewSource: SInnerViewNaturalClass,
-             val viewTarget: SInnerViewNaturalClass) extends SInnerClass(_name, _sPackage, _isAbstract, _isInterface, _externalClass) {
+             val viewTarget: SInnerViewNaturalClass) extends SInnerClass(_name, _sPackage, _sClassType, _externalClass) {
   
   Objects.requireNonNull(sumSource, "SUM Source class may not be null")
   Objects.requireNonNull(viewSource, "View Source class may not be null")
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SModel.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SModel.scala
index f014f0c2580c424a3e0d6de49b15dabc8a32cd19..7412f6eb5b6d8072c7c697a4e0187bb1c04c4f5e 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SModel.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SModel.scala
@@ -22,6 +22,9 @@ abstract class SModel(private val name: String, private val sourceName: String,
   /** Provides all model classes in `this` model. */
   def getModelClasses: Set[SClass]
   
+  /** Provides all model enums in `this` model. */
+  def getModelEnums: Set[SEnum]
+  
   /** Provides all provider classes in `this` model. */
   def getProviderClasses: Set[SClass]
   
@@ -31,14 +34,10 @@ abstract class SModel(private val name: String, private val sourceName: String,
   /** Provides all view compartments in `this` model. */
   def getViewCompartments: Set[SClass]
   
-  /** Provides all join objects in `this` model. */
-  def getJoinObjects: Set[SClass]
-  
   /** Provides all join classes in `this` model. */
   def getJoinClasses: Set[SClass]
   
-  /** Provides all model enums in `this` model. */
-  def getModelEnums: Set[SEnum]
+  
   
   /** Extends the model by a new provder class.
     *
@@ -70,12 +69,6 @@ abstract class SModel(private val name: String, private val sourceName: String,
     */
   def addJoinClass(mClass: SClass): Unit
   
-  /** Extends the model by a new join object.
-    *
-    * @param mClass the class to add. May never `null`.
-    */
-  def addJoinObject(mClass: SClass): Unit
-  
   /** Extends the model by a new enum.
     *
     * @param mEnum the enum to add. May never `null`.
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SRelationalCompartmentClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SRelationalCompartmentClass.scala
index c08527fa359025695793f61e33db86f2c7f57bb2..2a311e6667394ce8b1ad6413dd0917abd625df69 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SRelationalCompartmentClass.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SRelationalCompartmentClass.scala
@@ -4,11 +4,10 @@ import java.util.Objects
 
 class SRelationalCompartmentClass(_name: String,
              _sPackage: String = "",
-             _isAbstract: Boolean = false,
-             _isInterface: Boolean = false,
+             _sClassType: SClassType.Value = SClassType.normalClass,
              val connectedRef: SReference,
              val sClass: STypedElement,
-             val tClass: STypedElement) extends SClass(_name, _sPackage, _isAbstract, _isInterface) {
+             val tClass: STypedElement) extends SClass(_name, _sPackage, _sClassType) {
   
   Objects.requireNonNull(connectedRef, "Connected Reference may not be null")
 }
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SType.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SType.scala
index 350ec3743d89c8582c2e11b7c460aae3e31192a8..ad0470e4e58497855daab94bd119517addf58f58 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SType.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SType.scala
@@ -11,7 +11,7 @@ package org.rosi_project.model_sync.generator.acr_model
   * @see [[SClass]]
   * @author Rico Bergmann
   */
-case class SType(_name: String, _sPackage: String = "", _isInterface: Boolean = true) extends STypedElement (_name, _sPackage, _isInterface) {
+case class SType(_name: String, _sPackage: String = "", _sClassType: SClassType.Value = SClassType.normalTrait) extends STypedElement (_name, _sPackage, _sClassType) {
 
   override def accept(visitor: SModelVisitor): Unit = visitor.visit(this)
   
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala
index b57f9e3fc76d145ffacd569510b83e863e7ccc1c..0579ff7b2c1bc36bbd79bc8ecf2bc9c99e9f49a9 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala
@@ -12,7 +12,7 @@ package org.rosi_project.model_sync.generator.acr_model
   */
 abstract class STypedElement (_name: String,
              val sPackage: String,
-             val isInterface: Boolean) extends SNamedModelElement(_name) {
+             val sClassType: SClassType.Value) extends SNamedModelElement(_name) {
   
   /** Checks, whether `this` is part of the default package */
   def isDefaultPackage: Boolean = sPackage == ""
@@ -44,6 +44,16 @@ abstract class STypedElement (_name: String,
     */
   def getNecessaryImports: Set[SImport] = Set.empty
   
+  def isInterface: Boolean = sClassType == SClassType.normalTrait
+  
+  def isAbstract: Boolean = sClassType == SClassType.abstactClass
+  
+  def isObject: Boolean = sClassType == SClassType.normalObject
+  
+  def isCaseClass: Boolean = sClassType == SClassType.caseClass
+  
+  def isNormalClass: Boolean = sClassType == SClassType.normalClass
+  
   override def toString: String = s"STE: $getName($sPackage, $isInterface)"
 
 }
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SimpleSModel.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SimpleSModel.scala
index d27217e72bd0ebd03b441b1d90a6e344c774f7ea..c5ac6720b057b4d23be47ffe451d94beb4522977 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SimpleSModel.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SimpleSModel.scala
@@ -26,9 +26,6 @@ class SimpleSModel(name: String, sourceName: String, nsUri: String) extends SMod
   /** Provides all view compartments in `this` model. */
   override def getViewCompartments: Set[SClass] = sClasses
   
-  /** Provides all join objects in `this` model. */
-  override def getJoinObjects: Set[SClass] = Set.empty
-  
   /** Provides all join classes in `this` model. */
   override def getJoinClasses: Set[SClass] = Set.empty
   
@@ -57,7 +54,7 @@ class SimpleSModel(name: String, sourceName: String, nsUri: String) extends SMod
     *
     * @param mEnum the enum to add. May never `null`.
     */
-  def addModelEnums(mEnum: SEnum): Unit = {
+  override def addModelEnums(mEnum: SEnum): Unit = {
     Assert.notNull(mEnum, "Enum may not be null")
     sEnums += mEnum
   }
@@ -84,13 +81,7 @@ class SimpleSModel(name: String, sourceName: String, nsUri: String) extends SMod
     *
     * @param mClass the class to add. May never `null`.
     */
-  def addJoinClass(mClass: SClass): Unit = {/*pass*/}
-  
-  /** Extends the model by a new join object.
-    *
-    * @param mClass the class to add. May never `null`.
-    */
-  def addJoinObject(mClass: SClass): Unit = {/*pass*/}
+  override def addJoinClass(mClass: SClass): Unit = {/*pass*/}
 
   override def accept(visitor: SModelVisitor): Unit = {
     sClasses.foreach(_.accept(visitor))
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala
index f059a89f957a34495ed9a18edda8342845cf82d4..34573306ef182f24140e1ed2e8fb9996eef3a613 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala
@@ -135,7 +135,14 @@ class SClassConverter extends Converter[EClass, SClass] {
       case sType =>
         sys.error(s"sType should have been a class: $sType")
     }.getOrElse {
-      val createdClass: SClass = new SClass(source.getName, PackageNames.sourcePkgPrefix + source.getEPackage.getNsPrefix, source.isAbstract, source.isInterface)
+      var sClassType = SClassType.normalClass
+      if (source.isAbstract) {
+        sClassType = SClassType.abstactClass
+      }
+      if (source.isInterface) {
+        sClassType = SClassType.normalTrait
+      }
+      val createdClass: SClass = new SClass(source.getName, PackageNames.sourcePkgPrefix + source.getEPackage.getNsPrefix, sClassType)
       createdClass.setAttributes(attrs)
       createdClass.setReferences(refs)
       pars.foreach(p => {
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala
index b2e108e5f7f7929dcba9aadf6ea02d51c8d9c240..76a4cfeb57da0728560e252ccfefc55c0baf68f7 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala
@@ -1,39 +1,43 @@
 package org.rosi_project.model_sync.generator.conversion
 
-import org.eclipse.emf.ecore.{EClass, EGenericType, EPackage}
-import org.rosi_project.model_sync.generator.acr_model.{SModel, SType, STypeRegistry, ComplexSModel}
+import org.eclipse.emf.ecore.{ EClass, EGenericType, EPackage }
+import org.rosi_project.model_sync.generator.acr_model.{ SModel, SType, STypeRegistry, ComplexSModel }
 
 import scala.collection.JavaConverters._
 import org.rosi_project.model_sync.generator.acr_model.SClass
 import org.eclipse.emf.ecore.EEnum
 import org.rosi_project.model_sync.generator.PackageNames
+import org.rosi_project.model_sync.generator.acr_model.SClassType
 
-/** Converter to generate an [[SModel]] from ecore.
-  *
-  * @author Rico Bergmann
-  */
+/**
+ * Converter to generate an [[SModel]] from ecore.
+ *
+ * @author Rico Bergmann
+ */
 class SModelGenerator extends Converter[EPackage, SModel] {
 
   override def convert(source: EPackage, sourceName: String): SModel = {
     //val packageName = if (source.getName != null) source.getName else ""
     var contents = source.eAllContents().asScala
     val model = new ComplexSModel(source.getName, sourceName, source.getNsURI)
-    
 
-    println("... Converting ecore model")    
+    println("... Converting ecore model")
     println("First run creates all classes, important for abstract and interface relations")
     contents.foreach {
       case ec: EClass =>
-        if (PackageNames.multiInhertitanceWithTraits) {
-          STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, ec.isInterface, ec.isAbstract), ec)
-        } else {
-          STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, ec.isAbstract, ec.isInterface), ec)
-        }        
+        var sClassType = SClassType.normalClass
+        if (ec.isAbstract) {
+          sClassType = SClassType.abstactClass
+        }
+        if (ec.isInterface || PackageNames.multiInhertitanceWithTraits) {
+          sClassType = SClassType.normalTrait
+        }
+        STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, sClassType), ec)
       case ee: EEnum =>
         model.addModelEnums(new SEnumConverter convert (ee, sourceName))
       case _ =>
-        // we only care about classes. Types will be registered as soon as they are needed as
-        // attributes
+      // we only care about classes. Types will be registered as soon as they are needed as
+      // attributes
     }
     contents = source.eAllContents().asScala
     println("Second run add references, attributes, and class hierarchies")
@@ -42,8 +46,8 @@ class SModelGenerator extends Converter[EPackage, SModel] {
         //println(ec)
         model.addModelClass(new SClassConverter convert (ec, sourceName))
       case _ =>
-        // we only care about classes. Types will be registered as soon as they are needed as
-        // attributes
+      // we only care about classes. Types will be registered as soon as they are needed as
+      // attributes
     }
     println("... Conversion finished")
     println(s"Generated model: $model")
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala
index 83e4317f43d8975107c6e49862b32e7a7e938022..b89a9df127a862d32f6c81302fb1c459724d2012 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala
@@ -12,7 +12,7 @@ import org.rosi_project.model_sync.generator.PackageNames
  *
  * @author Rico Bergmann
  */
-class SClassWriter(val modelClass: SClass, val isObject: Boolean) {
+class SClassWriter(val modelClass: SClass) {
 
   private val isView: Boolean = modelClass.isInstanceOf[SViewClass]
   private val pckg: String = if (modelClass.isDefaultPackage) "" else s"package ${modelClass.sPackage}"
@@ -126,7 +126,7 @@ class SClassWriter(val modelClass: SClass, val isObject: Boolean) {
   protected def generateInternalClazzFixture: String = {
     var result = "";
     modelClass.getInternalClasses.foreach(intCls => {
-      var sw: SClassWriter = new SClassWriter(intCls, false)
+      var sw: SClassWriter = new SClassWriter(intCls)
       var s = sw.internalStringify;
       result = result + s + "\n";
     })
@@ -191,7 +191,7 @@ class SClassWriter(val modelClass: SClass, val isObject: Boolean) {
 
     if (modelClass.isInterface) {
       baseFixture = s"trait ${modelClass.getName}"
-    } else if (isObject) {
+    } else if (modelClass.isObject) {
       baseFixture = s"object ${modelClass.getName}"
     } else {
       baseFixture = s"class ${modelClass.getName}"
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala
index 17d26a0a5d21f05e592a59088f412cd401ff9cc7..535439a1495f6972d78e9f973a3b7672869915cb 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala
@@ -59,12 +59,11 @@ class SModelFSWriter(
 
   override def visit(sModel: SModel): Unit = {
     sModel.getModelEnums.foreach(writeEnum(_))
-    sModel.getModelClasses.foreach(writeClass(_, false))
-    sModel.getJoinClasses.foreach(writeClass(_, false))
-    sModel.getJoinObjects.foreach(writeClass(_, true)) //TODO
-    sModel.getRelationalCompartments.foreach(writeClass(_, false))
-    sModel.getViewCompartments.foreach(writeClass(_, false))
-    sModel.getProviderClasses.foreach(writeClass(_, false))
+    sModel.getModelClasses.foreach(writeClass(_))
+    sModel.getJoinClasses.foreach(writeClass(_))
+    sModel.getRelationalCompartments.foreach(writeClass(_))
+    sModel.getViewCompartments.foreach(writeClass(_))
+    sModel.getProviderClasses.foreach(writeClass(_))
     //println(s"... Wrote files (sources) $sFilesToCompile")
 
     println("... Starting compilation")
@@ -102,11 +101,11 @@ class SModelFSWriter(
     }
   }
   
-  private def writeClass(sClass: SClass, isObject: Boolean): Unit = {
+  private def writeClass(sClass: SClass): Unit = {
     try {
       println(s"Writing class $sClass")
       val classNameWithPath = workingDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.getName}.scala"
-      val writer = new SClassWriter(sClass, isObject)
+      val writer = new SClassWriter(sClass)
 
       val classFile = File(classNameWithPath)
 
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala
index 4194f049ae4ea57e06091d6f17905ec34e9f1337..4843488e23d1d3e7369034d284244364c2b7d71e 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala
@@ -16,7 +16,7 @@ class InstanceCombiGenerator(val clsins: ClassAndInstance) extends SModelVisitor
 
   override def visit(sModel: SModel): Unit = {
     //println("++++++++++++++++++++++++++++++++++++++++++++++")
-    val example = new SClass("ExampleCombiCase", PackageNames.examplePkgName)
+    val example = new SClass("ExampleCombiCase", PackageNames.examplePkgName, SClassType.normalObject)
     val contents = clsins.obj.eAllContents().asScala
     var counter = 0
     var lines: Seq[InstanceLine] = Seq.empty
@@ -97,7 +97,7 @@ class InstanceCombiGenerator(val clsins: ClassAndInstance) extends SModelVisitor
     
     
     example.addParent(PredefTypes.App)
-    sModel.addJoinObject(example)
+    sModel.addProviderClass(example)
     //println("++++++++++++++++++++++++++++++++++++++++++++++")
     // pass
 
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala
index 0ca45b307360e460de231f226161b4c907f2f7df..241f424cb0c2c1baa56978180d6199e17b76e66c 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala
@@ -21,7 +21,7 @@ class InstanceGenerator(val clsins: ClassAndInstance) extends SModelVisitor {
 
   override def visit(sModel: SModel): Unit = {
     //println("++++++++++++++++++++++++++++++++++++++++++++++")
-    val example = new SClass("ExampleCase", PackageNames.examplePkgName)
+    val example = new SClass("ExampleCase", PackageNames.examplePkgName, SClassType.normalObject)
     val contents = clsins.obj.eAllContents().asScala
     var counter = 0
     var lines: Seq[InstanceLine] = Seq.empty
@@ -70,7 +70,7 @@ class InstanceGenerator(val clsins: ClassAndInstance) extends SModelVisitor {
       })
     })
     example.addParent(PredefTypes.App)
-    sModel.addJoinObject(example)
+    sModel.addProviderClass(example)
     //println("++++++++++++++++++++++++++++++++++++++++++++++")
     // pass
 
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 88f4c2acd8ba80b38579ed0e54d4684f9b1b8f4d..d3c9b884e1cfae0040219ce86bb14d2f93adf5eb 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
@@ -76,7 +76,7 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV
       println("B: " + otherAttsBase)
       println("O: " + otherAttsOther)
       
-      val joinObject = new SClass(j.getTarget().getResourceName + "Object", j.getTarget().getResourcePath)
+      val joinObject = new SClass(j.getTarget().getResourceName + "Object", j.getTarget().getResourcePath, SClassType.normalObject)
       val joinClass = new SJoinClass(j.getTarget().getResourceName, j.getTarget().getResourcePath, 
           base = baseClass, other = otherClass, joinType = rsumJoinType, 
           joinAttributes = joinAtts, innerAttributes = joinAtts ++ otherAttsBase ++ otherAttsOther, joinObject)
@@ -122,7 +122,7 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV
       joinClass.addMethod(ToStringMethods.joinToStringMethod(joinClass.getName))
 
       sModel.addJoinClass(joinClass)
-      sModel.addJoinObject(joinObject)
+      sModel.addJoinClass(joinObject)
       
       //add in Type Registry
       STypeRegistry.addType(joinClass, null)
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala
index 760c8b6762b6f02c1d851110bdcb68398665a4d5..9cea21c63baf358e2a26168561af82376dc8bea3 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala
@@ -88,8 +88,7 @@ class ModelJoinViewGeneratingVisitor(joinExpression: ModelJoinExpression) extend
     } else {
       refClasses = refClasses :+ cls
       internalClass = new SInnerViewNaturalClass(cls.getName + PackageNames.viewRolePostName,
-        _isAbstract = cls.isAbstract,
-        _isInterface = cls.isInterface,
+        _sClassType = cls.sClassType,
         _externalClass = viewCompartment,
         sumSource = cls)
       newInternalRoles = newInternalRoles :+ internalClass
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala
index d40d5ad26600f869b70cc975c1225f8a5941a5d1..8b51551fe6bddf6c58fc6f9894c4648d2f5bd3ab 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala
@@ -24,8 +24,6 @@ class QueryGeneratingVisitor extends SModelVisitor {
     //Iterate over all Model classes and create natural internal role classes
     sModel.getModelClasses.filter(!_.getName.startsWith(PackageNames.queryHelperPrefix)).foreach(cls => {
       val internalClass = new SInnerViewNaturalClass(cls.getName + PackageNames.queryRolePostName,
-          _isAbstract = false,
-          _isInterface = false,
           _externalClass = viewCompartment, 
           sumSource = cls)
       //sets the attributes from the source class
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
index 8afc83f974852c771ba77158d271648634f9e732..989aa9f2e10e0d7f66fa221da3b07bf312451d18 100644
--- 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
@@ -4,6 +4,7 @@ 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
+import org.rosi_project.model_sync.generator.acr_model.types.GenericSequence
 
 /**
  * Read EMF and Ecore models.
@@ -98,6 +99,11 @@ class SumModelReadingVisitor() extends SModelVisitor {
           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()", usedTypes = Set(rc, rc.sClass, rc.tClass))))
+      if (rc.connectedRef.getTypeElement.isInstanceOf[GenericSequence]) {
+        //add -> add method
+      } else {
+        //add -> set method
+      }
       creator.addMethod(method)
 
       createRefImpl = createRefImpl :+ SMethodStatement(content = s"""if (o1Name.contains("${rc.sClass.getName}") && sfName == "${rc.connectedRef.getName}" && o2Name.contains("${rc.tClass.getName}")) {""")
@@ -115,8 +121,8 @@ class SumModelReadingVisitor() extends SModelVisitor {
     loader.addMethod(createRef)
 
     //add the new classes as model classes
-    sModel.addModelClass(creator)
-    sModel.addModelClass(loader)
+    sModel.addProviderClass(creator)
+    sModel.addProviderClass(loader)
   }
 
   override def visit(sClass: SClass): Unit = {
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala
index aef0d4ebd62c1a18f86b4f12402cea1528075d15..3faa3e4272fdca44b2cc00ba74ed27fb4a4ac38a 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala
@@ -16,8 +16,7 @@ class ViewGeneratingVisitor extends SModelVisitor {
     //Iterate over all Model classes and create natural internal role classes
     sModel.getModelClasses.foreach(cls => {
       val internalClass = new SInnerViewNaturalClass(cls.getName + PackageNames.viewRolePostName,
-          _isAbstract = cls.isAbstract,
-          _isInterface = cls.isInterface,
+          _sClassType = cls.sClassType,
           _externalClass = viewCompartment, 
           sumSource = cls)
       //sets the attributes from the source class
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 c0a9dfcfa204a016f11616cec69f11cf6c0bd96b..e83db03ca0e43e14eafaa8484475e403d38634b9 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
@@ -44,74 +44,62 @@ object ApplicationTest extends App {
   }
   
   def runTTCLive2019(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BibTeX.ecore", "assets/models/DocBook.ecore", "assets/models/NMetaChanges.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BibTeX.ecore", "assets/models/DocBook.ecore", "assets/models/NMetaChanges.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTTC2019(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BDD.ecore", "assets/models/BDDv2.ecore", "assets/models/TT.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BDD.ecore", "assets/models/BDDv2.ecore", "assets/models/TT.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runShrinkingModel(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/ShrinkingModel.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/shrinking.modeljoin");
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/ShrinkingModel.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/shrinking.modeljoin", create = cre);
     new Generator(config).run()
   }
   
   def runCombinedTest(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/IMDBDatabase.ecore", "assets/models/ModelJoinLibrary.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/simple.modeljoin");
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/IMDBDatabase.ecore", "assets/models/ModelJoinLibrary.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/simple.modeljoin", create = cre);
     new Generator(config).run()
   }
   
   def runTestFamily(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Family.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Family.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTestSimplePerson(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/SimplePerson.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/SimplePerson.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTestPerson(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Person.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Person.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTestLibrary(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Library.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/manager.modeljoin");
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Library.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/manager.modeljoin", create = cre);
     new Generator(config).run()
   }
   
   def runTestShrinkingModel(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/ShrinkingModel.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/ShrinkingModel.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTestAML(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/AML.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/AML.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTestIMDB(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/IMDBDatabase.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/IMDBDatabase.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
   
   def runTestModelJoinLib(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/ModelJoinLibrary.ecore"), false, new File("assets/models"));
-    config.setCreate(cre)
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/ModelJoinLibrary.ecore"), false, new File("assets/models"), create = cre);
     new Generator(config).run()
   }
     
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/test/SClassWriterTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/test/SClassWriterTest.scala
index cd514fca498f49e1a7b031080b083af02f22ca3b..b1b1d6761a8515bb00253410a90ea4e4ebb2f5c0 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/test/SClassWriterTest.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/test/SClassWriterTest.scala
@@ -13,7 +13,7 @@ object SClassWriterTest/* extends App */{
   val stringType = SType("String")
   val attrs = Seq(SAttribute("name", stringType))
   val sayHelloMethod = new SMethod("sayHello", stringType, Seq.empty, Seq(SMethodStatement("s\"Hello $name\"")))
-  val modelClass = new SClass("Person", "", false, false)
+  val modelClass = new SClass("Person", "foo")
   modelClass.setAttributes(attrs)
   modelClass.addMethod(sayHelloMethod)
 
@@ -23,7 +23,7 @@ object SClassWriterTest/* extends App */{
   val syncNotificationVisitor = new SyncEnhancingVisitor
   modelClass.accept(syncNotificationVisitor)
 
-  val writer = new SClassWriter(modelClass, false)
+  val writer = new SClassWriter(modelClass)
 
   println(writer.stringify)
 
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/test/SModelFSWriterTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/test/SModelFSWriterTest.scala
index 6f6a3c3711bbba1215657464f505b75ebffbaf9e..b7f00b87273be3a934316afc6f13327d65fd795a 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/test/SModelFSWriterTest.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/test/SModelFSWriterTest.scala
@@ -14,7 +14,7 @@ object SModelFSWriterTest/* extends App */{
 
   val personAttrs = Seq(SAttribute("name", stringType))
   val personSayHelloMethod = new SMethod("sayHello", stringType, Seq.empty, Seq(SMethodStatement("s\"Hello $name\"")))
-  val personClass = new SClass("Person", "foo", false, false)
+  val personClass = new SClass("Person", "foo")
   personClass.setAttributes(personAttrs)
   personClass.addMethod(personSayHelloMethod)