diff --git a/assets/model_join/libraryComplete.modeljoin b/assets/model_join/libraryComplete.modeljoin
new file mode 100644
index 0000000000000000000000000000000000000000..27db0faf62b4600552a15e3fd62cdfb0d7cdc55e
--- /dev/null
+++ b/assets/model_join/libraryComplete.modeljoin
@@ -0,0 +1,11 @@
+natural join lib.Library with lib.Library as lib.Library {
+   keep attributes lib.Library.name
+   keep outgoing lib.Library.employees as type lib.Employee {
+     keep attributes lib.Employee.salary
+     keep outgoing lib.Employee.manager as type lib.Employee {
+     }
+     keep supertype lib.Person as type lib.Person {
+       keep attributes lib.Person.name
+     }
+   }
+ }
\ No newline at end of file
diff --git a/assets/model_join/librarySimple.modeljoin b/assets/model_join/librarySimple.modeljoin
new file mode 100644
index 0000000000000000000000000000000000000000..db8daaed892dc182f0ba8d5eec3e967099ecdd65
--- /dev/null
+++ b/assets/model_join/librarySimple.modeljoin
@@ -0,0 +1,9 @@
+natural join lib.Library with lib.Library as lib.Library {
+   keep attributes lib.Library.name
+   keep outgoing lib.Library.employees as type lib.Employee {
+     keep attributes lib.Employee.salary
+     keep supertype lib.Person as type lib.Person {
+       keep attributes lib.Person.name
+     }
+   }
+ }
\ No newline at end of file
diff --git a/assets/model_join/manager.modeljoin b/assets/model_join/manager.modeljoin
new file mode 100644
index 0000000000000000000000000000000000000000..267f864506286730978bf97d5cdc5426438adf86
--- /dev/null
+++ b/assets/model_join/manager.modeljoin
@@ -0,0 +1,8 @@
+natural join lib.Employee with lib.Employee as lib.Employee {
+   keep attributes lib.Employee.salary
+   keep outgoing lib.Employee.manager as type lib.Employee {
+   }
+   keep supertype lib.Person as type lib.Person {
+     keep attributes lib.Person.name
+   }
+ }
\ No newline at end of file
diff --git a/assets/models/Library.ecore b/assets/models/Library.ecore
index 33179128b33c0c1f4d0b2396714ae0d3d708b16e..c281ccd51d05716e4033331b02b2f4ee4bc561ce 100644
--- a/assets/models/Library.ecore
+++ b/assets/models/Library.ecore
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Library" nsURI="http://www.example.org/library" nsPrefix="org.rosi_project.example.mm.lib">
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Library" nsURI="http://www.example.org/library" nsPrefix="lib">
   <eClassifiers xsi:type="ecore:EClass" name="Library">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="employees" upperBound="-1"
diff --git a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java
index ca2ee58040af64d1928120a4b0eabdf11d44601d..c92b525cc3cab941a9524c8b396b0de39958d25c 100644
--- a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java
+++ b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/ModelJoinBuilder.java
@@ -12,7 +12,7 @@ import org.rosi_project.model_sync.model_join.representation.grammar.KeepReferen
 import org.rosi_project.model_sync.model_join.representation.grammar.KeepSuperTypeExpression;
 import org.rosi_project.model_sync.model_join.representation.grammar.KeepSuperTypeExpression.KeepSuperTypeBuilder;
 import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression;
-import org.rosi_project.model_sync.model_join.representation.grammar.ThetaJoinExpression;
+import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.NaturalJoinBuilder;
 import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.ThetaJoinBuilder;
 
 /**
@@ -26,6 +26,10 @@ public class ModelJoinBuilder {
   public static ThetaJoinBuilder thetaJoin() {
     return JoinFactory.createNew().theta();
   }
+  
+  public static NaturalJoinBuilder naturalJoin() {
+	  return JoinFactory.createNew().natural();
+  }
 
   public static KeepAttributesExpression attributes(AttributePath firstAttribute, AttributePath... moreAttributes) {
     return KeepAttributesExpression.keepAttributes(firstAttribute, moreAttributes);
diff --git a/src/main/java/org/rosi_project/model_sync/model_join/representation/writer/FileBasedModelJoinWriter.java b/src/main/java/org/rosi_project/model_sync/model_join/representation/writer/FileBasedModelJoinWriter.java
index 323080fe8db4c612786e84cc7b145e1e6987df1f..e9cc804f59a7bbf116cfc0916c61381b322e9401 100644
--- a/src/main/java/org/rosi_project/model_sync/model_join/representation/writer/FileBasedModelJoinWriter.java
+++ b/src/main/java/org/rosi_project/model_sync/model_join/representation/writer/FileBasedModelJoinWriter.java
@@ -14,7 +14,7 @@ import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinEx
  *
  * @author Rico Bergmann
  */
