diff --git a/src/main/jastadd/Analysis.jrag b/src/main/jastadd/Analysis.jrag
index 0844b615b18897e9b791ddad58e1532f70258c42..21456331346ac897ee8f597c52e93c1ac8edb498 100644
--- a/src/main/jastadd/Analysis.jrag
+++ b/src/main/jastadd/Analysis.jrag
@@ -141,7 +141,7 @@ aspect ComponentAnalysis {
 
   //--- relationComponentsTransitive ---
   syn Collection<RelationComponent> TypeDecl.relationComponentsTransitive() {
-    ArrayList<RelationComponent> list = new ArrayList<>();
+    Collection<RelationComponent> list = new ArrayList<>();
     if (hasSuper() && getSuper().decl() != null) {
       list.addAll(getSuper().decl().relationComponentsTransitive());
     }
@@ -192,7 +192,7 @@ aspect InstanceSupplier {
 
   //--- subTypeDecls ---
   syn Collection<TypeDecl> TypeDecl.subTypeDecls() {
-    java.util.List<TypeDecl> subDecls = new ArrayList();
+    Collection<TypeDecl> subDecls = new ArrayList();
     for (TypeDecl decl : program().getTypeDeclList()) {
       if (decl.hasSuper() && decl.getSuper().getID().equals(getID())) {
         subDecls.add(decl);
diff --git a/src/main/jastadd/DumpTree.jrag b/src/main/jastadd/DumpTree.jrag
index 9193b9334fb63901d8dc985b5e5ba091e6a1e710..d1203aeee5ae7b2713571c7ecd9f1c51238482a7 100644
--- a/src/main/jastadd/DumpTree.jrag
+++ b/src/main/jastadd/DumpTree.jrag
@@ -1,25 +1,18 @@
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.lang.reflect.InvocationTargetException;
-
-// We have been careful to not import many types here because the imports are added for
-// _ALL_ AST nodes and can cause collisions in the abstract grammar namespace.
-
 aspect DumpTree {
   private static final String ASTNode.DUMP_TREE_INDENT = "  ";
 
   public String ASTNode.dumpTree() {
-    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-    dumpTree(new PrintStream(bytes));
+    java.io.ByteArrayOutputStream bytes = new java.io.ByteArrayOutputStream();
+    dumpTree(new java.io.PrintStream(bytes));
     return bytes.toString();
   }
 
-  public void ASTNode.dumpTree(PrintStream out) {
+  public void ASTNode.dumpTree(java.io.PrintStream out) {
     dumpTree(out, "");
     out.flush();
   }
 
-  public void ASTNode.dumpTree(PrintStream out, String indent) {
+  public void ASTNode.dumpTree(java.io.PrintStream out, String indent) {
     out.print(indent + getClass().getSimpleName());
     out.print(getTokens());
     String extra = extraDumpInfo();
@@ -40,26 +33,20 @@ aspect DumpTree {
   public String ASTNode.extraDumpInfo() { return ""; }
 
   public String ASTNode.getTokens() {
-    java.util.TreeSet<java.lang.reflect.Method> methods = new java.util.TreeSet<>(
-        new java.util.Comparator<java.lang.reflect.Method>() {
-          public int compare(java.lang.reflect.Method m1, java.lang.reflect.Method m2) {
-            return m1.getName().compareTo(m2.getName());
-          }
-        });
+    java.util.TreeSet<java.lang.reflect.Method> methods = new java.util.TreeSet<>(Comparator.comparing(Method::getName));
 
     methods.addAll(java.util.Arrays.asList(getClass().getMethods()));
 
-    String result = "";
+    StringBuilder result = new StringBuilder();
     for (java.lang.reflect.Method method : methods) {
       ASTNodeAnnotation.Token token = method.getAnnotation(ASTNodeAnnotation.Token.class);
       if (token != null) {
         try {
-          result += String.format(" %s=\"%s\"", token.name(), method.invoke(this));
-        } catch (IllegalAccessException ignored) {
-        } catch (InvocationTargetException ignored) {
+          result.append(String.format(" %s=\"%s\"", token.name(), method.invoke(this)));
+        } catch (IllegalAccessException | java.lang.reflect.InvocationTargetException ignored) {
         }
       }
     }
-    return result;
+    return result.toString();
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/jastadd/backend/AbstractGrammar.jadd b/src/main/jastadd/backend/AbstractGrammar.jadd
index 57c6d25bac5733fc65e788f5f0bd0356ceedf24e..24a92be879f8910ea480bb2c02c989ca2bf6ad0c 100644
--- a/src/main/jastadd/backend/AbstractGrammar.jadd
+++ b/src/main/jastadd/backend/AbstractGrammar.jadd
@@ -3,6 +3,7 @@ aspect BackendAbstractGrammar {
   public static String ASTNode.listInterface = "java.util.List";
   public static String ASTNode.listClass = "java.util.ArrayList";
   public static String ASTNode.jastAddListType = "List";
+  public static String ASTNode.jastAddOptType = "Opt";
 
   public static boolean ASTNode.resolverHelper = false;
   public static boolean ASTNode.serializer = false;
diff --git a/src/main/jastadd/backend/Backend.jadd b/src/main/jastadd/backend/Backend.jadd
index 96164f9918271f71479c97112b49a7c44fe3e6ee..cc4477d91bac5e0fe442be6130c418c7803abdd7 100644
--- a/src/main/jastadd/backend/Backend.jadd
+++ b/src/main/jastadd/backend/Backend.jadd
@@ -6,9 +6,6 @@ aspect BackendAspect {
   }
 
   public void Program.generateAspect(StringBuilder sb) {
-    sb.append("import java.util.Collections;\n");
-    sb.append("import java.time.Instant;\n");
-    sb.append("import java.time.Period;\n");
     sb.append("aspect RelAstAPI {\n");
 
     for (TypeDecl td: getTypeDecls()) {
@@ -52,7 +49,7 @@ aspect BackendAspect {
     return ASTNode.jastAddListType + "<" + getTypeUse() + "> " + getID();
   }
   public String OptComponent.constructorParameter() {
-    return "Opt<" + getTypeUse() + "> " + getID();
+    return ASTNode.jastAddOptType + "<" + getTypeUse() + "> " + getID();
   }
   public String Component.constructorSetMethod() {
     return "set" + getID();
diff --git a/src/main/jastadd/backend/BidirectionalAPI.jadd b/src/main/jastadd/backend/BidirectionalAPI.jadd
index 19eb9de5b54957fbf286b600acae7f4f425c5df1..a2cb558e92da745a348c4f3913a524774e1db720 100644
--- a/src/main/jastadd/backend/BidirectionalAPI.jadd
+++ b/src/main/jastadd/backend/BidirectionalAPI.jadd
@@ -72,7 +72,7 @@ aspect BackendBidirectionalAPI {
       sb.append(ind(3) + "}\n");
       sb.append(ind(2) + "}\n");
     }
-    sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n");
+    sb.append(ind(2) + "return l != null ? java.util.Collections.unmodifiableList(l) : java.util.Collections.emptyList();\n");
     sb.append(ind(1) + "}\n");
 
     // Add
@@ -175,7 +175,7 @@ aspect BackendBidirectionalAPI {
       sb.append(ind(3) + "}\n");
       sb.append(ind(2) + "}\n");
     }
-    sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n");
+    sb.append(ind(2) + "return l != null ? java.util.Collections.unmodifiableList(l) : java.util.Collections.emptyList();\n");
     sb.append(ind(1) + "}\n");
 
     // Add
diff --git a/src/main/jastadd/backend/DirectedAPI.jadd b/src/main/jastadd/backend/DirectedAPI.jadd
index e5e315e1fff49fd759af0f4c0789b9d3a32c807b..b8d114831838365ae80dc5ec0c881e85d0cf3f25 100644
--- a/src/main/jastadd/backend/DirectedAPI.jadd
+++ b/src/main/jastadd/backend/DirectedAPI.jadd
@@ -48,7 +48,7 @@ aspect BackendDirectedAPI {
       sb.append(ind(3) + "}\n");
       sb.append(ind(2) + "}\n");
     }
-    sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n");
+    sb.append(ind(2) + "return l != null ? java.util.Collections.unmodifiableList(l) : java.util.Collections.emptyList();\n");
     sb.append(ind(1) + "}\n");
 
     // Add
diff --git a/src/main/jastadd/backend/Serializer.jadd b/src/main/jastadd/backend/Serializer.jadd
index 9e89e7f54ca786727178ebb8d4817ce49170d3fd..21db37f69f93f2c852528ab334245ce5f3e3d9e0 100644
--- a/src/main/jastadd/backend/Serializer.jadd
+++ b/src/main/jastadd/backend/Serializer.jadd
@@ -169,10 +169,10 @@ aspect Serializer {
       case "String":
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "());\n");
         break;
-      case "Instant":
+      case "java.time.Instant":
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().toString());\n");
         break;
-      case "Period":
+      case "java.time.Period":
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().toString());\n");
         break;
       default:
@@ -390,11 +390,11 @@ aspect Serializer {
       case "String":
         sb.append(ind(indent) + "element.set" + getID() + "(children.get(\"" + getID() + "\").asText());\n");
         break;
-      case "Instant":
-        sb.append(ind(indent) + "element.set" + getID() + "(Instant.parse(children.get(\"" + getID() + "\").asText()));\n");
+      case "java.time.Instant":
+        sb.append(ind(indent) + "element.set" + getID() + "(java.time.Instant.parse(children.get(\"" + getID() + "\").asText()));\n");
         break;
-      case "Period":
-        sb.append(ind(indent) + "element.set" + getID() + "(Period.parse(children.get(\"" + getID() + "\").asText()));\n");
+      case "java.time.Period":
+        sb.append(ind(indent) + "element.set" + getID() + "(java.time.Period.parse(children.get(\"" + getID() + "\").asText()));\n");
         break;
       default:
         // assume that the type is an enum. there is no way of checking this here
diff --git a/src/test/jastadd/serializer-names/Serializer.relast b/src/test/jastadd/serializer-names/Serializer.relast
index 6bbd44b8a4ace22be14d9c37b328d903cccda143..9106765c6ee6b8016de898c75efa2f3c38903050 100644
--- a/src/test/jastadd/serializer-names/Serializer.relast
+++ b/src/test/jastadd/serializer-names/Serializer.relast
@@ -13,8 +13,8 @@ C:NamedElement ::= D1:D [D2:D] D3:D*
     <C1:char> <C2:Character>
     <T1:String>
     <T2>
-    <N:Instant>
-    <P:Period>
+    <N:java.time.Instant>
+    <P:java.time.Period>
     <Day:Weekday>;
 D:NamedElement;
 
diff --git a/src/test/jastadd/serializer/Serializer.relast b/src/test/jastadd/serializer/Serializer.relast
index 6bbd44b8a4ace22be14d9c37b328d903cccda143..9106765c6ee6b8016de898c75efa2f3c38903050 100644
--- a/src/test/jastadd/serializer/Serializer.relast
+++ b/src/test/jastadd/serializer/Serializer.relast
@@ -13,8 +13,8 @@ C:NamedElement ::= D1:D [D2:D] D3:D*
     <C1:char> <C2:Character>
     <T1:String>
     <T2>
-    <N:Instant>
-    <P:Period>
+    <N:java.time.Instant>
+    <P:java.time.Period>
     <Day:Weekday>;
 D:NamedElement;