diff --git a/relast2uml.base/build.gradle b/relast2uml.base/build.gradle
index 7c6be0213b75876f976bce2167129fa0960afbe1..86db1feb51a3cf8fb7e4fddddba40c694ac8ea9f 100644
--- a/relast2uml.base/build.gradle
+++ b/relast2uml.base/build.gradle
@@ -46,6 +46,18 @@ task newVersion() {
     }
 }
 
+jar {
+    manifest {
+        attributes "Main-Class": mainClassName
+    }
+
+    from {
+        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+
+    archiveBaseName = 'relast2uml'
+}
+
 sourceSets {
     main {
         java.srcDir "src/gen/java"
diff --git a/relast2uml.base/src/main/jastadd/NameResolution.jrag b/relast2uml.base/src/main/jastadd/NameResolution.jrag
index 0152ba609255b5f0fafb09cc3edc17d33f2c5bc8..e6450fbd126ab20cf1d3ccc792af9d3c84ac9636 100644
--- a/relast2uml.base/src/main/jastadd/NameResolution.jrag
+++ b/relast2uml.base/src/main/jastadd/NameResolution.jrag
@@ -1,2 +1,12 @@
-aspect NameResolution {
+aspect NameResolutionExtended {
+  refine NameResolution eq Program.resolveTypeDecl(String name) {
+    try {
+      return refined(name);
+    } catch (RuntimeException e) {
+      System.err.println(e.getMessage());
+      TypeDecl dummy = new TypeDecl();
+      dummy.setName("(" + name + ")");
+      return dummy;
+    }
+  }
 }
diff --git a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
index a216bd7e4bbafc8a0f831ea3ecd577a3f2783181..bb60cd810082c4f557b5d8a54e166d84006ee620 100644
--- a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
+++ b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java
@@ -78,7 +78,7 @@ public class Compiler {
       System.out.println("No output output file is set. Assuming '" + output + "'.");
     }
     try {
-      Files.createDirectories(Paths.get(output).getParent());
+      Files.createDirectories(Paths.get(output).toAbsolutePath().getParent());
     } catch (IOException e) {
       throw new CompilerException("Error creating output dir " + Paths.get(output).getParent().toAbsolutePath(), e);
     }
@@ -86,6 +86,9 @@ public class Compiler {
     if (anyRequiredOptionIsUnset()) {
       throw new CompilerException("Aborting due to missing values for required options.");
     }
+    if (commandLine.getArguments().isEmpty()) {
+      throw new CompilerException("No input grammars specified!");
+    }
 
     Relast2Uml relast2uml = parseProgram();
 
@@ -158,11 +161,16 @@ public class Compiler {
   }
 
   private void addOptions() {
-    optionOutputFile = addOption(new StringOption("output", "target file to be generated."));
-    optionInputRelast2Uml = addOption(new StringOption("inputRelast2Uml", "relast2uml definition file."));
-    optionHelp = addOption(new FlagOption("help", "Print usage and exit."));
-    optionVersion = addOption(new FlagOption("help", "Print version and exit."));
-    optionVerbose = addOption(new FlagOption("verbose", "Print more messages while compiling."));
+    optionOutputFile = addOption(new StringOption(
+        "output", "target file to be generated.", "uml.md").makeOptional());
+    optionInputRelast2Uml = addOption(new StringOption(
+        "inputRelast2Uml", "relast2uml definition file.").makeOptional());
+    optionHelp = addOption(new FlagOption(
+        "help", "Print usage and exit."));
+    optionVersion = addOption(new FlagOption(
+        "help", "Print version and exit."));
+    optionVerbose = addOption(new FlagOption(
+        "verbose", "Print more messages while compiling."));
   }
 
   private <OptionType extends Option<?>> OptionType addOption(OptionType option) {
@@ -175,6 +183,7 @@ public class Compiler {
     Relast2Uml relast2Uml;
 
     for (String inputGrammarFileName : commandLine.getArguments()) {
+      printMessage("Parsing " + inputGrammarFileName);
       GrammarFile inputGrammar;
       try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputGrammarFileName))) {
         Relast2UmlScanner scanner = new Relast2UmlScanner(reader);
diff --git a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java
index c75f09e7f4cccfbc762f2aa2b08663001e7d7239..baa92bc9e44fafa5a036e63c2062696a32d76a7c 100644
--- a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java
+++ b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/options/StringOption.java
@@ -1,6 +1,7 @@
 package org.jastadd.relast2uml.compiler.options;
 
 public class StringOption extends Option<String> {
+  private HasArgument hasArgument;
   private String value;
   private boolean isSet;
 
@@ -12,6 +13,12 @@ public class StringOption extends Option<String> {
     super(name, description);
     value = defaultValue;
     isSet = false;
+    hasArgument = HasArgument.YES;
+  }
+
+  public StringOption makeOptional() {
+    hasArgument = HasArgument.OPTIONAL;
+    return this;
   }
 
   @Override
@@ -21,7 +28,7 @@ public class StringOption extends Option<String> {
 
   @Override
   public Option.HasArgument hasArgument() {
-    return Option.HasArgument.YES;
+    return hasArgument;
   }
 
   @Override