diff --git a/.gitignore b/.gitignore
index 3eed6ca4779f8143dad9407775f4be957a28d9d6..756f43343ccdae38768bd7d156b05bbf8109fabc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -88,8 +88,8 @@ output.cfg
 **/nbproject/**
 **/build.xml
 /scratch/
-/test/
-/test_gnur/
+/test.fastr/
+/test.gnur/
 scratch/
 bin/
 share/
diff --git a/com.oracle.truffle.r.native/fficall/src/include/Defn.h b/com.oracle.truffle.r.native/fficall/src/include/Defn.h
index d431e33c736142a2c2e51e16815c95a9593e528f..2b4d813d23ac84d29dd8e6990d3c4f440ddc9e07 100644
--- a/com.oracle.truffle.r.native/fficall/src/include/Defn.h
+++ b/com.oracle.truffle.r.native/fficall/src/include/Defn.h
@@ -61,7 +61,7 @@ extern Rboolean mbcslocale;
 extern Rboolean latin1locale;
 
 #define INI_as(v)
-extern char OutDec	INI_as('.');
+extern char* OutDec	INI_as(".");
 extern Rboolean known_to_be_latin1 INI_as(FALSE);
 extern Rboolean known_to_be_utf8 INI_as(FALSE);
 
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 4a7fdffdd3cd064131e9ed347aecae97bd9c66df..af705d11e94160a54ca31a0d02fece4069410853 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
@@ -54,6 +54,7 @@ static jmethodID Rf_warningcallMethodID;
 static jmethodID Rf_warningMethodID;
 static jmethodID Rf_errorMethodID;
 static jmethodID Rf_NewHashedEnvMethodID;
+static jmethodID Rf_classgetsMethodID;
 static jmethodID Rf_rPsortMethodID;
 static jmethodID Rf_iPsortMethodID;
 static jmethodID RprintfMethodID;
