diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java
index 3be03b99133e8b48791416edae3f4fbcfcbdcb0b..1139df347c88ba98ffad02fb0074ffca2aa536b4 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java
@@ -242,7 +242,8 @@ public abstract class InternalNode extends OperatorNode {
         protected Object[] prepareArgs(VirtualFrame frame) {
             Object[] args = new Object[arguments.length];
             for (int i = 0; i < args.length; i++) {
-                args[i] = arguments[i].execute(frame);
+                Object execute = arguments[i].execute(frame);
+                args[i] = execute;
             }
             return args;
         }
@@ -300,11 +301,13 @@ public abstract class InternalNode extends OperatorNode {
             Object[] args = new Object[factory.getSignature().getLength()];
 
             for (int i = 0; i < args.length - 1; i++) {
-                args[i] = arguments[i].execute(frame);
+                Object arg = arguments[i].execute(frame);
+                args[i] = arg;
             }
             Object[] varArgs = new Object[arguments.length - (factory.getSignature().getLength() - 1)];
             for (int i = 0; i < varArgs.length; i++) {
-                varArgs[i] = arguments[args.length - 1 + i].execute(frame);
+                Object arg = arguments[args.length - 1 + i].execute(frame);
+                varArgs[i] = arg;
             }
             args[args.length - 1] = new RArgsValuesAndNames(varArgs, ArgumentsSignature.empty(varArgs.length));
             return args;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
index c3a0a12254405c034ad0cbd1c12137c5ebe61d76..4421b005683f46460eac43bb97e732a92401b227 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
@@ -540,10 +540,10 @@ public abstract class PromiseNode extends RNode {
                     evaluatedArgs[i] = argValue;
                 } else {
                     size++;
-                    evaluatedArgs[i] = promiseCheckHelper.checkEvaluate(frame, argValue);
+                    Object arg = promiseCheckHelper.checkEvaluate(frame, argValue);
+                    evaluatedArgs[i] = arg;
                 }
                 if (evaluatedArgs[i] == null) {
-                    CompilerDirectives.transferToInterpreterAndInvalidate();
                     throw RInternalError.shouldNotReachHere("evaluated argument must not be null");
                 }
             }
@@ -565,10 +565,10 @@ public abstract class PromiseNode extends RNode {
                     evaluatedArgs[i] = argValue;
                 } else {
                     size++;
-                    evaluatedArgs[i] = promiseCheckHelper.checkEvaluate(frame, argValue);
+                    Object arg = promiseCheckHelper.checkEvaluate(frame, argValue);
+                    evaluatedArgs[i] = arg;
                 }
                 if (evaluatedArgs[i] == null) {
-                    CompilerDirectives.transferToInterpreterAndInvalidate();
                     throw RInternalError.shouldNotReachHere("evaluated argument must not be null");
                 }
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java
index 73380b076b96549b3ddacea79e07178ea0573705..97d59407e63fcdbba076d896f2b946d2b3edc40e 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java
@@ -91,7 +91,10 @@ public final class OptForcedEagerPromiseNode extends PromiseNode {
                 call = call.getParent();
             }
         }
-        return factory.createEagerSuppliedPromise(value, alwaysValidAssumption, call, null, wrapIndex);
+        if (CompilerDirectives.inInterpreter()) {
+            return factory.createEagerSuppliedPromise(value, alwaysValidAssumption, call, null, wrapIndex, frame.materialize());
+        }
+        return factory.createEagerSuppliedPromise(value, alwaysValidAssumption, call, null, wrapIndex, null);
     }
 
     @Override
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java
index ef9229e20adc23db8633d5d5e3a12fc87dab69be..2270de4f5184ab124d6cb5ee212c9b44c7b936b5 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java
@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.function.opt;
 import com.oracle.truffle.api.Assumption;
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.frame.FrameSlot;
+import com.oracle.truffle.api.frame.MaterializedFrame;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.nodes.InvalidAssumptionException;
 import com.oracle.truffle.api.profiles.BranchProfile;
@@ -99,10 +100,16 @@ public abstract class OptVariablePromiseBaseNode extends PromiseNode implements
             promiseCallerProfile.enter();
             call = call.getParent();
         }
