diff --git a/tests/Makefile b/tests/Makefile
index 0b9d3265bec7b925294981cfc55acd813c6519c9..5a9e1b07fe213bbcb5e4e8fbf7dd97c3ae214ea6 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -3,3 +3,4 @@ all:
 	cd valid && make test
 	cd errors && make test
 	cd multipleFiles && make test
+	cd resolverHelper && make test
diff --git a/tests/multipleFiles/.gitignore b/tests/multipleFiles/.gitignore
index 670d4423526234f1b4d5bfc56801b40603ac1e8b..77ed314598ad4c8abe45841380097893fb543efc 100644
--- a/tests/multipleFiles/.gitignore
+++ b/tests/multipleFiles/.gitignore
@@ -1,3 +1,5 @@
-/AST/*
-/*Gen.ast
-/*Gen.jadd
+AST/*
+All.ast
+All.jadd
+AllGen.jadd
+AllGen.ast
\ No newline at end of file
diff --git a/tests/resolverHelper/.gitignore b/tests/resolverHelper/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ce16505a92247e9addf46d80d6298d41ca8314da
--- /dev/null
+++ b/tests/resolverHelper/.gitignore
@@ -0,0 +1,4 @@
+/AST/*
+/All.ast
+All.jadd
+AllRefResolver.jadd
diff --git a/tests/resolverHelper/AbstractTests.java b/tests/resolverHelper/AbstractTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b86096602b5925e1bc0f41c7d75624404881bcb
--- /dev/null
+++ b/tests/resolverHelper/AbstractTests.java
@@ -0,0 +1,25 @@
+public class AbstractTests {
+	protected void assertException() {
+		check(false, "should throw exception");
+	}
+	protected void assertTrue(boolean b) {
+		check(b, "value should be true (is false)");
+	}
+	protected void assertFalse(boolean b) {
+		check(!b, "value should be flase (is true)");
+	}
+	protected void assertNull(Object obj) {
+		check(obj == null, "Object not null: " + obj);
+	}
+	protected void assertSame(Object o1, Object o2) {
+		check(o1 == o2, "Objects not same: " + o1 + ", " + o2);
+	}
+	protected void assertEquals(Object o1, Object o2) {
+		check(o1.equals(o2), "Objects not equals: " + o1 + ", " + o2);
+	}
+	protected void check(boolean b, String message) {
+		if (!b) {
+			throw new RuntimeException(message);
+		}
+	}
+}
\ No newline at end of file
diff --git a/tests/resolverHelper/All.java b/tests/resolverHelper/All.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2f65cc6056dc37d51eff0a71abb0b421f3af46e
--- /dev/null
+++ b/tests/resolverHelper/All.java
@@ -0,0 +1,51 @@
+import AST.*;
+import java.util.*;
+
+@SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
+public class All extends AbstractTests {
+  private Root r;
+  private A a1;
+  private A a2;
+  private A a3;
+  private B b1;
+  private B b2;
+  private B b3;
+
+  public static void main(String args[]) {
+    new All().test();
+  }
+
+  public void test() {
+    testNameRes1();
+  }
+
+
+
+  /**
+   * rel A.Di1 -> B;
+   */
+  private void testNameRes1() {
+    setup();
+    a1.setRel1(NamedElement.createRef("b2"));
+    System.out.println("Rel 1 of a1 has type " + a1.getRel1().getClass().getSimpleName());
+    assertSame(a1.getRel1(), b2);
+  }
+
+  private void setup() {
+    r = new Root();
+    a1 = new A("a1");
+    a2 = new A("a2");
+    a3 = new A("a3");
+    b1 = new B("b1");
+    b2 = new B("b2");
+    b3 = new B("b3");
+
+    r.addA(a1);
+    r.addA(a2);
+    r.addA(a3);
+    r.addB(b1);
+    r.addB(b2);
+    r.addB(b3);
+  }
+
+}
diff --git a/tests/resolverHelper/Grammar.relast b/tests/resolverHelper/Grammar.relast
new file mode 100644
index 0000000000000000000000000000000000000000..51cfc61b59813dc28828646b9e540672c96bb273
--- /dev/null
+++ b/tests/resolverHelper/Grammar.relast
@@ -0,0 +1,7 @@
+Root ::= A* B*;
+abstract NamedElement ::= <Name:String>;
+A:NamedElement;
+B:NamedElement;
+
+rel A.Rel1  -> NamedElement;
+rel A.Rel2  -> NamedElement;
diff --git a/tests/resolverHelper/Makefile b/tests/resolverHelper/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3ffd58d57ed35016e91bbf0cc086d622c7c279a4
--- /dev/null
+++ b/tests/resolverHelper/Makefile
@@ -0,0 +1,18 @@
+all: build-jar test
+test: clean test1
+	@echo "#"
+	@echo "# RESOLVER HELPER TESTS OK"
+	@echo "#"
+
+build-jar:
+	(cd ../../ && ./gradlew jar)
+test1:
+	java -jar ../../build/libs/relast.jar Grammar.relast --file --grammarName=All --resolverHelper
+	java -jar ../../tools/jastadd2.jar --package=AST --rewrite=cnta All.ast All.jadd AllRefResolver.jadd MyRefResolver.jadd Utils.jadd
+	javac AST/*.java All.java
+	java All
+
+clean:
+	rm -rf AST
+	rm -f *.class
+	rm -f *.ast
\ No newline at end of file
diff --git a/tests/resolverHelper/MyRefResolver.jadd b/tests/resolverHelper/MyRefResolver.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..562f260f181c76828b81a2cc2bf25002d4f67d7a
--- /dev/null
+++ b/tests/resolverHelper/MyRefResolver.jadd
@@ -0,0 +1,15 @@
+aspect MyRewrites {
+
+  // context-independent name resolution
+  refine RefResolverStubs eq ASTNode.resolveNamedElement(String id) {
+    System.out.println("resolving " + id + " to " + root().findNamedElement(id));
+    return root().findNamedElement(id);
+  }
+
+  refine RefResolverStubs eq A.resolveRel2(String id) {
+    // default to context-independent name resolution
+    return resolveNamedElement(id);
+  }
+
+}
+
diff --git a/tests/resolverHelper/Utils.jadd b/tests/resolverHelper/Utils.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..eb9729cf42a323cfb654877e091f133316ca4a77
--- /dev/null
+++ b/tests/resolverHelper/Utils.jadd
@@ -0,0 +1,41 @@
+aspect Utils {
+  public String NamedElement.toString() {
+    return getName();
+  }
+
+  inh Root ASTNode.root();
+  eq Root.getA(int i).root() = this;
+  eq Root.getB(int i).root() = this;
+
+  syn NamedElement Root.findNamedElement(String name) {
+    for (A a : getAList()) {
+      if (a.getName().equals(name)) {
+        return a;
+      }
+    }
+    for (B b : getBList()) {
+      if (b.getName().equals(name)) {
+        return b;
+      }
+    }
+    return null;
+  }
+
+  syn A Root.findA(String name) {
+    for (A a : getAList()) {
+      if (a.getName().equals(name)) {
+        return a;
+      }
+    }
+    return null;
+  }
+
+  syn B Root.findB(String name) {
+    for (B b : getBList()) {
+      if (b.getName().equals(name)) {
+        return b;
+      }
+    }
+    return null;
+  }
+}
\ No newline at end of file