diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java
index 9b0c0e76b8e1f08e9b81f8135f91f73074363d03..3edeeca12f54968580af52923630e07ef930ebb2 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/OptionsFunctions.java
@@ -57,10 +57,7 @@ import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 
 public class OptionsFunctions {
-    /*
-     * This could be refactored using a recursive child node to handle simple cases, but it's
-     * unlikely to be the fast path.
-     */
+
     @RBuiltin(name = "options", visibility = CUSTOM, kind = INTERNAL, parameterNames = {"..."}, behavior = MODIFIES_STATE)
     public abstract static class Options extends RBuiltinNode {
 
@@ -107,7 +104,7 @@ public class OptionsFunctions {
                 return result.value;
             } catch (OptionsException ex) {
                 CompilerDirectives.transferToInterpreter();
-                throw RError.error(this, ex);
+                throw RError.error(RError.SHOW_CALLER, ex);
             }
         }
 
@@ -167,7 +164,7 @@ public class OptionsFunctions {
                             names = newNames;
                         }
                     } else {
-                        throw RError.error(this, Message.INVALID_UNNAMED_ARGUMENT);
+                        throw RError.error(RError.SHOW_CALLER, Message.INVALID_UNNAMED_ARGUMENT);
                     }
                     Object optionVal = options.getValue(optionName);
                     data[i] = optionVal == null ? RNull.instance : optionVal;