+
+        MaterializedFrame execFrame = null;
+        if (CompilerDirectives.inInterpreter()) {
+            execFrame = frame.materialize();
+        }
+
         if (result instanceof RPromise) {
-            return factory.createPromisedPromise((RPromise) result, notChangedNonLocally, call, this);
+            return factory.createPromisedPromise((RPromise) result, notChangedNonLocally, call, this, execFrame);
         } else {
-            return factory.createEagerSuppliedPromise(result, notChangedNonLocally, call, this, wrapIndex);
+            return factory.createEagerSuppliedPromise(result, notChangedNonLocally, call, this, wrapIndex, execFrame);
         }
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
index 434f23bb056da3702e818a2be7cee7e38aff6281..4b1ef19c90503c90823f29afb817eb2aa1c7d844 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
@@ -502,18 +502,18 @@ public final class RDataFactory {
     }
 
     public static RPromise createEagerPromise(PromiseState state, Closure exprClosure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback,
-                    int wrapIndex) {
+                    int wrapIndex, MaterializedFrame execFrame) {
         if (FastROptions.noEagerEval()) {
             throw RInternalError.shouldNotReachHere();
         }
-        return traceDataCreated(new RPromise.EagerPromise(state, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, wrapIndex));
+        return traceDataCreated(new RPromise.EagerPromise(state, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, wrapIndex, execFrame));
     }
 
-    public static RPromise createPromisedPromise(Closure exprClosure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback) {
+    public static RPromise createPromisedPromise(Closure exprClosure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, MaterializedFrame execFrame) {
         if (FastROptions.noEagerEval()) {
             throw RInternalError.shouldNotReachHere();
         }
-        return traceDataCreated(new RPromise.EagerPromise(PromiseState.Promised, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, -1));
+        return traceDataCreated(new RPromise.EagerPromise(PromiseState.Promised, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, -1, execFrame));
     }
 
     public static Object createLangPairList(int size) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
index db83ac5f85b11e51bf639f764170106a24973749..627c2ea261d9df22f4e70cea74c57d32232fb889 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
@@ -26,7 +26,6 @@ import java.util.HashMap;
 
 import com.oracle.truffle.api.Assumption;
 import com.oracle.truffle.api.CompilerAsserts;
-import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.CompilerDirectives.ValueType;
@@ -301,8 +300,8 @@ public class RPromise extends RObject implements RTypedValue {
          */
         private boolean deoptimized = false;
 
-        EagerPromise(PromiseState state, Closure closure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex) {
-            super(state, (MaterializedFrame) null, closure);
+        EagerPromise(PromiseState state, Closure closure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex, MaterializedFrame execFrame) {
+            super(state, execFrame, closure);
             assert state != PromiseState.Explicit;
             this.eagerValue = eagerValue;
             this.notChangedNonLocally = notChangedNonLocally;
@@ -317,7 +316,6 @@ public class RPromise extends RObject implements RTypedValue {
         public boolean deoptimize() {
             if (!deoptimized && !isEvaluated() && feedback != null) {
                 deoptimized = true;
-                notifyFailure();
                 materialize();
                 return false;
             }
@@ -327,8 +325,10 @@ public class RPromise extends RObject implements RTypedValue {
         @TruffleBoundary
         public void materialize() {
             if (execFrame == null) {
-                CompilerDirectives.transferToInterpreterAndInvalidate();
                 this.execFrame = Utils.getStackFrame(FrameAccess.MATERIALIZE, targetFrame).materialize();
+                if (feedback != null) {
+                    notifyFailure();
+                }
             }
         }
 
@@ -408,14 +408,14 @@ public class RPromise extends RObject implements RTypedValue {
          *            until evaluation
          * @return An {@link EagerPromise}
          */
-        public RPromise createEagerSuppliedPromise(Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex) {
+        public RPromise createEagerSuppliedPromise(Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex, MaterializedFrame execFrame) {
             return RDataFactory.createEagerPromise(state == PromiseState.Default ? PromiseState.EagerDefault : PromiseState.EagerSupplied, exprClosure, eagerValue, notChangedNonLocally, targetFrame,
-                            feedback, wrapIndex);
+                            feedback, wrapIndex, execFrame);
         }
 
-        public RPromise createPromisedPromise(RPromise promisedPromise, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback) {
+        public RPromise createPromisedPromise(RPromise promisedPromise, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, MaterializedFrame execFrame) {
             assert state == PromiseState.Supplied;
-            return RDataFactory.createPromisedPromise(exprClosure, promisedPromise, notChangedNonLocally, targetFrame, feedback);
+            return RDataFactory.createPromisedPromise(exprClosure, promisedPromise, notChangedNonLocally, targetFrame, feedback, execFrame);
         }
 
         public Object getExpr() {