diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java
index 0925aa27d1f64b30e5e755d0ab023c34bd2508c1..a86a84b9c3763eff4fea3d79d19683954eadfec4 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/GrepFunctions.java
@@ -181,8 +181,12 @@ public class GrepFunctions {
             } else {
                 // trim array to the appropriate size
                 int[] result = new int[numMatches];
-                for (int i = 0; i < result.length; i++) {
-                    result[i] = tmp[i];
+                int resultIdx = 0;
+                for (int i = 0; i < tmp.length; i++) {
+                    if (tmp[i] > 0) {
+                        result[resultIdx] = tmp[i];
+                        resultIdx++;
+                    }
                 }
                 return result;
             }
@@ -1250,14 +1254,20 @@ public class GrepFunctions {
         protected Object aGrep(String pattern, RAbstractStringVector vector, boolean ignoreCase, boolean value, RAbstractIntVector costs, RAbstractDoubleVector bounds, boolean useBytes, boolean fixed,
                         @Cached("createCommon()") CommonCodeNode common) {
             // TODO implement completely; this is a very basic implementation for fixed=TRUE only.
-            common.checkExtraArgs(ignoreCase, false, false, useBytes, false);
+            common.checkExtraArgs(!fixed && ignoreCase, false, false, useBytes, false);
             common.valueCheck(value);
             common.checkNotImplemented(!fixed, "fixed", false);
             int[] tmp = new int[vector.getLength()];
             int numMatches = 0;
             long maxDistance = Math.round(pattern.length() * bounds.getDataAt(0));
             for (int i = 0; i < vector.getLength(); i++) {
-                int ld = ld(pattern, vector.getDataAt(i));
+                int ld;
+                if (ignoreCase) {
+                    // reliable only with fixed=true
+                    ld = ld(pattern.toLowerCase(), vector.getDataAt(i).toLowerCase());
+                } else {
+                    ld = ld(pattern, vector.getDataAt(i));
+                }
                 if (ld <= maxDistance) {
                     tmp[i] = i + 1;
                     numMatches++;
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 72c6e21212ac8da5a68b88a650b97445379336f6..1109e690af21d63fa98a86560ab9f1f98f5f1b82 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
@@ -2518,6 +2518,46 @@ Error: invalid 'pattern' argument
 #{ .Internal(agrepl(character(), "42", F, F, NULL, NULL, F, F)) }
 Error: invalid 'pattern' argument
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('A', c('a'), ignore.case=T) }
+[1] 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('A', c('b', 'a', 'z'), max.distance=0, ignore.case=T) }
+[1] 2
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('A', c('b', 'a', 'z'), max.distance=1, ignore.case=T) }
+[1] 1 2 3
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('a', c('A'), ignore.case=T) }
+[1] 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('a', c('a'), ignore.case=T) }
+[1] 1
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#Ignored.ImplementationError#
+#{ agrep('a', c('a', 'b'), ignore.case=T) }
+[1] 1 2
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#Ignored.ImplementationError#
+#{ agrep('a', c('b', 'a'), ignore.case=F) }
+[1] 1 2
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#Ignored.ImplementationError#
+#{ agrep('a', c('b', 'a'), ignore.case=T) }
+[1] 1 2
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('a', c('b', 'a', 'z'), max.distance=0, ignore.case=T) }
+[1] 2
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testAgrep#
+#{ agrep('a', c('b', 'a', 'z'), max.distance=1, ignore.case=T) }
+[1] 1 2 3
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_agrep.testagrep1#
 #argv <- list('x86_64-linux-gnu', 'x86_64-linux-gnu', FALSE, FALSE, c(1L, 1L, 1L), c(0.1, NA, NA, NA, NA), FALSE, TRUE); .Internal(agrep(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]]))
 [1] 1
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java
index e8fb56be9845788a1566dcdad90d445142759a96..d383e72f0904043c2d31311e23a11a60240793ff 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_agrep.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2014, Purdue University
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -54,5 +54,18 @@ public class TestBuiltin_agrep extends TestBase {
         assertEval("{ .Internal(agrepl(7, \"42\", F, F, NULL, NULL, F, F)) }");
         assertEval("{ .Internal(agrepl(character(), \"42\", F, F, NULL, NULL, F, F)) }");
         assertEval("{ .Internal(agrepl(\"7\", 42, F, F, NULL, NULL, F, F)) }");
+
+        assertEval("{ agrep('a', c('a'), ignore.case=T) }");
+        assertEval("{ agrep('A', c('a'), ignore.case=T) }");
+        assertEval("{ agrep('a', c('A'), ignore.case=T) }");
+        assertEval(Ignored.ImplementationError, "{ agrep('a', c('a', 'b'), ignore.case=T) }");
+        assertEval(Ignored.ImplementationError, "{ agrep('a', c('b', 'a'), ignore.case=T) }");
+        assertEval(Ignored.ImplementationError, "{ agrep('a', c('b', 'a'), ignore.case=F) }");
+
+        assertEval("{ agrep('a', c('b', 'a', 'z'), max.distance=0, ignore.case=T) }");
+        assertEval("{ agrep('A', c('b', 'a', 'z'), max.distance=0, ignore.case=T) }");
+        assertEval("{ agrep('a', c('b', 'a', 'z'), max.distance=1, ignore.case=T) }");
+        assertEval("{ agrep('A', c('b', 'a', 'z'), max.distance=1, ignore.case=T) }");
+
     }
 }