@@ -203,7 +200,7 @@ public class OptionsFunctions {
         @Specialization
         protected Object getOption(RAbstractStringVector x) {
             if (x.getLength() != 1) {
-                throw RError.error(this, RError.Message.MUST_BE_STRING);
+                throw RError.error(RError.SHOW_CALLER, RError.Message.MUST_BE_STRING);
             }
             ROptions.ContextStateImpl options = RContext.getInstance().stateROptions;
             return options.getValue(x.getDataAt(0));
@@ -211,7 +208,7 @@ public class OptionsFunctions {
 
         @Fallback
         protected Object getOption(@SuppressWarnings("unused") Object x) {
-            throw RError.error(this, RError.Message.MUST_BE_STRING);
+            throw RError.error(RError.SHOW_CALLER, RError.Message.MUST_BE_STRING);
         }
     }
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java
index 7d7294095202e7f5ee95e789e947a12832a2e9c4..60c5f72e5830f273253b0b708b2c0b9b9961d67f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RExternalBuiltinNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -36,7 +36,8 @@ import com.oracle.truffle.r.nodes.unary.CastLogicalNodeGen;
 import com.oracle.truffle.r.nodes.unary.CastNode;
 import com.oracle.truffle.r.nodes.unary.CastToVectorNode;
 import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen;
-import com.oracle.truffle.r.runtime.RInternalError;
+import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RTypes;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
@@ -125,10 +126,14 @@ public abstract class RExternalBuiltinNode extends RBaseNode {
         }
     }
 
-    private static void checkLength(RArgsValuesAndNames args, int expectedLength) {
+    protected void checkLength(RArgsValuesAndNames args, int expectedLength) {
         if (args.getLength() != expectedLength) {
             CompilerDirectives.transferToInterpreter();
-            throw RInternalError.shouldNotReachHere("mismatching number of arguments to foreign function");
+            String name = this.getClass().getSimpleName();
+            if (name.endsWith("NodeGen")) {
+                name = name.substring(0, name.length() - 7);
+            }
+            throw RError.error(this, Message.INCORRECT_NOF_ARGS, args.getLength(), expectedLength, name.toLowerCase());
         }
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java
index ea0079348269c1bfaff45ef530e280c38123ae01..adedfbb1e561359141ead1f3484d140d10b8bb70 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java
@@ -778,7 +778,8 @@ public final class RError extends RuntimeException {
         MUST_BE_GE_ONE("'%s' must be of length >= 1"),
         MORE_THAN_ONE_MATCH("there is more than one match in '%s'"),
         TOO_MANY_ARGS("too many arguments"),
-        ARG_MUST_BE_CHARACTER("argument '%s' must be character");
+        ARG_MUST_BE_CHARACTER("argument '%s' must be character"),
+        INCORRECT_NOF_ARGS("Incorrect number of arguments (%d), expecting %d for '%s'");
 
         public final String message;
         final boolean hasArgs;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java
index 4bfe08721a679adf96f67887256232a0940fadbd..9344c42965fa52e26c5a5218ceef62f3efb4f81d 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_crc64.java
@@ -39,11 +39,7 @@ public class TestBuiltin_crc64 extends TestBase {
         assertEval(".Internal(crc64(paste(c(letters, LETTERS, 0:9), collapse=\"\")))");
         assertEval(".Internal(crc64(c('a')))");
 
-        // Expression: .Internal(crc64('a', 'b'))
-        // Expected output: Error: 2 arguments passed to .Internal(crc64) which requires 1
-        // FastR output: Error in crc64("a", "b") : unused argument ('b')
-        // should be handled in .Internal-s impl ?
-        assertEval(Ignored.ImplementationError, ".Internal(crc64('a', 'b'))");
+        assertEval(".Internal(crc64('a', 'b'))");
 
         assertEval(".Internal(crc64(c(1, 2)))");
 
@@ -74,12 +70,8 @@ public class TestBuiltin_crc64 extends TestBase {
 
         assertEval(".Call(utils:::C_crc64, c('a'))");
 
-        // // Expected output: Incorrect number of arguments (2), expecting 1 for 'crc64'
-        // // FastR output: throws com.oracle.truffle.r.runtime.RInternalError: should not reach
-        // here: mismatching number of arguments to foreign function
-        // // should be handled in .Call-s impl ?
-        assertEval(Ignored.ImplementationError, ".Call(utils:::C_crc64, 'a', 'b')");
-        assertEval(Ignored.ImplementationError, ".Call(utils:::C_crc64)");
+        assertEval(".Call(utils:::C_crc64, 'a', 'b')");
+        assertEval(".Call(utils:::C_crc64)");
 
         assertEval(".Call(utils:::C_crc64, c(1, 2))");
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java
index 175a144bc53168546d920c487663124cadc29601..894d7da3d6b0504510621d341e513a8b62e3abbb 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_options.java
@@ -54,18 +54,18 @@ public class TestBuiltin_options extends TestBase {
         assertEval("{ f<-function(){}; options(editor=f); identical(getOption(\"editor\"), f) }");
         assertEval("{ options(editor=\"vi\"); identical(getOption(\"editor\"), \"vi\") }");
         assertEval("{ options(editor=NULL); identical(getOption(\"editor\"), NULL) }");
-        assertEval(Ignored.WrongCaller, "{ options(editor=\"\") }");
+        assertEval("{ options(editor=\"\") }");
     }
 
     @Test
     public void testPrompt() {
-        assertEval(Ignored.WrongCaller, "{ options(prompt=NULL) }");
+        assertEval("{ options(prompt=NULL) }");
         assertEval("{ options(prompt=\"abc\"); identical(getOption(\"prompt\"), \"abc\") }");
     }
 
     @Test
     public void testContinue() {
-        assertEval(Ignored.WrongCaller, "{ options(continue=NULL) }");
+        assertEval("{ options(continue=NULL) }");
         assertEval("{ options(continue=\"abc\"); identical(getOption(\"continue\"), \"abc\") }");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java
index 0e2c0e52598ba1a865aa7d5b23ef4fac105eac09..2799e9a5ec964f71a3dcb2d8386ecf7b659e567c 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java
@@ -64,8 +64,7 @@ public class TestBuiltin_strsplit extends TestBase {
 
     @Test
     public void teststrsplit10() {
-        assertEval(Ignored.Unknown,
-                        "argv <- list('A shell of class documentation has been written to the file \\'./myTst2/man/DocLink-class.Rd\\'.\\n', '[ \\t\\n]', FALSE, TRUE, TRUE); .Internal(strsplit(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))");
+        assertEval("argv <- list('A shell of class documentation has been written to the file \\'./myTst2/man/DocLink-class.Rd\\'.\\n', '[ \\t\\n]', FALSE, TRUE, TRUE); .Internal(strsplit(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java
index c53b3e7847081d8b5d02e5d43a3b35b92813f8d4..811272afd42a247c5d2955715525e77e5d907825 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sum.java
@@ -104,7 +104,7 @@ public class TestBuiltin_sum extends TestBase {
 
     @Test
     public void testsum18() {
-        assertEval(Ignored.Unknown, "argv <- list(c(1073741824L, 1073741824L));sum(argv[[1]]);");
+        assertEval("argv <- list(c(1073741824L, 1073741824L));sum(argv[[1]]);");
     }
 
     @Test