diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java
index d22caa9aaf12ba0b5d9bc0d0d5a6ac1ffc5d165a..bc856523e38aec4a9c68afcbb73dbd27f968fffa 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java
@@ -271,7 +271,7 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess {
         return result;
     }
 
-    private static RNode unwrapToRNode(Object objArg) {
+    private RNode unwrapToRNode(Object objArg) {
         Object obj = objArg;
         // obj is RSymbol or a primitive value.
         // A symbol needs to be converted back to a ReadVariableNode
@@ -279,6 +279,9 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess {
             return (RNode) RASTUtils.unwrap(((RLanguage) obj).getRep());
         } else if (obj instanceof RSymbol) {
             return ReadVariableNode.create(((RSymbol) obj).getName());
+        } else if (obj instanceof RPromise) {
+            // Evaluate promise and return the result as constant.
+            return ConstantNode.create(forcePromise("unwrapToRNode", objArg));
         } else {
             return ConstantNode.create(obj);
         }
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 12b2efafc97208aff8087ae8a17f1961cf82d614..3b073fef2479aba79cd53d1cd8488ae2c42ac0b6 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
@@ -67,6 +67,7 @@ import com.oracle.truffle.r.runtime.conn.NativeConnections.NativeRConnection;
 import com.oracle.truffle.r.runtime.conn.RConnection;
 import com.oracle.truffle.r.runtime.context.Engine.ParseException;
 import com.oracle.truffle.r.runtime.context.RContext;
+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.RDataFactory;
@@ -581,6 +582,16 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
         }
     }
 