-class FileBasedModelJoinWriter implements ModelJoinWritingService<Boolean> {
+public class FileBasedModelJoinWriter implements ModelJoinWritingService<Boolean> {
 
   private final File outputFile;
   private final StringBasedModelJoinWriter toStringWriter;
@@ -24,7 +24,7 @@ class FileBasedModelJoinWriter implements ModelJoinWritingService<Boolean> {
    *
    * @param outputFile the file to write to
    */
-  FileBasedModelJoinWriter(@Nonnull File outputFile) {
+  public FileBasedModelJoinWriter(@Nonnull File outputFile) {
     this.outputFile = outputFile;
     this.toStringWriter = StringBasedModelJoinWriter.withNewlines();
   }
diff --git a/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java b/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java
index b2ac6d48f68ce08f2b43a84af3056792b005acc9..44fa819a32695600f414d3adb075e0d8c4411cb6 100644
--- a/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java
+++ b/src/main/java/org/rosi_project/model_sync/modelrepresentation/ModelJoinCreation.java
@@ -1,19 +1,23 @@
 package org.rosi_project.model_sync.modelrepresentation;
 
+import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.attributes;
+import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.outgoing;
+import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.supertype;
+import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.thetaJoin;
+import static org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder.naturalJoin;
+
+import java.io.File;
+
 import org.rosi_project.model_sync.model_join.representation.core.AttributePath;
 import org.rosi_project.model_sync.model_join.representation.core.ClassResource;
-import org.rosi_project.model_sync.model_join.representation.grammar.JoinExpression;
-import org.rosi_project.model_sync.model_join.representation.grammar.KeepAttributesExpression;
-import org.rosi_project.model_sync.model_join.representation.grammar.KeepExpression;
 import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression;
-import org.rosi_project.model_sync.model_join.representation.util.JoinFactory;
 import org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder;
+import org.rosi_project.model_sync.model_join.representation.writer.*;
 
 public class ModelJoinCreation {
 
 	public static void main(String[] args) {
-		// TODO Auto-generated method stub
-		ClassResource person = ClassResource.fromQualifiedName("contact.Person");
+		/*ClassResource person = ClassResource.fromQualifiedName("contact.Person");
 		ClassResource employee = ClassResource.fromQualifiedName("company.Employee");
 		AttributePath dateOfBirth = AttributePath.from(person, "dateOfBirth");
 
@@ -33,8 +37,95 @@ public class ModelJoinCreation {
 			for (KeepExpression k: j.getKeeps()) {
 				System.out.println(k);
 			}
-		}
+		}*/
+		
+		ClassResource library = ClassResource.from("lib", "Library");
+	    ClassResource employee = ClassResource.from("lib", "Employee");
+	    ClassResource person = ClassResource.from("lib", "Person");
+	    
+	    //ClassResource jointargetMovie = ClassResource.from("jointarget", "Movie");
+	    //ClassResource jointargetVote = ClassResource.from("jointarget", "Vote");
+	    //ClassResource jointargetMediaItem = ClassResource.from("jointarget", "MediaItem");
+
+	    AttributePath libraryName = AttributePath.from(library, "name");
+	    AttributePath libraryEmployees = AttributePath.from(library, "employees");
+	    AttributePath employeeSalary = AttributePath.from(employee, "salary");
+	    AttributePath employeeManager = AttributePath.from(employee, "manager");
+	    AttributePath personName = AttributePath.from(person, "name");
+	    
+	    ModelJoinExpression mjManager = ModelJoinBuilder.createNewModelJoin()
+		        .add(naturalJoin()
+		            .join(employee)
+		            .with(employee)
+		            .as(employee)
+		            .keep(attributes(employeeSalary))
+		            .keep(outgoing(employeeManager)
+		                .as(employee)
+		                .buildExpression()
+		            )
+		            .keep(supertype(person)
+			                .as(person)
+			                .keep(attributes(personName))
+			                .buildExpression()
+			        )
+		            .done())
+		        .build();
+	    
+		ModelJoinExpression mjComplete = ModelJoinBuilder.createNewModelJoin()
+		        .add(naturalJoin()
+		            .join(library)
+		            .with(library)
+		            .as(library)
+		            .keep(attributes(libraryName))
+		            .keep(outgoing(libraryEmployees)
+		                .as(employee)
+		                .keep(attributes(employeeSalary))
+		                .keep(outgoing(employeeManager)
+		                		.as(employee)
+		                		.buildExpression()
+		                )
+		                .keep(supertype(person)
+				                .as(person)
+				                .keep(attributes(personName))
+				                .buildExpression()
+				        )
+		                .buildExpression()
+		            )
+		            .done())
+		        .build();
+		
+		ModelJoinExpression mjSimple = ModelJoinBuilder.createNewModelJoin()
+		        .add(naturalJoin()
+		            .join(library)
+		            .with(library)
+		            .as(library)
+		            .keep(attributes(libraryName))
+		            .keep(outgoing(libraryEmployees)
+		                .as(employee)
+		                .keep(attributes(employeeSalary))
+		                .keep(supertype(person)
+				                .as(person)
+				                .keep(attributes(personName))
+				                .buildExpression()
+				        )
+		                .buildExpression()
+		            )
+		            .done())
+		        .build();
 		
+		File fileComplete = new File("libraryComplete.modeljoin");
+		File fileSimple = new File("librarySimple.modeljoin");
+		File fileManager = new File("manager.modeljoin");
+	    //registerCreatedFile(outputFile);
+
+	    FileBasedModelJoinWriter writerComplete = new FileBasedModelJoinWriter(fileComplete);
+	    writerComplete.write(mjComplete);
+	    
+	    FileBasedModelJoinWriter writerSimple = new FileBasedModelJoinWriter(fileSimple);
+	    writerSimple.write(mjSimple);
+	    
+	    FileBasedModelJoinWriter writerManager = new FileBasedModelJoinWriter(fileManager);
+	    writerManager.write(mjManager);
 	}
 
 }
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 533d8d3dca2fc4aaf44770c4382689f64cfe2bea..760c8b6762b6f02c1d851110bdcb68398665a4d5 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
@@ -31,7 +31,9 @@ class ModelJoinViewGeneratingVisitor(joinExpression: ModelJoinExpression) extend
 
       val joinType = STypeRegistry.query(j.getTarget.getResourceName, j.getTarget.getResourcePath)
       if (!joinType.isEmpty) {
-        viewCompartment.addJoinObject(joinType.get.asInstanceOf[SJoinClass])
+        if (joinType.get.isInstanceOf[SJoinClass]) {
+          viewCompartment.addJoinObject(joinType.get.asInstanceOf[SJoinClass])
+        }
         createClasses(asScalaBuffer(j.getKeepsList).toSet, joinType.get.asInstanceOf[SClass], sModel)
       }
 
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 993cd52f9316dda9a3380f3d820bca62198589a4..98b06370deac6164e1b3b7070c305d62cca446ce 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
@@ -7,7 +7,8 @@ import org.rosi_project.model_sync.generator.Creation
 
 object ApplicationTest extends App {
       
-  runCombinedTest(Creation.rolesum)
+  runTestLibrary(Creation.rolesum)
+  //runCombinedTest(Creation.rolesum)
   //runShrinkingModel(Creation.rolesum)
   //runTestAML(Creation.rolesum)
   
@@ -85,7 +86,7 @@ object ApplicationTest extends App {
   }
   
   def runTestLibrary(cre: Creation.Value): Unit = {
-    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Library.ecore"), false, new File("assets/models"));
+    var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/Library.ecore"), false, new File("assets/models"), modelJoin = "assets/model_join/manager.modeljoin");
     config.setCreate(cre)
     new Generator(config).run()
   }