diff --git a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java
index bd873738be32d3169868662f1f048e01480db08e..b22e6e91fc9b1e3e4a208c1fc66aba3879e12c43 100644
--- a/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java
+++ b/src/main/java/org/rosi_project/model_sync/model_join/representation/util/JoinFactory.java
@@ -72,50 +72,12 @@ public class JoinFactory {
     protected ClassResource right;
     protected ClassResource target;
     protected List<KeepExpression> keeps = new ArrayList<>();
-  }
-
-  /**
-   * The {@code OuterJoinBuilder} takes care of setting up new {@link OuterJoinExpression}
-   * instances.
-   *
-   * @see OuterJoinExpression
-   */
-  public static class OuterJoinBuilder extends AbstractJoinBuilder {
-
-    private OuterJoinExpression.JoinDirection direction;
-
-    /**
-     * Default constructor.
-     * <p>
-     * {@code private} to prevent direct instantiation.
-     */
-    private OuterJoinBuilder() {
-      // pass
-    }
-
-    /**
-     * Configures the join to use the right source model as the primary one.
-     */
-    @Nonnull
-    public OuterJoinBuilder rightOuter() {
-      direction = JoinDirection.RIGHT;
-      return this;
-    }
-
-    /**
-     * Configures the join to use the left source model as the primary one.
-     */
-    @Nonnull
-    public OuterJoinBuilder leftOuter() {
-      direction = JoinDirection.LEFT;
-      return this;
-    }
-
+    
     /**
      * Specifies the left source.
      */
     @Nonnull
-    public OuterJoinBuilder join(@Nonnull ClassResource left) {
+    public AbstractJoinBuilder join(@Nonnull ClassResource left) {
       this.left = left;
       return this;
     }
@@ -124,7 +86,7 @@ public class JoinFactory {
      * Specifies the right source.
      */
     @Nonnull
-    public OuterJoinBuilder with(@Nonnull ClassResource right) {
+    public AbstractJoinBuilder with(@Nonnull ClassResource right) {
       this.right = right;
       return this;
     }
@@ -133,7 +95,7 @@ public class JoinFactory {
      * Specifies the name of the resulting class.
      */
     @Nonnull
-    public OuterJoinBuilder as(@Nonnull ClassResource target) {
+    public AbstractJoinBuilder as(@Nonnull ClassResource target) {
       this.target = target;
       return this;
     }
@@ -142,72 +104,76 @@ public class JoinFactory {
      * Specifies a field that should be contained in the resulting view.
      */
     @Nonnull
-    public OuterJoinBuilder keep(@Nonnull KeepExpression keep) {
+    public AbstractJoinBuilder keep(@Nonnull KeepExpression keep) {
       this.keeps.add(keep);
       return this;
     }
-
-    /**
-     * Finishes the construction process and provides the resulting {@code join}.
-     */
-    @Nonnull
-    public OuterJoinExpression done() {
-      return new OuterJoinExpression(left, right, target, direction, keeps);
-    }
+    
+    public abstract JoinExpression done();
   }
 
   /**
-   * The {@code NaturalJoinBuilder} takes care of setting up new {@link NaturalJoinExpression}
+   * The {@code OuterJoinBuilder} takes care of setting up new {@link OuterJoinExpression}
    * instances.
    *
-   * @see NaturalJoinExpression
+   * @see OuterJoinExpression
    */
-  public static class NaturalJoinBuilder extends AbstractJoinBuilder {
+  public static class OuterJoinBuilder extends AbstractJoinBuilder {
+
+    private OuterJoinExpression.JoinDirection direction;
 
     /**
      * Default constructor.
      * <p>
      * {@code private} to prevent direct instantiation.
      */
-    private NaturalJoinBuilder() {
+    private OuterJoinBuilder() {
       // pass
     }
 
     /**
-     * Specifies the left source.
+     * Configures the join to use the right source model as the primary one.
      */
     @Nonnull
-    public NaturalJoinBuilder join(@Nonnull ClassResource left) {
-      this.left = left;
+    public OuterJoinBuilder rightOuter() {
+      direction = JoinDirection.RIGHT;
       return this;
     }
 
     /**
-     * Specifies the right source.
+     * Configures the join to use the left source model as the primary one.
      */
     @Nonnull
-    public NaturalJoinBuilder with(@Nonnull ClassResource right) {
-      this.right = right;
+    public OuterJoinBuilder leftOuter() {
+      direction = JoinDirection.LEFT;
       return this;
-    }
+    }    
 
     /**
-     * Specifies the name of the resulting class.
+     * Finishes the construction process and provides the resulting {@code join}.
      */
     @Nonnull
-    public NaturalJoinBuilder as(@Nonnull ClassResource target) {
-      this.target = target;
-      return this;
+    public OuterJoinExpression done() {
+      return new OuterJoinExpression(left, right, target, direction, keeps);
     }
+  }
+
+  /**
+   * The {@code NaturalJoinBuilder} takes care of setting up new {@link NaturalJoinExpression}
+   * instances.
+   *
+   * @see NaturalJoinExpression
+   */
+  public static class NaturalJoinBuilder extends AbstractJoinBuilder {
 
     /**
-     * Specifies a field that should be contained in the resulting view.
+     * Default constructor.
+     * <p>
+     * {@code private} to prevent direct instantiation.
      */
-    @Nonnull
-    public NaturalJoinBuilder keep(@Nonnull KeepExpression keep) {
-      this.keeps.add(keep);
-      return this;
-    }
+    private NaturalJoinBuilder() {
+      // pass
+    }    
 
     /**
      * Finishes the construction process and provides the resulting {@code join}.
@@ -235,34 +201,7 @@ public class JoinFactory {
      */
     private ThetaJoinBuilder() {
       // pass
-    }
-
-    /**
-     * Specifies the left source.
-     */
-    @Nonnull
-    public ThetaJoinBuilder join(@Nonnull ClassResource left) {
-      this.left = left;
-      return this;
-    }
-
-    /**
-     * Specifies the right source.
-     */
-    @Nonnull
-    public ThetaJoinBuilder with(@Nonnull ClassResource right) {
-      this.right = right;
-      return this;
-    }
-
-    /**
-     * Specifies the name of the resulting class.
-     */
-    @Nonnull
-    public ThetaJoinBuilder as(@Nonnull ClassResource target) {
-      this.target = target;
-      return this;
-    }
+    }    
 
     /**
      * Specifies the join condition.
@@ -281,15 +220,6 @@ public class JoinFactory {
       return where(OCLConstraint.of(oclCondition));
     }
 
-    /**
-     * Specifies a field that should be contained in the resulting view.
-     */
-    @Nonnull
-    public ThetaJoinBuilder keep(@Nonnull KeepExpression keep) {
-      this.keeps.add(keep);
-      return this;
-    }
-
     /**
      * Finishes the construction process and provides the resulting {@code join}.
      */
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 c92b525cc3cab941a9524c8b396b0de39958d25c..b5daa77a68a168b3ee5d7f3bba23d7694d955015 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
@@ -9,10 +9,13 @@ import org.rosi_project.model_sync.model_join.representation.grammar.JoinExpress
 import org.rosi_project.model_sync.model_join.representation.grammar.KeepAttributesExpression;
 import org.rosi_project.model_sync.model_join.representation.grammar.KeepReferenceExpression;
 import org.rosi_project.model_sync.model_join.representation.grammar.KeepReferenceExpression.KeepReferenceBuilder;
+import org.rosi_project.model_sync.model_join.representation.grammar.KeepSubTypeExpression;
+import org.rosi_project.model_sync.model_join.representation.grammar.KeepSubTypeExpression.KeepSubTypeBuilder;
 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.util.JoinFactory.NaturalJoinBuilder;
+import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.OuterJoinBuilder;
 import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.ThetaJoinBuilder;
 
 /**
@@ -30,6 +33,10 @@ public class ModelJoinBuilder {
   public static NaturalJoinBuilder naturalJoin() {
 	  return JoinFactory.createNew().natural();
   }
+  
+  public static OuterJoinBuilder outerJoin() {
+	  return JoinFactory.createNew().outer();
+  }
 
   public static KeepAttributesExpression attributes(AttributePath firstAttribute, AttributePath... moreAttributes) {
     return KeepAttributesExpression.keepAttributes(firstAttribute, moreAttributes);
@@ -38,10 +45,18 @@ public class ModelJoinBuilder {
   public static KeepReferenceBuilder outgoing(AttributePath attr) {
     return KeepReferenceExpression.keep().outgoing(attr);
   }
+  
+  public static KeepReferenceBuilder incoming(AttributePath attr) {
+	return KeepReferenceExpression.keep().incoming(attr);
+  }
 
   public static KeepSuperTypeBuilder supertype(ClassResource supertype) {
     return KeepSuperTypeExpression.keep().supertype(supertype);
   }
+  
+  public static KeepSubTypeBuilder subtype(ClassResource subtype) {
+	return KeepSubTypeExpression.keep().subtype(subtype);
+  }
 
   /**
    * Starts the construction process for a new {@link ModelJoinExpression}.
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 44fa819a32695600f414d3adb075e0d8c4411cb6..6db9adf545602863afb2209a577014c7d30c3de4 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
@@ -42,6 +42,7 @@ public class ModelJoinCreation {
 		ClassResource library = ClassResource.from("lib", "Library");
 	    ClassResource employee = ClassResource.from("lib", "Employee");
 	    ClassResource person = ClassResource.from("lib", "Person");
+	    //ClassResource.fromQualifiedName("lib.Library");
 	    
 	    //ClassResource jointargetMovie = ClassResource.from("jointarget", "Movie");
 	    //ClassResource jointargetVote = ClassResource.from("jointarget", "Vote");
diff --git a/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java b/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java
index 12ab7c144319e4a5a33174852cf402f2e22e644f..ad0da375f1164c652a42b83d828597b8e96ef766 100644
--- a/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java
+++ b/src/test/java/org/rosi_project/model_sync/model_join/representation/writer/TestedModels.java
@@ -4,10 +4,15 @@ import static org.rosi_project.model_sync.model_join.representation.util.ModelJo
 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 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.core.AttributePath;
 import org.rosi_project.model_sync.model_join.representation.core.ClassResource;
 import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression;
+import org.rosi_project.model_sync.model_join.representation.util.JoinFactory.ThetaJoinBuilder;
+import org.rosi_project.model_sync.model_join.representation.util.JoinFactory;
 import org.rosi_project.model_sync.model_join.representation.util.ModelJoinBuilder;
 
 class TestedModels {
@@ -32,14 +37,14 @@ class TestedModels {
     static final AttributePath imdbVoteScore = AttributePath.from("imdb.Vote", "score");
     static final AttributePath libraryAudioVisualItemMinutesLength = AttributePath.from(libraryAudioVisualItem, "minutesLength");
 
+    //static final ThetaJoinBuilder tjb = (ThetaJoinBuilder)JoinFactory.createNew().theta().join(imdbFilm).with(libraryVideoCassette).as(jointargetMovie);    
     static final ModelJoinExpression asModelJoin = ModelJoinBuilder.createNewModelJoin()
         .add(thetaJoin()
+        	.where("library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.firstname.concat(\" \") .concat(p.lastName) == a.name))")
             .join(imdbFilm)
             .with(libraryVideoCassette)
             .as(jointargetMovie)
-            .where(
-                "library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.firstname.concat(\" \") .concat(p.lastName) == a.name))")
-            .keep(attributes(imdbFilmYear))
+        	.keep(attributes(imdbFilmYear))
             .keep(outgoing(imdbFilmVotes)
                 .as(jointargetVote)
                 .keep(attributes(imdbVoteScore))
@@ -52,6 +57,26 @@ class TestedModels {
             )
             .done())
         .build();
+    /*static final KeepAttributesExpression ke = attributes(imdbFilmYear);
+    
+    static final ModelJoinExpression asModelJoin = ModelJoinBuilder.createNewModelJoin()
+            .add(naturalJoin()
+                .join(imdbFilm)
+                .with(libraryVideoCassette)
+                .as(jointargetMovie)
+            	.keep(ke)
+                .keep(outgoing(imdbFilmVotes)
+                    .as(jointargetVote)
+                    .keep(attributes(imdbVoteScore))
+                    .buildExpression()
+                )
+                .keep(supertype(libraryAudioVisualItem)
+                    .as(jointargetMediaItem)
+                    .keep(attributes(libraryAudioVisualItemMinutesLength))
+                    .buildExpression()
+                )
+                .done())
+            .build();*/
 
     static final String asString = "theta join imdb.Film with library.VideoCassette as jointarget.Movie\n"
         + "where library.VideoCassette.cast->forAll (p | imdb.Film.figures->playedBy->exists (a | p.\n"