diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java
index 9b4b963429d62fac8895a37defd264e109ff1072..4bd48a15a743aaff1b327b67af887a2d02dc5712 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java
@@ -96,18 +96,18 @@ public final class GridContext {
     public void openDefaultDevice() {
         String defaultDev = RGridGraphicsAdapter.getDefaultDevice();
         if (defaultDev.equals("awt") || defaultDev.startsWith("X11")) {
-            if (!FastRConfig.InternalGridAwtSupport) {
-                throw awtNotSupported();
-            } else {
-                setCurrentDevice(defaultDev, WindowDevice.createWindowDevice());
-            }
+            ensureAwtSupport();
+            setCurrentDevice(defaultDev, WindowDevice.createWindowDevice());
         } else if (defaultDev.equals("svg")) {
             setCurrentDevice(defaultDev, new SVGDevice("Rplot.svg", GridDevice.DEFAULT_WIDTH, GridDevice.DEFAULT_HEIGHT));
         } else if (defaultDev.equals("png")) {
+            ensureAwtSupport();
             setCurrentDevice(defaultDev, safeOpenImageDev("Rplot.png", "png"));
         } else if (defaultDev.equals("bmp")) {
+            ensureAwtSupport();
             setCurrentDevice(defaultDev, safeOpenImageDev("Rplot.bmp", "bmp"));
         } else if (defaultDev.equals("jpg") || defaultDev.equals("jpeg")) {
+            ensureAwtSupport();
             setCurrentDevice("jpeg", safeOpenImageDev("Rplot.jpg", "jpeg"));
         } else {
             throw RError.error(RError.NO_CALLER, Message.GENERIC, "FastR does not support device '" + defaultDev + "'.");
@@ -144,6 +144,12 @@ public final class GridContext {
         return RContext.getEngine().evalFunction(redrawAll, REnvironment.baseEnv().getFrame(), RCaller.topLevel, true, null, args);
     }
 
+    private static void ensureAwtSupport() {
+        if (!FastRConfig.InternalGridAwtSupport) {
+            throw awtNotSupported();
+        }
+    }
+
     private BufferedImageDevice safeOpenImageDev(String filename, String formatName) {
         try {
             return BufferedImageDevice.open(filename, formatName, GridDevice.DEFAULT_WIDTH, GridDevice.DEFAULT_HEIGHT);
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java
index 9825b273c127b2caef56c0d77c931e95285ec364..49d65f69802d492b841b9a78143d565b18b3e758 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java
@@ -101,7 +101,7 @@ public final class InitWindowedDevice extends RExternalBuiltinNode {
         String filename = name.substring(name.lastIndexOf(':') + 1);
         try {
             BufferedImageDevice device = BufferedImageDevice.open(filename, formatName, width, height);
-            GridContext.getContext().setCurrentDevice(formatName, device);
+            GridContext.getContext().setCurrentDevice(formatName.toUpperCase(), device);
         } catch (NotSupportedImageFormatException e) {
             throw error(Message.GENERIC, String.format("Format '%s' is not supported.", formatName));
         }
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java
index bff8b3810fced4776421d6adc9092b6434ea3419..d0f5518a6e39bff1c18ac8d49218dc8a49cf56df 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/RGridGraphicsAdapter.java
@@ -15,6 +15,7 @@
 package com.oracle.truffle.r.library.fastrGrid.graphics;
 
 import com.oracle.truffle.r.library.fastrGrid.FastRGridExternalLookup;
+import com.oracle.truffle.r.runtime.FastRConfig;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.ROptions;
@@ -70,7 +71,7 @@ public final class RGridGraphicsAdapter {
         if (options.getValue(DEFAULT_DEVICE_OPTION) != RNull.instance) {
             return;
         }
-        String defaultDevice = ctx.isInteractive() ? "awt" : "svg";
+        String defaultDevice = (ctx.isInteractive() && FastRConfig.InternalGridAwtSupport) ? "awt" : "svg";
         try {
             options.setValue(DEFAULT_DEVICE_OPTION, defaultDevice);
         } catch (OptionsException e) {
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java
index 1b7b81345c61a2dee531da2469918a904077780f..a906872082f8fb367e53f90a70af7c65a0b824ae 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/CompleteCases.java
@@ -106,56 +106,56 @@ public final class CompleteCases extends RExternalBuiltinNode {
             if (arg instanceof RPairList) {
                 for (Object t = ((RPairList) arg).car(); t != RNull.instance; t = ((RPairList) t).cdr()) {
                     Object entry = ((RPairList) t).car();
-                    iterateAbstractVectorContents(len, result, i, entry);
+                    iterateAbstractVectorContents(len, result, entry);
                 }
             } else if (arg instanceof RList) {
                 RList list = (RList) arg;
                 for (int entry = 0; entry < list.getLength(); entry++) {
-                    iterateAbstractVectorContents(len, result, i, list.getDataAt(entry));
+                    iterateAbstractVectorContents(len, result, list.getDataAt(entry));
                 }
             } else {
-                iterateAbstractVectorContents(len, result, i, arg);
+                iterateAbstractVectorContents(len, result, arg);
             }
         }
 
         return RDataFactory.createLogicalVector(result, true);
     }
 
-    private void iterateAbstractVectorContents(int len, byte[] result, int i, Object obj) {
+    private void iterateAbstractVectorContents(int len, byte[] result, Object obj) {
         Object entry = RRuntime.asAbstractVector(obj);
         if (entry instanceof RAbstractIntVector) {
             RAbstractIntVector v = (RAbstractIntVector) entry;
             for (int e = 0; e < v.getLength(); e++) {
                 if (RRuntime.isNA(v.getDataAt(e))) {
-                    result[i % len] = RRuntime.LOGICAL_FALSE;
+                    result[e % len] = RRuntime.LOGICAL_FALSE;
                 }
             }
         } else if (entry instanceof RAbstractLogicalVector) {
             RAbstractLogicalVector v = (RAbstractLogicalVector) entry;
             for (int e = 0; e < v.getLength(); e++) {
                 if (RRuntime.isNA(v.getDataAt(e))) {
-                    result[i % len] = RRuntime.LOGICAL_FALSE;
+                    result[e % len] = RRuntime.LOGICAL_FALSE;
                 }
             }
         } else if (entry instanceof RAbstractDoubleVector) {
             RAbstractDoubleVector v = (RAbstractDoubleVector) entry;
             for (int e = 0; e < v.getLength(); e++) {
                 if (Double.isNaN(v.getDataAt(e))) {
-                    result[i % len] = RRuntime.LOGICAL_FALSE;
+                    result[e % len] = RRuntime.LOGICAL_FALSE;
                 }
             }
         } else if (entry instanceof RAbstractComplexVector) {
             RAbstractComplexVector v = (RAbstractComplexVector) entry;
             for (int e = 0; e < v.getLength(); e++) {
                 if (Double.isNaN(v.getDataAt(e).getRealPart()) || Double.isNaN(v.getDataAt(e).getImaginaryPart())) {
-                    result[i % len] = RRuntime.LOGICAL_FALSE;
+                    result[e % len] = RRuntime.LOGICAL_FALSE;
                 }
             }
         } else if (entry instanceof RAbstractStringVector) {
             RAbstractStringVector v = (RAbstractStringVector) entry;
             for (int e = 0; e < v.getLength(); e++) {
                 if (RRuntime.isNA(v.getDataAt(e))) {
-                    result[i % len] = RRuntime.LOGICAL_FALSE;
+                    result[e % len] = RRuntime.LOGICAL_FALSE;
                 }
             }
         } else {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java
index f966c9ab3c357134731cfa5fa331f6379f3c94ce..124bb99da5da931233b235f9194b6d6d45325802 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsTypeFunctions.java
@@ -576,14 +576,14 @@ public class IsTypeFunctions {
 
         @TruffleBoundary
         protected static RType typeFromMode(String mode) {
-            return RType.fromMode(mode);
+            return RType.fromMode(mode, true);
         }
 
         @Specialization(limit = "5", guards = "cachedMode == mode")
         protected byte isVectorCached(RAbstractVector x, @SuppressWarnings("unused") String mode,
                         @Cached("mode") @SuppressWarnings("unused") String cachedMode,
                         @Cached("typeFromMode(mode)") RType type) {
-            if (namesOnlyOrNoAttr(x) && (type == RType.Any || x.getRType() == type)) {
+            if (namesOnlyOrNoAttr(x) && (type == RType.Any || typesMatch(type, x.getRType()))) {
                 return RRuntime.LOGICAL_TRUE;
             } else {
                 return RRuntime.LOGICAL_FALSE;
@@ -600,6 +600,10 @@ public class IsTypeFunctions {
             return RRuntime.LOGICAL_FALSE;
         }
 
+        private boolean typesMatch(RType expected, RType actual) {
+            return expected == RType.Numeric ? actual == RType.Integer || actual == RType.Double : actual == expected;
+        }
+
         private boolean namesOnlyOrNoAttr(RAbstractVector x) {
             DynamicObject attributes = x.getAttributes();
             if (attrNull.profile(attributes == null) || attrEmpty.profile(attributes.size() == 0)) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java
index 46e2e5e452a9a350e6e4d73b9177116a9e89c650..c96c928113e469a5501ce6b7ead8667af62babcc 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Prod.java
@@ -24,6 +24,7 @@ import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RComplex;
+import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RTypedValue;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
@@ -62,8 +63,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 {
             CompilerDirectives.transferToInterpreterAndInvalidate();
             prodRecursive = insert(ProdNodeGen.create());
         }
-        Object ret = prodRecursive.executeObject(args.getArgument(0));
-        if (argsLen != 1) {
+        Object ret = 1d;
+        if (argsLen > 0) {
             double prodReal;
             double prodImg;
             boolean complex;
@@ -77,7 +78,7 @@ public abstract class Prod extends RBuiltinNode.Arg2 {
                 prodImg = 0d;
                 complex = false;
             }
-            for (int i = 1; i < argsLen; i++) {
+            for (int i = 0; i < argsLen; i++) {
                 Object aProd = prodRecursive.executeObject(args.getArgument(i));
                 double aProdReal;
                 double aProdImg;
@@ -108,8 +109,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 {
     @Specialization
     protected double prod(RAbstractDoubleVector x) {
         RAbstractDoubleVector profiledVec = intVecProfile.profile(x);
-        double product = profiledVec.getDataAt(0);
-        for (int k = 1; k < profiledVec.getLength(); k++) {
+        double product = 1;
+        for (int k = 0; k < profiledVec.getLength(); k++) {
             product = prod.op(product, profiledVec.getDataAt(k));
         }
         return product;
@@ -118,8 +119,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 {
     @Specialization
     protected double prod(RAbstractIntVector x) {
         RAbstractIntVector profiledVec = intVecProfile.profile(x);
-        double product = profiledVec.getDataAt(0);
-        for (int k = 1; k < profiledVec.getLength(); k++) {
+        double product = 1;
+        for (int k = 0; k < profiledVec.getLength(); k++) {
             product = prod.op(product, profiledVec.getDataAt(k));
         }
         return product;
@@ -128,8 +129,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 {
     @Specialization
     protected double prod(RAbstractLogicalVector x) {
         RAbstractLogicalVector profiledVec = intVecProfile.profile(x);
-        double product = profiledVec.getDataAt(0);
-        for (int k = 1; k < profiledVec.getLength(); k++) {
+        double product = 1;
+        for (int k = 0; k < profiledVec.getLength(); k++) {
             product = prod.op(product, profiledVec.getDataAt(k));
         }
         return product;
@@ -138,8 +139,8 @@ public abstract class Prod extends RBuiltinNode.Arg2 {
     @Specialization
     protected RComplex prod(RAbstractComplexVector x) {
         RAbstractComplexVector profiledVec = intVecProfile.profile(x);
-        RComplex product = profiledVec.getDataAt(0);
-        for (int k = 1; k < profiledVec.getLength(); k++) {
+        RComplex product = RDataFactory.createComplexRealOne();
+        for (int k = 0; k < profiledVec.getLength(); k++) {
             RComplex a = profiledVec.getDataAt(k);
             product = prod.op(product.getRealPart(), product.getImaginaryPart(), a.getRealPart(), a.getImaginaryPart());
         }
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 8233f4cc27ba2047cc64a0bf5e8ff340351c6144..ea692637ede82a350f5340d74e004d14157f6d00 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
@@ -405,6 +405,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
                     @Cached("create()") ClassHierarchyNode classHierarchyNodeY,
                     @Cached("createWithException()") S3FunctionLookupNode dispatchLookupY,
                     @Cached("createIdentityProfile()") ValueProfile builtinProfile,
+                    @Cached("createBinaryProfile()") ConditionProfile emptyArgumentsProfile,
                     @Cached("createBinaryProfile()") ConditionProfile implicitTypeProfileX,
                     @Cached("createBinaryProfile()") ConditionProfile implicitTypeProfileY,
                     @Cached("createBinaryProfile()") ConditionProfile mismatchProfile,
@@ -420,6 +421,11 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
         Object[] args = explicitArgs != null ? ((RArgsValuesAndNames) explicitArgs.execute(frame)).getArguments() : callArguments.evaluateFlattenObjects(frame, lookupVarArgs(frame));
         ArgumentsSignature argsSignature = explicitArgs != null ? ((RArgsValuesAndNames) explicitArgs.execute(frame)).getSignature() : callArguments.flattenNames(lookupVarArgs(frame));
 
+        if (emptyArgumentsProfile.profile(args.length == 0)) {
+            // nothing to dispatch on, this is a valid situation, e.g. prod() == 1
+            return call.execute(frame, function, new RArgsValuesAndNames(args, argsSignature), null, null);
+        }
+
         RBuiltinDescriptor builtin = builtinProfile.profile(function.getRBuiltin());
         RDispatch dispatch = builtin.getDispatch();
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java
index c4d03652bf2589339d29122b77bc67cd6709bc7d..58096f6025f86d97235ed5018532a3b3f1ada2e3 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RType.java
@@ -25,6 +25,7 @@ public enum RType {
     Logical("logical", 1),
     Integer("integer", 2),
     Double("double", "numeric", 3),
+    Numeric("numeric", 3),
     Complex("complex", 4),
     Character("character", 5),
     List("list", 6),
@@ -112,6 +113,15 @@ public enum RType {
     }
 
     public static RType fromMode(String mode) {
+        return fromMode(mode, false);
+    }
+
+    /**
+     * @param includeNumeric if {@code true}, then the method returns {@link #Numeric} for string
+     *            "numeric". This may be useful for callers that need to distinguish "numeric" and
+     *            "double" modes.
+     */
+    public static RType fromMode(String mode, boolean includeNumeric) {
         switch (mode) {
             case "any":
                 return Any;
@@ -126,6 +136,7 @@ public enum RType {
             case "integer":
                 return Integer;
             case "numeric":
+                return includeNumeric ? Numeric : Double;
             case "double":
                 return Double;
             case "complex":
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 b1726a12cfb2df32babfc62ba312c5052b0d7ebd..075e99fff0f8ade7cfdd63b759aec9473a763fed 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
@@ -24861,6 +24861,14 @@ Error in get("x", inherits = FALSE) : object 'x' not found
 #{ x <- 33 ; f <- function() { if (FALSE) { x <- 22  } ; get("x", inherits = FALSE) } ; f() }
 Error in get("x", inherits = FALSE) : object 'x' not found
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_get.testGet#
+#{x <- 1L; get('x', mode='double'); }
+[1] 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_get.testGet#
+#{x <- 1L; get('x', mode='numeric'); }
+[1] 1
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_get.testGet#
 #{y<-function(){y<-2;get("y",mode="closure")};y();}
 function(){y<-2;get("y",mode="closure")}
@@ -26521,6 +26529,14 @@ attr(,"Rd_tag")
 #argv <- structure(list(test = c(TRUE, TRUE, FALSE, TRUE, FALSE),     yes = 'True', no = 'False'), .Names = c('test', 'yes', 'no'));do.call('ifelse', argv)
 [1] "True"  "True"  "False" "True"  "False"
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_inherits.testInherits#
+#inherits(1L, 'double')
+[1] FALSE
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_inherits.testInherits#
+#inherits(1L, 'numeric')
+[1] FALSE
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_inherits.testInherits#
 #inherits(NULL, 'NULL')
 [1] TRUE
@@ -29923,6 +29939,10 @@ Error in is.unsorted(x, strictly) : invalid 'strictly' argument
 #argv <- list(c(1L, 3L, 2L, 4L), TRUE); .Internal(is.unsorted(argv[[1]], argv[[2]]))
 [1] TRUE
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_isvector.testIsVector#
+#is.vector(1L, 'numeric');
+[1] TRUE
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_isvector.testIsVector#
 #{ is.vector(1) }
 [1] TRUE
@@ -44965,6 +44985,22 @@ age                        0.00561 0.012    0.00872  0.22  1.0 0.64000
 sex                       -1.65487 0.483    0.38527 11.74  1.0 0.00061
 frailty(id, dist = 't', c                           20.33 13.9 0.12000
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd#
+#prod()
+[1] 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd#
+#prod(complex())
+[1] 1+0i
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd#
+#prod(numeric())
+[1] 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd#
+#{ foo <- function(...) prod(...); foo(); }
+[1] 1
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_prod.testProd#
 #{prod('a')}
 Error in prod("a") : invalid 'type' (character) of argument
@@ -138258,6 +138294,27 @@ Error: argument 'files' must be character
 #.Call(tools:::Rmd5, c("abc","xyz"))
 [1] NA NA
 
+##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases#
+#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)))
+[1]  TRUE  TRUE FALSE
+
+##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases#
+#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), c(1,NA,2))
+[1]  TRUE FALSE FALSE
+
+##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases#
+#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), data.frame(col1=c(1,NA,3), col2=c(1,2,3)))
+[1]  TRUE FALSE FALSE
+
+##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCases#
+#stats::complete.cases(data.frame(col1=c(1,NA), col2=c(2,3)), matrix(c(1,NA,2,NA), nrow=2))
+[1]  TRUE FALSE
+
+##com.oracle.truffle.r.test.library.stats.TestExternal_completecases.testCompleteCasesArgsValidation#Output.IgnoreErrorContext#
+#stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), list(NA,2,2))
+Error in stats::complete.cases(data.frame(col1 = c(1, 2, NA), col2 = c(1,  :
+  not all arguments have the same length
+
 ##com.oracle.truffle.r.test.library.stats.TestExternal_covcor.testCovcor#
 #.Call(stats:::C_cov, 1:5, 1:5, 4, FALSE)
 [1] 2.5
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java
index 71ad84e6ef169c30f8eeb6d78d6cec134f20346e..d5064ed832423825d44cac15a7741064b96f12ca 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_get.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -34,5 +34,8 @@ public class TestBuiltin_get extends TestBase {
         // behavior specific to RS4Object as environment:
         assertEval("setClass('foo', representation(x='numeric')); f <- new('foo'); e <- new.env(); e$x <- 1; attr(f, '.xData') <- e; get('x', envir=f)");
         assertEval("setClass('foo', representation(x='numeric')); f <- new('foo'); e <- new.env(); e$x <- 1; attr(f, '.Data') <- e; get('x', envir=f)");
+
+        assertEval("{x <- 1L; get('x', mode='numeric'); }");
+        assertEval("{x <- 1L; get('x', mode='double'); }");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java
index 6bbed855deb3945f9858829de9e3eb46294c2859..dda9a52a128486e6d568566eb7f8a0b35ae2b1b4 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_inherits.java
@@ -213,5 +213,8 @@ public class TestBuiltin_inherits extends TestBase {
         assertEval("{x <- 10;class(x) <- c(\"a\", \"b\");inherits(x, \"a\", 1) ;}");
 
         assertEval("inherits(NULL, 'NULL')");
+
+        assertEval("inherits(1L, 'numeric')");
+        assertEval("inherits(1L, 'double')");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java
index 372f103da4a9ef759bf22ef55ce7720bc45dd42f..5a67e9ae37a4a0b85bc1db012f56d7e1ff67f586 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isvector.java
@@ -199,6 +199,7 @@ public class TestBuiltin_isvector extends TestBase {
         assertEval("{is.vector(c(TRUE,FALSE),\"logical\");}");
         assertEval("{x<-1;class(x)<-\"a\";is.vector(x);}");
         assertEval("{x<-1;names(x)<-\"a\";is.vector(x);}");
+        assertEval("is.vector(1L, 'numeric');");
         // FastR produces better error contexts
         assertEval(Output.IgnoreErrorContext, "{is.vector(c(1,2), c(\"sss\", \"dddd\"));}");
         assertEval(Output.IgnoreErrorContext, "{is.vector(c(1,2), TRUE);}");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java
index 7d0b9d0fddf7dfbc8d302c572ab70c8403083aa1..a31d73816c2f5602bf94c40391e595e3e1ebac35 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_prod.java
@@ -92,6 +92,10 @@ public class TestBuiltin_prod extends TestBase {
         assertEval("{prod(42,2+3i)}");
         assertEval("{prod('a')}");
         assertEval("{prod(list())}");
+        assertEval("prod()");
+        assertEval("prod(numeric())");
+        assertEval("prod(complex())");
+        assertEval("{ foo <- function(...) prod(...); foo(); }");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestExternal_completecases.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestExternal_completecases.java
new file mode 100644
index 0000000000000000000000000000000000000000..a29b4977a7cc88634d440b2c2f75487c23256900
--- /dev/null
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestExternal_completecases.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, 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
+ * 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.test.library.stats;
+
+import org.junit.Test;
+
+import com.oracle.truffle.r.test.TestBase;
+
+public class TestExternal_completecases extends TestBase {
+    @Test
+    public void testCompleteCases() {
+        assertEval("stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)))");
+        assertEval("stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), data.frame(col1=c(1,NA,3), col2=c(1,2,3)))");
+        assertEval("stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), c(1,NA,2))");
+        assertEval("stats::complete.cases(data.frame(col1=c(1,NA), col2=c(2,3)), matrix(c(1,NA,2,NA), nrow=2))");
+    }
+
+    @Test
+    public void testCompleteCasesArgsValidation() {
+        assertEval(Output.IgnoreErrorContext, "stats::complete.cases(data.frame(col1=c(1,2,NA), col2=c(1,2,3)), list(NA,2,2))");
+    }
+}