diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
index 08b2380ae7f1beb403493b0dea2606c6fb6cd6e2..ff81c0002ad83c7a456d22843abb2b4c022290bd 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
@@ -136,6 +136,8 @@ static jmethodID Rf_ncolsMethodID;
 static jclass CharSXPWrapperClass;
 static jfieldID CharSXPWrapperContentsFieldID;
 
+jmethodID setCompleteMethodID;
+
 void init_internals(JNIEnv *env) {
 	Rf_ScalarIntegerMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_ScalarInteger", "(I)Lcom/oracle/truffle/r/runtime/data/RIntVector;", 1);
 	Rf_ScalarDoubleMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_ScalarDouble", "(D)Lcom/oracle/truffle/r/runtime/data/RDoubleVector;", 1);
@@ -240,6 +242,8 @@ void init_internals(JNIEnv *env) {
     Rf_copyMatrixMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_copyMatrix", "(Ljava/lang/Object;Ljava/lang/Object;I)V", 1);
     Rf_nrowsMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_nrows", "(Ljava/lang/Object;)I", 1);
     Rf_ncolsMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_ncols", "(Ljava/lang/Object;)I", 1);
+
+    setCompleteMethodID = checkGetMethodID(env, CallRFFIHelperClass, "setComplete", "(Ljava/lang/Object;Z)V", 1);
 }
 
 static jstring stringFromCharSXP(JNIEnv *thisenv, SEXP charsxp) {
diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
index 381fd1bbd330935ecbb9c4beace5183490c43502..aa7a7506b4e8ff58c4fde9ed424c98c9ff848c64 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
@@ -294,6 +294,7 @@ static void releaseNativeArray(JNIEnv *env, int i, int freedata) {
                fprintf(traceFile, "releaseNativeArray(x=%p, ix=%d, freedata=%d)\n", cv.obj, i, freedata);
 #endif
 	if (cv.obj != NULL) {
+		jboolean complete = JNI_FALSE; // pessimal
 		switch (cv.type) {
 		case INTSXP: {
 			jintArray intArray = (jintArray) cv.jArray;
@@ -307,13 +308,21 @@ static void releaseNativeArray(JNIEnv *env, int i, int freedata) {
 			int len = (*env)->GetArrayLength(env, byteArray);
 			jbyte* internalData = (*env)->GetByteArrayElements(env, byteArray, NULL);
 			int* data = (int*) cv.data;
+			complete = JNI_TRUE; // since we going to look at each element anyway
 			for (int i = 0; i < len; i++) {
-				internalData[i] = data[i] == NA_INTEGER ? 255 : (jbyte) data[i];
+				int isNA = data[i] == NA_INTEGER ? JNI_TRUE : JNI_FALSE;
+				if (isNA) {
+					internalData[i] = 255;
+					complete = JNI_FALSE;
+				} else {
+					internalData[i] = (jbyte) data[i];
+				}
+
 			}
 			(*env)->ReleaseByteArrayElements(env, byteArray, internalData, 0);
-                       if (freedata){
-                           free(data); // was malloc'ed in addNativeArray
-                       }
+            if (freedata){
+                free(data); // was malloc'ed in addNativeArray
+            }
 			break;
 		}
 
@@ -333,10 +342,13 @@ static void releaseNativeArray(JNIEnv *env, int i, int freedata) {
 		default:
 			fatalError("releaseNativeArray type");
 		}
-               if (freedata) {
-                   // free up the slot
+		// update complete status
+		(*env)->CallVoidMethod(env, cv.obj, setCompleteMethodID, cv.obj, complete);
+
+        if (freedata) {
+            // free up the slot
 		    cv.obj = NULL;
-               }
+        }
 	}
 }
 
diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h
index 1a217b586c83a8ea42af363fa6adc2cb791dfc3d..9ace813ba473f3d71d4f44b9972c9aea3fc26eda 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h
+++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h
@@ -126,6 +126,7 @@ extern jmethodID INTEGER_MethodID;
 extern jmethodID LOGICAL_MethodID;
 extern jmethodID REAL_MethodID;
 extern jmethodID RAW_MethodID;
+extern jmethodID setCompleteMethodID;
 
 extern int callDepth;
 
diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java
index 1354db03807188427ea23aa85dfa3328b9cd7305..5849eeabcc7cd2fcd6e7d881864ba24a800d6020 100644
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java
+++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/CallRFFIHelper.java
@@ -71,6 +71,7 @@ import com.oracle.truffle.r.runtime.data.RShareable;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RUnboundValue;
+import com.oracle.truffle.r.runtime.data.RVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
@@ -659,6 +660,17 @@ public class CallRFFIHelper {
         }
     }
 
+    /**
+     * Called to possibly update the "complete" status on {@code x}. N.B. {@code x} may not be an
+     * object with a concrete {@code setComplete} method, e.g. see {@link #INTEGER(Object)}.
+     */
+    public static void setComplete(Object x, boolean complete) {
+        // only care about concrete vectors
+        if (x instanceof RVector) {
+            ((RVector<?>) x).setComplete(complete);
+        }
+    }
+
     public static void logObject(Object x) {
         System.out.println("object " + x);
         System.out.println("class " + x.getClass());
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 2fcf4c4215a3084ed2aaf10b7c5874fef5cb0f7c..3043028d705efe1ff3e2eb9914fb6aae55dbbea2 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
@@ -114708,48 +114708,16 @@ Error: unexpected '*' in:
 #'\ ' == ' '
 [1] TRUE
 
-##com.oracle.truffle.r.test.rffi.TestUserRNG.testUserRNG#
-#{ dyn.load("com.oracle.truffle.r.test.native/urand/lib/liburand.so"); RNGkind("user"); print(RNGkind()); set.seed(4567); runif(10) }
-[1] "user-supplied" "Inversion"
- [1] 0.45336386 0.38848030 0.94576608 0.11726267 0.21542351 0.08672997
- [7] 0.35201276 0.16919220 0.93579263 0.26084486
-
-##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed#
-#invisible(runif(1)); length(.Random.seed)
-[1] 626
-
-##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed#
-#set.seed(42); runif(5); .Random.seed[1:10]
-[1] 0.9148060 0.9370754 0.2861395 0.8304476 0.6417455
- [1]         403           5 -1577024373  1699409082  1745430460  -928819969
- [7] -1754023851   671107948   815604674  1800709149
-
-##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext#
-#.Random.seed <- c(401, 1, 2); invisible(runif(3))
-Warning message:
-In runif(3) :
-  '.Random.seed' is not an integer vector but of type 'double', so ignored
-
-##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#
-#.Random.seed <- c(401L, 1L, 2L); runif(3)
-[1] 0.5641106 0.2932388 0.6696743
-
-##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext#
-#.Random.seed <- c(999, 1, 2); invisible(runif(3))
-Warning message:
-In runif(3) :
-  '.Random.seed' is not an integer vector but of type 'double', so ignored
-
-##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange#
-#RNGkind('Marsaglia-Multicarry'); RNGkind('Mersenne-Twister'); set.seed(2); runif(5);
-[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393
+##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 }
+[1] 5
 
-##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange#
-#invisible(runif(5)); RNGkind('Marsaglia-Multicarry'); set.seed(2); runif(5);
-[1] 0.8431527 0.5749091 0.1531976 0.3460321 0.2313936
+##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 }
+[1] 1 2 3
 
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIDotC#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.dotCModifiedArguments(c(0,1,2,3)); r1 }
+##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 }
 [[1]]
 [1] 4
 
@@ -114763,8 +114731,8 @@ In runif(3) :
 [1]  TRUE FALSE FALSE FALSE
 
 
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIExternal#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); r1 }
+##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 }
 [[1]]
 [[1]][[1]]
 NULL
@@ -114822,8 +114790,8 @@ NULL
 
 
 
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIExternalWithNames#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach("package:testrffi"); r1 }
+##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 }
 [[1]]
 [[1]][[1]]
 x
@@ -114881,48 +114849,203 @@ NULL
 
 
 
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFIManyArgs#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.invoke12(); detach("package:testrffi"); r1 }
+##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 }
 [1] 12
 
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFISimple#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); c3 <- c(1L,2L,3L); r1 <- rffi.iterate_iarray(c3); r2 <- rffi.iterate_iptr(c3); detach("package:testrffi"); list(r1, r2) }
-[[1]]
-[1] 1 2 3
+##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 }
+[1] 13
 
-[[2]]
-[1] 1 2 3
+##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 }
+[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 }
+[1] FALSE
 
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFISimple#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.addInt(2L, 3L); r2 <- rffi.addDouble(2, 3); r3 <- rffi.populateIntVector(5); r4 <- rffi.populateLogicalVector(5); detach("package:testrffi"); list(r1, r2, r3, r4) }
-[[1]]
-[1] 5
+##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 }
+[1] FALSE
 
-[[2]]
+##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"
+
+##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 }
 [1] 5
 
-[[3]]
+##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 }
 [1] 0 1 2 3 4
 
-[[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 }
 [1]  TRUE    NA FALSE FALSE FALSE
 
-
-##com.oracle.truffle.r.test.rpackages.TestRFFIPackage.testLoadTestRFFISimple#
-#{ library("testrffi", lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); r1 <- rffi.mkStringFromChar(); r2 <- rffi.mkStringFromBytes(); r3 <- rffi.null(); r4 <-rffi.isRString(character(0)); detach("package:testrffi"); list(r1, r2, r3, r4) }
-[[1]]
+##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 }
 [1] "hello"
 
-[[2]]
+##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 }
 [1] "hello"
 
-[[3]]
+##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 }
 NULL
 
-[[4]]
+##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 }
 [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 }
+[1] 1 2 3
+
+##com.oracle.truffle.r.test.rffi.TestUserRNG.testUserRNG#
+#{ dyn.load("com.oracle.truffle.r.test.native/urand/lib/liburand.so"); RNGkind("user"); print(RNGkind()); set.seed(4567); runif(10) }
+[1] "user-supplied" "Inversion"
+ [1] 0.45336386 0.38848030 0.94576608 0.11726267 0.21542351 0.08672997
+ [7] 0.35201276 0.16919220 0.93579263 0.26084486
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed#
+#invisible(runif(1)); length(.Random.seed)
+[1] 626
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testDirectReadingSeed#
+#set.seed(42); .Random.seed
+  [1]         403         624   507561766  1260545903  1362917092 -1772566379
+  [7] -1344458670  1072028587 -1293707536  1708789297 -1333339586   256895399
+ [13]   998413756  -555191411 -1047547670   -50950813 -1543487672 -1766763351
+ [19]    32923734  1971684063  1718493076 -1117926011   890393730 -1032174053
+ [25]   932479648 -1892763103 -1040205458   262148887 -1220643732  1566094973
+ [31]  -137659622  1045161427 -1555709704   178265753 -1033943674 -1034388913
+ [37] -1721830332 -1749741963 -1137867598 -2065544053   866474576   458187281
+ [43]  1218274462 -2000447353   199687964  1107998061   590795082  -858760637
+ [49]  -240079192   839017609 -1886488906 -1479389761  1595536628  1848478565
+ [55]   368165090 -1706758405  -128901632   360384001  2027084750  1372682743
+ [61] -1578682932 -1716686755  1324659578  1519053491  2044463192  -906549639
+ [67]  1851192294 -1175847633 -1083563612  -849984427   333580562  1871261035
+ [73]  1972555184  1756407281  1943215870 -1751074969  1282021500 -1397758131
+ [79]   518529450 -1421699293   488820232  -413309847  1749794070   441878687
+ [85]    81427028  1971206469 -1203675838   995493851  -366646944  -810597919
+ [91]  2006003246  1288196311  -111499476  -280946115    -4973606    75390867
+ [97]  1671430072  -422306215 -1145056698  -393285617  1823866628  1253337653
+[103]  1712504178  1846705739 -1820069616  -990520879   247466334 -1717615033
+[109]  1633935836  -246413011  1455137290 -1652210685   741252456  1555715145
+[115]   197538678 -1312148609  -687362124  1153947429   286861730   568692923
+[121]  1575576768  1925410241  1087549582  1279039415 -1208956788  1317778461
+[127] -1306414022   257836147  1550427928    86967865 -1875779418  -520138001
+[133]  1989839972  1598521365  1842848210 -1967767765 -1806646160 -1558774351
+[139] -1040440386  1215776039  1529633596 -1637672179  -121023894  -992976669
+[145] -1867768632 -1273940951  1167448534   786779743 -2131127020 -1987943163
+[151]   563160578  1714129307 -1871376352 -1347450463   590308078  -135901545
+[157] -2080269844  1678065149 -1705673574  1784846675  -871301512  1157619225
+[163]   491069190   301147599  -563099196 -1769503243  -230115790  1806462987
+[169]  1792100304  1913393553    35614238 -1176456185  -165968740   -27190035
+[175] -1087819062  1583082947   678644776 -1957034999   760393782   778033471
+[181]  -636999052   757457637  -155102622 -1134562693 -1432327296   862688641
+[187]   960447822  1400730999 -1343939764 -1742358563  2020046074   549674547
+[193] -2039609896  1111401977  -527331994  -970823505  -779241692 -1209238571
+[199]  -964822382  1395462379  -170034384 -1664281231   264366206  1603506919
+[205] -1702273540   398593741  -269270230 -1017124189  1029450632   -57883671
+[211]   647280278   686937119  -443846700  1428836549 -1446924606  1958398811
+[217] -1052543264 -1494249119  1771722670 -1095103401   972246188   258286013
+[223] -1737515686  1505268499  -883376840   350445017 -1548801082   608508815
+[229] -1454615420  -957455947  -913346830   527442379     5070480 -1974335151
+[235]  -142896418   122151367  1556997980 -1392643923  1564443530  1762940803
+[241] -2059486488 -1650363447  -520885002  1934835455  -757373644  1661447845
+[247]  1604991778  2071204923  -717868480 -1355580095  1725471246  -179039433
+[253]  -863752692 -1438942307  -762972742  1484404723  1185490072  1357252025
+[259]  2083912230   789790319  -352083484    50673557  -426437806  1252893355
+[265]  1090056688 -1651315407 -1847300802  -625631065   -46063428  1015857805
+[271]  1696986090  -525257629   569571912 -2138041431  1476940630  1044126175
+[277]   -45086060  -197788539  1234368386  1489227035  -749691488  -315664095
+[283] -1349383058   251890199 -1108361364    86033789 -1966965222  2084588755
+[289]   272055288   104766873  -876742522  -985345713  1208721220  -408355467
+[295]   346482610  -350383221  1522021712   898089233 -2087422050  1603587975
+[301]  -398783972    15107181  -239168438  -680623805 -1588532824   860922761
+[307]  -748033610 -1771805505  -331259916  -500352411 -1533811742   820114939
+[313] -1804945152   -35969791 -1906397490  2139123959   277741772  2022506333
+[319] -1321388422  1078120883 -1411710120 -1058724487  1071589094 -1584278481
+[325] -1648603996   743551829  1457318930 -1292372885  -597481296 -1389853455
+[331]  1025749502  2006806119   907256700  -259836339  2032231594   377765411
+[337]   -47150840 -1076157591  -424628202  1686380447  1392993620  1113942085
+[343] -1178271678 -1006203173  -581139360  2049892577   433488174   377669591
+[349]  1924592172   418916669 -1039261990  1002030739   158104248 -1999528615
+[355]  -768506554  1521633039  -177362428  -998811339 -1135665038  -260782773
+[361]  1087491088  1533884625   -81126306  1619492167 -1423774500 -1109731283
+[367]   -43621110 -2094372093 -1687562136 -1406692535  1903470198  1834175103
+[373]   284826292  1716946469  -566342494  1852413883  1593704384  -148730687
+[379]   881951630    -4026697  1052939148 -1227209955  -984795334   568142707
+[385] -2067553768  -503577287  -934472794  1667115503 -2072529052  -544084203
+[391]  1612022994 -1916008917  -287563920 -1823613775  -968902978 -1274348505
+[397] -1212094916  -681219571   212178282   513345507  1305794504   -97651927
+[403] -1622291242  1367991647   829521940  -612854779  1930938626   675483803
+[409] -1238947040    95299745 -1926777362 -1023949417  2064180460  -559198979
+[415]  1326612378 -1041956781  -440895112  -866362087 -1278619130   172850383
+[421] -1405979452  -384207627  1766332722   288732939   962208464 -1547538287
+[427]  1929150750  1742727943  2017824668  1738206189 -1057557046   101192899
+[433]  1380550440   669401865  -405527754 -1914703809  -339372684  1799590373
+[439]  -446073502 -2050295429  1806698112   852079745 -1640949682  1138388087
+[445]  -639506868  -656193827  2138437626   118048051  1612906712 -1008032519
+[451]  1916780646  2050506671  -101326300 -2004489515   184475026 -1662396437
+[457]  1596184112  -675089295 -1577550978  -843167257 -1257707268  1425235405
+[463] -1066236374  1924108707  1386210952   793281257   245344662  2064476959
+[469] -1555146028   456097733 -1370795582 -1220980133  -193949216   124596321
+[475] -1371166034 -1037925545 -1180330068 -1443221315    42967130  -125699565
+[481] -1814349768 -1063330599   759619270 -1177128305   656015236 -1588637515
+[487] -2075012622  -283088693 -1961805424  1984391249 -1077172770 -1822549817
+[493]  -496831908  1105641389  1026573962 -1178108285  1689253352 -2041793847
+[499]   591945718  1305105919  -412889036   750017957  1389714978 -2000282821
+[505] -1321153216   143694913  -805475058  -645395913   615250188   308808349
+[511]   276265146 -1182327053 -1934024808   913376441  1517759782 -1411377809
+[517]   418827492  1391306389   542701138  1645308331  -738571024 -1035482063
+[523]    84803646 -1032366169   548121532 -1930620531  -179816726  1283971939
+[529]   173126984   518705833 -2124003754   382644447  1935537556   491400069
+[535]  1679792770  1655264283  -285689696 -1221855199  -504340626 -2117926633
+[541]  -783480212 -1901800323  1833271578 -1991199789 -1030441224   358161561
+[547] -1150768250   252520527  -521909692  -120001419   908872370  -336274805
+[553]  1018630224   -88334319  1985448606 -1061026169  1010504988  1350456173
+[559]   852645706 -1205295037   828187816  1729815177  -795779914 -1026393153
+[565]   781503220 -1503073947  2135033570  1226505467  -428846080 -1875426303
+[571] -1900641842   244017143   568380364  1462275677  1762769274 -1021921101
+[577]   424017496  -917560199  1572035046  2115349295 -1137018972   713630293
+[583]   686018322   520272747 -1273003088  1520198641  -465550082  1341531495
+[589] -1385615748  1662158157  -874076246 -1511922397   866796552  1221911145
+[595]    73507606   445494943   744509524 -1115121851  1297392450  -598534693
+[601] -1132486816   212500449  1290261550   798572247   616512812  1617639485
+[607]  -537648678  -569299565  -526060104   978000985 -1695598522  1873911311
+[613]   340874500 -1149876171  1737982834   695405643   353085200   417372113
+[619]  -346017954 -1916029881 -1735526436  1461823277   580724746  -622095869
+[625]  -686746776   705745481
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext#
+#.Random.seed <- c(401, 1, 2); invisible(runif(3))
+Warning message:
+In runif(3) :
+  '.Random.seed' is not an integer vector but of type 'double', so ignored
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#
+#.Random.seed <- c(401L, 1L, 2L); runif(3)
+[1] 0.5641106 0.2932388 0.6696743
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testDirectSeedAssignment#Output.IgnoreWarningContext#
+#.Random.seed <- c(999, 1, 2); invisible(runif(3))
+Warning message:
+In runif(3) :
+  '.Random.seed' is not an integer vector but of type 'double', so ignored
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange#
+#RNGkind('Marsaglia-Multicarry'); RNGkind('Mersenne-Twister'); set.seed(2); runif(5);
+[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393
+
+##com.oracle.truffle.r.test.rng.TestRRNG.testGeneratorChange#
+#invisible(runif(5)); RNGkind('Marsaglia-Multicarry'); set.seed(2); runif(5);
+[1] 0.8431527 0.5749091 0.1531976 0.3460321 0.2313936
 
 ##com.oracle.truffle.r.test.rpackages.TestRecommendedPackages.testLoad#Ignored.OutputFormatting#Context.NonShared#Context.LongTimeout#
 #{ library(KernSmooth, lib.loc = "tmptest/com.oracle.truffle.r.test.rpackages"); detach("package:KernSmooth"); }
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
new file mode 100644
index 0000000000000000000000000000000000000000..1b8cd192ef964076af0a275b3de0b31ace62002a
--- /dev/null
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rffi/TestRFFIPackage.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.test.rffi;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.oracle.truffle.r.test.TestBase;
+import com.oracle.truffle.r.test.rpackages.TestRPackages;
+
+public class TestRFFIPackage extends TestRPackages {
+
+    private static final String[] TEST_PACKAGES = new String[]{"testrffi"};
+
+    @BeforeClass
+    public static void setupInstallMyTestPackages() {
+        setupInstallTestPackages(TEST_PACKAGES);
+    }
+
+    @AfterClass
+    public static void tearDownUninstallMyTestPackages() {
+        tearDownUninstallTestPackages(TEST_PACKAGES);
+    }
+
+    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()}));
+    }
+
+    private void assertEvalWithLib(String test) {
+        assertEvalWithLibWithSetup("", test);
+    }
+
+    @Test
+    public void testRFFI1() {
+        assertEvalWithLib("rffi.addInt(2L, 3L)");
+    }
+
+    @Test
+    public void testRFFI2() {
+        assertEvalWithLib("rffi.addDouble(2, 3)");
+    }
+
+    @Test
+    public void testRFFI3() {
+        assertEvalWithLib("rffi.populateIntVector(5)");
+    }
+
+    @Test
+    public void testRFFI4() {
+        assertEvalWithLib("rffi.populateLogicalVector(5)");
+    }
+
+    @Test
+    public void testRFFI5() {
+        assertEvalWithLib("rffi.mkStringFromChar()");
+    }
+
+    @Test
+    public void testRFFI6() {
+        assertEvalWithLib("rffi.mkStringFromBytes()");
+    }
+
+    @Test
+    public void testRFFI7() {
+        assertEvalWithLib("rffi.null()");
+    }
+
+    @Test
+    public void testRFFI8() {
+        assertEvalWithLib("rffi.isRString(character(0))");
+    }
+
+    @Test
+    public void testRFFI9() {
+        assertEvalWithLibWithSetup("a <- c(1L,2L,3L); ", "rffi.iterate_iarray(a)");
+    }
+
+    @Test
+    public void testRFFI10() {
+        assertEvalWithLibWithSetup("a <- c(1L,2L,3L); ", "rffi.iterate_iptr(a)");
+    }
+
+    @Test
+    public void testRFFI11() {
+        assertEvalWithLib("rffi.dotCModifiedArguments(c(0,1,2,3))");
+    }
+
+    @Test
+    public void testRFFI12() {
+        assertEvalWithLib("rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12))");
+    }
+
+    @Test
+    public void testRFFI13() {
+        assertEvalWithLib("rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12))");
+    }
+
+    @Test
+    public void testRFFI14() {
+        assertEvalWithLib("rffi.invoke12()");
+    }
+
+    @Test
+    public void testRFFI15() {
+        assertEvalWithLib("rffi.TYPEOF(3L)");
+    }
+
+    @Test
+    public void testRFFI16() {
+        assertEvalWithLib("rffi.isRString(\"hello\")");
+    }
+
+    @Test
+    public void testRFFI17() {
+        assertEvalWithLib("rffi.isRString(NULL)");
+    }
+
+    @Test
+    public void testRFFI18() {
+        assertEvalWithLib("rffi.interactive()");
+    }
+
+    @Test
+    public void testRFFI19() {
+        assertEvalWithLibWithSetup("x <- 1; ", "rffi.findVar(x, globalenv())");
+    }
+}
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestRFFIPackage.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestRFFIPackage.java
deleted file mode 100644
index c6c3f540298bd422ff25ebe384c0eaa8bcdd7ff9..0000000000000000000000000000000000000000
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/rpackages/TestRFFIPackage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.truffle.r.test.rpackages;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import com.oracle.truffle.r.test.TestBase;
-
-/**
- * Tests related to the loading, etc. of R packages.
- */
-public class TestRFFIPackage extends TestRPackages {
-
-    private static final String[] TEST_PACKAGES = new String[]{"testrffi"};
-
-    @BeforeClass
-    public static void setupInstallMyTestPackages() {
-        setupInstallTestPackages(TEST_PACKAGES);
-    }
-
-    @AfterClass
-    public static void tearDownUninstallMyTestPackages() {
-        tearDownUninstallTestPackages(TEST_PACKAGES);
-    }
-
-    @Test
-    public void testLoadTestRFFISimple() {
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.addInt(2L, 3L); r2 <- rffi.addDouble(2, 3); r3 <- rffi.populateIntVector(5); " +
-                                        "r4 <- rffi.populateLogicalVector(5); detach(\"package:testrffi\"); list(r1, r2, r3, r4) }",
-                        new String[]{TestRPackages.libLoc()}));
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.mkStringFromChar(); r2 <- rffi.mkStringFromBytes(); r3 <- rffi.null(); " +
-                                        "r4 <-rffi.isRString(character(0)); detach(\"package:testrffi\"); list(r1, r2, r3, r4) }",
-                        new String[]{TestRPackages.libLoc()}));
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); c3 <- c(1L,2L,3L); r1 <- rffi.iterate_iarray(c3); r2 <- rffi.iterate_iptr(c3); " +
-                                        "detach(\"package:testrffi\"); list(r1, r2) }",
-                        new String[]{TestRPackages.libLoc()}));
-    }
-
-    @Test
-    public void testLoadTestRFFIDotC() {
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.dotCModifiedArguments(c(0,1,2,3)); r1 }",
-                        new String[]{TestRPackages.libLoc()}));
-    }
-
-    @Test
-    public void testLoadTestRFFIExternal() {
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.dotExternalAccessArgs(1L, 3, c(1,2,3), c('a', 'b'), 'b', TRUE, as.raw(12)); detach(\"package:testrffi\"); r1 }",
-                        new String[]{TestRPackages.libLoc()}));
-    }
-
-    @Test
-    public void testLoadTestRFFIExternalWithNames() {
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.dotExternalAccessArgs(x=1L, 3, c(1,2,3), y=c('a', 'b'), 'b', TRUE, as.raw(12)); detach(\"package:testrffi\"); r1 }",
-                        new String[]{TestRPackages.libLoc()}));
-    }
-
-    @Test
-    public void testLoadTestRFFIManyArgs() {
-        assertEval(TestBase.template(
-                        "{ library(\"testrffi\", lib.loc = \"%0\"); r1 <- rffi.invoke12(); detach(\"package:testrffi\"); r1 }",
-                        new String[]{TestRPackages.libLoc()}));
-    }
-
-}