diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_C.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_C.java
index 2102384fc2bc023c0356a92d3c6eb72bf7cb49c6..89fb551c08e14b756f3e1b8d847d3093aee06dc7 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_C.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_C.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.engine.interop.ffi.llvm;
 
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.nodes.Node;
@@ -33,7 +32,6 @@ import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.ffi.CRFFI;
 import com.oracle.truffle.r.runtime.ffi.NativeCallInfo;
 import com.oracle.truffle.r.runtime.ffi.jni.JNI_C.JNI_InvokeCNode;
-import com.oracle.truffle.r.runtime.ffi.truffle.TruffleRFFIFrameHelper;
 
 class TruffleLLVM_C implements CRFFI {
     private static class TruffleLLVM_InvokeCNode extends JNI_InvokeCNode {
@@ -43,12 +41,11 @@ class TruffleLLVM_C implements CRFFI {
             if (nativeCallInfo.address.value instanceof Long) {
                 super.execute(nativeCallInfo, args);
             } else {
-                VirtualFrame frame = TruffleRFFIFrameHelper.create();
                 TruffleLLVM_DLL.ensureParsed(nativeCallInfo);
                 Object[] wargs = wrap(args);
                 try {
                     Node messageNode = Message.createExecute(0).createNode();
-                    ForeignAccess.sendExecute(messageNode, frame, nativeCallInfo.address.asTruffleObject(), wargs);
+                    ForeignAccess.sendExecute(messageNode, nativeCallInfo.address.asTruffleObject(), wargs);
                 } catch (Throwable t) {
                     throw RInternalError.shouldNotReachHere(t);
                 }
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Call.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Call.java
index 8c62773207559b9885e623ef6159b54b1c87745f..c120b6fc7d1b9c7fdb3f264d916ed611cbbe86e4 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Call.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Call.java
@@ -25,7 +25,6 @@ package com.oracle.truffle.r.engine.interop.ffi.llvm;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.ImportStatic;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.TruffleObject;
@@ -43,7 +42,6 @@ import com.oracle.truffle.r.runtime.ffi.NativeCallInfo;
 import com.oracle.truffle.r.runtime.ffi.RFFIFactory;
 import com.oracle.truffle.r.runtime.ffi.RFFIVariables;
 import com.oracle.truffle.r.runtime.ffi.jni.JNI_Call;
-import com.oracle.truffle.r.runtime.ffi.truffle.TruffleRFFIFrameHelper;
 
 class TruffleLLVM_Call implements CallRFFI {
     private static TruffleLLVM_Call truffleCall;
@@ -99,7 +97,6 @@ class TruffleLLVM_Call implements CallRFFI {
             TruffleLLVM_DLL.ensureParsed("libR", initVarFun.funName, true);
             initVarFun.symbolHandle = new SymbolHandle(context.getEnv().importSymbol("@" + initVarFun.funName));
         }
-        VirtualFrame frame = TruffleRFFIFrameHelper.create();
         Node executeNode = Message.createExecute(2).createNode();
         RFFIVariables[] variables = RFFIVariables.initialize();
         for (int i = 0; i < variables.length; i++) {
@@ -110,9 +107,9 @@ class TruffleLLVM_Call implements CallRFFI {
             }
             try {
                 if (value instanceof Double) {
-                    ForeignAccess.sendExecute(executeNode, frame, INIT_VAR_FUN.DOUBLE.symbolHandle.asTruffleObject(), i, value);
+                    ForeignAccess.sendExecute(executeNode, INIT_VAR_FUN.DOUBLE.symbolHandle.asTruffleObject(), i, value);
                 } else if (value instanceof Integer) {
-                    ForeignAccess.sendExecute(executeNode, frame, INIT_VAR_FUN.INT.symbolHandle.asTruffleObject(), i, value);
+                    ForeignAccess.sendExecute(executeNode, INIT_VAR_FUN.INT.symbolHandle.asTruffleObject(), i, value);
                 } else {
                     // TODO
                     // ForeignAccess.sendExecute(executeNode, frame,
@@ -166,9 +163,8 @@ class TruffleLLVM_Call implements CallRFFI {
         }
 
         private static Object doInvoke(Node messageNode, NativeCallInfo nativeCallInfo, Object[] args) {
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
             try {
-                return ForeignAccess.sendExecute(messageNode, frame, nativeCallInfo.address.asTruffleObject(), args);
+                return ForeignAccess.sendExecute(messageNode, nativeCallInfo.address.asTruffleObject(), args);
             } catch (Throwable t) {
                 throw RInternalError.shouldNotReachHere(t);
             }
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_PkgInit.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_PkgInit.java
index 80151638dc831853be95efa573598d8f8d25d529..6c4b235ca5d9d86afc256813a820c6cf21d21811 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_PkgInit.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_PkgInit.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.engine.interop.ffi.llvm;
 
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.TruffleObject;
@@ -35,7 +34,6 @@ import com.oracle.truffle.r.runtime.ffi.DLL;
 import com.oracle.truffle.r.runtime.ffi.DLL.DLLInfo;
 import com.oracle.truffle.r.runtime.ffi.DLL.DotSymbol;
 import com.oracle.truffle.r.runtime.ffi.DLL.SymbolHandle;
-import com.oracle.truffle.r.runtime.ffi.truffle.TruffleRFFIFrameHelper;
 
 class TruffleLLVM_PkgInit {
 
@@ -78,11 +76,10 @@ class TruffleLLVM_PkgInit {
     }
 
     private static Object setSymbol(int nstOrd, long routines, int index, SymbolHandle symbolHandle) {
-        VirtualFrame frame = TruffleRFFIFrameHelper.create();
         Node executeNode = Message.createExecute(3).createNode();
         try {
 
-            Object result = ForeignAccess.sendExecute(executeNode, frame, symbolHandle.asTruffleObject(), nstOrd, routines, index);
+            Object result = ForeignAccess.sendExecute(executeNode, symbolHandle.asTruffleObject(), nstOrd, routines, index);
             return result;
         } catch (Throwable t) {
             throw RInternalError.shouldNotReachHere();
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Stats.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Stats.java
index 594866624b3332f4439df6b7c2f57b0f1611f92e..b3e1d89e4f55eb714ccd5b0b8a7abb6e6f046bf8 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Stats.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_Stats.java
@@ -25,7 +25,6 @@ package com.oracle.truffle.r.engine.interop.ffi.llvm;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.ImportStatic;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.nodes.Node;
@@ -42,7 +41,6 @@ import com.oracle.truffle.r.runtime.ffi.DLL.DLLInfo;
 import com.oracle.truffle.r.runtime.ffi.DLL.SymbolHandle;
 import com.oracle.truffle.r.runtime.ffi.DLLRFFI;
 import com.oracle.truffle.r.runtime.ffi.StatsRFFI;
-import com.oracle.truffle.r.runtime.ffi.truffle.TruffleRFFIFrameHelper;
 
 public class TruffleLLVM_Stats implements StatsRFFI {
 
@@ -124,9 +122,8 @@ public class TruffleLLVM_Stats implements StatsRFFI {
             NativeDoubleArray na = new NativeDoubleArray(a);
             NativeDoubleArray nwork = new NativeDoubleArray(work);
             NativeIntegerArray niwork = new NativeIntegerArray(iwork);
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
             try {
-                return (int) ForeignAccess.sendExecute(messageNode, frame, fftWork.asTruffleObject(), na, nseg, n, nspn, isn, nwork, niwork);
+                return (int) ForeignAccess.sendExecute(messageNode, fftWork.asTruffleObject(), na, nseg, n, nspn, isn, nwork, niwork);
             } catch (Throwable t) {
                 throw RInternalError.shouldNotReachHere(t);
             }
@@ -165,10 +162,9 @@ public class TruffleLLVM_Stats implements StatsRFFI {
         private static void doFactor(int n, int[] pmaxf, int[] pmaxp, Node messageNode, SymbolHandle fftFactor) {
             NativeIntegerArray npmaxf = new NativeIntegerArray(pmaxf);
             NativeIntegerArray npmaxp = new NativeIntegerArray(pmaxp);
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
 
             try {
-                ForeignAccess.sendExecute(messageNode, frame, fftFactor.asTruffleObject(), n, npmaxf, npmaxp);
+                ForeignAccess.sendExecute(messageNode, fftFactor.asTruffleObject(), n, npmaxf, npmaxp);
             } catch (Throwable t) {
                 throw RInternalError.shouldNotReachHere(t);
             }
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_UserRng.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_UserRng.java
index 4b65f52a6741a4805f63fda9ba9edd95f83d145c..74dbb58f09a6dee2952996225d2e94c439f6fd15 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_UserRng.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ffi/llvm/TruffleLLVM_UserRng.java
@@ -22,13 +22,11 @@
  */
 package com.oracle.truffle.r.engine.interop.ffi.llvm;
 
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.ffi.UserRngRFFI;
-import com.oracle.truffle.r.runtime.ffi.truffle.TruffleRFFIFrameHelper;
 import com.oracle.truffle.r.runtime.rng.user.UserRNG.Function;
 
 public class TruffleLLVM_UserRng implements UserRngRFFI {
@@ -41,12 +39,11 @@ public class TruffleLLVM_UserRng implements UserRngRFFI {
 
         @Override
         public void init(int seed) {
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
             if (initMessage == null) {
                 initMessage = Message.createExecute(1).createNode();
             }
             try {
-                ForeignAccess.sendExecute(initMessage, frame, Function.Init.getSymbolHandle().asTruffleObject(), seed);
+                ForeignAccess.sendExecute(initMessage, Function.Init.getSymbolHandle().asTruffleObject(), seed);
             } catch (Throwable t) {
                 throw RInternalError.shouldNotReachHere();
             }
@@ -54,13 +51,12 @@ public class TruffleLLVM_UserRng implements UserRngRFFI {
 
         @Override
         public double rand() {
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
             if (randMessage == null) {
                 randMessage = Message.createExecute(0).createNode();
             }
             try {
-                Object address = ForeignAccess.sendExecute(randMessage, frame, Function.Rand.getSymbolHandle().asTruffleObject());
-                Object value = ForeignAccess.sendExecute(readPointerNode, frame, TruffleLLVM_CAccess.Function.READ_POINTER_DOUBLE.getSymbolHandle().asTruffleObject(), address);
+                Object address = ForeignAccess.sendExecute(randMessage, Function.Rand.getSymbolHandle().asTruffleObject());
+                Object value = ForeignAccess.sendExecute(readPointerNode, TruffleLLVM_CAccess.Function.READ_POINTER_DOUBLE.getSymbolHandle().asTruffleObject(), address);
                 return (double) value;
             } catch (Throwable t) {
                 throw RInternalError.shouldNotReachHere();
@@ -69,13 +65,12 @@ public class TruffleLLVM_UserRng implements UserRngRFFI {
 
         @Override
         public int nSeed() {
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
             if (nSeedMessage == null) {
                 nSeedMessage = Message.createExecute(0).createNode();
             }
             try {
-                Object address = ForeignAccess.sendExecute(nSeedMessage, frame, Function.NSeed.getSymbolHandle().asTruffleObject());
-                Object n = ForeignAccess.sendExecute(readPointerNode, frame, TruffleLLVM_CAccess.Function.READ_POINTER_INT.getSymbolHandle().asTruffleObject(), address);
+                Object address = ForeignAccess.sendExecute(nSeedMessage, Function.NSeed.getSymbolHandle().asTruffleObject());
+                Object n = ForeignAccess.sendExecute(readPointerNode, TruffleLLVM_CAccess.Function.READ_POINTER_INT.getSymbolHandle().asTruffleObject(), address);
                 return (int) n;
             } catch (Throwable t) {
                 throw RInternalError.shouldNotReachHere();
@@ -84,14 +79,13 @@ public class TruffleLLVM_UserRng implements UserRngRFFI {
 
         @Override
         public void seeds(int[] n) {
-            VirtualFrame frame = TruffleRFFIFrameHelper.create();
             if (seedsMessage == null) {
                 seedsMessage = Message.createExecute(0).createNode();
             }
             try {
-                Object address = ForeignAccess.sendExecute(seedsMessage, frame, Function.Seedloc.getSymbolHandle().asTruffleObject());
+                Object address = ForeignAccess.sendExecute(seedsMessage, Function.Seedloc.getSymbolHandle().asTruffleObject());
                 for (int i = 0; i < n.length; i++) {
-                    Object seed = ForeignAccess.sendExecute(readPointerNode, frame, TruffleLLVM_CAccess.Function.READ_ARRAY_INT.getSymbolHandle().asTruffleObject(), address, i);
+                    Object seed = ForeignAccess.sendExecute(readPointerNode, TruffleLLVM_CAccess.Function.READ_ARRAY_INT.getSymbolHandle().asTruffleObject(), address, i);
                     n[i] = (int) seed;
                 }
             } catch (Throwable t) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Format.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Format.java
index 9c444c4d9a66f873274d46797f7d3855ba6570e5..14047da6e1ba80dc6a89cf244da3fa2250926f13 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Format.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Format.java
@@ -20,7 +20,6 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.profiles.BranchProfile;
 import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
@@ -102,15 +101,15 @@ public abstract class Format extends RBuiltinNode {
     }
 
     @Specialization
-    protected RStringVector format(VirtualFrame frame, RAbstractLogicalVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
+    protected RStringVector format(RAbstractLogicalVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
                     String decimalMark) {
-        return (RStringVector) valuePrinter.prettyPrint(frame, value, AnyVectorToStringVectorWriter::new);
+        return (RStringVector) valuePrinter.prettyPrint(value, AnyVectorToStringVectorWriter::new);
     }
 
     @Specialization
-    protected RStringVector format(VirtualFrame frame, RAbstractIntVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
+    protected RStringVector format(RAbstractIntVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
                     String decimalMark) {
-        return (RStringVector) valuePrinter.prettyPrint(frame, value, AnyVectorToStringVectorWriter::new);
+        return (RStringVector) valuePrinter.prettyPrint(value, AnyVectorToStringVectorWriter::new);
     }
 
     // TODO: even though format's arguments are not used at this point, their processing mirrors
@@ -136,15 +135,15 @@ public abstract class Format extends RBuiltinNode {
     }
 
     @Specialization
-    protected RStringVector format(VirtualFrame frame, RAbstractDoubleVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
+    protected RStringVector format(RAbstractDoubleVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
                     String decimalMark) {
-        return (RStringVector) valuePrinter.prettyPrint(frame, value, AnyVectorToStringVectorWriter::new);
+        return (RStringVector) valuePrinter.prettyPrint(value, AnyVectorToStringVectorWriter::new);
     }
 
     @Specialization
-    protected RStringVector format(VirtualFrame frame, RAbstractComplexVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
+    protected RStringVector format(RAbstractComplexVector value, boolean trim, int digits, int nsmall, int width, int justify, boolean naEncode, int scientific,
                     String decimalMark) {
-        return (RStringVector) valuePrinter.prettyPrint(frame, value, AnyVectorToStringVectorWriter::new);
+        return (RStringVector) valuePrinter.prettyPrint(value, AnyVectorToStringVectorWriter::new);
     }
 
     @Specialization
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java
index e2d8b344dd409fd5d9ee8706834e6cc8e0d5c306..9abaf902ac3f6f2f215952fbd29178e06c95035c 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/PrintFunctions.java
@@ -79,8 +79,8 @@ public class PrintFunctions {
         }
 
         @Specialization(guards = "!isS4(o)")
-        protected Object printDefault(VirtualFrame frame, Object o, Object digits, boolean quote, Object naPrint, Object printGap, boolean right, Object max, boolean useSource, boolean noOpt) {
-            valuePrinter.execute(frame, o, digits, quote, naPrint, printGap, right, max, useSource, noOpt);
+        protected Object printDefault(Object o, Object digits, boolean quote, Object naPrint, Object printGap, boolean right, Object max, boolean useSource, boolean noOpt) {
+            valuePrinter.execute(o, digits, quote, naPrint, printGap, right, max, useSource, noOpt);
             return o;
         }
 
@@ -89,13 +89,14 @@ public class PrintFunctions {
         }
 
         @Specialization(guards = "isS4(o)")
-        protected Object printDefaultS4(VirtualFrame frame, RTypedValue o, Object digits, boolean quote, Object naPrint, Object printGap, boolean right, Object max, boolean useSource, boolean noOpt,
+        protected Object printDefaultS4(@SuppressWarnings("unused") VirtualFrame frame, RTypedValue o, Object digits, boolean quote, Object naPrint, Object printGap, boolean right, Object max,
+                        boolean useSource, boolean noOpt,
                         @Cached("createShowFunction(frame)") RFunction showFunction) {
             if (noOpt) {
                 // S4 should only be called in case noOpt is true
                 RContext.getEngine().evalFunction(showFunction, null, null, null, o);
             } else {
-                printDefault(frame, showFunction, digits, quote, naPrint, printGap, right, max, useSource, noOpt);
+                printDefault(showFunction, digits, quote, naPrint, printGap, right, max, useSource, noOpt);
             }
             return o;
         }
@@ -117,10 +118,9 @@ public class PrintFunctions {
             casts.arg("useSource").defaultError(RError.Message.INVALID_ARGUMENT, "useSource").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).map(toBoolean());
         }
 
-        @SuppressWarnings("unused")
         @Specialization
-        protected RFunction printFunction(VirtualFrame frame, RFunction x, boolean useSource, RArgsValuesAndNames extra) {
-            valuePrinter.execute(frame, x, PrintParameters.getDefaultDigits(), true, RString.valueOf(RRuntime.STRING_NA), 1, false, PrintParameters.getDefaultMaxPrint(), useSource, false);
+        protected RFunction printFunction(RFunction x, boolean useSource, @SuppressWarnings("unused") RArgsValuesAndNames extra) {
+            valuePrinter.execute(x, PrintParameters.getDefaultDigits(), true, RString.valueOf(RRuntime.STRING_NA), 1, false, PrintParameters.getDefaultMaxPrint(), useSource, false);
             return x;
         }
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinterNode.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinterNode.java
index 16b9bb88af79e024667165cbd2360c2d42233b72..8bb9418b950dfcc2ac0667179f3c2644c7d006c3 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinterNode.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinterNode.java
@@ -104,7 +104,7 @@ public final class ValuePrinterNode extends RBaseNode {
         @Child private SetFixedAttributeNode namesAttrSetter = SetFixedAttributeNode.createNames();
         @Child private SetFixedAttributeNode isTruffleObjAttrSetter = SetFixedAttributeNode.create("is.truffle.object");
 
-        public Object convert(VirtualFrame frame, TruffleObject obj) {
+        public Object convert(TruffleObject obj) {
             class RStringWrapper extends TruffleObjectWrapper implements RAbstractStringVector {
                 final TruffleObject object;
 
@@ -122,9 +122,9 @@ public final class ValuePrinterNode extends RBaseNode {
                 public String getDataAt(int index) {
                     Object value;
                     try {
-                        value = ForeignAccess.sendRead(readNode, frame, object, index);
-                        if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                            value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                        value = ForeignAccess.sendRead(readNode, object, index);
+                        if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                            value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                         }
                     } catch (UnknownIdentifierException | UnsupportedMessageException e) {
                         throw RInternalError.shouldNotReachHere(e);
@@ -143,17 +143,16 @@ public final class ValuePrinterNode extends RBaseNode {
                 }
             }
             try {
-                if (ForeignAccess.sendHasSize(hasSizeNode, frame, obj)) {
-                    CompilerDirectives.transferToInterpreter();
-                    int size = (Integer) ForeignAccess.sendGetSize(getSizeNode, frame, obj);
+                if (ForeignAccess.sendHasSize(hasSizeNode, obj)) {
+                    int size = (Integer) ForeignAccess.sendGetSize(getSizeNode, obj);
                     boolean allBoolean = true;
                     boolean allInteger = true;
                     boolean allNumber = true;
                     boolean allString = true;
                     for (int i = 0; i < size; i++) {
-                        Object value = ForeignAccess.sendRead(readNode, frame, obj, i);
-                        if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                            value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                        Object value = ForeignAccess.sendRead(readNode, obj, i);
+                        if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                            value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                         }
                         allBoolean &= value instanceof Boolean;
                         allInteger &= value instanceof Integer;
@@ -176,9 +175,9 @@ public final class ValuePrinterNode extends RBaseNode {
                             public byte getDataAt(int index) {
                                 Object value;
                                 try {
-                                    value = ForeignAccess.sendRead(readNode, frame, obj, index);
-                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                                        value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                                    value = ForeignAccess.sendRead(readNode, obj, index);
+                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                                        value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                                     }
                                 } catch (UnknownIdentifierException | UnsupportedMessageException e) {
                                     throw RInternalError.shouldNotReachHere(e);
@@ -213,9 +212,9 @@ public final class ValuePrinterNode extends RBaseNode {
                             public int getDataAt(int index) {
                                 Object value;
                                 try {
-                                    value = ForeignAccess.sendRead(readNode, frame, obj, index);
-                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                                        value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                                    value = ForeignAccess.sendRead(readNode, obj, index);
+                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                                        value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                                     }
                                 } catch (UnknownIdentifierException | UnsupportedMessageException e) {
                                     throw RInternalError.shouldNotReachHere(e);
@@ -250,9 +249,9 @@ public final class ValuePrinterNode extends RBaseNode {
                             public double getDataAt(int index) {
                                 Object value;
                                 try {
-                                    value = ForeignAccess.sendRead(readNode, frame, obj, index);
-                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                                        value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                                    value = ForeignAccess.sendRead(readNode, obj, index);
+                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                                        value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                                     }
                                 } catch (UnknownIdentifierException | UnsupportedMessageException e) {
                                     throw RInternalError.shouldNotReachHere(e);
@@ -289,9 +288,9 @@ public final class ValuePrinterNode extends RBaseNode {
                             public Object getDataAt(int index) {
                                 Object value;
                                 try {
-                                    value = ForeignAccess.sendRead(readNode, frame, obj, index);
-                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                                        value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                                    value = ForeignAccess.sendRead(readNode, obj, index);
+                                    if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                                        value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                                     }
                                 } catch (UnknownIdentifierException | UnsupportedMessageException e) {
                                     throw RInternalError.shouldNotReachHere(e);
@@ -312,9 +311,9 @@ public final class ValuePrinterNode extends RBaseNode {
                         return new RListWrapper(size);
                     }
                 }
-                TruffleObject keys = (TruffleObject) ForeignAccess.send(keysNode, frame, obj);
+                TruffleObject keys = (TruffleObject) ForeignAccess.send(keysNode, obj);
                 if (keys != null) {
-                    int size = (Integer) ForeignAccess.sendGetSize(getSizeNode, frame, keys);
+                    int size = (Integer) ForeignAccess.sendGetSize(getSizeNode, keys);
                     RAbstractStringVector abstractNames = new RStringWrapper(size, keys);
                     RStringVector names = RDataFactory.createStringVector(size);
                     for (int i = 0; i < size; i++) {
@@ -339,9 +338,9 @@ public final class ValuePrinterNode extends RBaseNode {
                         public Object getDataAt(int index) {
                             Object value;
                             try {
-                                value = ForeignAccess.sendRead(readNode, frame, obj, names.getDataAt(index));
-                                if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, frame, (TruffleObject) value)) {
-                                    value = ForeignAccess.sendUnbox(unboxNode, frame, (TruffleObject) value);
+                                value = ForeignAccess.sendRead(readNode, obj, names.getDataAt(index));
+                                if (value instanceof TruffleObject && ForeignAccess.sendIsBoxed(isBoxedNode, (TruffleObject) value)) {
+                                    value = ForeignAccess.sendUnbox(unboxNode, (TruffleObject) value);
                                 }
                             } catch (UnknownIdentifierException | UnsupportedMessageException e) {
                                 throw RInternalError.shouldNotReachHere(e);
@@ -405,20 +404,20 @@ public final class ValuePrinterNode extends RBaseNode {
         return boxPrimitiveNode.execute(o);
     }
 
-    private Object convertTruffleObject(VirtualFrame frame, Object o) {
+    private Object convertTruffleObject(Object o) {
         if (o instanceof TruffleObject && !(o instanceof RTypedValue)) {
             if (convertTruffleObject == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
                 convertTruffleObject = insert(new ConvertTruffleObjectNode());
             }
-            return convertTruffleObject.convert(frame, (TruffleObject) o);
+            return convertTruffleObject.convert((TruffleObject) o);
         }
         return o;
     }
 
-    public String execute(VirtualFrame frame, Object o, Object digits, boolean quote, Object naPrint, Object printGap, boolean right, Object max, boolean useSource, boolean noOpt) {
+    public String execute(Object o, Object digits, boolean quote, Object naPrint, Object printGap, boolean right, Object max, boolean useSource, boolean noOpt) {
         try {
-            prettyPrint(convertTruffleObject(frame, o), new PrintParameters(digits, quote, naPrint, printGap, right, max, useSource, noOpt), RWriter::new);
+            prettyPrint(convertTruffleObject(o), new PrintParameters(digits, quote, naPrint, printGap, right, max, useSource, noOpt), RWriter::new);
             return null;
         } catch (IOException ex) {
             throw RError.ioError(this, ex);
@@ -576,12 +575,8 @@ public final class ValuePrinterNode extends RBaseNode {
         }
     }
 
-    public Object prettyPrint(VirtualFrame frame, Object v, WriterFactory wf) {
-        return prettyPrint(convertTruffleObject(frame, v), wf);
-    }
-
     @TruffleBoundary
-    private Object prettyPrint(Object v, WriterFactory wf) {
+    public Object prettyPrint(Object v, WriterFactory wf) {
         PrintParameters printParams = new PrintParameters();
         printParams.setDefaults();
         printParams.setSuppressIndexLabels(true);
@@ -619,7 +614,7 @@ public final class ValuePrinterNode extends RBaseNode {
 
             @Override
             public Object execute(VirtualFrame frame) {
-                return valuePrinterNode.prettyPrint(frame, value, AnyVectorToStringVectorWriter::new);
+                return valuePrinterNode.prettyPrint(value, AnyVectorToStringVectorWriter::new);
             }
         }).call(value);
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java
index d2cd4888e2b1df1307d8ffdfb04dc3ebbc666924..16cc34b1b57661dc0db381a6f0d57db48be81cd0 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRInterop.java
@@ -41,7 +41,6 @@ import com.oracle.truffle.api.Truffle;
 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.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.DirectCallNode;
@@ -203,8 +202,8 @@ public class FastRInterop {
         }
 
         @Specialization
-        public byte hasSize(VirtualFrame frame, TruffleObject obj) {
-            return RRuntime.asLogical(ForeignAccess.sendHasSize(node, frame, obj));
+        public byte hasSize(TruffleObject obj) {
+            return RRuntime.asLogical(ForeignAccess.sendHasSize(node, obj));
         }
     }
 
@@ -218,8 +217,8 @@ public class FastRInterop {
         }
 
         @Specialization
-        public byte hasSize(VirtualFrame frame, TruffleObject obj) {
-            return RRuntime.asLogical(ForeignAccess.sendIsNull(node, frame, obj));
+        public byte hasSize(TruffleObject obj) {
+            return RRuntime.asLogical(ForeignAccess.sendIsNull(node, obj));
         }
     }
 
@@ -233,8 +232,8 @@ public class FastRInterop {
         }
 
         @Specialization
-        public byte hasSize(VirtualFrame frame, TruffleObject obj) {
-            return RRuntime.asLogical(ForeignAccess.sendIsExecutable(node, frame, obj));
+        public byte hasSize(TruffleObject obj) {
+            return RRuntime.asLogical(ForeignAccess.sendIsExecutable(node, obj));
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java
index adf82d3b8cc43bdd842a0851083a5b70355154c5..56de20fc59ab85905959cd34a4e2475b028def6e 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java
@@ -103,29 +103,28 @@ public abstract class ExtractVectorNode extends Node {
         return FirstStringNode.createWithError(RError.Message.GENERIC, "Cannot corce position to character for foreign access.");
     }
 
-    @SuppressWarnings("unused")
     @Specialization(guards = {"isForeignObject(object)", "positions.length == cachedLength"})
-    protected Object accessField(VirtualFrame frame, TruffleObject object, Object[] positions, Object exact, Object dropDimensions,
+    protected Object accessField(TruffleObject object, Object[] positions, Object exact, Object dropDimensions,
                     @Cached("createForeignRead(positions)") Node foreignRead,
-                    @Cached("positions.length") int cachedLength,
+                    @SuppressWarnings("unused") @Cached("positions.length") int cachedLength,
                     @Cached("create()") CastStringNode castNode,
                     @Cached("createFirstString()") FirstStringNode firstString,
                     @Cached("createClassProfile()") ValueProfile positionProfile) {
         Object position = positionProfile.profile(positions[0]);
         try {
             if (position instanceof Integer) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((int) position) - 1});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((int) position) - 1});
             } else if (position instanceof Double) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((double) position) - 1});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((double) position) - 1});
             } else if (position instanceof String) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{position});
+                return ForeignAccess.send(foreignRead, object, new Object[]{position});
             } else if (position instanceof RAbstractStringVector) {
                 String string = firstString.executeString(castNode.execute(position));
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{string});
+                return ForeignAccess.send(foreignRead, object, new Object[]{string});
             } else if (position instanceof RAbstractDoubleVector) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((RAbstractDoubleVector) position).getDataAt(0) - 1});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((RAbstractDoubleVector) position).getDataAt(0) - 1});
             } else if (position instanceof RAbstractIntVector) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((RAbstractIntVector) position).getDataAt(0) - 1});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((RAbstractIntVector) position).getDataAt(0) - 1});
             } else {
                 throw RError.error(this, RError.Message.GENERIC, "invalid index during foreign access");
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java
index 86ed97dbd92dcb06311a26183d164162942e587a..03428c908e12d7675b48cfe2fbb093427c9672a2 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java
@@ -95,11 +95,10 @@ public abstract class ReplaceVectorNode extends Node {
         return FirstStringNode.createWithError(RError.Message.GENERIC, "Cannot corce position to character for foreign access.");
     }
 
-    @SuppressWarnings("unused")
     @Specialization(guards = {"isForeignObject(object)", "positions.length == cachedLength"})
-    protected Object accessField(VirtualFrame frame, TruffleObject object, Object[] positions, Object value,
+    protected Object accessField(TruffleObject object, Object[] positions, Object value,
                     @Cached("createForeignWrite(positions)") Node foreignRead,
-                    @Cached("positions.length") int cachedLength,
+                    @SuppressWarnings("unused") @Cached("positions.length") int cachedLength,
                     @Cached("create()") CastStringNode castNode,
                     @Cached("createFirstString()") FirstStringNode firstString) {
 
@@ -112,18 +111,18 @@ public abstract class ReplaceVectorNode extends Node {
         Object position = positions[0];
         try {
             if (position instanceof Integer) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((Integer) position) - 1, writtenValue});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((Integer) position) - 1, writtenValue});
             } else if (position instanceof Double) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((Double) position) - 1, writtenValue});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((Double) position) - 1, writtenValue});
             } else if (position instanceof String) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{position, writtenValue});
+                return ForeignAccess.send(foreignRead, object, new Object[]{position, writtenValue});
             } else if (position instanceof RAbstractStringVector) {
                 String string = firstString.executeString(castNode.execute(position));
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{string, writtenValue});
+                return ForeignAccess.send(foreignRead, object, new Object[]{string, writtenValue});
             } else if (position instanceof RAbstractDoubleVector) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((RAbstractDoubleVector) position).getDataAt(0) - 1, writtenValue});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((RAbstractDoubleVector) position).getDataAt(0) - 1, writtenValue});
             } else if (position instanceof RAbstractIntVector) {
-                return ForeignAccess.send(foreignRead, frame, object, new Object[]{((RAbstractIntVector) position).getDataAt(0) - 1, writtenValue});
+                return ForeignAccess.send(foreignRead, object, new Object[]{((RAbstractIntVector) position).getDataAt(0) - 1, writtenValue});
             } else {
                 throw RError.error(this, RError.Message.GENERIC, "invalid index during foreign access");
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java
index 254803f871184cebdae909f57bb45bc0ad9d3606..b16e8e51ce1e0219f429755fc5e647bda01546e6 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java
@@ -142,14 +142,14 @@ public abstract class RLengthNode extends RNode {
     }
 
     @Specialization(guards = "isForeignObject(object)")
-    protected int getForeignSize(VirtualFrame frame, TruffleObject object,
+    protected int getForeignSize(TruffleObject object,
                     @Cached("createHasSize()") Node hasSizeNode,
                     @Cached("createGetSize()") Node getSizeNode) {
         try {
-            if (!(boolean) ForeignAccess.send(hasSizeNode, frame, object)) {
+            if (!(boolean) ForeignAccess.send(hasSizeNode, object)) {
                 return 1;
             }
-            return (int) ForeignAccess.send(getSizeNode, frame, object);
+            return (int) ForeignAccess.send(getSizeNode, object);
         } catch (InteropException e) {
             throw RError.interopError(this, e, object);
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
index 427b9c1c60c09e0bf19005119dbe5d29ada820d7..5c9497e41bdfb24bd5d4092800123fee1682d397 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
@@ -499,7 +499,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
                 foreignCallArgCount = argumentsArray.length;
             }
             try {
-                Object result = ForeignAccess.sendExecute(foreignCall, frame, function, argumentsArray);
+                Object result = ForeignAccess.sendExecute(foreignCall, function, argumentsArray);
                 if (result instanceof Boolean) {
                     // convert to R logical
                     // TODO byte/short convert to int?
diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/truffle/TruffleRFFIFrameHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/truffle/TruffleRFFIFrameHelper.java
deleted file mode 100644
index 6b892a78508eb4b640a63e20b5836ba5136b4718..0000000000000000000000000000000000000000
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/truffle/TruffleRFFIFrameHelper.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.truffle.r.runtime.ffi.truffle;
-
-import com.oracle.truffle.api.frame.VirtualFrame;
-import com.oracle.truffle.r.runtime.SubstituteVirtualFrame;
-import com.oracle.truffle.r.runtime.Utils;
-
-public class TruffleRFFIFrameHelper {
-    public static VirtualFrame create() {
-        return SubstituteVirtualFrame.create(Utils.getActualCurrentFrame().materialize());
-    }
-}
diff --git a/mx.fastr/suite.py b/mx.fastr/suite.py
index 1d08d05febcb302ba6a5893793dc42f3ebb01c10..fad0981f6dd9d10f6fd38521d1b490453b022a5d 100644
--- a/mx.fastr/suite.py
+++ b/mx.fastr/suite.py
@@ -28,7 +28,7 @@ suite = {
     "suites" : [
             {
                "name" : "truffle",
-               "version" : "54e4d48faa085ae1fb1bbcdb4733acfd523a5fd0",
+               "version" : "ffe6583cc1d92c8e9f7cddd8283c23941faecddc",
                "urls" : [
                     {"url" : "https://github.com/graalvm/truffle", "kind" : "git"},
                     {"url" : "https://curio.ssw.jku.at/nexus/content/repositories/snapshots", "kind" : "binary"},