diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/R/diff.R b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/R/diff.R
new file mode 100644
index 0000000000000000000000000000000000000000..d66dd250036917af2275475b56eb3a434db336d5
--- /dev/null
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/R/diff.R
@@ -0,0 +1,41 @@
+#  File src/library/base/R/diff.R
+#  Part of the R package, http://www.R-project.org
+#
+#  Copyright (C) 1995-2012 The R Core Team
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program 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 for more details.
+#
+#  A copy of the GNU General Public License is available at
+#  http://www.r-project.org/Licenses/
+
+diff <- function(x, ...) UseMethod("diff")
+
+diff.default <- function(x, lag = 1L, differences = 1L, ...)
+{
+        ismat <- is.matrix(x)
+        xlen <- if(ismat) dim(x)[1L] else length(x)
+        if (length(lag) > 1L || length(differences) > 1L ||
+                        lag < 1L || differences < 1L)
+                stop("'lag' and 'differences' must be integers >= 1")
+        if (lag * differences >= xlen)
+                return(x[0L]) # empty, but of proper mode
+        r <- unclass(x)  # don't want class-specific subset methods
+        i1 <- -seq_len(lag)
+        if (ismat)
+                for (i in seq_len(differences))
+                        r <- r[i1, , drop = FALSE] -
+                                        r[-nrow(r):-(nrow(r)-lag+1L), , drop = FALSE]
+        else
+                for (i in seq_len(differences))
+                        r <- r[i1] - r[-length(r):-(length(r)-lag+1L)]
+        class(r) <- oldClass(x)
+        r
+}
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 aa816adb48de03ad76b3ac549a5d9ee346d308d5..29ac63cb1f6573978d8cbe4bec0e55ac182ea1bb 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
@@ -7416,6 +7416,22 @@ Error in print(x, y) :
 #{ m <- matrix(1:9, nrow=3) ; diag(m) }
 [1] 1 5 9
 
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff
+#{ diff(1:10, 2) }
+[1] 2 2 2 2 2 2 2 2
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff
+#{ diff(1:10, 2, 2) }
+[1] 0 0 0 0 0 0
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff
+#{ x <- cumsum(cumsum(1:10)) ; diff(x, differences = 2) }
+[1]  3  4  5  6  7  8  9 10
+
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDiff
+#{ x <- cumsum(cumsum(1:10)) ; diff(x, lag = 2) }
+[1]   9  16  25  36  49  64  81 100
+
 ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testDimensions
 #{ NCOL(1) }
 [1] 1
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
index 25795bbad29192733f0e6b874124004b2a164b1a..9f80add3385e800a2dc0dfc798705ec8260b7c9c 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
@@ -7098,6 +7098,26 @@ public class AllTests extends TestBase {
         assertEval("{ diag(1, 2, 7) }");
     }
 
+    @Test
+    public void TestSimpleBuiltins_testDiff_f0ac3bed06cb4b5646da1f73e78291f8() {
+        assertEval("{ diff(1:10, 2) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDiff_7b31177c1f34b8a05962fdbb5b777fde() {
+        assertEval("{ diff(1:10, 2, 2) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDiff_3715f48e2640f2039090554c74f88ddc() {
+        assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, lag = 2) }");
+    }
+
+    @Test
+    public void TestSimpleBuiltins_testDiff_e72d1cda19e760416d19b9192a7a2321() {
+        assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, differences = 2) }");
+    }
+
     @Test
     public void TestSimpleBuiltins_testDimensions_0c23ecb60a78eddaab4dced71193f975() {
         assertEval("{ dim(1) }");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
index 68833617bae571c1586cca8a43ff7fdfe12b0aee..9398cf67381741b95c225e52de0dded9dd72f2de 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
@@ -3956,4 +3956,12 @@ public class TestSimpleBuiltins extends TestBase {
         assertEval("{x<-gl(2, 1, 20); print(x)}");
         assertEval("{x<-gl(2, 2, 20); print(x)}");
     }
+
+    @Test
+    public void testDiff() {
+        assertEval("{ diff(1:10, 2) }");
+        assertEval("{ diff(1:10, 2, 2) }");
+        assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, lag = 2) }");
+        assertEval("{ x <- cumsum(cumsum(1:10)) ; diff(x, differences = 2) }");
+    }
 }