diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
index 03064e98e07f76cd362a3c1d5cec958b576ace0d..18a0f13f97d07574a79d6e10bc9c150a2842e851 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/BasePackage.java
@@ -292,6 +292,16 @@ public class BasePackage extends RBuiltinPackage {
         add(Complex.class, ComplexNodeGen::create);
         add(CompileFunctions.CompilePKGS.class, CompileFunctionsFactory.CompilePKGSNodeGen::create);
         add(CompileFunctions.EnableJIT.class, CompileFunctionsFactory.EnableJITNodeGen::create);
+        add(CompileFunctions.MkCode.class, CompileFunctionsFactory.MkCodeNodeGen::create);
+        add(CompileFunctions.BcClose.class, CompileFunctionsFactory.BcCloseNodeGen::create);
+        add(CompileFunctions.IsBuiltinInternal.class, CompileFunctionsFactory.IsBuiltinInternalNodeGen::create);
+        add(CompileFunctions.Disassemble.class, CompileFunctionsFactory.DisassembleNodeGen::create);
+        add(CompileFunctions.BcVersion.class, CompileFunctionsFactory.BcVersionNodeGen::create);
+        add(CompileFunctions.LoadFromFile.class, CompileFunctionsFactory.LoadFromFileNodeGen::create);
+        add(CompileFunctions.SaveToFile.class, CompileFunctionsFactory.SaveToFileNodeGen::create);
+        add(CompileFunctions.Growconst.class, CompileFunctionsFactory.GrowconstNodeGen::create);
+        add(CompileFunctions.Putconst.class, CompileFunctionsFactory.PutconstNodeGen::create);
+        add(CompileFunctions.Getconst.class, CompileFunctionsFactory.GetconstNodeGen::create);
         add(ConditionFunctions.AddCondHands.class, ConditionFunctionsFactory.AddCondHandsNodeGen::create);
         add(ConditionFunctions.AddRestart.class, ConditionFunctionsFactory.AddRestartNodeGen::create);
         add(ConditionFunctions.DfltStop.class, ConditionFunctionsFactory.DfltStopNodeGen::create);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java
index 515a446f104eff8d27cd9562b20f4507c3a0e4ba..383554e3ac42e46081f99ee0ccdb061ce7a5d32a 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CompileFunctions.java
@@ -22,12 +22,18 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
+import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
+import com.oracle.truffle.r.runtime.data.RList;
+import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 
 /**
  * FastR does not byte-compile, obviously, but these keep the package installation code happy.
@@ -61,4 +67,179 @@ public class CompileFunctions {
             return 0;
         }
     }
+
+    @RBuiltin(name = "mkCode", kind = INTERNAL, parameterNames = {"bytes", "consts"}, behavior = PURE)
+    public abstract static class MkCode extends RBuiltinNode.Arg2 {
+
+        static {
+            Casts casts = new Casts(MkCode.class);
+            casts.arg("bytes"); // Looks like an int vector in R_registerBC
+            casts.arg("consts"); // precise type not found yet
+        }
+
+        @Specialization
+        protected Object mkCode(Object bytes, Object consts) {
+            return RNull.instance;
+            // RIntVector code = RDataFactory.createEmptyIntVector();
+            // return RDataFactory.createPairList(code, consts, RNull.instance, SEXPTYPE.BCODESXP);
+        }
+    }
+
+    @RBuiltin(name = "bcClose", kind = INTERNAL, parameterNames = {"forms", "body", "env"}, behavior = PURE)
+    public abstract static class BcClose extends RBuiltinNode.Arg3 {
+
+        static {
+            Casts casts = new Casts(BcClose.class);
+            casts.arg("forms");
+            casts.arg("body");
+            casts.arg("env");
+        }
+
+        @Specialization
+        protected Object bcClose(@SuppressWarnings("unused") Object forms, Object body, @SuppressWarnings("unused") Object env) {
+            return RNull.instance; // Body
+        }
+    }
+
+    @RBuiltin(name = "is.builtin.internal", kind = INTERNAL, parameterNames = {"symbol"}, behavior = PURE)
+    public abstract static class IsBuiltinInternal extends RBuiltinNode.Arg1 {
+
+        static {
+            Casts casts = new Casts(IsBuiltinInternal.class);
+            casts.arg("symbol").asStringVector().findFirst();
+        }
+
+        @Specialization
+        protected boolean isBuiltinInternal(@SuppressWarnings("unused") String symbol) {
+            return false;
+        }
+    }
+
+    @RBuiltin(name = "disassemble", kind = INTERNAL, parameterNames = {"symbol"}, behavior = PURE)
+    public abstract static class Disassemble extends RBuiltinNode.Arg1 {
+
+        static {
+            Casts casts = new Casts(Disassemble.class);
+            casts.arg("symbol").asStringVector().findFirst();
+        }
+
+        @Specialization
+        protected boolean disassemble(@SuppressWarnings("unused") String symbol) {
+            return false;
+        }
+    }
+
+    @RBuiltin(name = "bcVersion", kind = INTERNAL, parameterNames = {}, behavior = PURE)
+    public abstract static class BcVersion extends RBuiltinNode.Arg0 {
+
+        static {
+            Casts casts = new Casts(BcVersion.class);
+        }
+
+        @Specialization
+        protected int bcVersion() {
+            return 10; // R_bcVersion in eval.c
+        }
+    }
+
+    @RBuiltin(name = "load.from.file", kind = INTERNAL, parameterNames = {"file"}, behavior = PURE)
+    public abstract static class LoadFromFile extends RBuiltinNode.Arg1 {
+
+        static {
+            Casts casts = new Casts(LoadFromFile.class);
+            casts.arg("file").asStringVector().findFirst();
+        }
+
+        @Specialization
+        protected Object loadFromFile(@SuppressWarnings("unused") String file) {
+            return RNull.instance;
+        }
+    }
+
+    @RBuiltin(name = "save.to.file", kind = INTERNAL, parameterNames = {"content", "file", "ascii"}, behavior = PURE)
+    public abstract static class SaveToFile extends RBuiltinNode.Arg3 {
+
+        static {
+            Casts casts = new Casts(SaveToFile.class);
+            // 'content' arg traced till "NewMakeLists" where it can be anything except WEAKREFSXP
+            casts.arg("content");
+            casts.arg("file").asStringVector().findFirst();
+            casts.arg("ascii").asLogicalVector().findFirst().map(toBoolean());
+        }
+
+        @Specialization
+        protected Object saveToFile(@SuppressWarnings("unused") Object content, @SuppressWarnings("unused") String file, @SuppressWarnings("unused") boolean ascii) {
+            return RNull.instance;
+        }
+    }
+
+    @RBuiltin(name = "growconst", kind = INTERNAL, parameterNames = {"constBuf"}, behavior = PURE)
+    public abstract static class Growconst extends RBuiltinNode.Arg1 {
+
+        static {
+            Casts casts = new Casts(Growconst.class);
+            // RList required in do_growconst() in eval.c
+            casts.arg("constBuf").mustNotBeMissing().mustNotBeNull().mustBe(RList.class);
+        }
+
+        @Specialization
+        protected RList growconst(RList constBuf) {
+            int n = constBuf.getLength();
+            RList ret = (RList) constBuf.copyResized(n << 1, true);
+            return ret;
+        }
+    }
+
+    @RBuiltin(name = "putconst", kind = INTERNAL, parameterNames = {"constBuf", "constCount", "x"}, behavior = PURE)
+    public abstract static class Putconst extends RBuiltinNode.Arg3 {
+
+        @Child Identical identical = Identical.create();
+
+        static {
+            Casts casts = new Casts(Putconst.class);
+            // RList required in do_putconst() in eval.c
+            casts.arg("constBuf").mustNotBeMissing().mustNotBeNull().mustBe(RList.class);
+            casts.arg("constCount").mustNotBeMissing().mustNotBeNull().asIntegerVector().findFirst();
+            casts.arg("x");
+        }
+
+        @Specialization
+        protected int putconst(RList constBuf, int constCount, Object x) {
+            // constCount <= constBuf length
+            // if x is present in constBuf within <0,constCindexount) return its index otherwise set
+            // x as element of constBuf at constCount index and return constCount
+            if (constCount < 0 || constCount > constBuf.getLength()) {
+                throw RError.error(this, RError.Message.BAD_CONSTANT_COUNT);
+            }
+            for (int i = 0; i < constCount; i++) {
+                Object y = constBuf.getDataAt(i);
+                if (identical.executeByte(x, y, true, true, true, true, true, false) == RRuntime.LOGICAL_TRUE) {
+                    return i;
+                }
+            }
+            constBuf.setDataAt(constCount, x);
+            return constCount;
+        }
+    }
+
+    @RBuiltin(name = "getconst", kind = INTERNAL, parameterNames = {"constBuf", "n"}, behavior = PURE)
+    public abstract static class Getconst extends RBuiltinNode.Arg2 {
+
+        static {
+            Casts casts = new Casts(Getconst.class);
+            casts.arg("constBuf").mustNotBeMissing().mustNotBeNull().mustBe(RList.class);
+            casts.arg("n").mustNotBeMissing().mustNotBeNull().asIntegerVector().findFirst();
+        }
+
+        @Specialization
+        protected RList getconst(RAbstractVector constBuf, int n) {
+            // Return new vector of size n with content copied from constBuf
+            if (n < 0 || n > constBuf.getLength()) {
+                throw RError.error(this, RError.Message.BAD_CONSTANT_COUNT);
+            }
+            RList ret = (RList) constBuf.copyResized(n, false);
+            return ret;
+        }
+    }
+
 }
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 fdb7c6ef17ab8df7029d64ab24eb218d71d091c0..167eb0774866c35ff324a14ec2300ddafd85d471 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
@@ -349,8 +349,8 @@ public abstract class InternalNode extends OperatorNode {
                     "rcauchy", "rf", "rgamma", "rlnorm", "rlogis", "rnbinom", "rnbinom_mu", "rnchisq", "rnorm", "runif", "rweibull", "rwilcox", "rhyper",
                     "format.info", "grepRaw", "regexec", "adist", "aregexec", "chartr", "packBits", "strtrim", "eapply", "machine", "save", "dump", "prmatrix", "gcinfo", "gctorture", "gctorture2",
                     "memory.profile", "sys.on.exit", "builtins", "bodyCode", "rapply", "inspect",
-                    "mem.limits", "capabilitiesX11", "Cstack_info", "file.choose", "polyroot", "mkCode", "bcClose", "is.builtin.internal", "disassemble", "bcVersion", "load.from.file", "save.to.file",
-                    "growconst", "putconst", "getconst", "setNumMathThreads", "setMaxNumMathThreads", "isatty", "isIncomplete", "pipe", "fifo", "unz", "truncate", "rawConnection",
+                    "mem.limits", "capabilitiesX11", "Cstack_info", "file.choose", "polyroot",
+                    "setNumMathThreads", "setMaxNumMathThreads", "isatty", "isIncomplete", "pipe", "fifo", "unz", "truncate", "rawConnection",
                     "rawConnectionValue", "sockSelect", "gzcon", "memCompress", "memDecompress", "mkUnbound", "env.profile", "setSessionTimeLimit", "icuSetCollate", "findInterval", "rowsum_df",
                     "La_qr_cmplx", "La_rs_cmplx", "La_rg_cmplx", "La_rs_cmplx", "La_dlange", "La_dgecon", "La_dtrcon", "La_zgecon", "La_ztrcon", "La_solve_cmplx", "La_chol2inv", "qr_qy_real",
                     "qr_coef_cmplx", "qr_qy_cmpl", "La_svd", "La_svd_cmplx");
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 d34706d3fad9ee6c11f3b072dc8b8a9360388a7e..867137f043cb6ba8f26a624984e2e5d51f3bb838 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
@@ -908,7 +908,8 @@ public final class RError extends RuntimeException implements TruffleException {
         INVALID_TYPE("invalid type (%s) for '%s' (must be a %s)"),
         NOT_A_LIST_OF_SOCKETS("not a list of sockets"),
         NOT_A_SOCKET_CONNECTION("not a socket connection"),
-        UNEXPECTED_OBJ_IN_SIZE("Unexpected object type %s while calculating estimated object size.");
+        UNEXPECTED_OBJ_IN_SIZE("Unexpected object type %s while calculating estimated object size."),
+        BAD_CONSTANT_COUNT("bad constant count");
 
         public final String message;
         final boolean hasArgs;
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 f61ac6982f9debc18ca4f4ebb99fa3eddb9f84c2..b530d9e8c93c3ebfcb1bece8f9cee02f1f5ab7aa 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
@@ -10144,8 +10144,8 @@ character(0)
 #argv <- structure(list(path = 'myTst'), .Names = 'path');do.call('basename', argv)
 [1] "myTst"
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_bcVersion.testbcVersion1#Ignored.Unimplemented#
-# .Internal(bcVersion())
+##com.oracle.truffle.r.test.builtins.TestBuiltin_bcVersion.testbcVersion1#
+#.Internal(bcVersion())
 [1] 10
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_besselI.testbesselI1#Ignored.Unimplemented#
@@ -27061,13 +27061,13 @@ NULL
 #argv <- list('FALSE', '', FALSE); .Internal(getSymbolInfo(argv[[1]], argv[[2]], argv[[3]]))
 NULL
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst1#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst1#
 #argv <- list(list(list(), NULL), 1); .Internal(getconst(argv[[1]], argv[[2]]))
 [[1]]
 list()
 
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst2#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_getconst.testgetconst2#
 #argv <- list(list(FALSE), 1); .Internal(getconst(argv[[1]], argv[[2]]))
 [[1]]
 [1] FALSE
@@ -27856,7 +27856,7 @@ logical(0)
 #argv <- list('\n', '\nqr(x, ...)\nqrR(qr, complete=FALSE, backPermute=TRUE)\n', FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); .Internal(grepl(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]]))
 [1] TRUE
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_growconst.testgrowconst1#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_growconst.testgrowconst1#
 #argv <- list(list(list())); .Internal(growconst(argv[[1]]))
 [[1]]
 list()
@@ -48375,11 +48375,11 @@ Error: only atomic vectors can be sorted
 #argv <- list(FALSE); .Internal(pushBackLength(argv[[1]]))
 [1] 0
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst1#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst1#
 #argv <- list(list(NULL), 0, NULL); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))
 [1] 0
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst2#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_putconst.testputconst2#
 #argv <- list(list(list(), NULL), 1, list()); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))
 [1] 0
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java
index a3953145225a1095d7734e6c9ccb5df39199c2bd..04480ef508d2724d65161009334285d61fcfe1a6 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_bcVersion.java
@@ -19,7 +19,6 @@ public class TestBuiltin_bcVersion extends TestBase {
 
     @Test
     public void testbcVersion1() {
-        // FIXME RInternalError: not implemented: .Internal bcVersion
-        assertEval(Ignored.Unimplemented, " .Internal(bcVersion())");
+        assertEval(".Internal(bcVersion())");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java
index 4592ad622fd9a31864d8874855b406142d7d568e..18a308c595efb50b940a64a7418ab617786d7545 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_getconst.java
@@ -19,13 +19,11 @@ public class TestBuiltin_getconst extends TestBase {
 
     @Test
     public void testgetconst1() {
-        // FIXME not implemented: .Internal getconst
-        assertEval(Ignored.Unimplemented, "argv <- list(list(list(), NULL), 1); .Internal(getconst(argv[[1]], argv[[2]]))");
+        assertEval("argv <- list(list(list(), NULL), 1); .Internal(getconst(argv[[1]], argv[[2]]))");
     }
 
     @Test
     public void testgetconst2() {
-        // FIXME not implemented: .Internal getconst
-        assertEval(Ignored.Unimplemented, "argv <- list(list(FALSE), 1); .Internal(getconst(argv[[1]], argv[[2]]))");
+        assertEval("argv <- list(list(FALSE), 1); .Internal(getconst(argv[[1]], argv[[2]]))");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java
index f2fae494fcdb53f6727283abf79547d00d35dfbe..0b89a68138bd79e8ba3fc1b5635ed1a4cc9df129 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_growconst.java
@@ -19,7 +19,6 @@ public class TestBuiltin_growconst extends TestBase {
 
     @Test
     public void testgrowconst1() {
-        // FIXME RInternalError: not implemented: .Internal growconst
-        assertEval(Ignored.Unimplemented, "argv <- list(list(list())); .Internal(growconst(argv[[1]]))");
+        assertEval("argv <- list(list(list())); .Internal(growconst(argv[[1]]))");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java
index c5167e42ce7b1a90ee62c8221a7d9eb1e8f8a028..26d619d3bad4a67ce950c39db5c53b9f86b87c0c 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_putconst.java
@@ -19,13 +19,11 @@ public class TestBuiltin_putconst extends TestBase {
 
     @Test
     public void testputconst1() {
-        // FIXME RInternalError: not implemented: .Internal putconst
-        assertEval(Ignored.Unimplemented, "argv <- list(list(NULL), 0, NULL); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))");
+        assertEval("argv <- list(list(NULL), 0, NULL); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))");
     }
 
     @Test
     public void testputconst2() {
-        // FIXME RInternalError: not implemented: .Internal putconst
-        assertEval(Ignored.Unimplemented, "argv <- list(list(list(), NULL), 1, list()); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))");
+        assertEval("argv <- list(list(list(), NULL), 1, list()); .Internal(putconst(argv[[1]], argv[[2]], argv[[3]]))");
     }
 }