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 e12bd7d4d0a589e2597b7c48f6c1a136ce753c22..599155c9ec43d13f147f065a9e140d3fb2052238 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
@@ -99,8 +99,10 @@ import com.oracle.truffle.r.nodes.builtin.fastr.FastRContext;
 import com.oracle.truffle.r.nodes.builtin.fastr.FastRContextFactory;
 import com.oracle.truffle.r.nodes.builtin.fastr.FastRDebug;
 import com.oracle.truffle.r.nodes.builtin.fastr.FastRDebugNodeGen;
-import com.oracle.truffle.r.nodes.builtin.fastr.FastRHelp;
-import com.oracle.truffle.r.nodes.builtin.fastr.FastRHelpNodeGen;
+import com.oracle.truffle.r.nodes.builtin.fastr.FastRHelp.FastRHelpPath;
+import com.oracle.truffle.r.nodes.builtin.fastr.FastRHelp.FastRHelpRd;
+import com.oracle.truffle.r.nodes.builtin.fastr.FastRHelpFactory.FastRHelpPathNodeGen;
+import com.oracle.truffle.r.nodes.builtin.fastr.FastRHelpFactory.FastRHelpRdNodeGen;
 import com.oracle.truffle.r.nodes.builtin.fastr.FastRIdentity;
 import com.oracle.truffle.r.nodes.builtin.fastr.FastRIdentityNodeGen;
 import com.oracle.truffle.r.nodes.builtin.fastr.FastRInspect;
