diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java
index 7bdb55e2a5d80691fe0eaa3cda00009f8a466e16..e874fcffe4d8e8b7a0048200f7445e1cd6039708 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java
@@ -65,6 +65,7 @@ import com.oracle.truffle.r.runtime.context.Engine.ParseException;
 import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.data.CharSXPWrapper;
 import com.oracle.truffle.r.runtime.data.NativeDataAccess;
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RAttributesLayout;
 import com.oracle.truffle.r.runtime.data.RComplexVector;
@@ -230,7 +231,6 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     }
 
     @Override
-    @TruffleBoundary
     public Object Rf_findVar(Object symbolArg, Object envArg) {
         return findVarInFrameHelper(envArg, symbolArg, true);
     }
@@ -247,6 +247,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
         return findVarInFrameHelper(envArg, symbolArg, false);
     }
 
+    @TruffleBoundary
     private static Object findVarInFrameHelper(Object envArg, Object symbolArg, boolean inherits) {
         if (envArg == RNull.instance) {
             throw RError.error(RError.SHOW_CALLER2, RError.Message.USE_NULL_ENV_DEFUNCT);
@@ -264,6 +265,9 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
                     // env) should not show up
                     return ((RPromise) value).getRawValue();
                 }
+                if (value instanceof RArgsValuesAndNames) {
+                    return ((RArgsValuesAndNames) value).toPairlist();
+                }
                 return value;
             }
             if (!inherits) {
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java
index bd897ddfbcfce7afb73413ef801dde8667599af7..62b743b4f544ed3809dd455a1a94ee73fdccb4f6 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java
@@ -97,7 +97,8 @@ public final class ListAccessNodes {
 
         @Specialization
         protected Object cdr(RArgsValuesAndNames args) {
-            return args.toPairlist().cdr();
+            // TODO: this is too late - "..." should be converted to pairlist earlier
+            return ((RPairList) args.toPairlist()).cdr();
         }
 
         @Specialization
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java
index f0182160856b72173b12e5dd533ec35f7ad2f186..479a3fcc90c99a64ceb8347ef0876ca7b0a0d0cc 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java
@@ -103,22 +103,16 @@ public final class RArgsValuesAndNames extends RObject implements RTypedValue {
         return str.toString();
     }
 
-    public RPairList toPairlist() {
-        RPairList head = null;
-        assert signature.getLength() == getLength();
-        for (int i = 0; i < getLength(); i++) {
-            String name = signature.getName(i);
-            RPairList cur = RDataFactory.createPairList(getArgument(i), RNull.instance, name != null ? RDataFactory.createSymbol(name) : RNull.instance, SEXPTYPE.DOTSXP);
-
-            if (head == null) {
-                head = cur;
-            } else {
-                head.appendToEnd(cur);
-            }
+    public Object toPairlist() {
+        // special case: empty lists are represented by "missing"
+        if (isEmpty()) {
+            return RMissing.instance;
         }
-        if (head != null) {
-            return head;
+        Object current = RNull.instance;
+        for (int i = getLength() - 1; i >= 0; i--) {
+            String name = signature.getName(i);
+            current = RDataFactory.createPairList(getArgument(i), current, name != null ? RDataFactory.createSymbol(name) : RNull.instance, SEXPTYPE.DOTSXP);
         }
-        return RDataFactory.createPairList(RNull.instance);
+        return current;
     }
 }