+    @Override
+    public Object SET_NAMED_FASTR(Object x, int v) {
+        if (x instanceof RShareable) {
+            ((RShareable) x).incRefCount();
+            return RNull.instance;
+        } else {
+            throw unimplemented();
+        }
+    }
+
     @Override
     public Object SET_TYPEOF_FASTR(Object x, int v) {
         int code = SEXPTYPE.gnuRCodeForObject(x);
@@ -644,6 +655,12 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     public Object TAG(Object e) {
         if (e instanceof RPairList) {
             return ((RPairList) e).getTag();
+        } else if (e instanceof RArgsValuesAndNames) {
+            ArgumentsSignature signature = ((RArgsValuesAndNames) e).getSignature();
+            if (signature.getLength() > 0 && signature.getName(0) != null) {
+                return signature.getName(0);
+            }
+            return RNull.instance;
         } else {
             guaranteeInstanceOf(e, RExternalPtr.class);
             // at the moment, this can only be used to null out the pointer
@@ -691,8 +708,14 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
 
     @Override
     public Object SETCAR(Object x, Object y) {
-        guaranteeInstanceOf(x, RPairList.class);
-        ((RPairList) x).setCar(y);
+        RPairList pl;
+        if (x instanceof RLanguage) {
+            pl = ((RLanguage) x).getPairList();
+        } else {
+            guaranteeInstanceOf(x, RPairList.class);
+            pl = (RPairList) x;
+        }
+        pl.setCar(y);
         return y;
     }
 
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java
index 2fb1c91b4c5da517ca6e13b03fbe8a46c8ace852..b779d8c54ec5ac1ad886c7db22786a6a88403076 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java
@@ -309,6 +309,12 @@ final class TracingUpCallsRFFIImpl implements UpCallsRFFI {
         return delegate.NAMED(x);
     }
 
+    @Override
+    public Object SET_NAMED_FASTR(Object x, int v) {
+        RFFIUtils.traceUpCall("SET_NAMED_FASTR", x, v);
+        return delegate.SET_NAMED_FASTR(x, v);
+    }
+
     @Override
     public Object SET_TYPEOF_FASTR(Object x, int v) {
         RFFIUtils.traceUpCall("SET_TYPEOF_FASTR", x, v);
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 e2010764484de96abf096f52db83204c0cae5940..8db649b9ccc211d5827c67d796849899d2fce318 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
@@ -26,8 +26,11 @@ 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.r.runtime.RInternalError;
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RLanguage;
+import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPairList;
+import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RTypes;
 
 /**
@@ -48,6 +51,21 @@ public final class ListAccessNodes {
             return lang.getDataAtAsObject(0);
         }
 
+        @Specialization
+        protected Object car(RArgsValuesAndNames args) {
+            return args.getArgument(0);
+        }
+
+        @Specialization
+        protected Object car(RSymbol sym) {
+            return sym;
+        }
+
+        @Specialization
+        protected Object car(@SuppressWarnings("unused") RNull nil) {
+            return RNull.instance;
+        }
+
         @Fallback
         protected Object car(@SuppressWarnings("unused") Object obj) {
             throw RInternalError.unimplemented("CAR only works on pair lists and language objects");
@@ -68,6 +86,11 @@ public final class ListAccessNodes {
             return l.cdr();
         }
 
+        @Specialization
+        protected Object cdr(RArgsValuesAndNames args) {
+            return args.toPairlist().cdr();
+        }
+
         @Fallback
         protected Object cdr(@SuppressWarnings("unused") Object obj) {
             throw RInternalError.unimplemented("CDR only works on pair lists and language objects");
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java
index dfe993c8a64d2cdc6cb3329df40fa6526f449d23..f428cb625cfa537e6f363aadca4564b74ce6ceec 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java
@@ -33,6 +33,7 @@ import com.oracle.truffle.r.nodes.access.UpdateSlotNodeGen;
 import com.oracle.truffle.r.nodes.objects.NewObject;
 import com.oracle.truffle.r.nodes.objects.NewObjectNodeGen;
 import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RTypes;
@@ -81,6 +82,11 @@ public final class MiscNodes {
             return obj.getLength();
         }
 
+        @Specialization
+        protected int length(RArgsValuesAndNames obj) {
+            return obj.getLength();
+        }
+
         @Fallback
         protected int length(Object obj) {
             CompilerDirectives.transferToInterpreter();
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java
index 34e5920142774fa21726f9a4860beb1745c1bf96..49014be6befa6e4878f9f0681d4e518ca898857d 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java
@@ -146,6 +146,8 @@ public interface StdUpCallsRFFI {
 
     int NAMED(Object x);
 
+    Object SET_NAMED_FASTR(Object x, int v);
+
     Object SET_TYPEOF_FASTR(Object x, int v);
 
     int TYPEOF(Object x);
diff --git a/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c b/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c
index 184f0869edeb7e2a760cdf6364a5f9242211d572..48cab2736216cb2c7790c7a6c2fa69c5eda0263c 100644
--- a/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c
+++ b/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c
@@ -45,16 +45,10 @@ INLINE_FUN R_len_t length(SEXP s)
     case VECSXP:
     case EXPRSXP:
     case RAWSXP:
+    case DOTSXP:
 	return LENGTH(s);
     case LISTSXP:
     case LANGSXP:
-    case DOTSXP:
-	i = 0;
-	while (s != NULL && s != R_NilValue) {
-	    i++;
-	    s = CDR(s);
-	}
-	return i;
     case ENVSXP:
 	return Rf_envlength(s);
     default:
@@ -77,16 +71,10 @@ INLINE_FUN R_xlen_t xlength(SEXP s)
     case VECSXP:
     case EXPRSXP:
     case RAWSXP:
+    case DOTSXP:
 	return XLENGTH(s);
     case LISTSXP:
     case LANGSXP:
-    case DOTSXP:
-	i = 0;
-	while (s != NULL && s != R_NilValue) {
-	    i++;
-	    s = CDR(s);
-	}
-	return i;
     case ENVSXP:
 	return Rf_envlength(s);
     default:
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 823acf5af00657e80bb01bc573d8c94764f8565f..710affdd150797f463f9098c7b5322de2b0715bd 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
@@ -107,6 +107,7 @@ static jmethodID Rf_PairToVectorListMethodID;
 static jmethodID gnuRCodeForObjectMethodID;
 static jmethodID NAMED_MethodID;
 static jmethodID SET_TYPEOF_FASTR_MethodID;
+static jmethodID SET_NAMED_FASTR_MethodID;
 static jmethodID TYPEOF_MethodID;
 static jmethodID OBJECT_MethodID;
 static jmethodID DUPLICATE_ATTRIB_MethodID;
@@ -225,6 +226,7 @@ void init_internals(JNIEnv *env) {
 	Rf_PairToVectorListMethodID = checkGetMethodID(env, UpCallsRFFIClass, "Rf_PairToVectorList", "(Ljava/lang/Object;)Ljava/lang/Object;", 0);
 	NAMED_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "NAMED", "(Ljava/lang/Object;)I", 0);
 	SET_TYPEOF_FASTR_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "SET_TYPEOF_FASTR", "(Ljava/lang/Object;I)Ljava/lang/Object;", 0);
+	SET_NAMED_FASTR_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "SET_NAMED_FASTR", "(Ljava/lang/Object;I)Ljava/lang/Object;", 0);
 	TYPEOF_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "TYPEOF", "(Ljava/lang/Object;)I", 0);
 	OBJECT_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "OBJECT", "(Ljava/lang/Object;)I", 0);
 	DUPLICATE_ATTRIB_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "DUPLICATE_ATTRIB", "(Ljava/lang/Object;Ljava/lang/Object;)I", 0);
@@ -1252,7 +1254,8 @@ SEXP SET_TYPEOF_FASTR(SEXP x, int v){
 }
 
 void SET_NAMED(SEXP x, int v){
-    unimplemented("SET_NAMED");
+    JNIEnv *thisenv = getEnv();
+    (*thisenv)->CallObjectMethod(thisenv, UpCallsRFFIObject, SET_NAMED_FASTR_MethodID, x, v);
 }
 
 void SET_ATTRIB(SEXP x, SEXP v){
@@ -1559,7 +1562,7 @@ int R_check_class_etc (SEXP x, const char **valid) {
 	return R_check_class_etc_helper(x, valid, jniGetMethodsNamespace);
 }
 
-SEXP R_PreserveObject(SEXP x) {
+SEXP R_PreserveObject_FASTR(SEXP x) {
 	// convert to a JNI global ref until explicitly released
 	return createGlobalRef(getEnv(), x, 0);
 }
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c
index 473de0261a9cacc21e16f43a3ab2ea4403d11a3e..6d04555401fa4b32eb746bb7ac6ebc545d0825ca 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c
@@ -1085,7 +1085,7 @@ int R_check_class_etc (SEXP x, const char **valid) {
 	return (int) unimplemented("R_check_class_etc");
 }
 
-SEXP R_PreserveObject(SEXP x) {
+SEXP R_PreserveObject_FASTR(SEXP x) {
 	return unimplemented("R_PreserveObject");
 }
 
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c
index 6b5569d2973f0d2bf0b3b963739adfe56a445955..05e517b2013d5bdf3b8fa38f283eac167cf8381b 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c
@@ -1168,7 +1168,7 @@ int R_check_class_etc (SEXP x, const char **valid) {
 	return R_check_class_etc_helper(x, valid, nfiGetMethodsNamespace);
 }
 
-SEXP R_PreserveObject(SEXP x) {
+SEXP R_PreserveObject_FASTR(SEXP x) {
     TruffleEnv* env = (*truffleContext)->getTruffleEnv(truffleContext);
 	return (*env)->newObjectRef(env, x);
 }
diff --git a/com.oracle.truffle.r.native/version.source b/com.oracle.truffle.r.native/version.source
index 9902f17848a8974ab57d57999b74a63198fe6e23..f04c001f3f7fd5d290d0264b4a2c35f7b159ac42 100644
--- a/com.oracle.truffle.r.native/version.source
+++ b/com.oracle.truffle.r.native/version.source
@@ -1 +1 @@
-28
+29
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/RArgsValuesAndNamesPrinter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/RArgsValuesAndNamesPrinter.java
new file mode 100644
index 0000000000000000000000000000000000000000..b77c4f9c360c0613d58199f083dc7b9b0a795991
--- /dev/null
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/RArgsValuesAndNamesPrinter.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2017, 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.nodes.builtin.base.printer;
+
+import java.io.IOException;
+
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
+import com.oracle.truffle.r.runtime.data.RDataFactory;
+
+public final class RArgsValuesAndNamesPrinter extends AbstractValuePrinter<RArgsValuesAndNames> {
+
+    public static final RArgsValuesAndNamesPrinter INSTANCE = new RArgsValuesAndNamesPrinter();
+
+    private RArgsValuesAndNamesPrinter() {
+    }
+
+    @Override
+    protected void printValue(RArgsValuesAndNames value, PrintContext printCtx) throws IOException {
+        StringVectorPrinter.INSTANCE.print(RDataFactory.createStringVector("<...>"), printCtx);
+    }
+
+}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java
index 0bd88751d6643cdb10f595f18ad40e3a5b98507f..e3c2e29a373bec5ea0d6026dc2f2b3b6c09eb518 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java
@@ -31,6 +31,7 @@ import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.r.nodes.function.ClassHierarchyNode;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RAttributable;
 import com.oracle.truffle.r.runtime.data.RExpression;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
@@ -107,6 +108,8 @@ final class ValuePrinters implements ValuePrinter<Object> {
                     printer = RawVectorPrinter.INSTANCE;
                 } else if (x instanceof RAbstractListVector) {
                     printer = ListPrinter.INSTANCE;
+                } else if (x instanceof RArgsValuesAndNames) {
+                    printer = RArgsValuesAndNamesPrinter.INSTANCE;
                 } else if (x instanceof REnvironment) {
                     printer = EnvironmentPrinter.INSTANCE;
                 } else if (x instanceof TruffleObject) {
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 1f874d0842786b2e9c4e944544a9815dc2941bab..132f153d20779c4fae436c2d095926e573206952 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
@@ -28,6 +28,7 @@ import com.oracle.truffle.r.runtime.Arguments;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RType;
+import com.oracle.truffle.r.runtime.gnur.SEXPTYPE;
 
 /**
  * A simple wrapper class for passing the ... argument through RArguments
@@ -60,4 +61,24 @@ public final class RArgsValuesAndNames extends Arguments<Object> implements RTyp
     public void setTypedValueInfo(int value) {
         throw RInternalError.shouldNotReachHere();
     }
+
+    public RPairList toPairlist() {
+        RPairList head = null;
+        ArgumentsSignature signature = getSignature();
+        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 ? name : RNull.instance, SEXPTYPE.DOTSXP);
+
+            if (head == null) {
+                head = cur;
+            } else {
+                head.appendToEnd(cur);
+            }
+        }
+        if (head != null) {
+            return head;
+        }
+        return RDataFactory.createPairList(RNull.instance);
+    }
 }
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 bb19311e0bb716428d512ff0a3cdb108c94138cc..fd2952d4e0c5bbcbb778e51c5794ac6ee868528e 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
@@ -62588,6 +62588,10 @@ Error in seq.int(NaN) : 'from' cannot be NA, NaN or infinite
 #argv <- list(from = 0, to = 0.793110173512391, length.out = FALSE);do.call('seq.int', argv);
 integer(0)
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_serialize.testSerializeWithPromises#
+#{ f <- function(...) serialize(environment()[['...']],NULL); x <- unserialize(f(a=3,b=2,c=1)); typeof(x) }
+[1] "..."
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_serialize.testSerializeWithPromises#
 #{ f <- function(...) serialize(mget('...'),NULL); length(unserialize(f(a=3,b=2,c=1))[[1]]); }
 [1] 3
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java
index 018b22c6522e7f87fd641f22e554eb5fe53ca58d..e0ef86b8142d201c59940a44be130243039b8688 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java
@@ -115,5 +115,6 @@ public class TestBuiltin_serialize extends TestBase {
     @Test
     public void testSerializeWithPromises() {
         assertEval("{ f <- function(...) serialize(mget('...'),NULL); length(unserialize(f(a=3,b=2,c=1))[[1]]); }");
+        assertEval("{ f <- function(...) serialize(environment()[['...']],NULL); x <- unserialize(f(a=3,b=2,c=1)); typeof(x) }");
     }
 }
diff --git a/mx.fastr/mx_fastr_edinclude.py b/mx.fastr/mx_fastr_edinclude.py
index bed40f5912044d02c67819cfd80e0c41f4fd87bc..1ca1490bc01cf29bcb8a3133320c43ceb3a174e3 100644
--- a/mx.fastr/mx_fastr_edinclude.py
+++ b/mx.fastr/mx_fastr_edinclude.py
@@ -84,7 +84,8 @@ use_internals_end = '''#endif
 
 '''
 preserveObject = '''#ifdef FASTR
-SEXP R_PreserveObject(SEXP);
+SEXP R_PreserveObject_FASTR(SEXP);
+#define R_PreserveObject(var) ((var) = R_PreserveObject_FASTR((var)))
 #else
 '''