diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6a5a767d9e71e9bf4b8f8baa772bdaaf1124178
--- /dev/null
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java
@@ -0,0 +1,95 @@
+/*
+ * This material is distributed under the GNU General Public License
+ * Version 2. You may review the terms of this license at
+ * http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * Copyright (c) 2000--2014, The R Core Team
+ * Copyright (c) 2016, Oracle and/or its affiliates
+ *
+ * All rights reserved.
+ */
+// Acknowledgement from GnuR header:
+// Author: Catherine Loader, catherine@research.bell-labs.com, October 23, 2000.
+package com.oracle.truffle.r.library.stats;
+
+import static com.oracle.truffle.r.library.stats.LBeta.lbeta;
+
+import com.oracle.truffle.r.library.stats.StatsFunctions.Function3_1;
+
+public class DBeta implements Function3_1 {
+    @Override
+    public double evaluate(double x, double a, double b, boolean log) {
+        /* NaNs propagated correctly */
+        if (Double.isNaN(x) || Double.isNaN(a) || Double.isNaN(b)) {
+            return x + a + b;
+        }
+
+        if (a < 0 || b < 0) {
+            return RMath.mlError();
+        }
+        if (x < 0 || x > 1) {
+            return (DPQ.rd0(log));
+        }
+
+        // limit cases for (a,b), leading to point masses
+        if (a == 0 || b == 0 || !Double.isFinite(a) || !Double.isFinite(b)) {
+            if (a == 0 && b == 0) { // point mass 1/2 at each of {0,1} :
+                if (x == 0 || x == 1) {
+                    return Double.POSITIVE_INFINITY;
+                } else {
+                    return DPQ.rd0(log);
+                }
+            }
+            if (a == 0 || a / b == 0) { // point mass 1 at 0
+                if (x == 0) {
+                    return Double.POSITIVE_INFINITY;
+                } else {
+                    return DPQ.rd0(log);
+                }
+            }
+            if (b == 0 || b / a == 0) { // point mass 1 at 1
+                if (x == 1) {
+                    return Double.POSITIVE_INFINITY;
+                } else {
+                    return DPQ.rd0(log);
+                }
+            }
+            // else, remaining case: a = b = Inf : point mass 1 at 1/2
+            if (x == 0.5) {
+                return Double.POSITIVE_INFINITY;
+            } else {
+                return DPQ.rd0(log);
+            }
+        }
+
+        if (x == 0) {
+            if (a > 1) {
+                return DPQ.rd0(log);
+            }
+            if (a < 1) {
+                return Double.POSITIVE_INFINITY;
+            }
+            /* a == 1 : */
+            return DPQ.rdval(b, log);
+        }
+        if (x == 1) {
+            if (b > 1) {
+                return DPQ.rd0(log);
+            }
+            if (b < 1) {
+                return Double.POSITIVE_INFINITY;
+            }
+            /* b == 1 : */
+            return (DPQ.rdval(a, log));
+        }
+
+        double lval;
+        if (a <= 2 || b <= 2) {
+            lval = (a - 1) * Math.log(x) + (b - 1) * Math.log1p(-x) - lbeta(a, b);
+        } else {
+            lval = Math.log(a + b - 1) + Dbinom.dbinomRaw(a - 1, a + b - 2, x, 1 - x, true);
+        }
+
+        return DPQ.rdexp(lval, log);
+    }
+}
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java
index f3286dd935c434ed1e9e09711e3d5b0350fce863..1ac88316bc5407bcc8e74d0f4cf36bb04aed85e9 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java
@@ -79,7 +79,8 @@ public final class DPQ {
         return lowerTail ? 0.5 - p + 0.5 : p; /* 1 - p */
     }
 
-    public static double dval(double x, boolean logP) {
+    // R_D_val
+    public static double rdval(double x, boolean logP) {
         return logP ? Math.log(x) : x; /* x in pF(x,..) */
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java
index 6d1559d763aeafa49e50270dfe01f3a47718ce14..3b4d61c879f64fa3d019c9103d985e46b9334c34 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java
@@ -45,6 +45,7 @@ import com.oracle.truffle.r.library.stats.Chisq;
 import com.oracle.truffle.r.library.stats.CompleteCases;
 import com.oracle.truffle.r.library.stats.CovcorNodeGen;
 import com.oracle.truffle.r.library.stats.CutreeNodeGen;
+import com.oracle.truffle.r.library.stats.DBeta;
 import com.oracle.truffle.r.library.stats.DPois;
 import com.oracle.truffle.r.library.stats.Dbinom;
 import com.oracle.truffle.r.library.stats.DoubleCentreNodeGen;
@@ -304,6 +305,8 @@ public class CallAndExternalFunctions {
                     return StatsFunctionsFactory.Function2_1NodeGen.create(new DGeom());
                 case "dpois":
                     return StatsFunctionsFactory.Function2_1NodeGen.create(new DPois());
+                case "dbeta":
+                    return StatsFunctionsFactory.Function3_1NodeGen.create(new DBeta());
                 case "dt":
                     return StatsFunctionsFactory.Function2_1NodeGen.create(new Dt());
                 case "rmultinom":
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestStatFunctions.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestStatFunctions.java
index 1dc8ca79cb1b90c90e1f86812335e8c24d085ea7..30665246ce8d2e1a46b9793eeca9f60ca0631087 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestStatFunctions.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestStatFunctions.java
@@ -30,7 +30,7 @@ import com.oracle.truffle.r.test.TestBase;
  * Common tests for functions implemented using {@code StatsFunctions} infrastructure.
  */
 public class TestStatFunctions extends TestBase {
-    private static final String[] FUNCTION3_1_NAMES = {"dgamma"};
+    private static final String[] FUNCTION3_1_NAMES = {"dgamma", "dbeta"};
     private static final String[] FUNCTION3_1_PARAMS = {
                     "10, 10, 10, log=TRUE",
                     "3, 3, 3, log=FALSE",
diff --git a/mx.fastr/copyrights/overrides b/mx.fastr/copyrights/overrides
index 5749956835828799755859ea651baf09c2ec9fd8..5fa2ed2ee9f9b192bd5562d37f05f52788705833 100644
--- a/mx.fastr/copyrights/overrides
+++ b/mx.fastr/copyrights/overrides
@@ -73,6 +73,7 @@ com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RChisq.java,
 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Exp.java,gnu_r_ihaka_core.copyright
 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Geom.java,gnu_r_ihaka_core.copyright
 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dt.java,gnu_r.core.copyright
+com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java,gnu_r.core.copyright
 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPois.java,gnu_r.core.copyright
 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNchisq.java,gnu_r.copyright
 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Wilcox.java,gnu_r.core.copyright