@@ -154,6 +155,7 @@ void init_internals(JNIEnv *env) {
 	Rf_duplicateMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_duplicate", "(Ljava/lang/Object;I)Ljava/lang/Object;", 1);
 	Rf_anyDuplicatedMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_anyDuplicated", "(Ljava/lang/Object;I)I", 1);
 	Rf_NewHashedEnvMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_createNewEnv", "(Lcom/oracle/truffle/r/runtime/env/REnvironment;Ljava/lang/String;ZI)Lcom/oracle/truffle/r/runtime/env/REnvironment;", 1);
+	Rf_classgetsMethodID = checkGetMethodID(env, CallRFFIHelperClass, "Rf_classgets", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 1);
 	RprintfMethodID = checkGetMethodID(env, CallRFFIHelperClass, "printf", "(Ljava/lang/String;)V", 1);
 	R_do_MAKE_CLASS_MethodID = checkGetMethodID(env, CallRFFIHelperClass, "R_do_MAKE_CLASS", "(Ljava/lang/String;)Ljava/lang/Object;", 1);
 	R_FindNamespaceMethodID = checkGetMethodID(env, CallRFFIHelperClass, "R_FindNamespace", "(Ljava/lang/Object;)Ljava/lang/Object;", 1);
@@ -675,9 +677,10 @@ SEXP R_NewHashedEnv(SEXP parent, SEXP size) {
 	return checkRef(thisenv, result);
 }
 
-SEXP Rf_classgets(SEXP x, SEXP y) {
-	unimplemented("Rf_classgets");
-	return NULL;
+SEXP Rf_classgets(SEXP vec, SEXP klass) {
+	JNIEnv *thisenv = getEnv();
+	SEXP result = (*thisenv)->CallStaticObjectMethod(thisenv, RDataFactoryClass, Rf_classgetsMethodID, vec, klass);
+	return checkRef(thisenv, result);
 }
 
 const char *Rf_translateChar(SEXP x) {
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 c083d5a7811e31bc3d106fb65b55defeb8c4a6c8..381fd1bbd330935ecbb9c4beace5183490c43502 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
@@ -384,7 +384,7 @@ SEXP addGlobalRef(JNIEnv *env, SEXP obj, int permanent) {
 
 SEXP checkRef(JNIEnv *env, SEXP obj) {
 	SEXP gref = findCachedGlobalRef(env, obj);
-	TRACE(TARGpp, obj, global);
+	TRACE(TARGpp, obj, gref);
 	if (gref == NULL) {
 		return obj;
 	} else {
diff --git a/com.oracle.truffle.r.native/fficall/src/variable_defs/variable_defs.h b/com.oracle.truffle.r.native/fficall/src/variable_defs/variable_defs.h
index 9ab6cb36a2dd04d30fd90242b6955138ab369ccf..01f2643b7dd05d124e0cfd40815233163a5ee0d1 100644
--- a/com.oracle.truffle.r.native/fficall/src/variable_defs/variable_defs.h
+++ b/com.oracle.truffle.r.native/fficall/src/variable_defs/variable_defs.h
@@ -89,7 +89,7 @@ Rboolean R_interrupts_suspended;
 int R_interrupts_pending;
 Rboolean mbcslocale;
 Rboolean useaqua;
-char OutDec = '.';
+char* OutDec = ".";
 Rboolean utf8locale = FALSE;
 Rboolean mbcslocale = FALSE;
 Rboolean latin1locale = FALSE;
diff --git a/com.oracle.truffle.r.native/gnur/Makefile.gnur b/com.oracle.truffle.r.native/gnur/Makefile.gnur
index 62071263f0a093d53956dba2244043416e70cdae..29c57579c3e0d2c0f96e5eca81d56583072cf3ab 100644
--- a/com.oracle.truffle.r.native/gnur/Makefile.gnur
+++ b/com.oracle.truffle.r.native/gnur/Makefile.gnur
@@ -81,8 +81,8 @@ ifeq ($(OSNAME), SunOS)
     ICONV := libiconv-1.14
     $(shell mkdir -p iconv_install)
     ICONV_INSTALL := $(abspath iconv_install)
-    ICONV_CFLAGS := "$(CFLAGS) -m64 -xcode=pic32 -I$(ICONV_INSTALL)/include"
-    ICONV_LDFLAGS := -L$(ICONV_INSTALL)/lib 
+    ICONV_CFLAGS := "$(CFLAGS) -m64 -xcode=pic32 -I$(ICONV_INSTALL)/include -I$(XZ_HOME)/include"
+    ICONV_LDFLAGS := "-m64 -L$(ICONV_INSTALL)/lib -L$(XZ_HOME)/lib"
     ICONV_CONFIG_FLAGS := CC=cc CXX=CC CFLAGS=$(ICONV_CFLAGS) LDFLAGS=$(ICONV_LDFLAGS)
 # required for Solaris compiler >=12.2, see Appendix C of R installation guide: 
 # http://cran.r-project.org/doc/manuals/r-release/R-admin.html#Solaris 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java
index 82458154281a76cb2b7d6b71a4e48a5471be5e55..6628d127dc2cf233ff558a54283552d84eee6909 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java
@@ -28,9 +28,11 @@ import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
+import com.oracle.truffle.api.dsl.TypeSystemReference;
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.builtin.CastBuilder;
@@ -42,6 +44,7 @@ import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RAttributeProfiles;
+import com.oracle.truffle.r.runtime.data.RAttributes;
 import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RDouble;
 import com.oracle.truffle.r.runtime.data.RExpression;
@@ -472,48 +475,49 @@ public class IsTypeFunctions {
     @RBuiltin(name = "is.vector", kind = INTERNAL, parameterNames = {"x", "mode"}, behavior = PURE)
     public abstract static class IsVector extends RBuiltinNode {
 
-        private final RAttributeProfiles attrProfiles = RAttributeProfiles.create();
+        private final ConditionProfile attrNull = ConditionProfile.createBinaryProfile();
+        private final ConditionProfile attrEmpty = ConditionProfile.createBinaryProfile();
+        private final ConditionProfile attrNames = ConditionProfile.createBinaryProfile();
 
         @Override
         protected void createCasts(CastBuilder casts) {
             casts.arg("x").conf(c -> c.allowNull().mustNotBeMissing(null, RError.Message.ARGUMENT_MISSING, "x"));
-            casts.arg("mode").defaultError(this, RError.Message.INVALID_ARGUMENT, "mode").mustBe(stringValue()).asStringVector().mustBe(size(1));
+            casts.arg("mode").defaultError(this, RError.Message.INVALID_ARGUMENT, "mode").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst();
         }
 
-        @Override
-        public Object[] getDefaultParameterValues() {
-            // INTERNAL does not need default parameters
-            return RNode.EMPTY_OBJECT_ARRAY;
+        @TruffleBoundary
+        protected static RType typeFromMode(String mode) {
+            return RType.fromMode(mode);
         }
 
-        @Specialization
-        protected byte isVector(RAbstractVector x, String mode) {
-            if (!namesOnlyOrNoAttr(x) || !modeIsAnyOrMatches(x, mode)) {
-                return RRuntime.LOGICAL_FALSE;
-            } else {
+        @Specialization(limit = "5", guards = "cachedMode == mode")
+        protected byte isVectorCached(RAbstractVector x, String mode,
+                        @Cached("mode") String cachedMode,
+                        @Cached("typeFromMode(mode)") RType type) {
+            if (namesOnlyOrNoAttr(x) && (type == RType.Any || x.getRType() == type)) {
                 return RRuntime.LOGICAL_TRUE;
+            } else {
+                return RRuntime.LOGICAL_FALSE;
             }
         }
 
+        @Specialization(contains = "isVectorCached")
+        protected byte isVector(RAbstractVector x, String mode) {
+            return isVectorCached(x, mode, mode, typeFromMode(mode));
+        }
+
         @Fallback
         protected byte isVector(Object x, Object mode) {
             return RRuntime.LOGICAL_FALSE;
         }
 
         private boolean namesOnlyOrNoAttr(RAbstractVector x) {
-            // there should be no attributes other than names
-            if (x.getNames(attrProfiles) == null) {
-                assert x.getAttributes() == null || x.getAttributes().size() > 0;
-                return x.getAttributes() == null ? true : false;
+            RAttributes attributes = x.getAttributes();
+            if (attrNull.profile(attributes == null) || attrEmpty.profile(attributes.size() == 0)) {
+                return true;
             } else {
-                assert x.getAttributes() != null;
-                return x.getAttributes().size() == 1 ? true : false;
+                return attributes.size() == 1 && attrNames.profile(attributes.getNameAtIndex(0) == RRuntime.NAMES_ATTR_KEY);
             }
         }
-
-        private static boolean modeIsAnyOrMatches(RAbstractVector x, String mode) {
-            return RType.Any.getName().equals(mode) || (x instanceof RList && mode.equals("list")) || (x.getElementClass() == RDouble.class && RType.Double.getName().equals(mode)) ||
-                            RRuntime.classToString(x.getElementClass()).equals(mode);
-        }
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quantifier.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quantifier.java
index 4d482f36010504900fd34ed5d067042dc7e55cef..54ea1667f9c2ad16c2241a538238538824630191 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quantifier.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Quantifier.java
@@ -22,8 +22,10 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
-import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.instanceOf;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.integerValue;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.logicalValue;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.size;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean;
 
 import java.util.function.Function;
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sample2.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sample2.java
index 36acfb3a7d69ad400b47ab33447114bb3fe0a40c..54c5da31bc222161b8039a957a99fef263eadaa9 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sample2.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sample2.java
@@ -113,7 +113,7 @@ public abstract class Sample2 extends RBuiltinNode {
         }
     }
 
-    private double ru() {
+    private static double ru() {
         return (Math.floor(U * RRNG.unifRand()) + RRNG.unifRand()) / U;
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/SpecialsUtils.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/SpecialsUtils.java
index 47862084142edcf3fdf6232a1b40f7d2a55843b1..7618a1d5e34b074989a62718d94ea289367d62ab 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/SpecialsUtils.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/SpecialsUtils.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.nodes.builtin.base.infix;
 
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
+import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.function.ClassHierarchyNode;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.data.RList;
@@ -49,7 +50,10 @@ class SpecialsUtils {
      */
     abstract static class SubscriptSpecialCommon extends RNode {
 
-        protected static boolean isValidIndex(RAbstractVector vector, int index) {
+        protected final ValueProfile vectorClassProfile = ValueProfile.createClassProfile();
+
+        protected boolean isValidIndex(RAbstractVector vector, int index) {
+            vector = vectorClassProfile.profile(vector);
             return index >= 1 && index <= vector.getLength();
         }
 
@@ -97,7 +101,7 @@ class SpecialsUtils {
             return cachedField == null || (cachedField == field && list.getNames() == cachedNames);
         }
 
-        protected final int getIndex(RAbstractStringVector names, String field) {
+        protected static int getIndex(RAbstractStringVector names, String field) {
             for (int i = 0; i < names.getLength(); i++) {
                 String current = names.getDataAt(i);
                 if (current == field || current.equals(field)) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subscript.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subscript.java
index 3a88c5ec748882bb8d2b9c2b75a58972e53c037f..ed74d6b51b07cdd7a9495ded353dfff1c8343d90 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subscript.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subscript.java
@@ -71,33 +71,33 @@ abstract class SubscriptSpecialBase extends SubscriptSpecialCommon {
     }
 
     @Specialization(guards = {"simpleVector(vector)", "isValidIndex(vector, index)"})
-    protected static int access(RAbstractIntVector vector, int index) {
-        return vector.getDataAt(index - 1);
+    protected int access(RAbstractIntVector vector, int index) {
+        return vectorClassProfile.profile(vector).getDataAt(index - 1);
     }
 
     @Specialization(guards = {"simpleVector(vector)", "isValidIndex(vector, index)"})
-    protected static double access(RAbstractDoubleVector vector, int index) {
-        return vector.getDataAt(index - 1);
+    protected double access(RAbstractDoubleVector vector, int index) {
+        return vectorClassProfile.profile(vector).getDataAt(index - 1);
     }
 
     @Specialization(guards = {"simpleVector(vector)", "isValidIndex(vector, index)"})
-    protected static String access(RAbstractStringVector vector, int index) {
-        return vector.getDataAt(index - 1);
+    protected String access(RAbstractStringVector vector, int index) {
+        return vectorClassProfile.profile(vector).getDataAt(index - 1);
     }
 
     @Specialization(guards = {"simpleVector(vector)", "isValidDoubleIndex(vector, index)"})
     protected int access(RAbstractIntVector vector, double index) {
-        return vector.getDataAt(toIndex(index) - 1);
+        return vectorClassProfile.profile(vector).getDataAt(toIndex(index) - 1);
     }
 
     @Specialization(guards = {"simpleVector(vector)", "isValidDoubleIndex(vector, index)"})
     protected double access(RAbstractDoubleVector vector, double index) {
-        return vector.getDataAt(toIndex(index) - 1);
+        return vectorClassProfile.profile(vector).getDataAt(toIndex(index) - 1);
     }
 
     @Specialization(guards = {"simpleVector(vector)", "isValidDoubleIndex(vector, index)"})
     protected String access(RAbstractStringVector vector, double index) {
-        return vector.getDataAt(toIndex(index) - 1);
+        return vectorClassProfile.profile(vector).getDataAt(toIndex(index) - 1);
     }
 
     @SuppressWarnings("unused")
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subset.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subset.java
index 09f0694fc7d050d6ce1b44fc01a32a4482b6754b..4b3166024df80800419b87a3ec2843f9f62f46b7 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subset.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subset.java
@@ -59,6 +59,7 @@ abstract class SubsetSpecial extends SubscriptSpecialBase {
 
     @Override
     protected boolean simpleVector(RAbstractVector vector) {
+        vector = vectorClassProfile.profile(vector);
         return super.simpleVector(vector) && vector.getNames(attrProfiles) == null;
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/system/ProcessSystemFunctionFactory.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/system/ProcessSystemFunctionFactory.java
index d1f8116fb1d97a82df6c308cdf8653f4c3576dc4..fac23adfb4ffb9968ee6fd1d543732440c8d4ec2 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/system/ProcessSystemFunctionFactory.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/system/ProcessSystemFunctionFactory.java
@@ -26,6 +26,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.ProcessBuilder.Redirect;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.frame.VirtualFrame;
@@ -35,6 +36,10 @@ import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 
 public class ProcessSystemFunctionFactory extends SystemFunctionFactory {
+    /**
+     * Temporary support for (test) processes that hang.
+     */
+    private static final String TIMEOUT = "FASTR_PROCESS_TIMEOUT";
 
     @Override
     public Object execute(VirtualFrame frame, String command, boolean intern) {
@@ -65,7 +70,20 @@ public class ProcessSystemFunctionFactory extends SystemFunctionFactory {
                 readThread = new ProcessOutputManager.OutputThreadVariable("system", os);
                 readThread.start();
             }
-            rc = p.waitFor();
+            String timeoutVar = System.getenv(TIMEOUT);
+            if (timeoutVar != null) {
+                long timeout;
+                try {
+                    timeout = Integer.parseInt(timeoutVar);
+                } catch (NumberFormatException ex) {
+                    timeout = 5;
+                }
+                boolean exited = p.waitFor(timeout, TimeUnit.MINUTES);
+                rc = exited ? 0 : 127;
+            } else {
+                rc = p.waitFor();
+            }
+
             if (intern) {
                 // capture output in character vector
                 String output = new String(readThread.getData(), 0, readThread.getTotalRead());
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java
index f42f5c7b72ffb6682738120fb9b90d8485bce874..67a858a2e7d25726f7db1b0591f28919e57955f3 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java
@@ -68,6 +68,7 @@ final class CachedExtractVectorNode extends CachedVectorNode {
 
     private final VectorLengthProfile vectorLengthProfile = VectorLengthProfile.create();
     private final RAttributeProfiles vectorNamesProfile = RAttributeProfiles.create();
+    private final ValueProfile vectorClassProfile = ValueProfile.createClassProfile();
 
     @Child private WriteIndexedVectorNode writeVectorNode;
     @Child private PositionsCheckNode positionsCheckNode;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
index e9c34ebf32fb76d030c01f76e46c41fd19ac43f4..f5362334867e54c39902d5adaf15cbaa05956241 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
@@ -88,6 +88,8 @@ final class CachedReplaceVectorNode extends CachedVectorNode {
     private final ConditionProfile emptyReplacementProfile = ConditionProfile.createBinaryProfile();
     private final ConditionProfile completeVectorProfile = ConditionProfile.createBinaryProfile();
 
+    private final ValueProfile vectorTypeProfile = ValueProfile.createClassProfile();
+
     private final RType valueType;
     private final RType castType;
     private final boolean updatePositionNames;
@@ -262,6 +264,7 @@ final class CachedReplaceVectorNode extends CachedVectorNode {
         // resizing/materializing 'vector', it will be marked as 'temporary' and its refCount
         // incremented during the assignment step.
 
+        vector = vectorTypeProfile.profile(vector);
         vectorLength = targetLengthProfile.profile(vector.getLength());
 
         if (mode.isSubset()) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java
index 177b16a70499c1366fcb1fef5c3640acbb72a669..67f7371186c1adb6b6d202909e62e288c234aa72 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentMatcher.java
@@ -501,7 +501,7 @@ public class ArgumentMatcher {
         int varArgIndex = formalSignature.getVarArgIndex();
         boolean hasVarArgs = varArgIndex != ArgumentsSignature.NO_VARARG;
 
-        // MATCH by exact name
+        // MATCH by exact and partial name
         int[] resultPermutation = new int[formalSignature.getLength()];
         String[] resultSignature = new String[formalSignature.getLength()];
         Arrays.fill(resultPermutation, MatchPermutation.UNMATCHED);
@@ -509,21 +509,20 @@ public class ArgumentMatcher {
 
         boolean[] matchedSuppliedArgs = new boolean[signature.getLength()];
         for (int suppliedIndex = 0; suppliedIndex < signature.getLength(); suppliedIndex++) {
-            if (signature.getName(suppliedIndex) == null || signature.getName(suppliedIndex).isEmpty()) {
+            String suppliedName = signature.getName(suppliedIndex);
+            if (suppliedName == null || suppliedName.isEmpty()) {
                 continue;
             }
 
             // Search for argument name inside formal arguments
-            int formalIndex = findParameterPosition(formalSignature, signature.getName(suppliedIndex), resultPermutation, suppliedIndex, hasVarArgs, callingNode, varArgIndex, errorString, builtin);
+            int formalIndex = findParameterPosition(formalSignature, suppliedName, resultPermutation, suppliedIndex, hasVarArgs, callingNode, varArgIndex, errorString, builtin);
             if (formalIndex != MatchPermutation.UNMATCHED) {
                 resultPermutation[formalIndex] = suppliedIndex;
-                resultSignature[formalIndex] = signature.getName(suppliedIndex);
+                resultSignature[formalIndex] = suppliedName;
                 matchedSuppliedArgs[suppliedIndex] = true;
             }
         }
 
-        // TODO MATCH by partial name (up to the vararg, which consumes all non-exact matches)
-
         // MATCH by position
         int suppliedIndex = -1;
         int regularArgumentCount = hasVarArgs ? varArgIndex : formalSignature.getLength();
@@ -631,37 +630,41 @@ public class ArgumentMatcher {
      */
     private static <T> int findParameterPosition(ArgumentsSignature formalsSignature, String suppliedName, int[] resultPermutation, int suppliedIndex, boolean hasVarArgs, RBaseNode callingNode,
                     int varArgIndex, IntFunction<String> errorString, RBuiltinDescriptor builtin) {
-        int found = MatchPermutation.UNMATCHED;
+        assert suppliedName != null && !suppliedName.isEmpty();
         for (int i = 0; i < formalsSignature.getLength(); i++) {
             String formalName = formalsSignature.getName(i);
-            if (formalName == null) {
-                continue;
+            if (formalName != null) {
+                if (formalName.equals(suppliedName)) {
+                    if (resultPermutation[i] != MatchPermutation.UNMATCHED) {
+                        if (builtin != null && builtin.getKind() == RBuiltinKind.PRIMITIVE && hasVarArgs) {
+                            // for primitives, the first argument is matched, and the others are
+                            // folded
+                            // into varargs, for example:
+                            // x<-1:64; dim(x)<-c(4,4,2,2); x[1,drop=FALSE,1,drop=TRUE,-1]
+                            return MatchPermutation.UNMATCHED;
+                        } else {
+                            // Has already been matched: Error!
+                            throw RError.error(callingNode, RError.Message.FORMAL_MATCHED_MULTIPLE, formalName);
+                        }
+                    }
+                    return i;
+                }
             }
-
-            if (formalName.equals(suppliedName)) {
-                found = i;
-                if (resultPermutation[found] != MatchPermutation.UNMATCHED) {
-                    if (builtin != null && builtin.getKind() == RBuiltinKind.PRIMITIVE && hasVarArgs) {
-                        // for primitives, the first argument is matched, and the others are folded
-                        // into varargs, for example:
-                        // x<-1:64; dim(x)<-c(4,4,2,2); x[1,drop=FALSE,1,drop=TRUE,-1]
-                        found = MatchPermutation.UNMATCHED;
-                    } else {
-                        // Has already been matched: Error!
+        }
+        int found = MatchPermutation.UNMATCHED;
+        for (int i = 0; i < formalsSignature.getLength(); i++) {
+            String formalName = formalsSignature.getName(i);
+            if (formalName != null) {
+                if (formalName.startsWith(suppliedName) && ((varArgIndex != ArgumentsSignature.NO_VARARG && i < varArgIndex) || varArgIndex == ArgumentsSignature.NO_VARARG)) {
+                    // partial-match only if the formal argument is positioned before ...
+                    if (found >= 0) {
+                        throw RError.error(callingNode, RError.Message.ARGUMENT_MATCHES_MULTIPLE, 1 + suppliedIndex);
+                    }
+                    found = i;
+                    if (resultPermutation[found] != MatchPermutation.UNMATCHED) {
                         throw RError.error(callingNode, RError.Message.FORMAL_MATCHED_MULTIPLE, formalName);
                     }
                 }
-                break;
-            } else if (!suppliedName.isEmpty() && formalName.startsWith(suppliedName) &&
-                            ((varArgIndex != ArgumentsSignature.NO_VARARG && i < varArgIndex) || varArgIndex == ArgumentsSignature.NO_VARARG)) {
-                // partial-match only if the formal argument is positioned before ...
-                if (found >= 0) {
-                    throw RError.error(callingNode, RError.Message.ARGUMENT_MATCHES_MULTIPLE, 1 + suppliedIndex);
-                }
-                found = i;
-                if (resultPermutation[found] != MatchPermutation.UNMATCHED) {
-                    throw RError.error(callingNode, RError.Message.FORMAL_MATCHED_MULTIPLE, formalName);
-                }
             }
         }
         if (found >= 0 || hasVarArgs) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ClassHierarchyNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ClassHierarchyNode.java
index 5b53a4755112480eec0216da8c54be0c97a52ed7..ac47fa670537deda57b0a0adf5378f332d69c0d1 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ClassHierarchyNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ClassHierarchyNode.java
@@ -122,13 +122,15 @@ public abstract class ClassHierarchyNode extends UnaryNode {
                     @Cached("createClassProfile()") ValueProfile argProfile) {
 
         RAttributes attributes;
-        RAttributable profiledArg;
         if (attrStorageProfile.profile(arg instanceof RAttributeStorage)) {
             // Note: the seemingly unnecessary cast is here to ensure the method can be inlined
+            // Note2: the attrStorageProfile and cast is better at helping compiler to inline
+            // 'getAttributes' than just the ValueProfile in else branch, which degrades when it
+            // sees two different classes
             attributes = ((RAttributeStorage) arg).getAttributes();
         } else {
-            profiledArg = argProfile.profile(arg);
-            attributes = profiledArg.getAttributes();
+            arg = argProfile.profile(arg);
+            attributes = arg.getAttributes();
         }
         if (noAttributesProfile.profile(attributes != null)) {
             if (access == null) {
@@ -147,7 +149,7 @@ public abstract class ClassHierarchyNode extends UnaryNode {
                 return classHierarchy;
             }
         }
-        return withImplicitTypes ? arg.getImplicitClass() : null;
+        return withImplicitTypes ? argProfile.profile(arg).getImplicitClass() : null;
     }
 
     protected static boolean isRTypedValue(Object obj) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/WrapDefaultArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/WrapDefaultArgumentNode.java
index 0d9c02ebf52ab89c5fbf33243e42107d19b7c81b..bb3d87e04f386fd7b5b6ab63d89e1c9c9ef5bb22 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/WrapDefaultArgumentNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/WrapDefaultArgumentNode.java
@@ -49,7 +49,7 @@ public final class WrapDefaultArgumentNode extends WrapArgumentBaseNode {
         if (rShareable != null) {
             shareable.enter();
             if (isShared.profile(rShareable.isShared())) {
-                return ((RShareable) result).copy();
+                return rShareable.copy();
             } else {
                 ((RShareable) result).incRefCount();
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/VarArgsHelper.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/VarArgsHelper.java
index b0b110efecb3470bd4b48d404f831aa15b605cfd..cd3d69081b061d4175b3841ab7a1282911a4025c 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/VarArgsHelper.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/signature/VarArgsHelper.java
@@ -115,9 +115,9 @@ public final class VarArgsHelper {
             if (varArgs[valuesIdx] != null) {
                 assert values[valuesIdx] instanceof RArgsValuesAndNames;
                 assert ((RArgsValuesAndNames) values[valuesIdx]).getSignature() == varArgs[valuesIdx];
-                RArgsValuesAndNames varArgs = (RArgsValuesAndNames) values[valuesIdx];
-                for (int i = 0; i < varArgs.getLength(); i++) {
-                    result[resultIdx++] = varArgs.getArgument(i);
+                RArgsValuesAndNames varArgsValues = (RArgsValuesAndNames) values[valuesIdx];
+                for (int i = 0; i < varArgsValues.getLength(); i++) {
+                    result[resultIdx++] = varArgsValues.getArgument(i);
                 }
             } else if (!signature.isUnmatched(valuesIdx)) {
                 result[resultIdx++] = values[valuesIdx];
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/NonNANode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/NonNANode.java
index cfeed6b5eae610a7cc77fdad07ae01d6b2bccd6e..5fec2dfc86a5f1000c52245ae71df02a0dc0492f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/NonNANode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/NonNANode.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.nodes.unary;
 
-import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.BranchProfile;
 import com.oracle.truffle.r.runtime.RError;
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 62dceba674c6d9765c1c085b05acb6b7e01bda16..17b709e42409978a85f50726d3b066533256a8bf 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
@@ -1377,4 +1377,10 @@ public class CallRFFIHelper {
         return x == y ? 1 : 0;
     }
 
+    public static Object Rf_classgets(Object x, Object y) {
+        RAbstractVector vector = guaranteeInstanceOf(x, RAbstractVector.class);
+        vector.setClassAttr(guaranteeInstanceOf(y, RStringVector.class));
+        return RNull.instance;
+    }
+
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/DefaultResourceHandlerFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/DefaultResourceHandlerFactory.java
index 0f90524e98b782cbc2fed6760582fa4c96e4a0e7..bc3a8db00d9cee4b415f25ff0769c7108e9cb373 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/DefaultResourceHandlerFactory.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/DefaultResourceHandlerFactory.java
@@ -26,7 +26,6 @@ import java.io.BufferedReader;
 import java.io.File;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.net.URI;
 import java.net.URL;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java
index 9da38a9af9e03e131dadae2b0f7bc36b94c89fea..fe0a57bac502c4d7f5fb31cd1a4cfe03f82e17c7 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java
@@ -143,6 +143,7 @@ public enum RType {
                 return Builtin;
             case "special":
                 return Special;
+            case "name":
             case "symbol":
                 return Symbol;
             case "environment":
diff --git a/com.oracle.truffle.r.test.cran/r/install.cran.packages.R b/com.oracle.truffle.r.test.cran/r/install.cran.packages.R
index 8cf210cda483b9f05b0f9b09d7fab2fce9463c86..a800cb1e9bce4781939540982ee811c4ead1256b 100644
--- a/com.oracle.truffle.r.test.cran/r/install.cran.packages.R
+++ b/com.oracle.truffle.r.test.cran/r/install.cran.packages.R
@@ -35,7 +35,7 @@
 # If unset, defaults to "http://cran.cnr.berkeley.edu/"
 # However, a local copy of the CRAN repo can be used either by setting the LOCAL_CRAN_REPO env variable or setting --contrib-url
 
-# Packages are installed into the directory specified by the --lib arg (or R_LIBS_USER env var)
+# Packages are installed into the directory specified by the --lib arg (or R_LIBS env var)
 
 # Blacklisted packages nor their dependents will not be installed. By default the list of blacklisted
 # packages will be read from the file in the --blacklist-file arg or the PACKAGE_BLACKLIST env var.
@@ -46,9 +46,9 @@
 # Package: name
 # Reason: reason
 
-# The env var R_LIBS_USER or the option --lib must be set to the directory where the install should take place.
+# The env var R_LIBS or the option --lib must be set to the directory where the install should take place.
 # N.B. --lib works for installation. However, when running tests ( --run-tests), it does not and
-# R_LIBS_USER must be set instead (as well) since some of the test code has explicit "library(foo)" calls
+# R_LIBS must be set instead (as well) since some of the test code has explicit "library(foo)" calls
 # without a "lib.loc" argument.
 
 # A single package install can be handled in three ways, based on the run-mode argument (default system):
@@ -67,14 +67,17 @@
 # test output goes to a directory derived from the '--testdir dir' option (default 'test'). Each package's test output is
 # stored in a subdirectory named after the package.
 
-# There are three ways to specify the packages to be installed
+# There are three ways to specify the packages to be installed/tested
 # --pkg-pattern a regular expression to match packages
 # --pkg-filelist a file containing an explicit list of package names (not regexps), one per line
 # --alpha-daily implicitly sets --pkg-pattern from the day of the year modulo 26. E.g., 0 is ^[Aa], 1 is ^[Bb]
 # --ok-only implicitly sets --pkg-filelist to a list of packages known to install
+# --no-install gets the list of packages from the lib install directory (evidently only useful with --run-tests)
 
 # TODO At some point this will need to upgraded to support installation from other repos, e.g. BioConductor, github
 
+# All fatal errors terminate with a return code of 100
+
 args <- commandArgs(TRUE)
 
 usage <- function() {
@@ -98,7 +101,7 @@ usage <- function() {
 					  "[--count-daily count]",
 					  "[--ok-only]",
                       "[--pkg.pattern package-pattern] \n"))
-	quit(status=1)
+	quit(status=100)
 }
 
 trim <- function (x) gsub("^\\s+|\\s+$", "", x)
@@ -211,7 +214,7 @@ create.blacklist <- function() {
 
 abort <- function(msg) {
 	print(msg)
-	quit("no", 1)
+	quit("no", status=100)
 }
 
 set.contriburl <- function() {
@@ -516,6 +519,16 @@ get.blacklist <- function() {
 	blacklist
 }
 
+show.install.status <- function(test.pkgnames) {
+	if (print.install.status) {
+		cat("BEGIN install status\n")
+		for (pkgname.i in test.pkgnames) {
+			cat(paste0(pkgname.i, ":"), ifelse(install.status[pkgname.i], "OK", "FAILED"), "\n")
+		}
+		cat("END install status\n")
+	}
+}
+
 # performs the installation, or logs what it would install if dry.run = T
 do.it <- function() {
 	test.pkgnames <- get.pkgs()
@@ -523,7 +536,7 @@ do.it <- function() {
 	if (list.versions) {
 		for (pkgname in test.pkgnames) {
 			pkg <- toinstall.pkgs[pkgname, ]
-			# pretend we are acessing CRAN if list.canonical
+			# pretend we are accessing CRAN if list.canonical
 			list.contriburl = ifelse(list.canonical, "https://cran.r-project.org/src/contrib", contriburl)
 			cat(pkg["Package"], pkg["Version"], paste0(list.contriburl, "/", pkgname, "_", pkg["Version"], ".tar.gz"), "\n", sep=",")
 		}
@@ -533,14 +546,7 @@ do.it <- function() {
 		cat("BEGIN package installation\n")
 		install.pkgs(test.pkgnames)
 		cat("END package installation\n")
-
-		if (print.install.status) {
-			cat("BEGIN install status\n")
-			for (pkgname.i in test.pkgnames) {
-				cat(paste0(pkgname.i, ":"), ifelse(install.status[pkgname.i], "OK", "FAILED"), "\n")
-			}
-			cat("END install status\n")
-		}
+		show.install.status(test.pkgnames)
 	}
 
 	if (run.tests) {
@@ -554,6 +560,8 @@ do.it <- function() {
 			}
 			matched.pkgnames <- sapply(test.pkgnames, match.fun)
 			test.pkgnames <- test.pkgnames[matched.pkgnames]
+			# fake the install
+			show.install.status(test.pkgnames)
 		}
 
 		cat("BEGIN package tests\n")
@@ -608,12 +616,18 @@ install.pkg <- function(pkgname) {
 	return(rc)
 }
 
+gnu_rscript <- function() {
+	rv <- R.Version()
+	dirv <- paste0('R-', rv$major, '.', rv$minor)
+	file.path("com.oracle.truffle.r.native/gnur", dirv, 'bin/Rscript')
+}
+
 system.install <- function(pkgname) {
 	script <- normalizePath("com.oracle.truffle.r.test.cran/r/install.package.R")
 	if (is.fastr()) {
 		rscript = file.path(R.home(), "bin", "Rscript")
 	} else {
-		rscript = "Rscript"
+		rscript = gnu_rscript()
 	}
 	args <- c(script, pkgname, contriburl, lib.install)
 	rc <- system2(rscript, args)
@@ -657,7 +671,7 @@ system.test <- function(pkgname) {
 	if (is.fastr()) {
 		rscript = file.path(R.home(), "bin", "Rscript")
 	} else {
-		rscript = "Rscript"
+		rscript = gnu_rscript()
 	}
 	args <- c(script, pkgname, file.path(testdir, pkgname), lib.install)
 	rc <- system2(rscript, args)
@@ -794,9 +808,9 @@ cat.args <- function() {
 }
 
 check.libs <- function() {
-    lib.install <<- Sys.getenv("R_LIBS_USER", unset=NA)
+    lib.install <<- Sys.getenv("R_LIBS", unset=NA)
 	if (is.na(lib.install)) {
-		abort("R_LIBS_USER must be set")
+		abort("R_LIBS must be set")
 	}
 	if (!file.exists(lib.install) || is.na(file.info(lib.install)$isdir)) {
 		abort(paste(lib.install, "does not exist or is not a directory"))
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 2ea3673fc769138890b6339c11d97967f096c9e9..0a8e299779a9806fe7c11cde24dd068ce3b66b7b 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
@@ -57412,6 +57412,10 @@ Error in f(h = 1) : argument 1 matches multiple formal arguments
 #{ f <- function(hello, hi) { hello + hi } ; f(hello = 1, bye = 3) }
 Error in f(hello = 1, bye = 3) : unused argument (bye = 3)
 
+##com.oracle.truffle.r.test.functions.TestFunctions.testMatching#
+#{ f <- function(xy, x) xy + x; f(xy=1,x=2) }
+[1] 3
+
 ##com.oracle.truffle.r.test.functions.TestFunctions.testMatching#
 #{ f<-function(..., val=1) { c(list(...), val) }; f(v=7, 2) }
 $v
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_structure.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_structure.java
index 364a6b46ae28fd2e15dadd30ce7c441e6a0c28b9..645dd290d3dfbf241863a78d35b62b2331e6468d 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_structure.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_structure.java
@@ -20,8 +20,7 @@ public class TestBuiltin_structure extends TestBase {
 
     @Test
     public void teststructure1() {
-        assertEval(
-                        "argv <- structure(list(.Data = structure(c(1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c('13',     '14', '15', '16', '17'), class = 'factor'), .Label = c('13',     '14', '15', '16', '17'), class = 'factor'), .Names = c('.Data',     '.Label', 'class'));" +
-                                        "do.call('structure', argv)");
+        assertEval("argv <- structure(list(.Data = structure(c(1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c('13',     '14', '15', '16', '17'), class = 'factor'), .Label = c('13',     '14', '15', '16', '17'), class = 'factor'), .Names = c('.Data',     '.Label', 'class'));" +
+                        "do.call('structure', argv)");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tdefault.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tdefault.java
index 6d1687f6aa98c20989125c44c677ebbdf332e29e..58b7bf9977d3a3335d234442028cb08902a32198 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tdefault.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tdefault.java
@@ -125,8 +125,7 @@ public class TestBuiltin_tdefault extends TestBase {
 
     @Test
     public void testtdefault22() {
-        assertEval(
-                        "argv <- list(structure(c(8.3, 8.6, 8.8, 10.5, 10.7, 10.8, 11, 11, 11.1, 11.2, 11.3, 11.4, 11.4, 11.7, 12, 12.9, 12.9, 13.3, 13.7, 13.8, 14, 14.2, 14.5, 16, 16.3, 17.3, 17.5, 17.9, 18, 18, 20.6, 70, 65, 63, 72, 81, 83, 66, 75, 80, 75, 79, 76, 76, 69, 75, 74, 85, 86, 71, 64, 78, 80, 74, 72, 77, 81, 82, 80, 80, 80, 87, 10.3, 10.3, 10.2, 16.4, 18.8, 19.7, 15.6, 18.2, 22.6, 19.9, 24.2, 21, 21.4, 21.3, 19.1, 22.2, 33.8, 27.4, 25.7, 24.9, 34.5, 31.7, 36.3, 38.3, 42.6, 55.4, 55.7, 58.3, 51.5, 51, 77), .Dim = c(31L, 3L), .Dimnames = list(NULL, c('Girth', 'Height', 'Volume')))); .Internal(t.default(argv[[1]]))");
+        assertEval("argv <- list(structure(c(8.3, 8.6, 8.8, 10.5, 10.7, 10.8, 11, 11, 11.1, 11.2, 11.3, 11.4, 11.4, 11.7, 12, 12.9, 12.9, 13.3, 13.7, 13.8, 14, 14.2, 14.5, 16, 16.3, 17.3, 17.5, 17.9, 18, 18, 20.6, 70, 65, 63, 72, 81, 83, 66, 75, 80, 75, 79, 76, 76, 69, 75, 74, 85, 86, 71, 64, 78, 80, 74, 72, 77, 81, 82, 80, 80, 80, 87, 10.3, 10.3, 10.2, 16.4, 18.8, 19.7, 15.6, 18.2, 22.6, 19.9, 24.2, 21, 21.4, 21.3, 19.1, 22.2, 33.8, 27.4, 25.7, 24.9, 34.5, 31.7, 36.3, 38.3, 42.6, 55.4, 55.7, 58.3, 51.5, 51, 77), .Dim = c(31L, 3L), .Dimnames = list(NULL, c('Girth', 'Height', 'Volume')))); .Internal(t.default(argv[[1]]))");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_unlist.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_unlist.java
index 853d5074055bfc51991e6ef5c3263b5b823511cc..442097e3a4fee220d36f8700788fdec4b6a1013e 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_unlist.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_unlist.java
@@ -106,14 +106,12 @@ public class TestBuiltin_unlist extends TestBase {
 
     @Test
     public void testunlist18() {
-        assertEval(
-                        "argv <- list(list(c(NA_real_, NA_real_), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'),     c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi')), TRUE, TRUE); .Internal(unlist(argv[[1]], argv[[2]], argv[[3]]))");
+        assertEval("argv <- list(list(c(NA_real_, NA_real_), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'),     c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi'), c('Svansota', 'No. 462', 'Manchuria', 'No. 475', 'Velvet', 'Peatland', 'Glabron', 'No. 457', 'Wisconsin No. 38', 'Trebi')), TRUE, TRUE); .Internal(unlist(argv[[1]], argv[[2]], argv[[3]]))");
     }
 
     @Test
     public void testunlist19() {
-        assertEval(
-                        "argv <- list(list(structure(list('/home/lzhao/tmp/RtmpTzriDZ/R.INSTALL30d4108a07be/mgcv/R/gamm.r'), row.names = c(NA, -1L), class = 'data.frame'), structure(list(1522L), row.names = c(NA, -1L), class = 'data.frame'), structure(list(1522L), row.names = c(NA, -1L), class = 'data.frame')), FALSE, FALSE); .Internal(unlist(argv[[1]], argv[[2]], argv[[3]]))");
+        assertEval("argv <- list(list(structure(list('/home/lzhao/tmp/RtmpTzriDZ/R.INSTALL30d4108a07be/mgcv/R/gamm.r'), row.names = c(NA, -1L), class = 'data.frame'), structure(list(1522L), row.names = c(NA, -1L), class = 'data.frame'), structure(list(1522L), row.names = c(NA, -1L), class = 'data.frame')), FALSE, FALSE); .Internal(unlist(argv[[1]], argv[[2]], argv[[3]]))");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/functions/TestFunctions.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/functions/TestFunctions.java
index bce570f903c34c7adf70c8a76b6332518dddbad4..78259d758de8733c7c38a1d39a2de73cf1c607ce 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/functions/TestFunctions.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/functions/TestFunctions.java
@@ -230,6 +230,8 @@ public class TestFunctions extends TestBase {
         assertEval("{ f <- function(hello, hi) { hello + hi } ; f(hello = 1, bye = 3) }");
         assertEval("{ f <- function(a) { a } ; f(1,2) }");
 
+        assertEval("{ f <- function(xy, x) xy + x; f(xy=1,x=2) }");
+
         // with ... partial-match only if formal parameter are before ...
         assertEval("{ f<-function(..., val=1) { c(list(...), val) }; f(v=7, 2) }");
         assertEval("{ f<-function(er=1, ..., val=1) { c(list(...), val, er) }; f(v=7, 2, e=8) }");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tools/AnalyzeExpectedTestOutput.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tools/AnalyzeExpectedTestOutput.java
index 40d357268c2a78387e2037c6e99425bf9514de3d..17bf41a39d88abe4b81e6fb575d48835067fd791 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tools/AnalyzeExpectedTestOutput.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/tools/AnalyzeExpectedTestOutput.java
@@ -27,8 +27,6 @@ import java.util.ArrayList;
 import java.util.Map;
 import java.util.SortedMap;
 
-import com.oracle.truffle.r.test.ArithmeticWhiteList;
-import com.oracle.truffle.r.test.TestBase;
 import com.oracle.truffle.r.test.TestBase.Output;
 import com.oracle.truffle.r.test.TestTrait;
 import com.oracle.truffle.r.test.WhiteList;
diff --git a/mx.fastr/mx_fastr.py b/mx.fastr/mx_fastr.py
index d0711cbe700ca57526a8c095ebd5ab1c0c3c6fc9..860e12cd49635b88a195a4501c788f2a45222c63 100644
--- a/mx.fastr/mx_fastr.py
+++ b/mx.fastr/mx_fastr.py
@@ -515,12 +515,13 @@ def gnu_r(args):
     cmd = [join(_gnur_path(), 'R')] + args
     return mx.run(cmd, nonZeroIsFatal=False)
 
-def gnu_rscript(args):
+def gnu_rscript(args, env=None):
     '''
-    run the internally built GNU Rscript executable'
+    run the internally built GNU Rscript executable
+    env arg is used by pkgtest
     '''
     cmd = [join(_gnur_path(), 'Rscript')] + args
-    return mx.run(cmd, nonZeroIsFatal=False)
+    return mx.run(cmd, nonZeroIsFatal=False, env=env)
 
 def mx_post_parse_cmd_line(opts):
     mx_fastr_dists.mx_post_parse_cmd_line(opts)
diff --git a/mx.fastr/mx_fastr_pkgs.py b/mx.fastr/mx_fastr_pkgs.py
index e510aa2264a4b4591f931bcede173998041e83e1..24d9596cb919b131aa7e32d4ad4c3a7100241d0f 100644
--- a/mx.fastr/mx_fastr_pkgs.py
+++ b/mx.fastr/mx_fastr_pkgs.py
@@ -21,30 +21,69 @@
 # questions.
 #
 
-from os.path import join, exists, relpath, dirname
+'''
+The pkgtest command operates in two modes:
+1. In development mode it uses the FastR 'Rscript' command and the internal GNU R for test comparison
+2. In production mode it uses the GraalVM 'Rscript' command and a GNU R loaded as a sibling suite. This is indicated
+by the environment variable 'GRAALVM_FASTR' being set.
+
+Evidently in case 2, there is the potential for a version mismatch between FastR and GNU R, and this is checked.
+
+In either case all the output is placed in the fastr suite dir. Separate directories are used for FastR and GNU R package installs
+and tests, namely 'lib.install.cran.{fastr,gnur}' and 'test.{fastr,gnur}' (sh syntax).
+'''
+from os.path import join, relpath
 import shutil, os, re
+import subprocess
 import mx
 import mx_fastr
 
 quiet = False
+graalvm = None
+
+def _fastr_suite_dir():
+    return mx_fastr._fastr_suite.dir
 
 def _mx_gnur():
     return mx.suite('gnur')
 
-def _create_libinstall(s):
-    '''Create lib.install.cran/install.tmp/test for suite s
+def _gnur_rscript():
+    return _mx_gnur().extensions._gnur_rscript_path()
+
+def _graalvm_rscript():
+    assert graalvm is not None
+    return join(graalvm, 'bin', 'Rscript')
+
+def _graalvm():
+    global graalvm
+    if graalvm is None:
+        if os.environ.has_key('GRAALVM_FASTR'):
+            graalvm = os.environ['GRAALVM_FASTR']
+            # version check
+            gnur_version = _mx_gnur().extensions.r_version().split('-')[1]
+            graalvm_version = subprocess.check_output([_graalvm_rscript(), '--version'], stderr=subprocess.STDOUT).rstrip()
+            if not gnur_version in graalvm_version:
+                mx.abort('graalvm R version does not match gnur suite')
+    return graalvm
+
+def _create_libinstall(rvm, test_installed):
     '''
-    libinstall = join(s.dir, "lib.install.cran")
-    # make sure its empty
-    shutil.rmtree(libinstall, ignore_errors=True)
-    os.mkdir(libinstall)
-    install_tmp = join(s.dir, "install.tmp")
+    Create lib.install.cran.<rvm>/install.tmp.<rvm>/test.<rvm> for <rvm>: fastr or gnur
+    If use_installed_pkgs is True, assume lib.install exists and is populated (development)
+    '''
+    libinstall = join(_fastr_suite_dir(), "lib.install.cran." + rvm)
+    if not test_installed:
+        # make sure its empty
+        shutil.rmtree(libinstall, ignore_errors=True)
+        os.mkdir(libinstall)
+    install_tmp = join(_fastr_suite_dir(), "install.tmp." + rvm)
+#    install_tmp = join(_fastr_suite_dir(), "install.tmp")
     shutil.rmtree(install_tmp, ignore_errors=True)
     os.mkdir(install_tmp)
-    test = join(s.dir, "test")
-    shutil.rmtree(test, ignore_errors=True)
-    os.mkdir(test)
-    return libinstall, install_tmp
+    testdir = join(_fastr_suite_dir(), "test." + rvm)
+    shutil.rmtree(testdir, ignore_errors=True)
+    os.mkdir(testdir)
+    return libinstall, install_tmp, testdir
 
 def _log_step(state, step, rvariant):
     if not quiet:
@@ -63,12 +102,6 @@ def _installpkgs_script():
     cran_test = _cran_test_project_dir()
     return join(cran_test, 'r', 'install.cran.packages.R')
 
-def _is_graalvm():
-    return os.environ.has_key('GRAALVM_FASTR')
-
-def _graalvm():
-    return os.environ['GRAALVM_FASTR']
-
 def _installpkgs(args, **kwargs):
     '''
     Runs the R script that does package/installation and testing.
@@ -77,11 +110,10 @@ def _installpkgs(args, **kwargs):
     FastR, but instead have to invoke the command directly.
     '''
     script = _installpkgs_script()
-    if _is_graalvm():
-        rscript = join(_graalvm(), 'bin', 'Rscript')
-        return mx.run([rscript, script] + args, **kwargs)
-    else:
+    if _graalvm() is None:
         return mx_fastr.rscript([script] + args, **kwargs)
+    else:
+        return mx.run([_graalvm_rscript(), script] + args, **kwargs)
 
 
 def pkgtest(args):
@@ -90,12 +122,10 @@ def pkgtest(args):
     rc: 0 for success; 1: install fail, 2: test fail, 3: install&test fail
     '''
 
-    libinstall, install_tmp = _create_libinstall(mx.suite('fastr'))
+    test_installed = '--no-install' in args
+    fastr_libinstall, fastr_install_tmp, fastr_testdir = _create_libinstall('fastr', test_installed)
+    gnur_libinstall, gnur_install_tmp, gnur_testdir = _create_libinstall('gnur', test_installed)
 
-    if _is_graalvm():
-        stacktrace_args = ['-J:-DR:-PrintErrorStacktracesToFile', '-J:-DR:+PrintErrorStacktraces']
-    else:
-        stacktrace_args = ['--J', '@-DR:-PrintErrorStacktracesToFile -DR:+PrintErrorStacktraces']
     if "--quiet" in args:
         global quiet
         quiet = True
@@ -154,11 +184,15 @@ def pkgtest(args):
                     if time_match:
                         pkg_name = time_match.group(1)
                         test_time = time_match.group(2)
-                        with open(join('test', pkg_name, 'test_time'), 'w') as f:
+                        with open(join(_pkg_testdir('fastr', pkg_name), 'test_time'), 'w') as f:
                             f.write(test_time)
     env = os.environ.copy()
-    env["TMPDIR"] = install_tmp
-    env['R_LIBS_USER'] = libinstall
+    env["TMPDIR"] = fastr_install_tmp
+    env['R_LIBS'] = fastr_libinstall
+    if not env.has_key('FASTR_PROCESS_TIMEOUT'):
+        env['FASTR_PROCESS_TIMEOUT'] = '5'
+    env['FASTR_OPTION_PrintErrorStacktracesToFile'] = 'false'
+    env['FASTR_OPTION_PrintErrorStacktraces'] = 'true'
 
     # TODO enable but via installing Suggests
     #_install_vignette_support('FastR', env)
@@ -167,12 +201,13 @@ def pkgtest(args):
     # install and test the packages, unless just listing versions
     if not '--list-versions' in install_args:
         install_args += ['--run-tests']
+        install_args += ['--testdir', 'test.fastr']
         if not '--print-install-status' in install_args:
             install_args += ['--print-install-status']
 
     _log_step('BEGIN', 'install/test', 'FastR')
     # Currently installpkgs does not set a return code (in install.cran.packages.R)
-    rc = _installpkgs(stacktrace_args + install_args, nonZeroIsFatal=False, env=env, out=out, err=out)
+    rc = _installpkgs(install_args, nonZeroIsFatal=False, env=env, out=out, err=out)
     if rc == 100:
         # fatal error connecting to package repo
         mx.abort(rc)
@@ -187,9 +222,9 @@ def pkgtest(args):
     install_failure = single_pkg and rc == 1
     if '--run-tests' in install_args and not install_failure:
         # in order to compare the test output with GnuR we have to install/test the same
-        # set of packages with GnuR, which must be present as a sibling suite
+        # set of packages with GnuR
         ok_pkgs = [k for k, v in out.install_status.iteritems() if v]
-        _gnur_install_test(ok_pkgs)
+        _gnur_install_test(ok_pkgs, gnur_libinstall, gnur_install_tmp)
         _set_test_status(out.test_info)
         print 'Test Status'
         for pkg, test_status in out.test_info.iteritems():
@@ -197,7 +232,11 @@ def pkgtest(args):
                 rc = rc | 2
             print '{0}: {1}'.format(pkg, test_status.status)
 
-    shutil.rmtree(install_tmp, ignore_errors=True)
+        # tar up the test results
+        subprocess.call(['tar', 'cf', join(_fastr_suite_dir, fastr_testdir + '.tar'), os.path.basename(fastr_testdir)])
+        subprocess.call(['tar', 'cf', join(_fastr_suite_dir, gnur_testdir + '.tar'), os.path.basename(gnur_testdir)])
+
+    shutil.rmtree(fastr_install_tmp, ignore_errors=True)
     return rc
 
 class TestFileStatus:
@@ -219,11 +258,11 @@ class TestStatus:
         self.status = "UNKNOWN"
         self.testfile_outputs = dict()
 
-def _pkg_testdir(suite, pkg_name):
-    return join(mx.suite(suite).dir, 'test', pkg_name)
+def _pkg_testdir(rvm, pkg_name):
+    return join(_fastr_suite_dir(), 'test.' + rvm, pkg_name)
 
-def _get_test_outputs(suite, pkg_name, test_info):
-    pkg_testdir = _pkg_testdir(suite, pkg_name)
+def _get_test_outputs(rvm, pkg_name, test_info):
+    pkg_testdir = _pkg_testdir(rvm, pkg_name)
     for root, _, files in os.walk(pkg_testdir):
         if not test_info.has_key(pkg_name):
             test_info[pkg_name] = TestStatus()
@@ -246,44 +285,42 @@ def _get_test_outputs(suite, pkg_name, test_info):
             relfile = relpath(absfile, pkg_testdir)
             test_info[pkg_name].testfile_outputs[relfile] = TestFileStatus(status, absfile)
 
-def _install_vignette_support(rvariant, env):
+def _install_vignette_support(rvm, env):
     # knitr is needed for vignettes, but FastR  can't handle it yet
-    if rvariant == 'FastR':
+    if rvm == 'FastR':
         return
-    _log_step('BEGIN', 'install vignette support', rvariant)
-    args = ['--ignore-blacklist', '^rmarkdown$|^knitr$']
-    _gnur_installpkgs(args, env)
-    _log_step('END', 'install vignette support', rvariant)
-
-def _gnur_installpkgs(args, env, **kwargs):
-    return mx.run(['Rscript', _installpkgs_script()] + args, env=env, **kwargs)
+    _log_step('BEGIN', 'install vignette support', rvm)
+    args = [_installpkgs_script(), '--ignore-blacklist', '^rmarkdown$|^knitr$']
+    mx_fastr.gnu_rscript(args, env)
+    _log_step('END', 'install vignette support', rvm)
 
-def _gnur_install_test(pkgs):
-    gnur_packages = join(_mx_gnur().dir, 'gnur.packages')
+def _gnur_install_test(pkgs, gnur_libinstall, gnur_install_tmp):
+    gnur_packages = join(_fastr_suite_dir(), 'gnur.packages')
     with open(gnur_packages, 'w') as f:
         for pkg in pkgs:
             f.write(pkg)
             f.write('\n')
-    # clone the cran test project into gnur
-    gnur_cran_test_project_dir = join(_mx_gnur().dir, _cran_test_project())
-    if not exists(gnur_cran_test_project_dir):
-        shutil.copytree(_cran_test_project_dir(), gnur_cran_test_project_dir)
-    gnur_libinstall, gnur_install_tmp = _create_libinstall(_mx_gnur())
     env = os.environ.copy()
-    gnur = _mx_gnur().extensions
-    path = env['PATH']
-    env['PATH'] = dirname(gnur._gnur_rscript_path()) + os.pathsep + path
     env["TMPDIR"] = gnur_install_tmp
-    env['R_LIBS_USER'] = gnur_libinstall
+    env['R_LIBS'] = gnur_libinstall
 
     # TODO enable but via installing Suggests
     # _install_vignette_support('GnuR', env)
 
-    args = ['--pkg-filelist', gnur_packages]
+    args = []
+    if _graalvm():
+        args += [_gnur_rscript()]
+    args += [_installpkgs_script()]
+    args += ['--pkg-filelist', gnur_packages]
     args += ['--run-tests']
+    args += ['--run-mode', 'internal']
     args += ['--ignore-blacklist']
+    args += ['--testdir', 'test.gnur']
     _log_step('BEGIN', 'install/test', 'GnuR')
-    _gnur_installpkgs(args, env=env, cwd=_mx_gnur().dir, nonZeroIsFatal=False)
+    if _graalvm():
+        mx.run(args, nonZeroIsFatal=False, env=env)
+    else:
+        mx_fastr.gnu_rscript(args, env=env)
     _log_step('END', 'install/test', 'GnuR')
 
 def _set_test_status(fastr_test_info):
diff --git a/mx.fastr/suite.py b/mx.fastr/suite.py
index ca56e3bcf90a8d49e67b6bcafeac06575c2e1972..971b6743e1025e3a4776a7cc05b2b9416a8be764 100644
--- a/mx.fastr/suite.py
+++ b/mx.fastr/suite.py
@@ -344,8 +344,8 @@ suite = {
            },
         },
          "solaris" : {
-           "amd64" : {
-             "path" : "mxbuild/dists/solaris/amd64/fastr-unit-tests-native.jar",
+           "sparcv9" : {
+             "path" : "mxbuild/dists/solaris/sparcv9/fastr-unit-tests-native.jar",
            }
         },
       },
@@ -370,8 +370,8 @@ suite = {
           },
         },
          "solaris" : {
-           "amd64" : {
-             "path" : "mxbuild/dists/solaris/amd64/fastr-native-dev.jar",
+           "sparcv9" : {
+             "path" : "mxbuild/dists/solaris/sparcv9/fastr-native-dev.jar",
           },
         },
       },
@@ -392,8 +392,8 @@ suite = {
            }
         },
          "solaris" : {
-           "amd64" : {
-             "path" : "mxbuild/dists/solaris/amd64/fastr-release.jar",
+           "sparcv9" : {
+             "path" : "mxbuild/dists/solaris/sparcv9/fastr-release.jar",
            }
         },
       },