@@ -435,7 +437,8 @@ public class BasePackage extends RBuiltinPackage {
         add(FastrDqrls.class, FastrDqrlsNodeGen::create);
         add(FastRDebug.class, FastRDebugNodeGen::create);
         add(FastRSetBreakpoint.class, FastRSetBreakpointNodeGen::create);
-        add(FastRHelp.class, FastRHelpNodeGen::create);
+        add(FastRHelpPath.class, FastRHelpPathNodeGen::create);
+        add(FastRHelpRd.class, FastRHelpRdNodeGen::create);
         add(FastRIdentity.class, FastRIdentityNodeGen::create);
         add(FastROptionBuiltin.class, FastROptionBuiltin::create);
         add(FastRTry.class, FastRTryNodeGen::create);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.byte.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.byte.Rd
similarity index 80%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.byte.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.byte.Rd
index 5411a6b93d1f9809becca8d3a5ce784bbd4a894f..baaf99c8646f6d3f34ef095924431cb364407979 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.byte.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.byte.Rd
@@ -16,7 +16,11 @@ An interop byte value. Error in case the given value can't be converted to a byt
 Marks a R value to be converted to byte when passed over to a foreign language.
 }
 \examples{
-as.external.byte(123)
+javaByte <- as.external.byte(123)
+
+## used to pass a java byte to a java method call
+byteClass <- new.java.class('java.lang.Byte')
+byteClass$valueOf(javaByte)
 }
 \seealso{
 \code{\link{as.external.char}}, \code{\link{as.external.float}}, \code{\link{as.external.long}}, \code{\link{as.external.short}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.char.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.char.Rd
similarity index 80%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.char.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.char.Rd
index 589ff22fb5756d1ad62cfe9a13598e9868f54587..7d0543e857c286f6cf942f46ca278c23e4d16e9c 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.char.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.char.Rd
@@ -16,7 +16,11 @@ An interop char value. Error in case the given value can't be converted to a cha
 Marks a R value to be converted to char when passed over to a foreign language.
 }
 \examples{
-as.external.char('a')
+javaChar <- as.external.char(123)
+
+## used to pass a java char to a java method call
+charClass <- new.java.class('java.lang.Character')
+charClass$valueOf(javaChar)
 }
 \seealso{
 \code{\link{as.external.byte}}, \code{\link{as.external.float}}, \code{\link{as.external.long}}, \code{\link{as.external.short}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.float.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.float.Rd
similarity index 80%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.float.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.float.Rd
index 10d7248d16a2713f82150b99c9ed45c5800ea8a8..d291d565056ae4257c8a5651d44b29f80511d3a7 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.float.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.float.Rd
@@ -16,7 +16,11 @@ An interop float value. Error in case the given value can't be converted to a fl
 Marks a R value to be converted to float when passed over to a foreign language.
 }
 \examples{
-as.external.float(1.1)
+javaFloat <- as.external.float(123)
+
+## used to pass a java float to a java method call
+floatClass <- new.java.class('java.lang.Float')
+floatClass$valueOf(javaFloat)
 }
 \seealso{
 \code{\link{as.external.byte}}, \code{\link{as.external.char}}, \code{\link{as.external.long}}, \code{\link{as.external.short}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.long.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.long.Rd
similarity index 80%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.long.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.long.Rd
index 600f2746f3a7d84908cec829fe6b566e92362707..dba6a9674177f60ffca1e93717a21bf7d1ebcd12 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.long.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.long.Rd
@@ -16,7 +16,11 @@ An interop long value. Error in case the given value can't be converted to a lon
 Marks a R value to be converted to long when passed over to a foreign language.
 }
 \examples{
-as.external.long(123)
+javaLong <- as.external.long(123)
+
+## used to pass a java long to a java method call
+longClass <- new.java.class('java.lang.Long')
+longClass$valueOf(javaLong)
 }
 \seealso{
 \code{\link{as.external.byte}}, \code{\link{as.external.char}}, \code{\link{as.external.float}}, \code{\link{as.external.short}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.short.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.short.Rd
similarity index 80%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.short.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.short.Rd
index fd96b53ac77c43169ae7ef39d5a41412aa511353..a59e27d02c05aedcf709ac2f95f97c499b8e48ad 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.external.short.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.external.short.Rd
@@ -16,7 +16,11 @@ An interop short value. Error in case the given value can't be converted to a sh
 Marks a R value to be converted to short when passed over to a foreign language.
 }
 \examples{
-as.external.short(123)
+javaShort <- as.external.short(123)
+
+## used to pass a java short to a java method call
+shortClass <- new.java.class('java.lang.Short')
+shortClass$valueOf(javaShort)
 }
 \seealso{
 \code{\link{as.external.byte}}, \code{\link{as.external.char}}, \code{\link{as.external.short}}, \code{\link{as.external.long}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.java.array.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.java.array.Rd
similarity index 84%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.java.array.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.java.array.Rd
index 0b6f195c8d6ed2e08070697d570c9e1a2d8744e2..cec497a4a38f0f761e81a497774d6ee8468fc2e8 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/as.java.array.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/as.java.array.Rd
@@ -18,7 +18,9 @@ An external object representing a java array. Error in case the array could not
 Converts a R vector or list to a java array.
 }
 \examples{
-as.java.array(c(1, 2, 3), 'java.lang.Double')
+as.java.array(c(1, 2, 3))
+as.java.array(c(1L, 2L, 3L), 'int')
+as.java.array(c(1L, 2L, 3L), 'java.lang.Integer')
 }
 \seealso{
 \code{\link{new.java.array}}, \code{\link{is.external.array}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.array.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.array.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.array.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.array.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.executable.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.executable.Rd
similarity index 92%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.executable.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.executable.Rd
index f1a066cd72df154e880c236ecb38ced1245f08c6..a5907b740aa51961c53262f1f36d3e14f6e04fe8 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.executable.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.executable.Rd
@@ -17,5 +17,5 @@ Determines whether the passed external object can be executed.
 }
 \examples{
 javaClass <- new.java.class('java.util.Collections')
-is.external.executable(javaClass$addAll())
+is.external.executable(javaClass$addAll)
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.null.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.null.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/is.external.null.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/is.external.null.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/java.addToClasspath.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/java.addToClasspath.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/java.addToClasspath.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/java.addToClasspath.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/java.class.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/java.class.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/java.class.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/java.class.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.external.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.external.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.external.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.external.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.java.array.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.java.array.Rd
similarity index 95%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.java.array.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.java.array.Rd
index 36a31df71e804dae545d1791048c6f8576263930..402b78242837b89ea775596bf0ad72ba6deefc83 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.java.array.Rd
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.java.array.Rd
@@ -20,6 +20,7 @@ Creates a new java array given by the class name and length or dimensions.
 \examples{
 new.java.array('java.lang.Double', 10)
 new.java.array('java.lang.Double', c(2, 3))
+new.java.array('int', c(2L, 3L))
 }
 \seealso{
 \code{\link{as.java.array}}, \code{\link{is.external.array}}
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.java.class.Rd b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.java.class.Rd
similarity index 100%
rename from com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/Rd/new.java.class.Rd
rename to com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rd/new.java.class.Rd
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRHelp.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRHelp.java
index f41e6f961cbf059792a7cd275b090bc3799e7c43..21bbff1baf74e5f90ae0afa3a12e6d0f863e754c 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRHelp.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRHelp.java
@@ -39,30 +39,57 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 
-@RBuiltin(name = ".fastr.interop.getHelpRd", visibility = ON, kind = PRIMITIVE, parameterNames = {"builtinName"}, behavior = COMPLEX)
-public abstract class FastRHelp extends RBuiltinNode.Arg1 {
+public class FastRHelp {
 
-    static {
-        Casts casts = new Casts(FastRHelp.class);
-        casts.arg("builtinName").mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst();
+    @RBuiltin(name = ".fastr.interop.helpPath", visibility = ON, kind = PRIMITIVE, parameterNames = {"builtinName"}, behavior = COMPLEX)
+    public abstract static class FastRHelpPath extends RBuiltinNode.Arg1 {
+
+        static {
+            Casts casts = new Casts(FastRHelpPath.class);
+            casts.arg("builtinName").mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst();
+        }
+
+        @Specialization()
+        @TruffleBoundary
+        public Object helpPath(String builtinName) {
+            String path = "/com/oracle/truffle/r/nodes/builtin/base/Rd/" + builtinName + ".Rd";
+            try (InputStream in = getClass().getResourceAsStream(path)) {
+                if (in != null) {
+                    return path;
+                }
+            } catch (IOException ex) {
+
+            }
+            return RNull.instance;
+        }
     }
 
-    @Specialization()
-    @TruffleBoundary
-    public Object isExternal(String builtinName) {
-        InputStream in = getClass().getResourceAsStream("/com/oracle/truffle/r/nodes/builtin/fastr/Rd/" + builtinName + ".Rd");
-        if (in != null) {
-            try (BufferedReader r = new BufferedReader(new InputStreamReader(in))) {
-                StringBuilder sb = new StringBuilder();
-                String line;
-                while ((line = r.readLine()) != null) {
-                    sb.append(line).append("\n");
+    @RBuiltin(name = ".fastr.interop.helpRd", visibility = ON, kind = PRIMITIVE, parameterNames = {"path"}, behavior = COMPLEX)
+    public abstract static class FastRHelpRd extends RBuiltinNode.Arg1 {
+
+        static {
+            Casts casts = new Casts(FastRHelpRd.class);
+            casts.arg("path").mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst();
+        }
+
+        @Specialization()
+        @TruffleBoundary
+        public Object getHelpRdPath(String path) {
+            try (InputStream in = getClass().getResourceAsStream(path)) {
+                if (in != null) {
+                    try (BufferedReader r = new BufferedReader(new InputStreamReader(in))) {
+                        StringBuilder sb = new StringBuilder();
+                        String line;
+                        while ((line = r.readLine()) != null) {
+                            sb.append(line).append("\n");
+                        }
+                        return sb.toString();
+                    }
                 }
-                return sb.toString();
             } catch (IOException ex) {
-                RError.warning(this, RError.Message.GENERIC, "problems while reading " + builtinName + ".Rd", ex.getMessage());
+                RError.warning(this, RError.Message.GENERIC, "problems while reading " + path, ex.getMessage());
             }
+            return RNull.instance;
         }
-        return RNull.instance;
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/R/utils_overrides.R b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/R/utils_overrides.R
index 038bccdf91fc35c7702aec16a21fc26c53ef4fc8..bc72ccbeb2246d24966724fa09ddf250cb358d88 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/R/utils_overrides.R
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/utils/R/utils_overrides.R
@@ -33,72 +33,30 @@ setBreakpoint <- function (srcfile, line, nameonly = TRUE, envir = parent.frame(
 }), asNamespace("utils"))
 
 eval(expression({
-help <- function (topic, package = NULL, lib.loc = NULL, verbose = getOption("verbose"), try.all.packages = getOption("help.try.all.packages"), help_type = getOption("help_type")) {
-    types <- c("text", "html", "pdf")
-    if (!missing(package))
-        if (is.name(y <- substitute(package)))
-            package <- as.character(y)
-    if (missing(topic)) {
-        if (!is.null(package)) {
-            help_type <- if (!length(help_type))
-                "text"
-                else match.arg(tolower(help_type), types)
-            if (interactive() && help_type == "html") {
-                port <- tools::startDynamicHelp(NA)
-                if (port <= 0L)
-                  return(library(help = package, lib.loc = lib.loc, character.only = TRUE))
-                browser <- if (.Platform$GUI == "AQUA") {
-                  get("aqua.browser", envir = as.environment("tools:RGUI"))
-                }
-                else getOption("browser")
-                browseURL(paste0("http://127.0.0.1:", port, "/library/", package, "/html/00Index.html"), browser)
-                return(invisible())
-            }
-            else return(library(help = package, lib.loc = lib.loc, character.only = TRUE))
+index.search.orig <- utils:::index.search 
+index.search <- function (topic, paths, firstOnly = FALSE) 
+{
+    res <- index.search.orig(topic, paths, firstOnly)
+    
+    if(length(res) == 0) {
+        fastrHelpRd <- .fastr.interop.helpPath(topic)
+        if(!is.null(fastrHelpRd)) {
+            res <- fastrHelpRd
         }
-        if (!is.null(lib.loc))
-            return(library(lib.loc = lib.loc))
-        topic <- "help"
-        package <- "utils"
-        lib.loc <- .Library
-    }
-    ischar <- tryCatch(is.character(topic) && length(topic) == 1L, error = identity)
-    if (inherits(ischar, "error"))
-        ischar <- FALSE
-    if (!ischar) {
-        reserved <- c("TRUE", "FALSE", "NULL", "Inf", "NaN", "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_")
-        stopic <- deparse(substitute(topic))
-        if (!is.name(substitute(topic)) && !stopic %in% reserved)
-            stop("'topic' should be a name, length-one character vector or reserved word")
-        topic <- stopic
-    }
-    # Fastr >>>>
-    fastrHelpRd <- .fastr.interop.getHelpRd(topic)
-    if (!is.null(fastrHelpRd)) {
-        fastrHelpRd <- tools::parse_Rd(textConnection(fastrHelpRd))
-        cat("==== R Help on ‘", topic, "’ ====\n", sep = "")
-        return(tools::Rd2txt(fastrHelpRd))
     }
-    # Fastr <<<<
-    help_type <- if (!length(help_type))
-        "text"
-        else match.arg(tolower(help_type), types)
-    paths <- index.search(topic, find.package(if (is.null(package))
-        loadedNamespaces()
-        else package, lib.loc, verbose = verbose))
-    tried_all_packages <- FALSE
-    if (!length(paths) && is.logical(try.all.packages) && !is.na(try.all.packages) && try.all.packages && is.null(package) && is.null(lib.loc)) {
-        for (lib in .libPaths()) {
-            packages <- .packages(TRUE, lib)
-            packages <- packages[is.na(match(packages, .packages()))]
-            paths <- c(paths, index.search(topic, file.path(lib, packages)))
-        }
-        paths <- paths[nzchar(paths)]
-        tried_all_packages <- TRUE
+    res
+}
+}), asNamespace("utils"))
+
+eval(expression({
+.getHelpFile.orig <- utils:::.getHelpFile
+.getHelpFile <- function (file) 
+{
+    fastrHelpRd <- .fastr.interop.helpRd(file)
+    if(!is.null(fastrHelpRd)) {
+        return(tools::parse_Rd(textConnection(fastrHelpRd)))
     }
-    paths <- unique(paths)
-    attributes(paths) <- list(call = match.call(), topic = topic, tried_all_packages = tried_all_packages, type = help_type)
-    class(paths) <- "help_files_with_topic"
-    paths
+
+    .getHelpFile.orig(file)
 }
 }), asNamespace("utils"))
\ No newline at end of file
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestInterop.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestInterop.java
index ed097f703a71c7c03fb737b4c7885bb0071ef9bc..d801b73256570adf83bb88c03700888d3f6e9c60 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestInterop.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestInterop.java
@@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.conn.SeekableMemoryByteChannel;
 import com.oracle.truffle.r.test.TestBase;
 import java.io.File;
 import org.junit.After;
+import static org.junit.Assert.assertTrue;
 
 public class TestInterop extends TestBase {
 
@@ -105,6 +106,22 @@ public class TestInterop extends TestBase {
                         "cat('Error in fo@bitLength :\n  cannot get a slot (\"bitLength\") from an object of type \"external object\"\n')");
     }
 
+    @Test
+    public void testHelp() {
+        assertHelpResult(fastREval("?as.external.byte", null, false), "==== R Help on ‘as.external.byte’ ====", "converted to a byte", "byteClass$valueOf(javaByte)");
+        assertHelpResult(fastREval("help(as.external.byte)", null, false), "==== R Help on ‘as.external.byte’ ====", "converted to a byte", "byteClass$valueOf(javaByte)");
+        assertHelpResult(fastREval("example(as.external.byte)", null, false), null, "byteClass$valueOf(javaByte)", "[1] 123");
+    }
+
+    private void assertHelpResult(String result, String startsWith, String... contains) {
+        if (startsWith != null) {
+            assertTrue(result.startsWith(startsWith));
+        }
+        for (String s : contains) {
+            assertTrue(result.contains(s));
+        }
+    }
+
     /**
      * Used for testing interop functionality.
      */