diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
index 8e15953f3a70a2f7c332323f727420743c6a5387..54c5c79209d12d65cbee830a6d24a19af28e9fc4 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
@@ -1,3 +1,6 @@
+.onUnload <- function(libpath)
+	library.dynam.unload("testrffi", libpath)
+
 rffi.dotCModifiedArguments <- function(data) {
 	.C("dotCModifiedArguments", length(data), as.integer(data), as.double(data), as.logical(data))
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index 7336777a881f7bc6696caf0ac122b716143cccde..334667a09750ed2dd53d1e11e952edf071e8f1b6 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -116047,15 +116047,15 @@ Error: unexpected '*' in:
 [1] TRUE
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI1#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addInt(2L, 3L); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addInt(2L, 3L); detach("package:testrffi", unload=T); x }
 [1] 5
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI10#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); a <- c(1L,2L,3L); x <- rffi.iterate_iptr(a); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); a <- c(1L,2L,3L); x <- rffi.iterate_iptr(a); detach("package:testrffi", unload=T); x }
 [1] 1 2 3
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI11#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotCModifiedArguments(c(0,1,2,3)); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotCModifiedArguments(c(0,1,2,3)); detach("package:testrffi", unload=T); x }
 [[1]]
 [1] 4
 
@@ -116070,7 +116070,7 @@ Error: unexpected '*' in:
 
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI12#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi", unload=T); x }
 [[1]]
 [[1]][[1]]
 NULL
@@ -116129,7 +116129,7 @@ NULL
 
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI13#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi", unload=T); x }
 [[1]]
 [[1]][[1]]
 x
@@ -116188,68 +116188,68 @@ NULL
 
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI14#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.invoke12(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.invoke12(); detach("package:testrffi", unload=T); x }
 [1] 12
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI15#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.TYPEOF(3L); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.TYPEOF(3L); detach("package:testrffi", unload=T); x }
 [1] 13
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI16#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString("hello"); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString("hello"); detach("package:testrffi", unload=T); x }
 [1] TRUE
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI17#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString(NULL); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString(NULL); detach("package:testrffi", unload=T); x }
 [1] FALSE
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI18#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.interactive(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.interactive(); detach("package:testrffi", unload=T); x }
 [1] FALSE
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI19#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- 1; x <- rffi.findVar(x, globalenv()); detach("package:testrffi"); x }
-Error: could not find function "rffi.findVar"
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- 1; x <- rffi.findvar("x", globalenv()); detach("package:testrffi", unload=T); x }
+[1] 1
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI2#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addDouble(2, 3); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.addDouble(2, 3); detach("package:testrffi", unload=T); x }
 [1] 5
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI3#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.populateIntVector(5); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.populateIntVector(5); detach("package:testrffi", unload=T); x }
 [1] 0 1 2 3 4
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI4#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.populateLogicalVector(5); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.populateLogicalVector(5); detach("package:testrffi", unload=T); x }
 [1]  TRUE    NA FALSE FALSE FALSE
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI5#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.mkStringFromChar(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.mkStringFromChar(); detach("package:testrffi", unload=T); x }
 [1] "hello"
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI6#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.mkStringFromBytes(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.mkStringFromBytes(); detach("package:testrffi", unload=T); x }
 [1] "hello"
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI7#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null(); detach("package:testrffi", unload=T); x }
 NULL
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI7C#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null.C(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null.C(); detach("package:testrffi", unload=T); x }
 NULL
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI7E#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null.E(); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.null.E(); detach("package:testrffi", unload=T); x }
 Error in .Call("null", PACKAGE = "foo") :
   "null" not available for .Call() for package "foo"
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI8#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString(character(0)); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); x <- rffi.isRString(character(0)); detach("package:testrffi", unload=T); x }
 [1] TRUE
 
 ##com.oracle.truffle.r.test.rffi.TestRFFIPackage.testRFFI9#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); a <- c(1L,2L,3L); x <- rffi.iterate_iarray(a); detach("package:testrffi"); x }
+#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); a <- c(1L,2L,3L); x <- rffi.iterate_iarray(a); detach("package:testrffi", unload=T); x }
 [1] 1 2 3
 
 ##com.oracle.truffle.r.test.rffi.TestUserRNG.testUserRNG#
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
index bbd3eb494137e31efa92a924a92201042f1a02cb..40270c5de51f4b35661184065b85a52780d0e742 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
@@ -43,8 +43,13 @@ public class TestRFFIPackage extends TestRPackages {
         tearDownUninstallTestPackages(TEST_PACKAGES);
     }
 
+    /**
+     * This is somewhat expensive to do per test, but the only alternative is to put all the
+     * micro-tests in one big test. It might be that this should be switched to an R file-based
+     * approach as the number of tests increase.
+     */
     private void assertEvalWithLibWithSetup(String setup, String test) {
-        assertEval(TestBase.template("{ library(\"testrffi\", lib.loc = \"%0\"); " + setup + "x <- " + test + "; detach(\"package:testrffi\"); x }", new String[]{TestRPackages.libLoc()}));
+        assertEval(TestBase.template("{ library(\"testrffi\", lib.loc = \"%0\"); " + setup + "x <- " + test + "; detach(\"package:testrffi\", unload=T); x }", new String[]{TestRPackages.libLoc()}));
     }
 
     private void assertEvalWithLib(String test) {
@@ -153,6 +158,6 @@ public class TestRFFIPackage extends TestRPackages {
 
     @Test
     public void testRFFI19() {
-        assertEvalWithLibWithSetup("x <- 1; ", "rffi.findVar(x, globalenv())");
+        assertEvalWithLibWithSetup("x <- 1; ", "rffi.findvar(\"x\", globalenv())");
     }
 }