diff --git a/lib/java/se/lth/control/labcomm/ASTbuilder.java b/lib/java/se/lth/control/labcomm/ASTbuilder.java
index d16b15621bfab4335b96cca4084fb4a2a8c59383..b1525cbcf44baaf73121711e5d60f5a18ba84dba 100644
--- a/lib/java/se/lth/control/labcomm/ASTbuilder.java
+++ b/lib/java/se/lth/control/labcomm/ASTbuilder.java
@@ -158,13 +158,17 @@ public class ASTbuilder implements TypeDefParser.ParsedSymbolVisitor {
     /** Create a labcomm AST for the ParsedTypeDef d, including
      *  all declarations from p.
      *
-     *  This copies the declarations in p, and creates a new AST.
      *
-     *  If d is a sampleDecl, include the typedefs it depends on.
+     *  If p is not null, and the source of d matches the 
+     *  TypeDefParser this ASTbuilder was created for, 
+     *  creates a new AST containing the declarations in p
+     *  and d and (if d is a sampleDecl) its dependencies.
+     *
+     *  Otherwise, makeProgram(d)
      */
     public Program makeProgram(TypeDefParser.ParsedTypeDef d,
                                Program p) {
-        if(p != null) {
+        if(p != null && d.checkSource(tdp)) {
            return makeProgram(d, p.getDecls().fullCopy());
         } else {
            return makeProgram(d);
diff --git a/lib/java/se/lth/control/labcomm/TypeDefParser.java b/lib/java/se/lth/control/labcomm/TypeDefParser.java
index 773ba32431a0c406229889e57436f8f1a869987e..6ab81831a230bfa9befb264a363de298b9b3a6cc 100644
--- a/lib/java/se/lth/control/labcomm/TypeDefParser.java
+++ b/lib/java/se/lth/control/labcomm/TypeDefParser.java
@@ -2,8 +2,9 @@ package se.lth.control.labcomm;
 
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
@@ -17,6 +18,10 @@ import se.lth.control.labcomm.TypeBinding;
 
 public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
 
+    public interface TypeDefListener {
+        void onTypeDef(ParsedTypeDef d);
+    }
+
     static class SelfBinding extends TypeDef {
 
         private int sampleIndex;
@@ -48,10 +53,25 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
         }
     }
 
-    public interface TypeDefListener {
-        void onTypeDef(ParsedTypeDef d);
+    static class EmptyIterator<T>  implements java.util.Iterator {
+        @Override
+        public boolean hasNext() {
+            return false;
+        }
+
+        @Override
+        public T next() {
+            throw new NoSuchElementException();
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
     }
 
+    static EmptyIterator<ParsedTypeDef> emptyIterator =
+        new EmptyIterator<>();
+
     private HashMap<Integer,TypeDef> typeDefs;
     private HashMap<Integer,Integer> typeBindings;
     private HashSet<TypeDefListener> listeners;
@@ -403,10 +423,22 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
        private int idx;
        private String name;
        private ParsedType type;
+       private final TypeDefParser source;
+
+       ParsedTypeDef(TypeDefParser source, int idx, String name){
+           this.source = source;
+           this.idx = idx;
+           this.name = name;
+       }
+
+       ParsedTypeDef(TypeDefParser source, 
+                     int idx, String name, ParsedType type) {
+           this(source, idx, name);
+           this.type = type;
+       }
 
        ParsedTypeDef(int idx, String name){
-            this.idx = idx;
-            this.name = name;
+           this(null, idx, name);
        }
 
        ParsedTypeDef(int idx, String name, ParsedType type) {
@@ -414,6 +446,16 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
            this.type = type;
        }
 
+       /** @return true if source is same as
+        */
+       public boolean checkSource(TypeDefParser o) {
+           boolean result = source == o;
+           System.err.println("ParsedTypeDef.checkSource: source = "+source);
+           System.err.println("ParsedTypeDef.checkSource: o "+o);
+           System.err.println("ParsedTypeDef.checkSource: "+result);
+           return result;
+       }
+
        /** To be overridden in ParsedSampleDef
         */
        public boolean isSampleDef() {
@@ -421,7 +463,7 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
        }
 
         Iterator<ParsedTypeDef> getDepIterator() {
-           throw new Error("ParseTypeDef has no dependencies"); 
+            return emptyIterator;  
         }        
 
        void setType(ParsedType type) {
@@ -465,8 +507,9 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
     public class ParsedSampleDef extends ParsedTypeDef{
 
         private HashSet<ParsedTypeDef> deps;
+
         ParsedSampleDef(ParsedTypeDef td) {
-            super(td.getIndex(), td.getName(), td.getType());
+            super(td.source, td.getIndex(), td.getName(), td.getType());
             this.deps = new HashSet<ParsedTypeDef>();
         }
 
@@ -496,7 +539,7 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler {
         private LinkedList<TypeDef> typeStack;
 
         ParsedTypeDef newTypeDef() {
-            currentParsed =new ParsedTypeDef(getCurrentIndex(), getCurrentName());
+            currentParsed =new ParsedTypeDef(TypeDefParser.this, getCurrentIndex(), getCurrentName());
             return currentParsed;
         }