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 d0d48097d59d96b28d8e3770e37f6f31bb0d5131..b3d2794751f1872b52fbf75baf62bcf95fae2094 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
@@ -233,7 +233,7 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess {
             List<RCodeBuilder.Argument<RSyntaxNode>> argList = new ArrayList<>(length - 1);
             for (int i = 1; i < length; i++) {
                 String formal = formals == null ? null : formals.getDataAt(i);
-                RSyntaxNode syntaxArg = (RSyntaxNode) unwrapToRNode(list.getDataAtAsObject(i));
+                RSyntaxNode syntaxArg = (RSyntaxNode) unwrapToRNode(list.getDataAtAsObject(i), false);
                 if (formal != null) {
                     argList.add(RCodeBuilder.argument(RSourceSectionNode.LAZY_DEPARSE, formal, syntaxArg));
                 } else {
@@ -241,7 +241,7 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess {
                 }
             }
 
-            RNode fn = unwrapToRNode(list.getDataAtAsObject(0));
+            RNode fn = unwrapToRNode(list.getDataAtAsObject(0), true);
             RSyntaxNode call = RContext.getASTBuilder().call(RSourceSectionNode.LAZY_DEPARSE, fn.asRSyntaxNode(), argList);
             RLanguage result = RDataFactory.createLanguage(call.asRNode());
             if (formals != null && formals.getLength() > 0 && formals.getDataAt(0).length() > 0) {
@@ -250,13 +250,13 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess {
             return addAttributes(result, list);
         } else if (repType == RLanguage.RepType.FUNCTION) {
             RList argsList = (RList) list.getDataAt(1);
-            RSyntaxNode body = (RSyntaxNode) unwrapToRNode(list.getDataAt(2));
+            RSyntaxNode body = (RSyntaxNode) unwrapToRNode(list.getDataAt(2), false);
             List<Argument<RSyntaxNode>> resArgs = new LinkedList<>();
             RStringVector argsNames = argsList.getNames();
             for (int i = 0; i < argsList.getLength(); i++) {
                 String argName = argsNames == null ? null : argsNames.getDataAt(i);
                 Object argVal = argsList.getDataAt(i);
-                Argument<RSyntaxNode> arg = RCodeBuilder.argument(RSyntaxNode.LAZY_DEPARSE, argName, argVal == RSymbol.MISSING ? null : (RSyntaxNode) unwrapToRNode(argVal));
+                Argument<RSyntaxNode> arg = RCodeBuilder.argument(RSyntaxNode.LAZY_DEPARSE, argName, argVal == RSymbol.MISSING ? null : (RSyntaxNode) unwrapToRNode(argVal, false));
                 resArgs.add(arg);
             }
             RootCallTarget rootCallTarget = RContext.getASTBuilder().rootFunction(RContext.getInstance().getLanguage(), RSyntaxNode.LAZY_DEPARSE, resArgs, body, null);
@@ -276,14 +276,14 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess {
         return result;
     }
 
-    private RNode unwrapToRNode(Object objArg) {
+    private RNode unwrapToRNode(Object objArg, boolean functionLookup) {
         Object obj = objArg;
         // obj is RSymbol or a primitive value.
         // A symbol needs to be converted back to a ReadVariableNode
         if (obj instanceof RLanguage) {
             return (RNode) RASTUtils.unwrap(((RLanguage) obj).getRep());
         } else if (obj instanceof RSymbol) {
-            return RContext.getASTBuilder().lookup(RSyntaxNode.LAZY_DEPARSE, ((RSymbol) obj).getName(), false).asRNode();
+            return RContext.getASTBuilder().lookup(RSyntaxNode.LAZY_DEPARSE, ((RSymbol) obj).getName(), functionLookup).asRNode();
         } else if (obj instanceof RPromise) {
             // Evaluate promise and return the result as constant.
             return ConstantNode.create(forcePromise("unwrapToRNode", objArg));
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 fa3a468fa0f357f2df8281a4ae092569ecf9177c..1a9ebda52122b1ff9da0aeb76516d5745e6eaba9 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
@@ -2783,6 +2783,10 @@ character(0)
 #argv <- structure(list(expr = expression(quote(temp[1, ] ~ 3))),     .Names = 'expr');do.call('all.vars', argv)
 [1] "temp"
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_allvars.testallvars2#
+#{ fml <- as.formula('v ~ a + b'); fml[[2]] <- NULL; all.vars(fml) }
+[1] "a" "b"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_and_octmode.testand_octmode1#
 #argv <- structure(list(a = structure(integer(0), class = 'octmode'),     b = '400'), .Names = c('a', 'b'));do.call('&.octmode', argv)
 character(0)
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java
index d7a2158250a43b05c25ddc352036b4ddecf88bcc..0fa7a639c1bb7e0fc67f353d78e9472b08afd7f3 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allvars.java
@@ -22,4 +22,9 @@ public class TestBuiltin_allvars extends TestBase {
     public void testallvars1() {
         assertEval("argv <- structure(list(expr = expression(quote(temp[1, ] ~ 3))),     .Names = 'expr');do.call('all.vars', argv)");
     }
+
+    @Test
+    public void testallvars2() {
+        assertEval("{ fml <- as.formula('v ~ a + b'); fml[[2]] <- NULL; all.vars(fml) }");
+    }
 }