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 d1432ee475bb9ad690ebd2e7ee58f7c4464ef6d5..79152550b9fa1d292b20e134f0182470f1179629 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
@@ -1368,6 +1368,11 @@ public class GrepFunctions {
             }
             for (int i = 0; i < x.getLength(); i++) {
                 String data = x.getDataAt(i);
+                assert data != null;
+                if (data.length() == 0) {
+                    result[i] = RDataFactory.createEmptyStringVector();
+                    continue;
+                }
                 String currentSplit = splits[i % splits.length];
                 if (currentSplit.isEmpty()) {
                     result[i] = na.check(data) ? RDataFactory.createNAStringVector() : emptySplitIntl(data);
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 6ee205844bd96447969fb7d8106d26b4ec65afb9..7f0f565864333a0f12351be442344a3a9cf3769f 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
@@ -79,6 +79,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
+import com.oracle.truffle.r.runtime.data.RExternalPtr;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
@@ -698,6 +699,11 @@ public class CallAndExternalFunctions {
             return callRFFINode.execute(new NativeCallInfo(symbol, func, rns.getDllInfo()), args.getArguments());
         }
 
+        @Specialization
+        protected Object callNamedFunctionWithPackage(RExternalPtr symbol, RArgsValuesAndNames args, @SuppressWarnings("unused") RMissing packageName) {
+            return callRFFINode.execute(new NativeCallInfo("", symbol.getAddr(), null), args.getArguments());
+        }
+
         @SuppressWarnings("unused")
         @Fallback
         protected Object dotCallFallback(Object symbol, Object args, Object packageName) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
index 5d3c31feba257afdbfd70dbc0da57b7c367a7f19..174c4c56c6c0fecea9aa0966809facb587ff91a7 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
@@ -324,7 +324,11 @@ public final class Utils {
                         Path truePath = currentPath.resolve(p);
                         if (keepRelative) {
                             // relativize it (it was relative to start with)
-                            return currentPath.relativize(truePath).toString();
+                            if (".".equals(path) || "..".equals(path)) {
+                                return path;
+                            } else {
+                                return currentPath.relativize(truePath).toString();
+                            }
                         } else {
                             return truePath.toString();
                         }
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 53b3c3e5b88cbec974e1986a42fff73b204d163d..4cfca94bd60c8d88820d84ae69e88bea57b778c6 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
@@ -43736,6 +43736,11 @@ character(0)
 #argv <- structure(list(path = '/tmp/RtmpagC9oa/Pkgs/exNSS4'),     .Names = 'path');do.call('path.expand', argv)
 [1] "/tmp/RtmpagC9oa/Pkgs/exNSS4"
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_pathexpand.testpathexpand6#
+#path.expand('.'); wd <- getwd(); tryCatch({ setwd('/tmp'); path.expand('.') }, finally = { setwd(wd) })
+[1] "."
+[1] "."
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_plus_Date.testplus_Date1#
 #argv <- structure(list(e1 = structure(1, units = 'days', class = 'difftime'),     e2 = structure(14579, class = 'Date')), .Names = c('e1',     'e2'));do.call('+.Date', argv)
 [1] "2009-12-02"
@@ -65895,6 +65900,15 @@ Error: unexpected '}' in "{ .Internal(strrep(, '') }"
 [1] "" ""
 
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_strsplit.testStrSplit#
+#strsplit(c('','a , b'), '[[:space:]]*,[[:space:]]*')
+[[1]]
+character(0)
+
+[[2]]
+[1] "a" "b"
+
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_strsplit.testStrSplit#
 #strsplit(c('1', ''), c('1', ''), fixed=FALSE)
 [[1]]
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java
index 0b873424d18b832deaa51e573156d5bd30148e69..13330f9079da2aabd25459dc2f52150348b75cec 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_pathexpand.java
@@ -37,6 +37,11 @@ public class TestBuiltin_pathexpand extends TestBase {
         assertEval("argv <- structure(list(path = '/tmp/RtmpagC9oa/Pkgs/exNSS4'),     .Names = 'path');do.call('path.expand', argv)");
     }
 
+    @Test
+    public void testpathexpand6() {
+        assertEval("path.expand('.'); wd <- getwd(); tryCatch({ setwd('/tmp'); path.expand('.') }, finally = { setwd(wd) })");
+    }
+
     @Test
     public void testArgsValidation() {
         assertEval("path.expand(NULL)");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java
index f06f1669ca542addb832b1f4b26154654006cc2e..dd40c57132e6884495892cf0b5f644f696b001c1 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_strsplit.java
@@ -142,6 +142,7 @@ public class TestBuiltin_strsplit extends TestBase {
         assertEval("strsplit(c('1', 'b'), c('1', 'b'), fixed=FALSE)");
         assertEval("strsplit(c('a1a', 'a1b'), c('1', '1'), fixed=FALSE)");
         assertEval("strsplit(c('a1a', 'a1b'), '1', fixed=FALSE)");
+        assertEval("strsplit(c('','a , b'), '[[:space:]]*,[[:space:]]*')");
 
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java
index b0e6a808ccdeaac61afbcfd20e90945d6478c942..5d1d166160c6db4a8ccd366c71c83ee9493faeb3 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/fastr/TestJavaInterop.java
@@ -360,8 +360,11 @@ public class TestJavaInterop extends TestBase {
         assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClass.class.getName() + "'); names(tc$staticField)", "NULL");
         assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClass.class.getName() + "'); names(tc$staticMethod)", "NULL");
         assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClass.class.getName() + "'); t <- .fastr.interop.new(tc); sort(names(t))", "c('field', 'method', 'staticField', 'staticMethod')");
-        assertEvalFastR("cl <- .fastr.java.class('java.util.Collections'); em<-cl$EMPTY_MAP; names(em)", "NULL");
-        assertEvalFastR("tc <- .fastr.java.class('" + TestNamesClassMap.class.getName() + "'); to <- .fastr.interop.new(tc); sort(names(to$m()))", "c('one', 'two')");
+        // Note: The following two tests fails on Solaris. It seems that the Java interop on
+        // Solaris treats the two inner classes SimpleImmutableEntry and SimpleEntry of
+        // java.util.AbstractMap as if they were members.
+        assertEvalFastR(Ignored.ImplementationError, "cl <- .fastr.java.class('java.util.Collections'); em<-cl$EMPTY_MAP; names(em)", "NULL");
+        assertEvalFastR(Ignored.ImplementationError, "tc <- .fastr.java.class('" + TestNamesClassMap.class.getName() + "'); to <- .fastr.interop.new(tc); sort(names(to$m()))", "c('one', 'two')");
     }
 
     @Test