diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
index f6a101e149dab4e47ce4ee036603b8643db9eb9f..1bf4c9fcea7536b40a4f6823587a97eaded66f77 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
@@ -191,6 +191,7 @@ public final class ReadVariableNode extends RSourceSectionNode implements RSynta
     }
 
     public Object execute(VirtualFrame frame, Frame variableFrame) {
+        assert frame != null;
         return executeInternal(frame, kind == ReadKind.Super ? superEnclosingFrameProfile.profile(RArguments.getEnclosingFrame(variableFrame)) : variableFrame);
     }
 
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 69037c6399a16f843fe699d9e9199287543b6f78..516a88ad1537d6d600a75df1ddb2a1e98337caf6 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
@@ -170,7 +170,6 @@ abstract class S4Class extends RBaseNode {
 
     public abstract RStringVector executeRStringVector(String classAttr);
 
-    @Child private ReadVariableNode sExtendsForS3Find = ReadVariableNode.createFunctionLookup(RSyntaxNode.INTERNAL, ".extendsForS3");
     @Child private CastToVectorNode castToVector = CastToVectorNode.create();
 
     @TruffleBoundary
@@ -180,8 +179,8 @@ abstract class S4Class extends RBaseNode {
         RStringVector s4Extends = RContext.getInstance().getS4Extends(classAttr);
         if (s4Extends == null) {
             REnvironment methodsEnv = REnvironment.getRegisteredNamespace("methods");
-            RFunction sExtendsForS3Function = (RFunction) sExtendsForS3Find.execute(null, methodsEnv.getFrame());
-            // the assumption here is that R function can only return either a String or
+            RFunction sExtendsForS3Function = ReadVariableNode.lookupFunction(".extendsForS3", methodsEnv.getFrame(), false);
+            // the assumption here is that the R function can only return either a String or
             // RStringVector
             s4Extends = (RStringVector) castToVector.execute(RContext.getEngine().evalFunction(sExtendsForS3Function, methodsEnv.getFrame(), classAttr));
             RContext.getInstance().putS4Extends(classAttr, s4Extends);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/S3FunctionLookupNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/S3FunctionLookupNode.java
index 342c1c1a3d049fbe6c8321862e5b57364d4d36d8..71553ad110b389ef808a201541698de6ea1c892c 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/S3FunctionLookupNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/S3FunctionLookupNode.java
@@ -297,7 +297,7 @@ public abstract class S3FunctionLookupNode extends RBaseNode {
                 if ((genericIdentityProfile.profile(genericName != cachedGenericName) && !cachedGenericName.equals(genericName)) || !isEqualType(type) || group != cachedGroup) {
                     return next.execute(frame, genericName, type, group, callerFrame, genericDefFrame);
                 }
-                if (!executeReads(unsuccessfulReadsCallerFrame, callerFrame)) {
+                if (!executeReads(frame, unsuccessfulReadsCallerFrame, callerFrame)) {
                     break;
                 }
                 REnvironment methodsTable;
@@ -311,7 +311,7 @@ public abstract class S3FunctionLookupNode extends RBaseNode {
                 }
                 if (successfulRead != null || successfulReadTable != null) {
 
-                    Object actualFunction = successfulRead != null ? successfulRead.execute(null, callerFrame) : successfulReadTable.execute(null, methodsTable.getFrame());
+                    Object actualFunction = successfulRead != null ? successfulRead.execute(frame, callerFrame) : successfulReadTable.execute(frame, methodsTable.getFrame());
                     if (actualFunction != result.function) {
                         break;
                     }
@@ -331,9 +331,9 @@ public abstract class S3FunctionLookupNode extends RBaseNode {
         }
 
         @ExplodeLoop
-        private static boolean executeReads(ReadVariableNode[] reads, Frame callerFrame) {
+        private static boolean executeReads(VirtualFrame frame, ReadVariableNode[] reads, Frame callerFrame) {
             for (ReadVariableNode read : reads) {
-                if (read.execute(null, callerFrame) != null) {
+                if (read.execute(frame, callerFrame) != null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
                     return false;
                 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java
index 3f7cfee8b4ab7a915e5e5e7814141b0290cc3ae2..f11df1e5baaacd88078af09ba8fdf1f8b8495c5d 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java
@@ -119,7 +119,7 @@ abstract class LoadMethod extends RBaseNode {
             if (loadMethodFind == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
                 loadMethodFind = insert(ReadVariableNode.createFunctionLookup(RSyntaxNode.INTERNAL, RRuntime.R_LOAD_METHOD_NAME));
-                currentFunction = (RFunction) loadMethodFind.execute(null, methodsEnv.getFrame());
+                currentFunction = (RFunction) loadMethodFind.execute(frame, methodsEnv.getFrame());
                 loadMethodFunction = currentFunction;
                 loadMethodCall = insert(Truffle.getRuntime().createDirectCallNode(loadMethodFunction.getTarget()));
                 RError.performanceWarning("loadMethod executing slow path");