diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java
index 7e6193122e64c39b05bf20a4d00d8ba8407807ab..afe1fbe86e60e3a01bf8ecf1449578dbb6bce7e1 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java
@@ -413,14 +413,14 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     @Override
     @TruffleBoundary
     public int Rf_error(String msg) {
-        RError.error(RError.SHOW_CALLER2, RError.Message.GENERIC, msg);
+        RError.error(RError.SHOW_CALLER, RError.Message.GENERIC, msg);
         return 0;
     }
 
     @Override
     @TruffleBoundary
     public int Rf_warning(String msg) {
-        RError.warning(RError.SHOW_CALLER2, RError.Message.GENERIC, msg);
+        RError.warning(RError.SHOW_CALLER, RError.Message.GENERIC, msg);
         return 0;
     }
 
@@ -443,7 +443,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     public Object Rf_allocVector(int mode, long n) {
         SEXPTYPE type = SEXPTYPE.mapInt(mode);
         if (n > Integer.MAX_VALUE) {
-            throw RError.error(RError.SHOW_CALLER2, RError.Message.LONG_VECTORS_NOT_SUPPORTED);
+            throw RError.error(RError.SHOW_CALLER, RError.Message.LONG_VECTORS_NOT_SUPPORTED);
             // TODO check long vector
         }
         int ni = (int) n;
@@ -676,6 +676,11 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
         throw implementedAsNode();
     }
 
+    @Override
+    public Object CAAR(Object e) {
+        throw implementedAsNode();
+    }
+
     @Override
     public Object CDR(Object e) {
         throw implementedAsNode();
@@ -686,16 +691,36 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
         throw implementedAsNode();
     }
 
+    @Override
+    public Object CDAR(Object e) {
+        throw implementedAsNode();
+    }
+
     @Override
     public Object CADDR(Object e) {
         throw implementedAsNode();
     }
 
+    @Override
+    public Object CADDDR(Object e) {
+        throw implementedAsNode();
+    }
+
+    @Override
+    public Object CAD4R(Object e) {
+        throw implementedAsNode();
+    }
+
     @Override
     public Object CDDR(Object e) {
         throw implementedAsNode();
     }
 
+    @Override
+    public Object CDDDR(Object e) {
+        throw implementedAsNode();
+    }
+
     @Override
     public Object SET_TAG(Object x, Object y) {
         if (x instanceof RPairList) {
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java
index 29acb7dd3326cb9fe09943a379022510621ffafd..3279573549545bf005d13825528ed7558f12d6f2 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java
@@ -51,8 +51,8 @@ public class TruffleNFI_DLL implements DLLRFFI {
 
     private static class TruffleNFI_DLOpenNode extends Node implements DLLRFFI.DLOpenNode {
 
-        @TruffleBoundary
         @Override
+        @TruffleBoundary
         public Object execute(String path, boolean local, boolean now) {
             String libName = DLL.libName(path);
             Env env = RContext.getInstance().getEnv();
@@ -77,6 +77,7 @@ public class TruffleNFI_DLL implements DLLRFFI {
     private static class TruffleNFI_DLSymNode extends Node implements DLLRFFI.DLSymNode {
 
         @Override
+        @TruffleBoundary
         public SymbolHandle execute(Object handle, String symbol) {
             assert handle instanceof NFIHandle;
             NFIHandle nfiHandle = (NFIHandle) handle;
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java
index 051567f2a264727f4d7270ee5f5f7cedb51629d5..9e8c18a8c8da56b9fea99f90ae32870a4102a380 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java
@@ -26,9 +26,14 @@ import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.dsl.TypeSystemReference;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CAARNodeGen;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CAD4RNodeGen;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADDDRNodeGen;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADDRNodeGen;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADRNodeGen;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CARNodeGen;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDARNodeGen;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDDDRNodeGen;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDDRNodeGen;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDRNodeGen;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.SETCARNodeGen;
@@ -94,6 +99,22 @@ public final class ListAccessNodes {
         }
     }
 
+    @TypeSystemReference(RTypes.class)
+    public abstract static class CAARNode extends FFIUpCallNode.Arg1 {
+
+        @Child private CARNode car1 = CARNode.create();
+        @Child private CARNode car2 = CARNode.create();
+
+        @Specialization
+        protected Object caar(Object value) {
+            return car2.executeObject(car1.executeObject(value));
+        }
+
+        public static CAARNode create() {
+            return CAARNodeGen.create();
+        }
+    }
+
     @TypeSystemReference(RTypes.class)
     public static final class SETCADRNode extends FFIUpCallNode.Arg2 {
         @Child private SETCARNode setcarNode = SETCARNode.create();
@@ -196,6 +217,21 @@ public final class ListAccessNodes {
         }
     }
 
+    @TypeSystemReference(RTypes.class)
+    public abstract static class CDARNode extends FFIUpCallNode.Arg1 {
+        @Child private CARNode car = CARNode.create();
+        @Child private CDRNode cdr = CDRNode.create();
+
+        @Specialization
+        protected Object cdar(Object value) {
+            return cdr.executeObject(car.executeObject(value));
+        }
+
+        public static CDARNode create() {
+            return CDARNodeGen.create();
+        }
+    }
+
     @TypeSystemReference(RTypes.class)
     public abstract static class CADDRNode extends FFIUpCallNode.Arg1 {
         @Specialization
@@ -218,6 +254,52 @@ public final class ListAccessNodes {
         }
     }
 
+    @TypeSystemReference(RTypes.class)
+    public abstract static class CADDDRNode extends FFIUpCallNode.Arg1 {
+        @Specialization
+        protected Object cadddr(RPairList pl) {
+            RPairList tmp = (RPairList) pl.cddr();
+            return tmp.cadr();
+        }
+
+        @Specialization
+        protected Object cadddr(RLanguage lang) {
+            return lang.getDataAtAsObject(3);
+        }
+
+        @Fallback
+        protected Object cadddr(@SuppressWarnings("unused") Object obj) {
+            throw RInternalError.unimplemented("CADDDR only works on pair lists and language objects");
+        }
+
+        public static CADDDRNode create() {
+            return CADDDRNodeGen.create();
+        }
+    }
+
+    @TypeSystemReference(RTypes.class)
+    public abstract static class CAD4RNode extends FFIUpCallNode.Arg1 {
+        @Specialization
+        protected Object cad4r(RPairList pl) {
+            RPairList tmp = (RPairList) pl.cddr();
+            return tmp.caddr();
+        }
+
+        @Specialization
+        protected Object cad4r(RLanguage lang) {
+            return lang.getDataAtAsObject(4);
+        }
+
+        @Fallback
+        protected Object cad4r(@SuppressWarnings("unused") Object obj) {
+            throw RInternalError.unimplemented("CAD4R only works on pair lists and language objects");
+        }
+
+        public static CAD4RNode create() {
+            return CAD4RNodeGen.create();
+        }
+    }
+
     @TypeSystemReference(RTypes.class)
     public abstract static class CDDRNode extends FFIUpCallNode.Arg1 {
         @Specialization
@@ -226,7 +308,7 @@ public final class ListAccessNodes {
         }
 
         @Specialization
-        protected Object cdr(RLanguage lang) {
+        protected Object cddr(RLanguage lang) {
             RPairList l = lang.getPairList();
             return l.cddr();
         }
@@ -240,4 +322,27 @@ public final class ListAccessNodes {
             return CDDRNodeGen.create();
         }
     }
+
+    @TypeSystemReference(RTypes.class)
+    public abstract static class CDDDRNode extends FFIUpCallNode.Arg1 {
+        @Specialization
+        protected Object cdddr(RPairList pl) {
+            return pl.cddr();
+        }
+
+        @Specialization
+        protected Object cdddr(RLanguage lang) {
+            RPairList l = (RPairList) lang.getPairList().cddr();
+            return l.cdr();
+        }
+
+        @Fallback
+        protected Object cdddr(@SuppressWarnings("unused") Object obj) {
+            throw RInternalError.unimplemented("CDDDR only works on pair lists and language objects");
+        }
+
+        public static CDDDRNode create() {
+            return CDDDRNodeGen.create();
+        }
+    }
 }
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java
index 26c9a460b1d6acf3acc07c15c69512b50dd4cbd0..9138e92393ae206aee397b439c9c9932c1b45a01 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java
@@ -34,9 +34,14 @@ import com.oracle.truffle.r.ffi.impl.nodes.CoerceNodes.VectorToPairListNode;
 import com.oracle.truffle.r.ffi.impl.nodes.DuplicateNodes;
 import com.oracle.truffle.r.ffi.impl.nodes.EnvNodes.LockBindingNode;
 import com.oracle.truffle.r.ffi.impl.nodes.EnvNodes.UnlockBindingNode;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CAARNode;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CAD4RNode;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADDDRNode;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADDRNode;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADRNode;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CARNode;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDARNode;
+import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDDDRNode;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDDRNode;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDRNode;
 import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.SETCADRNode;
@@ -200,18 +205,33 @@ public interface StdUpCallsRFFI {
     @RFFIUpCallNode(CARNode.class)
     Object CAR(Object e);
 
+    @RFFIUpCallNode(CAARNode.class)
+    Object CAAR(Object e);
+
     @RFFIUpCallNode(CDRNode.class)
     Object CDR(Object e);
 
+    @RFFIUpCallNode(CDARNode.class)
+    Object CDAR(Object e);
+
     @RFFIUpCallNode(CADRNode.class)
     Object CADR(Object e);
 
     @RFFIUpCallNode(CADDRNode.class)
     Object CADDR(Object e);
 
+    @RFFIUpCallNode(CADDDRNode.class)
+    Object CADDDR(Object e);
+
+    @RFFIUpCallNode(CAD4RNode.class)
+    Object CAD4R(Object e);
+
     @RFFIUpCallNode(CDDRNode.class)
     Object CDDR(Object e);
 
+    @RFFIUpCallNode(CDDDRNode.class)
+    Object CDDDR(Object e);
+
     Object SET_TAG(Object x, Object y);
 
     @RFFIUpCallNode(SETCARNode.class)
diff --git a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h
index c149521873dc4873790bfccbdbc133571cc5e9d6..faf4a45a09695111a4a4b722f1a434f4a2daa4c4 100644
--- a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h
+++ b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h
@@ -3,174 +3,179 @@
 #define RFFI_UPCALLSINDEX_H
 
 #define ATTRIB_x 0
-#define CADDR_x 1
-#define CADR_x 2
-#define CAR_x 3
-#define CDDR_x 4
-#define CDR_x 5
-#define CLOENV_x 6
-#define COMPLEX_x 7
-#define DUPLICATE_ATTRIB_x 8
-#define ENCLOS_x 9
-#define FASTR_getConnectionChar_x 10
-#define GetRNGstate_x 11
-#define INTEGER_x 12
-#define IS_S4_OBJECT_x 13
-#define LENGTH_x 14
-#define LOGICAL_x 15
-#define NAMED_x 16
-#define OBJECT_x 17
-#define PRCODE_x 18
-#define PRENV_x 19
-#define PRINTNAME_x 20
-#define PRSEEN_x 21
-#define PRVALUE_x 22
-#define PutRNGstate_x 23
-#define RAW_x 24
-#define RDEBUG_x 25
-#define REAL_x 26
-#define RSTEP_x 27
-#define R_BaseEnv_x 28
-#define R_BaseNamespace_x 29
-#define R_BindingIsLocked_x 30
-#define R_CHAR_x 31
-#define R_CleanUp_x 32
-#define R_ExternalPtrAddr_x 33
-#define R_ExternalPtrProtected_x 34
-#define R_ExternalPtrTag_x 35
-#define R_FindNamespace_x 36
-#define R_GetConnection_x 37
-#define R_GlobalContext_x 38
-#define R_GlobalEnv_x 39
-#define R_Home_x 40
-#define R_HomeDir_x 41
-#define R_Interactive_x 42
-#define R_LockBinding_x 43
-#define R_MakeExternalPtr_x 44
-#define R_MethodsNamespace_x 45
-#define R_NamespaceRegistry_x 46
-#define R_NewHashedEnv_x 47
-#define R_ParseVector_x 48
-#define R_PreserveObject_x 49
-#define R_PromiseExpr_x 50
-#define R_ProtectWithIndex_x 51
-#define R_ReadConnection_x 52
-#define R_ReleaseObject_x 53
-#define R_Reprotect_x 54
-#define R_SetExternalPtrAddr_x 55
-#define R_SetExternalPtrProtected_x 56
-#define R_SetExternalPtrTag_x 57
-#define R_TempDir_x 58
-#define R_ToplevelExec_x 59
-#define R_WriteConnection_x 60
-#define R_alloc_x 61
-#define R_compute_identical_x 62
-#define R_do_MAKE_CLASS_x 63
-#define R_do_new_object_x 64
-#define R_do_slot_x 65
-#define R_do_slot_assign_x 66
-#define R_getClassDef_x 67
-#define R_getContextCall_x 68
-#define R_getContextEnv_x 69
-#define R_getContextFun_x 70
-#define R_getContextSrcRef_x 71
-#define R_getGlobalFunctionContext_x 72
-#define R_getParentFunctionContext_x 73
-#define R_has_slot_x 74
-#define R_insideBrowser_x 75
-#define R_isEqual_x 76
-#define R_isGlobal_x 77
-#define R_lsInternal3_x 78
-#define R_new_custom_connection_x 79
-#define R_tryEval_x 80
-#define R_unLockBinding_x 81
-#define Rf_GetOption1_x 82
-#define Rf_NonNullStringMatch_x 83
-#define Rf_PairToVectorList_x 84
-#define Rf_ScalarDouble_x 85
-#define Rf_ScalarInteger_x 86
-#define Rf_ScalarLogical_x 87
-#define Rf_ScalarString_x 88
-#define Rf_VectorToPairList_x 89
-#define Rf_allocArray_x 90
-#define Rf_allocMatrix_x 91
-#define Rf_allocVector_x 92
-#define Rf_any_duplicated_x 93
-#define Rf_asChar_x 94
-#define Rf_asCharacterFactor_x 95
-#define Rf_asInteger_x 96
-#define Rf_asLogical_x 97
-#define Rf_asReal_x 98
-#define Rf_classgets_x 99
-#define Rf_coerceVector_x 100
-#define Rf_cons_x 101
-#define Rf_copyListMatrix_x 102
-#define Rf_copyMatrix_x 103
-#define Rf_copyMostAttrib_x 104
-#define Rf_defineVar_x 105
-#define Rf_dunif_x 106
-#define Rf_duplicate_x 107
-#define Rf_error_x 108
-#define Rf_errorcall_x 109
-#define Rf_eval_x 110
-#define Rf_findFun_x 111
-#define Rf_findVar_x 112
-#define Rf_findVarInFrame_x 113
-#define Rf_findVarInFrame3_x 114
-#define Rf_getAttrib_x 115
-#define Rf_gsetVar_x 116
-#define Rf_inherits_x 117
-#define Rf_install_x 118
-#define Rf_installChar_x 119
-#define Rf_isNull_x 120
-#define Rf_isString_x 121
-#define Rf_lengthgets_x 122
-#define Rf_match_x 123
-#define Rf_mkCharLenCE_x 124
-#define Rf_namesgets_x 125
-#define Rf_ncols_x 126
-#define Rf_nrows_x 127
-#define Rf_protect_x 128
-#define Rf_punif_x 129
-#define Rf_qunif_x 130
-#define Rf_runif_x 131
-#define Rf_setAttrib_x 132
-#define Rf_str2type_x 133
-#define Rf_unprotect_x 134
-#define Rf_unprotect_ptr_x 135
-#define Rf_warning_x 136
-#define Rf_warningcall_x 137
-#define Rprintf_x 138
-#define SETCADR_x 139
-#define SETCAR_x 140
-#define SETCDR_x 141
-#define SET_NAMED_FASTR_x 142
-#define SET_RDEBUG_x 143
-#define SET_RSTEP_x 144
-#define SET_S4_OBJECT_x 145
-#define SET_STRING_ELT_x 146
-#define SET_SYMVALUE_x 147
-#define SET_TAG_x 148
-#define SET_TYPEOF_FASTR_x 149
-#define SET_VECTOR_ELT_x 150
-#define STRING_ELT_x 151
-#define SYMVALUE_x 152
-#define TAG_x 153
-#define TYPEOF_x 154
-#define UNSET_S4_OBJECT_x 155
-#define VECTOR_ELT_x 156
-#define forceSymbols_x 157
-#define getCCallable_x 158
-#define getConnectionClassString_x 159
-#define getOpenModeString_x 160
-#define getSummaryDescription_x 161
-#define isSeekable_x 162
-#define registerCCallable_x 163
-#define registerRoutines_x 164
-#define setDotSymbolValues_x 165
-#define unif_rand_x 166
-#define useDynamicSymbols_x 167
+#define CAAR_x 1
+#define CAD4R_x 2
+#define CADDDR_x 3
+#define CADDR_x 4
+#define CADR_x 5
+#define CAR_x 6
+#define CDAR_x 7
+#define CDDDR_x 8
+#define CDDR_x 9
+#define CDR_x 10
+#define CLOENV_x 11
+#define COMPLEX_x 12
+#define DUPLICATE_ATTRIB_x 13
+#define ENCLOS_x 14
+#define FASTR_getConnectionChar_x 15
+#define GetRNGstate_x 16
+#define INTEGER_x 17
+#define IS_S4_OBJECT_x 18
+#define LENGTH_x 19
+#define LOGICAL_x 20
+#define NAMED_x 21
+#define OBJECT_x 22
+#define PRCODE_x 23
+#define PRENV_x 24
+#define PRINTNAME_x 25
+#define PRSEEN_x 26
+#define PRVALUE_x 27
+#define PutRNGstate_x 28
+#define RAW_x 29
+#define RDEBUG_x 30
+#define REAL_x 31
+#define RSTEP_x 32
+#define R_BaseEnv_x 33
+#define R_BaseNamespace_x 34
+#define R_BindingIsLocked_x 35
+#define R_CHAR_x 36
+#define R_CleanUp_x 37
+#define R_ExternalPtrAddr_x 38
+#define R_ExternalPtrProtected_x 39
+#define R_ExternalPtrTag_x 40
+#define R_FindNamespace_x 41
+#define R_GetConnection_x 42
+#define R_GlobalContext_x 43
+#define R_GlobalEnv_x 44
+#define R_Home_x 45
+#define R_HomeDir_x 46
+#define R_Interactive_x 47
+#define R_LockBinding_x 48
+#define R_MakeExternalPtr_x 49
+#define R_MethodsNamespace_x 50
+#define R_NamespaceRegistry_x 51
+#define R_NewHashedEnv_x 52
+#define R_ParseVector_x 53
+#define R_PreserveObject_x 54
+#define R_PromiseExpr_x 55
+#define R_ProtectWithIndex_x 56
+#define R_ReadConnection_x 57
+#define R_ReleaseObject_x 58
+#define R_Reprotect_x 59
+#define R_SetExternalPtrAddr_x 60
+#define R_SetExternalPtrProtected_x 61
+#define R_SetExternalPtrTag_x 62
+#define R_TempDir_x 63
+#define R_ToplevelExec_x 64
+#define R_WriteConnection_x 65
+#define R_alloc_x 66
+#define R_compute_identical_x 67
+#define R_do_MAKE_CLASS_x 68
+#define R_do_new_object_x 69
+#define R_do_slot_x 70
+#define R_do_slot_assign_x 71
+#define R_getClassDef_x 72
+#define R_getContextCall_x 73
+#define R_getContextEnv_x 74
+#define R_getContextFun_x 75
+#define R_getContextSrcRef_x 76
+#define R_getGlobalFunctionContext_x 77
+#define R_getParentFunctionContext_x 78
+#define R_has_slot_x 79
+#define R_insideBrowser_x 80
+#define R_isEqual_x 81
+#define R_isGlobal_x 82
+#define R_lsInternal3_x 83
+#define R_new_custom_connection_x 84
+#define R_tryEval_x 85
+#define R_unLockBinding_x 86
+#define Rf_GetOption1_x 87
+#define Rf_NonNullStringMatch_x 88
+#define Rf_PairToVectorList_x 89
+#define Rf_ScalarDouble_x 90
+#define Rf_ScalarInteger_x 91
+#define Rf_ScalarLogical_x 92
+#define Rf_ScalarString_x 93
+#define Rf_VectorToPairList_x 94
+#define Rf_allocArray_x 95
+#define Rf_allocMatrix_x 96
+#define Rf_allocVector_x 97
+#define Rf_any_duplicated_x 98
+#define Rf_asChar_x 99
+#define Rf_asCharacterFactor_x 100
+#define Rf_asInteger_x 101
+#define Rf_asLogical_x 102
+#define Rf_asReal_x 103
+#define Rf_classgets_x 104
+#define Rf_coerceVector_x 105
+#define Rf_cons_x 106
+#define Rf_copyListMatrix_x 107
+#define Rf_copyMatrix_x 108
+#define Rf_copyMostAttrib_x 109
+#define Rf_defineVar_x 110
+#define Rf_dunif_x 111
+#define Rf_duplicate_x 112
+#define Rf_error_x 113
+#define Rf_errorcall_x 114
+#define Rf_eval_x 115
+#define Rf_findFun_x 116
+#define Rf_findVar_x 117
+#define Rf_findVarInFrame_x 118
+#define Rf_findVarInFrame3_x 119
+#define Rf_getAttrib_x 120
+#define Rf_gsetVar_x 121
+#define Rf_inherits_x 122
+#define Rf_install_x 123
+#define Rf_installChar_x 124
+#define Rf_isNull_x 125
+#define Rf_isString_x 126
+#define Rf_lengthgets_x 127
+#define Rf_match_x 128
+#define Rf_mkCharLenCE_x 129
+#define Rf_namesgets_x 130
+#define Rf_ncols_x 131
+#define Rf_nrows_x 132
+#define Rf_protect_x 133
+#define Rf_punif_x 134
+#define Rf_qunif_x 135
+#define Rf_runif_x 136
+#define Rf_setAttrib_x 137
+#define Rf_str2type_x 138
+#define Rf_unprotect_x 139
+#define Rf_unprotect_ptr_x 140
+#define Rf_warning_x 141
+#define Rf_warningcall_x 142
+#define Rprintf_x 143
+#define SETCADR_x 144
+#define SETCAR_x 145
+#define SETCDR_x 146
+#define SET_NAMED_FASTR_x 147
+#define SET_RDEBUG_x 148
+#define SET_RSTEP_x 149
+#define SET_S4_OBJECT_x 150
+#define SET_STRING_ELT_x 151
+#define SET_SYMVALUE_x 152
+#define SET_TAG_x 153
+#define SET_TYPEOF_FASTR_x 154
+#define SET_VECTOR_ELT_x 155
+#define STRING_ELT_x 156
+#define SYMVALUE_x 157
+#define TAG_x 158
+#define TYPEOF_x 159
+#define UNSET_S4_OBJECT_x 160
+#define VECTOR_ELT_x 161
+#define forceSymbols_x 162
+#define getCCallable_x 163
+#define getConnectionClassString_x 164
+#define getOpenModeString_x 165
+#define getSummaryDescription_x 166
+#define isSeekable_x 167
+#define registerCCallable_x 168
+#define registerRoutines_x 169
+#define setDotSymbolValues_x 170
+#define unif_rand_x 171
+#define useDynamicSymbols_x 172
 
-#define UPCALLS_TABLE_SIZE 168
+#define UPCALLS_TABLE_SIZE 173
 
 #endif // RFFI_UPCALLSINDEX_H
diff --git a/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c b/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c
index a715a69fcb1854d606e1389766510ad40c3e5f59..4d6193502941ff2da15d39c2069a0d4a02945dd9 100644
--- a/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c
+++ b/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c
@@ -5,13 +5,14 @@
  *
  * Copyright (c) 1995-2015, The R Core Team
  * Copyright (c) 2003, The R Foundation
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
 
 #include <Rinternals.h>
 #include <stdlib.h>
+#include <float.h>
 #include <R_ext/RS.h>
 
 #define _(Source) (Source)
@@ -218,3 +219,172 @@ SEXP nthcdr(SEXP s, int n)
     else error(_("'nthcdr' needs a list to CDR down"));
     return R_NilValue;/* for -Wall */
 }
+
+#define LDOUBLE double
+
+double R_strtod5(const char *str, char **endptr, char dec,
+                 Rboolean NA, int exact)
+{
+    LDOUBLE ans = 0.0, p10 = 10.0, fac = 1.0;
+    int n, expn = 0, sign = 1, ndigits = 0, exph = -1;
+    const char *p = str;
+
+    /* optional whitespace */
+    while (isspace(*p)) p++;
+
+    if (NA && strncmp(p, "NA", 2) == 0) {
+        ans = NA_REAL;
+        p += 2;
+        goto done;
+    }
+
+   /* optional sign */
+    switch (*p) {
+    case '-': sign = -1;
+    case '+': p++;
+    default: ;
+    }
+
+    if (strncasecmp(p, "NaN", 3) == 0) {
+        ans = R_NaN;
+        p += 3;
+        goto done;
+    /* C99 specifies this: must come first to avoid 'inf' match */
+    } else if (strncasecmp(p, "infinity", 8) == 0) {
+        ans = R_PosInf;
+        p += 8;
+        goto done;
+    } else if (strncasecmp(p, "Inf", 3) == 0) {
+        ans = R_PosInf;
+        p += 3;
+        goto done;
+    }
+
+    if(strlen(p) > 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+        /* This will overflow to Inf if appropriate */
+        for(p += 2; p; p++) {
+            if('0' <= *p && *p <= '9') ans = 16*ans + (*p -'0');
+            else if('a' <= *p && *p <= 'f') ans = 16*ans + (*p -'a' + 10);
+            else if('A' <= *p && *p <= 'F') ans = 16*ans + (*p -'A' + 10);
+            else if(*p == dec) {exph = 0; continue;}
+            else break;
+            if (exph >= 0) exph += 4;
+        }
+#define strtod_EXACT_CLAUSE                                             \
+        if(exact && ans > 0x1.fffffffffffffp52) {                       \
+            if(exact == NA_LOGICAL)                                     \
+                warning(_(                                              \
+                "accuracy loss in conversion from \"%s\" to numeric"),  \
+                        str);                                           \
+            else {                                                      \
+                ans = NA_REAL;                                          \
+                p = str; /* back out */                                 \
+                goto done;                                              \
+            }                                                           \
+        }
+        strtod_EXACT_CLAUSE;
+        if (*p == 'p' || *p == 'P') {
+            int expsign = 1;
+            double p2 = 2.0;
+            switch(*++p) {
+            case '-': expsign = -1;
+            case '+': p++;
+            default: ;
+            }
+            /* The test for n is in response to PR#16358; it's not right if the exponent is
+               very large, but the overflow or underflow below will handle it. */
+#define MAX_EXPONENT_PREFIX 9999
+            for (n = 0; *p >= '0' && *p <= '9'; p++) n = (n < MAX_EXPONENT_PREFIX) ? n * 10 + (*p - '0') : n;
+            if (ans != 0.0) { /* PR#15976:  allow big exponents on 0 */
+                expn += expsign * n;
+                if(exph > 0) {
+                    if (expn - exph < -122) {   /* PR#17199:  fac may overflow below if expn - exph is too small.
+                                                   2^-122 is a bit bigger than 1E-37, so should be fine on all systems */
+                        for (n = exph, fac = 1.0; n; n >>= 1, p2 *= p2)
+                            if (n & 1) fac *= p2;
+                        ans /= fac;
+                        p2 = 2.0;
+                    } else
+                        expn -= exph;
+                }
+                if (expn < 0) {
+                    for (n = -expn, fac = 1.0; n; n >>= 1, p2 *= p2)
+                        if (n & 1) fac *= p2;
+                    ans /= fac;
+                } else {
+                    for (n = expn, fac = 1.0; n; n >>= 1, p2 *= p2)
+                        if (n & 1) fac *= p2;
+                    ans *= fac;
+                }
+            }
+        }
+        goto done;
+    }
+
+    for ( ; *p >= '0' && *p <= '9'; p++, ndigits++) ans = 10*ans + (*p - '0');
+    if (*p == dec)
+        for (p++; *p >= '0' && *p <= '9'; p++, ndigits++, expn--)
+            ans = 10*ans + (*p - '0');
+    if (ndigits == 0) {
+        ans = NA_REAL;
+        p = str; /* back out */
+        goto done;
+    }
+    strtod_EXACT_CLAUSE;
+
+    if (*p == 'e' || *p == 'E') {
+        int expsign = 1;
+        switch(*++p) {
+        case '-': expsign = -1;
+        case '+': p++;
+        default: ;
+        }
+        for (n = 0; *p >= '0' && *p <= '9'; p++) n = (n < MAX_EXPONENT_PREFIX) ? n * 10 + (*p - '0') : n;
+        expn += expsign * n;
+    }
+
+    /* avoid unnecessary underflow for large negative exponents */
+    if (expn + ndigits < -300) {
+        for (n = 0; n < ndigits; n++) ans /= 10.0;
+        expn += ndigits;
+    }
+    if (expn < -307) { /* use underflow, not overflow */
+        for (n = -expn, fac = 1.0; n; n >>= 1, p10 *= p10)
+            if (n & 1) fac /= p10;
+        ans *= fac;
+    } else if (expn < 0) { /* positive powers are exact */
+        for (n = -expn, fac = 1.0; n; n >>= 1, p10 *= p10)
+            if (n & 1) fac *= p10;
+        ans /= fac;
+    } else if (ans != 0.0) { /* PR#15976:  allow big exponents on 0, e.g. 0E4933 */
+        for (n = expn, fac = 1.0; n; n >>= 1, p10 *= p10)
+            if (n & 1) fac *= p10;
+        ans *= fac;
+    }
+
+    /* explicit overflow to infinity */
+    if (ans > DBL_MAX) {
+        if (endptr) *endptr = (char *) p;
+        return (sign > 0) ? R_PosInf : R_NegInf;
+    }
+
+done:
+    if (endptr) *endptr = (char *) p;
+    return sign * (double) ans;
+}
+
+
+double R_strtod4(const char *str, char **endptr, char dec, Rboolean NA)
+{
+    return R_strtod5(str, endptr, dec, NA, FALSE);
+}
+
+double R_strtod(const char *str, char **endptr)
+{
+    return R_strtod5(str, endptr, '.', FALSE, FALSE);
+}
+
+double R_atof(const char *str)
+{
+    return R_strtod5(str, NULL, '.', FALSE, FALSE);
+}
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h
index 699f70c482838c5ddf4dff0a758f6da1a45add1c..cc43c6ff9c3a6be99e9ca259d73771dfd4ee38fc 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h
@@ -663,14 +663,16 @@ SEXP PRINTNAME(SEXP e) {
 
 SEXP CAAR(SEXP e) {
     TRACE0();
-    unimplemented("CAAR");
-    return NULL;
+    SEXP result = ((call_CAAR) callbacks[CAAR_x])(e);
+    checkExitCall();
+    return result;
 }
 
 SEXP CDAR(SEXP e) {
     TRACE0();
-    unimplemented("CDAR");
-    return NULL;
+    SEXP result = ((call_CDAR) callbacks[CDAR_x])(e);
+    checkExitCall();
+    return result;
 }
 
 SEXP CADR(SEXP e) {
@@ -689,8 +691,9 @@ SEXP CDDR(SEXP e) {
 
 SEXP CDDDR(SEXP e) {
     TRACE0();
-    unimplemented("CDDDR");
-    return NULL;
+    SEXP result = ((call_CDDDR) callbacks[CDDDR_x])(e);
+    checkExitCall();
+    return result;
 }
 
 SEXP CADDR(SEXP e) {
@@ -702,14 +705,16 @@ SEXP CADDR(SEXP e) {
 
 SEXP CADDDR(SEXP e) {
     TRACE0();
-    unimplemented("CADDDR");
-    return NULL;
+    SEXP result = ((call_CADDDR) callbacks[CADDDR_x])(e);
+    checkExitCall();
+    return result;
 }
 
 SEXP CAD4R(SEXP e) {
     TRACE0();
-    unimplemented("CAD4R");
-    return NULL;
+    SEXP result = ((call_CAD4R) callbacks[CAD4R_x])(e);
+    checkExitCall();
+    return result;
 }
 
 int MISSING(SEXP x) {
@@ -1364,7 +1369,7 @@ SEXP R_tryEvalSilent(SEXP x, SEXP y, int *ErrorOccurred) {
     TRACE0();
     return R_tryEvalInternal(x, y, ErrorOccurred, 1);
 }
-
+/*
 double R_atof(const char *str) {
     TRACE0();
     unimplemented("R_atof");
@@ -1375,7 +1380,7 @@ double R_strtod(const char *c, char **end) {
     TRACE0();
     unimplemented("R_strtod");
     return 0;
-}
+}*/
 
 SEXP R_PromiseExpr(SEXP x) {
     TRACE0();
@@ -1509,7 +1514,7 @@ SEXP R_do_slot_assign(SEXP obj, SEXP name, SEXP value) {
 
 int R_has_slot(SEXP obj, SEXP name) {
     TRACE(TARGpp, obj, name);
-    SEXP result = ((call_R_has_slot) callbacks[R_has_slot_x])(obj, name);
+    int result = ((call_R_has_slot) callbacks[R_has_slot_x])(obj, name);
     checkExitCall();
     return result;
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java
index 015ffea85340b0fbdc899feed463a5a35a43a9dd..acb1b4cd0453de8efff4bf35ef022c694c8327e4 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java
@@ -48,7 +48,7 @@ public abstract class Capabilities extends RBuiltinNode.Arg0 {
         libxml(false, null),
         fifo(true, null),
         cledit(false, null),
-        iconv(false, null),
+        iconv(true, null),
         nls(false, "NLS"),
         profmem(false, null),
         cairo(false, null),
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java
index 56bb231456813d173e3755fea8891b5c7a0fdef0..769b288779887581dabdaab4d381bac80220b5c9 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java
@@ -189,7 +189,7 @@ public class DatePOSIXFunctions {
         protected RList asPOSIXlt(RAbstractDoubleVector x, String tz) {
             TimeZone zone;
             if (tz.isEmpty()) {
-                zone = RContext.getInstance().getSystemTimeZone();
+                zone = RContext.getInstance().stateREnvVars.getSystemTimeZone();
             } else {
                 zone = TimeZone.getTimeZone(tz);
             }
@@ -235,7 +235,7 @@ public class DatePOSIXFunctions {
             RAbstractVector yearVector = (RAbstractVector) RRuntime.convertScalarVectors(x.getDataAt(5));
             TimeZone zone;
             if (tz.isEmpty()) {
-                zone = RContext.getInstance().getSystemTimeZone();
+                zone = RContext.getInstance().stateREnvVars.getSystemTimeZone();
             } else {
                 zone = TimeZone.getTimeZone(tz);
             }
@@ -360,7 +360,7 @@ public class DatePOSIXFunctions {
                     builder.appendLiteral(' ').appendZoneText(TextStyle.SHORT);
                 }
             } else {
-                zone = RContext.getInstance().getSystemTimeZone().toZoneId();
+                zone = RContext.getInstance().stateREnvVars.getSystemTimeZone().toZoneId();
             }
 
             DateTimeFormatter[] formatters = new DateTimeFormatter[builders.length];
@@ -406,7 +406,7 @@ public class DatePOSIXFunctions {
             TimeZone zone;
             String zoneString = RRuntime.asString(tz);
             if (zoneString.isEmpty()) {
-                zone = RContext.getInstance().getSystemTimeZone();
+                zone = RContext.getInstance().stateREnvVars.getSystemTimeZone();
             } else {
                 zone = TimeZone.getTimeZone(zoneString);
             }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
index 5fc572acadb1e05df9c53596b9fba59c653ca5d4..3feb26bd40ed44046a9738be0352a6de7c17342e 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java
@@ -25,15 +25,14 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.BranchProfile;
+import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.nodes.attributes.UnaryCopyAttributesNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
-import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RStringVector;
-import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 
@@ -63,286 +62,165 @@ public abstract class EncodeString extends RBuiltinNode.Arg5 {
         casts.arg("na.encode").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).mustBe(notLogicalNA()).map(toBoolean());
     }
 
-    private int computeWidth(RAbstractStringVector x, int width, final String quote) {
-        if (!RRuntime.isNA(width)) {
-            return width == 0 ? 1 : width;
+    private static StringBuilder append(String source, int offset, StringBuilder str, String snippet) {
+        if (str == null) {
+            StringBuilder newStr = new StringBuilder(source.length() + 2);
+            newStr.append(source, 0, offset);
+            return newStr.append(snippet);
         }
-        int maxElWidth = -1;
-        na.enable(x);
-        // Find the element in x with the largest width.
-        for (int i = 0; i < x.getLength(); i++) {
-            if (!na.check(x.getDataAt(i))) {
-                int curLen = x.getDataAt(i).length();
-                if (maxElWidth < curLen) {
-                    maxElWidth = curLen;
-                }
-            }
-        }
-        maxElWidth += quote.length() > 0 ? 2 : 0; // Accounting for the quote.
-        if (!RRuntime.isNA(width) && width > maxElWidth) {
-            maxElWidth = width;
-        }
-        return maxElWidth;
+        return str.append(snippet);
     }
 
     @TruffleBoundary
-    private static String concat(Object... args) {
-        StringBuilder sb = new StringBuilder();
-        for (Object arg : args) {
-            sb.append(arg);
-        }
-        return sb.toString();
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"leftJustify(justify)", "encodeNA"})
-    protected RStringVector encodeStringLeftJustifyEncodeNA(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final int maxElWidth = computeWidth(x, width, quoteEl);
-        final String[] result = new String[x.getLength()];
-        na.enable(x);
-        for (int i = 0; i < x.getLength(); i++) {
-            String currentEl = x.getDataAt(i);
-            if (na.check(currentEl)) {
-                everSeenNA.enter();
-                if (quoteEl.isEmpty()) {
-                    currentEl = concat("<", currentEl, ">");
-                }
-                result[i] = Utils.stringFormat(concat("%-", maxElWidth, "s"), currentEl);
-            } else {
-                result[i] = Utils.stringFormat(concat("%-", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
+    private static String encodeString(String value, char quote) {
+        StringBuilder str = null;
+        int offset = 0;
+        while (offset < value.length()) {
+            int codepoint = value.codePointAt(offset);
+            switch (codepoint) {
+                case '\n':
+                    str = append(value, offset, str, "\\n");
+                    break;
+                case '\r':
+                    str = append(value, offset, str, "\\r");
+                    break;
+                case '\t':
+                    str = append(value, offset, str, "\\t");
+                    break;
+                case '\b':
+                    str = append(value, offset, str, "\\b");
+                    break;
+                case 7:
+                    str = append(value, offset, str, "\\a");
+                    break;
+                case '\f':
+                    str = append(value, offset, str, "\\f");
+                    break;
+                case 11:
+                    str = append(value, offset, str, "\\v");
+                    break;
+                case '\\':
+                    str = append(value, offset, str, "\\\\");
+                    break;
+                case '"':
+                    if (quote == '"') {
+                        str = append(value, offset, str, "\\\"");
+                    } else {
+                        if (str != null) {
+                            str.appendCodePoint(codepoint);
+                        }
+                    }
+                    break;
+                case '\'':
+                    if (quote == '\'') {
+                        str = append(value, offset, str, "\\'");
+                    } else {
+                        if (str != null) {
+                            str.appendCodePoint(codepoint);
+                        }
+                    }
+                    break;
+                default:
+                    if (codepoint < 32 || codepoint == 0x7f) {
+                        str.append("\\").append(codepoint >>> 6).append((codepoint >>> 3) & 0x7).append(codepoint & 0x7);
+                    } else if (codepoint > 64967) { // determined by experimentation
+                        if (codepoint < 0x10000) {
+                            str.append("\\u").append(String.format("%04x", codepoint));
+                        } else {
+                            str.append("\\U").append(String.format("%08x", codepoint));
+                        }
+                    } else {
+                        if (str != null) {
+                            str.appendCodePoint(codepoint);
+                        }
+                    }
+                    break;
             }
+            offset += Character.charCount(codepoint);
         }
-        RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
+        return str == null ? value : str.toString();
     }
 
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"leftJustify(justify)", "!encodeNA"})
-    protected RStringVector encodeStringLeftJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final int maxElWidth = computeWidth(x, width, quoteEl);
-        final String[] result = new String[x.getLength()];
-        na.enable(x);
-        boolean seenNA = false;
-        for (int i = 0; i < x.getLength(); i++) {
-            final String currentEl = x.getDataAt(i);
-            if (na.check(currentEl)) {
-                everSeenNA.enter();
-                result[i] = currentEl;
-                seenNA = true;
+    @TruffleBoundary
+    private static String justifyAndQuote(int width, int justify, int quoteLength, char quoteChar, String currentEl) {
+        String res;
+        if (currentEl.length() + quoteLength >= width || justify == JUSTIFY.NONE.ordinal()) {
+            if (quoteLength == 0) {
+                res = currentEl;
             } else {
-                result[i] = Utils.stringFormat(concat("%-", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
+                res = new StringBuilder(currentEl.length() + quoteLength).append(quoteChar).append(currentEl).append(quoteChar).toString();
             }
-        }
-        RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"rightJustify(justify)", "encodeNA"})
-    protected RStringVector encodeStringRightJustifyEncodeNA(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final int maxElWidth = computeWidth(x, width, quoteEl);
-        final String[] result = new String[x.getLength()];
-        na.enable(x);
-        for (int i = 0; i < x.getLength(); i++) {
-            String currentEl = x.getDataAt(i);
-            if (na.check(currentEl)) {
-                everSeenNA.enter();
-                if (quoteEl.isEmpty()) {
-                    currentEl = concat("<", currentEl, ">");
-                }
-                result[i] = Utils.stringFormat(concat("%", maxElWidth, "s"), currentEl);
-            } else {
-                result[i] = Utils.stringFormat(concat("%", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
+        } else {
+            StringBuilder str = new StringBuilder(width);
+            int remainder = width - currentEl.length() - quoteLength;
+            int before = justify == JUSTIFY.RIGHT.ordinal() ? remainder : justify == JUSTIFY.CENTER.ordinal() ? remainder / 2 : 0;
+            int whitespaces = 0;
+            for (; whitespaces < before; whitespaces++) {
+                str.append(' ');
             }
-        }
-        RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"rightJustify(justify)", "!encodeNA"})
-    protected RStringVector encodeStringRightJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final int maxElWidth = computeWidth(x, width, quoteEl);
-        final String[] result = new String[x.getLength()];
-        na.enable(x);
-        boolean seenNA = false;
-        for (int i = 0; i < x.getLength(); i++) {
-            final String currentEl = x.getDataAt(i);
-            if (na.check(currentEl)) {
-                everSeenNA.enter();
-                result[i] = currentEl;
-                seenNA = true;
-            } else {
-                result[i] = Utils.stringFormat(concat("%", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl));
+            if (quoteLength > 0) {
+                str.append(quoteChar);
             }
-        }
-        RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"centerJustify(justify)", "encodeNA"})
-    protected RStringVector encodeStringCenterJustifyEncodeNA(RAbstractStringVector x, int width, String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final int maxElWidth = computeWidth(x, width, quoteEl);
-        final String[] result = new String[x.getLength()];
-        final int quoteLength = quoteEl.length() > 0 ? 2 : 0;
-        final int padding = maxElWidth - quoteLength;
-
-        na.enable(x);
-        for (int i = 0; i < x.getLength(); i++) {
-            final String currentEl = x.getDataAt(i);
-            int totalPadding = padding - currentEl.length();
-            if (na.check(currentEl)) {
-                everSeenNA.enter();
-                if (quoteEl.isEmpty()) {
-                    // Accounting for <> in <NA>
-                    totalPadding -= 2;
-                } else {
-                    totalPadding += quoteLength;
-                }
+            str.append(currentEl);
+            if (quoteLength > 0) {
+                str.append(quoteChar);
+            }
+            for (; whitespaces < remainder; whitespaces++) {
+                str.append(' ');
             }
-            final int leftPadding = totalPadding >> 1;
-            final int rightPadding = totalPadding - leftPadding;
-            result[i] = addPadding(currentEl, leftPadding, rightPadding, quoteEl);
+            res = str.toString();
         }
-        RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
+        return res;
     }
 
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"centerJustify(justify)", "!encodeNA"})
-    protected RStringVector encodeStringCenterJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final int maxElWidth = computeWidth(x, width, quoteEl);
-        final String[] result = new String[x.getLength()];
-        final int quoteLength = quoteEl.length() > 0 ? 2 : 0;
-        final int padding = maxElWidth - quoteLength;
+    @Specialization
+    protected RStringVector encodeStringLeftJustifyEncodeNA(RAbstractStringVector x, int width, final String quoteEl, int justify, boolean encodeNA,
+                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode,
+                    @Cached("createBinaryProfile()") ConditionProfile widthNAProfile,
+                    @Cached("createBinaryProfile()") ConditionProfile encodeNAProfile) {
+        int quoteLength = quoteEl.isEmpty() ? 0 : 2; // only the first char of quoteEl is used
+        char quoteChar = quoteEl.isEmpty() ? 0 : quoteEl.charAt(0);
+        String[] result = new String[x.getLength()];
         na.enable(x);
-        boolean seenNA = false;
         for (int i = 0; i < x.getLength(); i++) {
-            final String currentEl = x.getDataAt(i);
+            String currentEl = x.getDataAt(i);
             if (na.check(currentEl)) {
-                everSeenNA.enter();
-                result[i] = currentEl;
-                seenNA = true;
+                result[i] = RRuntime.STRING_NA;
             } else {
-                final int totalPadding = padding - currentEl.length();
-                final int leftPadding = totalPadding >> 1;
-                final int rightPadding = totalPadding - leftPadding;
-                result[i] = addPaddingIgnoreNA(currentEl, leftPadding, rightPadding, quoteEl);
+                result[i] = encodeString(currentEl, quoteChar);
             }
         }
-        RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
-    }
-
-    @TruffleBoundary
-    private static String addPaddingIgnoreNA(final String el, final int leftPadding, final int rightPadding, final String quoteEl) {
-        final StringBuilder sb = new StringBuilder();
-        for (int j = 0; j < leftPadding; j++) {
-            sb.append(" ");
-        }
-        sb.append(quoteEl);
-        sb.append(el);
-        sb.append(quoteEl);
-        for (int j = 0; j < rightPadding; j++) {
-            sb.append(" ");
-        }
-        return sb.toString();
-    }
-
-    @TruffleBoundary
-    private String addPadding(final String el, final int leftPadding, final int rightPadding, final String quoteEl) {
-        final StringBuilder sb = new StringBuilder();
-        for (int j = 0; j < leftPadding; j++) {
-            sb.append(" ");
-        }
-        if (RRuntime.isNA(el)) {
-            everSeenNA.enter();
-            if (quoteEl.isEmpty()) {
-                sb.append("<");
-                sb.append(el);
-                sb.append(">");
-            } else {
-                sb.append(el);
+        int maxWidth;
+        if (widthNAProfile.profile(RRuntime.isNA(width))) {
+            maxWidth = 0;
+            for (int i = 0; i < x.getLength(); i++) {
+                int w;
+                if (na.check(result[i])) {
+                    w = encodeNA ? 2 + quoteLength : 0;
+                } else {
+                    w = result[i].length() + quoteLength;
+                }
+                maxWidth = Math.max(maxWidth, w);
             }
         } else {
-            sb.append(quoteEl);
-            sb.append(el);
-            sb.append(quoteEl);
-        }
-        for (int j = 0; j < rightPadding; j++) {
-            sb.append(" ");
+            maxWidth = width;
         }
-        return sb.toString();
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"noJustify(width, justify)", "encodeNA"})
-    protected RStringVector encodeStringNoJustifyEncodeNA(RAbstractStringVector x, int width, String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final String[] result = new String[x.getLength()];
-        na.enable(x);
+        boolean complete = true;
         for (int i = 0; i < x.getLength(); i++) {
-            final String currentEl = x.getDataAt(i);
+            String currentEl = result[i];
             if (na.check(currentEl)) {
-                everSeenNA.enter();
-                result[i] = new String(currentEl);
-            } else {
-                result[i] = concat(quoteEl, currentEl, quoteEl);
-            }
-        }
-        RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR);
-        copyAttributesNode.execute(resultVector, x);
-        return resultVector;
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"noJustify(width, justify)", "!encodeNA"})
-    protected RStringVector encodeStringNoJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
-        final String[] result = new String[x.getLength()];
-        na.enable(x);
-        boolean seenNA = false;
-        for (int i = 0; i < x.getLength(); i++) {
-            final String currentEl = x.getDataAt(i);
-            if (na.check(currentEl)) {
-                everSeenNA.enter();
-                result[i] = currentEl;
-                seenNA = true;
+                if (encodeNAProfile.profile(encodeNA)) {
+                    result[i] = justifyAndQuote(maxWidth, justify, 0, (char) 0, quoteLength == 0 ? "<NA>" : "NA");
+                } else {
+                    result[i] = RRuntime.STRING_NA;
+                    complete = false;
+                }
             } else {
-                result[i] = concat(quoteEl, currentEl, quoteEl);
+                result[i] = justifyAndQuote(maxWidth, justify, quoteLength, quoteChar, currentEl);
             }
         }
-        RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA);
+        RStringVector resultVector = RDataFactory.createStringVector(result, complete);
         copyAttributesNode.execute(resultVector, x);
         return resultVector;
     }
-
-    protected boolean leftJustify(RAbstractIntVector justify) {
-        return justify.getDataAt(0) == JUSTIFY.LEFT.ordinal();
-    }
-
-    protected boolean rightJustify(RAbstractIntVector justify) {
-        return justify.getDataAt(0) == JUSTIFY.RIGHT.ordinal();
-    }
-
-    protected boolean centerJustify(RAbstractIntVector justify) {
-        return justify.getDataAt(0) == JUSTIFY.CENTER.ordinal();
-    }
-
-    protected boolean noJustify(int width, RAbstractIntVector justify) {
-        return justify.getDataAt(0) == JUSTIFY.NONE.ordinal() || width == 0;
-    }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java
index 6e245e1ed74d87338ed744ce95b59203b8df644d..231aa74701b50991da830aba1d1a51840074e147 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java
@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.builtin.base;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.nodes.ExplodeLoop;
 import com.oracle.truffle.api.profiles.ConditionProfile;
@@ -49,7 +50,7 @@ public abstract class Expression extends RBuiltinNode.Arg1 {
     }
 
     @Specialization
-    @ExplodeLoop
+    @TruffleBoundary
     protected Object doExpression(RArgsValuesAndNames args) {
         Object[] argValues = args.getArguments();
         Object[] data = new Object[argValues.length];
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java
index acd936402b30d172f5e88b5444ca3c2a99bc9dc4..ddddd0287c8f0a66953348b28210defd344e5bba 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java
@@ -913,10 +913,8 @@ public class FileFunctions {
                 if (copyMode || copyDate) {
                     copyOptions = new CopyOption[overwrite ? 2 : 1];
                     copyOptions[overwrite ? 1 : 0] = StandardCopyOption.COPY_ATTRIBUTES;
-                } else if (overwrite) {
-                    copyOptions = new CopyOption[1];
                 } else {
-                    copyOptions = new CopyOption[0];
+                    copyOptions = new CopyOption[overwrite ? 1 : 0];
                 }
                 if (overwrite) {
                     copyOptions[0] = StandardCopyOption.REPLACE_EXISTING;
@@ -938,20 +936,20 @@ public class FileFunctions {
 
                 for (int i = 0; i < lenFrom; i++) {
                     String from = vecFrom.getDataAt(i % lenFrom);
-                    String to = vecTo.getDataAt(i % lenTo);
-                    Path fromPathKeepRel = fileSystem.getPath(Utils.tildeExpand(from, true));
-                    if (toDir != null && !fromPathKeepRel.isAbsolute()) {
-                        to = toDir.resolve(fromPathKeepRel.getFileName()).toString();
-                    }
                     Path fromPath = fileSystem.getPath(Utils.tildeExpand(from));
+                    String to = vecTo.getDataAt(i % lenTo);
                     Path toPath = fileSystem.getPath(Utils.tildeExpand(to));
-                    status[i] = RRuntime.LOGICAL_TRUE;
+                    assert !recursive || toDir != null;
+                    status[i] = RRuntime.LOGICAL_FALSE;
                     try {
-                        if (recursive && Files.isDirectory(fromPath)) {
-                            // to is just one dir (checked above)
-                            boolean copyError = copyDir(fromPath, toPath, copyOptions);
-                            if (copyError) {
-                                status[i] = RRuntime.LOGICAL_FALSE;
+                        if (toDir != null) {
+                            toPath = toDir.resolve(fromPath.getFileName());
+                        }
+                        if (Files.isDirectory(fromPath)) {
+                            if (recursive) {
+                                assert toDir != null;
+                                // to is just one dir (checked above)
+                                status[i] = RRuntime.asLogical(copyDir(fromPath, toPath, copyOptions));
                             }
                         } else {
                             // copy to existing files is skipped unless overWrite
@@ -960,15 +958,11 @@ public class FileFunctions {
                                  * toB Be careful if toPath is a directory, if empty Java will
                                  * replace it with a plain file, otherwise the copy will fail
                                  */
-                                if (Files.isDirectory(toPath)) {
-                                    Path fromFileNamePath = fromPath.getFileName();
-                                    toPath = toPath.resolve(fromFileNamePath);
-                                }
                                 Files.copy(fromPath, toPath, copyOptions);
+                                status[i] = RRuntime.LOGICAL_TRUE;
                             }
                         }
                     } catch (UnsupportedOperationException | IOException ex) {
-                        status[i] = RRuntime.LOGICAL_FALSE;
                         warning(RError.Message.FILE_CANNOT_COPY, from, to, ex.getMessage());
                     }
                 }
@@ -1014,7 +1008,7 @@ public class FileFunctions {
         private boolean copyDir(Path fromDir, Path toDir, CopyOption[] copyOptions) throws IOException {
             DirCopy dirCopy = new DirCopy(fromDir, toDir, copyOptions);
             Files.walkFileTree(fromDir, dirCopy);
-            return dirCopy.error;
+            return !dirCopy.error;
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java
index c4a74c677561cd9277671d5b3fb91cd98eeb0034..35a9acd0cb58ae18dfc044b702b0fc6a2980f163 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java
@@ -22,19 +22,34 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
-import com.oracle.truffle.api.dsl.Cached;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.size;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
+import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.nodes.attributes.UnaryCopyAttributesNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.RError.Message;
+import com.oracle.truffle.r.runtime.RInternalError;
+import com.oracle.truffle.r.runtime.RLocale;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
+import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
@@ -46,25 +61,91 @@ public abstract class IConv extends RBuiltinNode.Arg6 {
         Casts casts = new Casts(IConv.class);
         casts.arg("x").mustBe(stringValue(), RError.Message.NOT_CHARACTER_VECTOR, "x");
         // with default error message, NO_CALLER does not work
-        casts.arg("from").defaultError(RError.Message.INVALID_ARGUMENT, "from").mustBe(stringValue()).asStringVector().mustBe(size(1));
-        casts.arg("to").defaultError(RError.Message.INVALID_ARGUMENT, "to").mustBe(stringValue()).asStringVector().mustBe(size(1));
-        casts.arg("sub").defaultError(RError.Message.INVALID_ARGUMENT, "sub").mustBe(stringValue()).asStringVector().mustBe(size(1));
-        casts.arg("mark").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE);
-        casts.arg("toRaw").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE);
+        casts.arg("from").defaultError(RError.Message.INVALID_ARGUMENT, "from").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst();
+        casts.arg("to").defaultError(RError.Message.INVALID_ARGUMENT, "to").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst();
+        casts.arg("sub").defaultError(RError.Message.INVALID_ARGUMENT, "sub").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst();
+        casts.arg("mark").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).map(toBoolean());
+        casts.arg("toRaw").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).map(toBoolean());
 
     }
 
-    @SuppressWarnings("unused")
     @Specialization
-    protected RStringVector doIConv(RAbstractStringVector x, Object from, Object to, Object sub, byte mark, byte toRaw,
-                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode,
-                    @Cached("createBinaryProfile()") ConditionProfile xLengthProfile) {
-        // TODO implement
-        RStringVector xv = x.materialize();
-        RStringVector result = RDataFactory.createStringVector(xv.getDataCopy(), RDataFactory.COMPLETE_VECTOR);
-        if (xLengthProfile.profile(result.getLength() == x.getLength())) {
+    @TruffleBoundary
+    protected RAbstractStringVector doIConv(RAbstractStringVector x, String from, String to, String sub, @SuppressWarnings("unused") boolean mark, boolean toRaw,
+                    @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) {
+
+        if (toRaw) {
+            throw RInternalError.unimplemented("iconv with toRaw=TRUE");
+        }
+
+        Charset fromCharset = getCharset(from, from, to);
+        Charset toCharset = getCharset(to, from, to);
+        boolean complete = x.isComplete();
+        if ((fromCharset == StandardCharsets.UTF_8 || fromCharset == StandardCharsets.UTF_16) && (toCharset == StandardCharsets.UTF_8 || toCharset == StandardCharsets.UTF_16)) {
+            // this conversion cannot change anything
+            return x;
+        } else {
+            // simulate the results of charset conversion
+            CharsetEncoder encoder = fromCharset.newEncoder();
+            CharsetDecoder decoder = toCharset.newDecoder();
+            if (RRuntime.isNA(sub)) {
+                encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
+                encoder.onMalformedInput(CodingErrorAction.REPORT);
+                decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
+                decoder.onMalformedInput(CodingErrorAction.REPORT);
+            } else if ("byte".equals(sub)) {
+                // TODO: special mode that inserts <hexcode>
+                encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+                encoder.onMalformedInput(CodingErrorAction.IGNORE);
+                decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+                decoder.onMalformedInput(CodingErrorAction.IGNORE);
+            } else if (sub.isEmpty()) {
+                encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+                encoder.onMalformedInput(CodingErrorAction.IGNORE);
+                decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+                decoder.onMalformedInput(CodingErrorAction.IGNORE);
+            } else {
+                // ignore encoding errors
+                encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+                encoder.onMalformedInput(CodingErrorAction.IGNORE);
+                // TODO: support more than one character in "replacement"
+                decoder.replaceWith(sub.substring(0, 1));
+                decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
+                decoder.onMalformedInput(CodingErrorAction.REPLACE);
+            }
+            int length = x.getLength();
+            String[] data = new String[length];
+            for (int i = 0; i < length; i++) {
+                String value = x.getDataAt(i);
+                if (!RRuntime.isNA(value)) {
+                    try {
+                        data[i] = decoder.decode(encoder.encode(CharBuffer.wrap(value))).toString();
+                    } catch (CharacterCodingException e) {
+                        complete = false;
+                        data[i] = RRuntime.STRING_NA;
+                    }
+                }
+            }
+            RStringVector result = RDataFactory.createStringVector(data, complete);
             copyAttributesNode.execute(result, x);
+            return result;
+        }
+    }
+
+    private Charset getCharset(String name, String from, String to) {
+        if (name.isEmpty()) {
+            return RContext.getInstance().stateRLocale.getCharset(RLocale.CTYPE);
+        }
+        Charset toCharset;
+        if ("C".equals(name)) {
+            toCharset = StandardCharsets.US_ASCII;
+        } else {
+            try {
+                toCharset = Charset.forName(name);
+            } catch (IllegalCharsetNameException | UnsupportedCharsetException e) {
+                throw error(Message.UNSUPPORTED_ENCODING_CONVERSION, from, to);
+            }
         }
-        return result;
+        return toCharset;
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java
index ddbc3242d79084bada22a91dce8a1d158374d687..bdc76843617b57f13b7ea6f01304146fd9aa22a3 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java
@@ -33,7 +33,6 @@ import static com.oracle.truffle.r.runtime.builtins.RBehavior.READS_STATE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
-import java.nio.charset.Charset;
 import java.util.Locale;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -41,6 +40,7 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.r.nodes.builtin.NodeWithArgumentCasts.Casts;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
+import com.oracle.truffle.r.runtime.RLocale;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.context.RContext;
@@ -52,45 +52,9 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 
 public class LocaleFunctions {
 
-    enum LC {
-        COLLATE(stdDefault()),
-        CTYPE(stdDefault()),
-        MONETARY(stdDefault()),
-        NUMERIC("C"),
-        TIME(stdDefault()),
-        MESSAGES(stdDefault()),
-        PAPER(""),
-        MEASUREMENT("");
-
-        private String value;
-        private String defaultValue;
-
-        LC(String defaultValue) {
-            this.defaultValue = defaultValue;
-        }
-
-        static String stdDefault() {
-            String defLocale = Locale.getDefault().toString() + "_";
-            String defCharSet = Charset.defaultCharset().name();
-            return defLocale + defCharSet;
-        }
-
-        private String getLCEnvVar() {
-            if (value != null) {
-                return value;
-            }
-            String val = RContext.getInstance().stateREnvVars.get("LC_" + name());
-            if (val == null) {
-                return defaultValue;
-            } else {
-                return val;
-            }
-        }
-
-        private static int getLCCategory(int category) {
-            return category - 2;
-        }
-    }
+    private static final int LC_ALL = 1;
+    private static final int MAPPING_START = 2;
+    private static final RLocale[] MAPPING = new RLocale[]{RLocale.COLLATE, RLocale.CTYPE, RLocale.MONETARY, RLocale.NUMERIC, RLocale.TIME, RLocale.MESSAGES, RLocale.PAPER, RLocale.MEASUREMENT};
 
     @RBuiltin(name = "Sys.getlocale", kind = INTERNAL, parameterNames = {"category"}, behavior = READS_STATE)
     public abstract static class GetLocale extends RBuiltinNode.Arg1 {
@@ -100,33 +64,34 @@ public class LocaleFunctions {
             CastsHelper.category(casts);
         }
 
-        private static final int[] ALL_CATEGORIES = new int[]{3, 2, 4, 5, 6, 7, 8, 9};
-
         @Specialization
         @TruffleBoundary
-        protected Object getLocale(int category) {
-            return RDataFactory.createStringVector(getLocaleData(category));
-        }
-
-        protected String getLocaleData(int category) {
-            String data = "";
-            if (category == 1) {
-                // "LC_ALL"
+        protected static Object getLocale(int category) {
+            RContext context = RContext.getInstance();
+            if (category == LC_ALL) {
+                String singleRep = RLocale.COLLATE.getRepresentation(context);
+                for (RLocale locale : RLocale.values()) {
+                    if (locale.isListed() && !locale.getRepresentation(context).equals(singleRep)) {
+                        singleRep = null;
+                        break;
+                    }
+                }
+                if (singleRep != null) {
+                    return singleRep;
+                }
                 StringBuilder sb = new StringBuilder();
-                for (int i = 0; i < ALL_CATEGORIES.length; i++) {
-                    String d = getLocaleData(ALL_CATEGORIES[i]);
-                    if (d.length() > 0) {
-                        sb.append(d);
-                        if (i != ALL_CATEGORIES.length - 1) {
+                for (RLocale locale : RLocale.values()) {
+                    if (locale.isListed()) {
+                        if (sb.length() > 0) {
                             sb.append('/');
                         }
+                        sb.append(locale.getRepresentation(context));
                     }
                 }
-                data = sb.toString();
+                return sb.toString();
             } else {
-                data = LC.values()[LC.getLCCategory(category)].getLCEnvVar();
+                return MAPPING[category - MAPPING_START].getRepresentation(context);
             }
-            return data;
         }
     }
 
@@ -139,11 +104,20 @@ public class LocaleFunctions {
             casts.arg("locale").mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst();
         }
 
+        private static final RLocale[] SET_ALL = new RLocale[]{RLocale.COLLATE, RLocale.CTYPE, RLocale.MONETARY, RLocale.TIME};
+
         @Specialization
         @TruffleBoundary
-        protected Object setLocale(int category, String locale) {
-            LC.values()[LC.getLCCategory(category)].value = locale;
-            return locale;
+        protected Object setLocale(int category, String value) {
+            RContext context = RContext.getInstance();
+            if (category == LC_ALL) {
+                for (RLocale locale : SET_ALL) {
+                    context.stateRLocale.setLocale(locale, value);
+                }
+            } else {
+                context.stateRLocale.setLocale(MAPPING[category - MAPPING_START], value);
+            }
+            return GetLocale.getLocale(category);
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java
index a82f8b5c896ed67db5cfd5801c7bf9475c6db031..ac41e8e5355ab9c72624c983bcef21c60928aa89 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java
@@ -18,9 +18,11 @@ import static com.oracle.truffle.r.runtime.RError.Message.INVALID_LOGICAL;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
+import java.text.CollationKey;
 import java.text.Collator;
 import java.text.ParseException;
 import java.text.RuleBasedCollator;
+import java.util.Locale;
 
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -39,9 +41,11 @@ import com.oracle.truffle.r.nodes.unary.CastToVectorNode;
 import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
+import com.oracle.truffle.r.runtime.RLocale;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 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.RComplex;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
@@ -76,17 +80,13 @@ public abstract class Order extends RPrecedenceBuiltinNode {
 
     private static final int[] SINCS = {1073790977, 268460033, 67121153, 16783361, 4197377, 1050113, 262913, 65921, 16577, 4193, 1073, 281, 77, 23, 8, 1, 0};
 
-    private RIntVector executeOrderVector1(RAbstractVector v, byte naLast, boolean dec) {
-        return executeOrderVector1(v, naLast, dec, false);
-    }
-
-    private RIntVector executeOrderVector1(RAbstractVector vIn, byte naLast, boolean dec, boolean needsStringCollation) {
+    private RIntVector executeOrderVector1(RAbstractVector vIn, byte naLast, boolean dec) {
         RAbstractVector v = vectorProfile.profile(vIn);
         int n = v.getLength();
         reportWork(n);
 
         int[] indx = createIndexes(v, n, naLast);
-        initOrderVector1(needsStringCollation).execute(indx, v, naLast, dec, null);
+        initOrderVector1().execute(indx, v, naLast, dec, true);
         for (int i = 0; i < indx.length; i++) {
             indx[i] = indx[i] + 1;
         }
@@ -134,10 +134,10 @@ public abstract class Order extends RPrecedenceBuiltinNode {
         return result;
     }
 
-    private OrderVector1Node initOrderVector1(boolean needsStringCollation) {
-        if (orderVector1Node == null || needsStringCollation && !orderVector1Node.needsStringCollation) {
+    private OrderVector1Node initOrderVector1() {
+        if (orderVector1Node == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            orderVector1Node = insert(OrderVector1NodeGen.create(needsStringCollation));
+            orderVector1Node = insert(OrderVector1NodeGen.create());
         }
         return orderVector1Node;
     }
@@ -198,35 +198,19 @@ public abstract class Order extends RPrecedenceBuiltinNode {
     }
 
     @Specialization(guards = {"oneVec(args)", "isFirstStringPrecedence(args)"})
-    Object orderString(byte naLast, boolean decreasing, RArgsValuesAndNames args,
-                    @Cached("create()") BranchProfile collationProfile) {
+    Object orderString(byte naLast, boolean decreasing, RArgsValuesAndNames args) {
         RAbstractStringVector v = (RAbstractStringVector) castVector(args.getArgument(0));
-        int n = v.getLength();
-        boolean needsCollation = false;
-        outer: for (int i = 0; i < n; i++) {
-            String str = v.getDataAt(i);
-            for (int i2 = 0; i2 < str.length(); i2++) {
-                char c = str.charAt(i2);
-                if (c > 127) {
-                    collationProfile.enter();
-                    needsCollation = true;
-                    break outer;
-                }
-            }
-        }
-
-        return executeOrderVector1(v, naLast, decreasing, needsCollation);
+        return executeOrderVector1(v, naLast, decreasing);
     }
 
-    @Specialization(guards = {"oneVec(args)", "isFirstComplexPrecedence( args)"})
+    @Specialization(guards = {"oneVec(args)", "isFirstComplexPrecedence(args)"})
     Object orderComplex(byte naLast, boolean decreasing, RArgsValuesAndNames args) {
         RAbstractComplexVector v = (RAbstractComplexVector) castVector(args.getArgument(0));
         return executeOrderVector1(v, naLast, decreasing);
     }
 
-    @SuppressWarnings("unused")
-    @Specialization(guards = {"oneVec(args)", "isFirstListPrecedence( args)"})
-    Object orderList(byte naLast, boolean decreasing, RArgsValuesAndNames args) {
+    @Specialization(guards = {"oneVec(args)", "isFirstListPrecedence(args)"})
+    Object orderList(@SuppressWarnings("unused") byte naLast, @SuppressWarnings("unused") boolean decreasing, RArgsValuesAndNames args) {
         /*
          * Lists are not actually supported by GnuR but there is a corner case of a length < 2 list
          * that produces a result in GnuR and there is a unit test for that (when called via
@@ -261,6 +245,9 @@ public abstract class Order extends RPrecedenceBuiltinNode {
         return n;
     }
 
+    /*
+     * TODO: multi-element order does not honor string collation.
+     */
     @Specialization(guards = {"!oneVec(args)", "!noVec(args)"})
     Object orderMulti(byte naLast, boolean decreasing, RArgsValuesAndNames args,
                     @Cached("createEqualityProfile()") ValueProfile lengthProfile) {
@@ -320,25 +307,20 @@ public abstract class Order extends RPrecedenceBuiltinNode {
      * Also used by {@link Rank}, where the "rho" parameter is not null. TODO handle S4 objects
      * (which involves rho)
      */
+
     abstract static class OrderVector1Node extends RBaseNode {
         private final ConditionProfile decProfile = ConditionProfile.createBinaryProfile();
 
-        private final boolean needsStringCollation;
-
-        protected OrderVector1Node(boolean needsStringCollation) {
-            this.needsStringCollation = needsStringCollation;
-        }
-
-        public abstract Object execute(int[] v, Object dv, byte naLast, boolean dec, Object rho);
+        public abstract Object execute(int[] v, Object dv, byte naLast, boolean dec, boolean sortNA);
 
         @Specialization
-        protected Object orderVector1(int[] indx, RAbstractIntVector dv, byte naLast, boolean decreasing, Object rho) {
+        protected Object orderVector1(int[] indx, RAbstractIntVector dv, byte naLast, boolean decreasing, boolean sortNA) {
             if (indx.length < 2) {
                 return indx;
             }
             int lo = 0;
             int hi = indx.length - 1;
-            if (rho == null) {
+            if (sortNA) {
                 int numNa = 0;
                 if (!dv.isComplete() && !RRuntime.isNA(naLast)) {
                     boolean[] isNa = new boolean[indx.length];
@@ -370,13 +352,13 @@ public abstract class Order extends RPrecedenceBuiltinNode {
         }
 
         @Specialization
-        protected Object orderVector1(int[] indx, RAbstractDoubleVector dv, byte naLast, boolean decreasing, Object rho) {
+        protected Object orderVector1(int[] indx, RAbstractDoubleVector dv, byte naLast, boolean decreasing, boolean sortNA) {
             if (indx.length < 2) {
                 return indx;
             }
             int lo = 0;
             int hi = indx.length - 1;
-            if (rho == null && !RRuntime.isNA(naLast)) {
+            if (sortNA && !RRuntime.isNA(naLast)) {
                 int numNa = 0;
                 boolean[] isNa = new boolean[indx.length];
                 for (int i = 0; i < isNa.length; i++) {
@@ -406,13 +388,13 @@ public abstract class Order extends RPrecedenceBuiltinNode {
         }
 
         @Specialization
-        protected Object orderVector1(int[] indx, RAbstractStringVector dv, byte naLast, boolean decreasing, Object rho) {
+        protected Object orderVector1(int[] indx, RAbstractStringVector dv, byte naLast, boolean decreasing, boolean sortNA) {
             if (indx.length < 2) {
                 return indx;
             }
             int lo = 0;
             int hi = indx.length - 1;
-            if (rho == null) {
+            if (sortNA) {
                 int numNa = 0;
                 if (!dv.isComplete() && !RRuntime.isNA(naLast)) {
                     boolean[] isNa = new boolean[indx.length];
@@ -444,13 +426,13 @@ public abstract class Order extends RPrecedenceBuiltinNode {
         }
 
         @Specialization
-        protected Object orderVector1(int[] indx, RAbstractComplexVector dv, byte naLast, boolean decreasing, Object rho) {
+        protected Object orderVector1(int[] indx, RAbstractComplexVector dv, byte naLast, boolean decreasing, boolean sortNA) {
             if (indx.length < 2) {
                 return indx;
             }
             int lo = 0;
             int hi = indx.length - 1;
-            if (rho == null) {
+            if (sortNA) {
                 int numNa = 0;
                 if (!dv.isComplete() && !RRuntime.isNA(naLast)) {
                     boolean[] isNa = new boolean[indx.length];
@@ -483,7 +465,7 @@ public abstract class Order extends RPrecedenceBuiltinNode {
 
         @SuppressWarnings("unused")
         @Specialization
-        protected Object orderVector1(int[] indx, RList dv, byte naLast, boolean decreasing, Object rho) {
+        protected Object orderVector1(int[] indx, RList dv, byte naLast, boolean decreasing, boolean sortNA) {
             /* Only needed to satisfy .Internal(rank) in unit test */
             return indx;
         }
@@ -544,61 +526,76 @@ public abstract class Order extends RPrecedenceBuiltinNode {
             }
         }
 
+        @TruffleBoundary
         private void sort(int[] indx, RAbstractStringVector dv, int lo, int hi, boolean dec) {
-            Collator collator = createCollator();
             int t = 0;
             for (; SINCS[t] > hi - lo + 1; t++) {
             }
-            for (int h = SINCS[t]; t < 16; h = SINCS[++t]) {
-                for (int i = lo + h; i <= hi; i++) {
-                    int itmp = indx[i];
-                    int j = i;
-                    while (j >= lo + h) {
-                        int a = indx[j - h];
-                        int b = itmp;
-                        int c = compareString(collator, dv.getDataAt(a), dv.getDataAt(b));
-                        if (decProfile.profile(dec)) {
-                            if (!(c < 0 || (c == 0 && a > b))) {
-                                break;
-                            }
-                        } else {
-                            if (!(c > 0 || (c == 0 && a > b))) {
-                                break;
+
+            Locale locale = RContext.getInstance().stateRLocale.getLocale(RLocale.COLLATE);
+            if (locale == Locale.ROOT) {
+                // simple comparison based on numeric value of characters
+                for (int h = SINCS[t]; t < 16; h = SINCS[++t]) {
+                    for (int i = lo + h; i <= hi; i++) {
+                        int itmp = indx[i];
+                        int j = i;
+                        while (j >= lo + h) {
+                            int a = indx[j - h];
+                            int b = itmp;
+                            int c = dv.getDataAt(a).compareTo(dv.getDataAt(b));
+                            if (decProfile.profile(dec)) {
+                                if (!(c < 0 || (c == 0 && a > b))) {
+                                    break;
+                                }
+                            } else {
+                                if (!(c > 0 || (c == 0 && a > b))) {
+                                    break;
+                                }
                             }
+                            indx[j] = indx[j - h];
+                            j -= h;
                         }
-                        indx[j] = indx[j - h];
-                        j -= h;
+                        indx[j] = itmp;
                     }
-                    indx[j] = itmp;
                 }
-            }
-        }
-
-        private int compareString(Collator collator, String dataAt, String dataAt2) {
-            if (needsStringCollation) {
-                return compare(collator, dataAt, dataAt2);
             } else {
-                return dataAt.compareToIgnoreCase(dataAt2);
-            }
-        }
-
-        @TruffleBoundary
-        private static int compare(Collator collator, String dataAt, String dataAt2) {
-            return collator.compare(dataAt, dataAt2);
-        }
+                int length = dv.getLength();
+                Collator baseCollator = Collator.getInstance(locale);
+                String rules = ((RuleBasedCollator) baseCollator).getRules();
+                Collator collator;
+                try {
+                    collator = new RuleBasedCollator(rules.replaceAll("<'\u005f'", "<' '<'\u005f'"));
+                } catch (ParseException e) {
+                    throw RInternalError.shouldNotReachHere(e);
+                }
+                CollationKey[] entries = new CollationKey[length];
+                for (int i = 0; i < length; i++) {
+                    entries[i] = collator.getCollationKey(dv.getDataAt(i));
+                }
 
-        @TruffleBoundary
-        private Collator createCollator() {
-            if (!needsStringCollation) {
-                return null;
-            }
-            // add rule for space before '_'
-            Collator collator = Collator.getInstance();
-            String rules = ((RuleBasedCollator) collator).getRules();
-            try {
-                return new RuleBasedCollator(rules.replaceAll("<'\u005f'", "<' '<'\u005f'"));
-            } catch (ParseException e) {
-                throw RInternalError.shouldNotReachHere(e);
+                for (int h = SINCS[t]; t < 16; h = SINCS[++t]) {
+                    for (int i = lo + h; i <= hi; i++) {
+                        int itmp = indx[i];
+                        int j = i;
+                        while (j >= lo + h) {
+                            int a = indx[j - h];
+                            int b = itmp;
+                            int c = entries[a].compareTo(entries[b]);
+                            if (decProfile.profile(dec)) {
+                                if (!(c < 0 || (c == 0 && a > b))) {
+                                    break;
+                                }
+                            } else {
+                                if (!(c > 0 || (c == 0 && a > b))) {
+                                    break;
+                                }
+                            }
+                            indx[j] = indx[j - h];
+                            j -= h;
+                        }
+                        indx[j] = itmp;
+                    }
+                }
             }
         }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java
index d9c48f7c886237a56d7b9b13298cbf3e4f14aa9a..15e8e71aa71ed38f06bcdfc9e3dc66a3d80f5bf1 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java
@@ -52,8 +52,6 @@ public abstract class Rank extends RBuiltinNode.Arg3 {
     @Child private Order.CmpNode orderCmpNode;
     private final BranchProfile errorProfile = BranchProfile.create();
 
-    private static final Object rho = new Object();
-
     private enum TiesKind {
         AVERAGE,
         MAX,
@@ -76,7 +74,7 @@ public abstract class Rank extends RBuiltinNode.Arg3 {
     private Order.OrderVector1Node initOrderVector1() {
         if (orderVector1Node == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            orderVector1Node = insert(OrderVector1NodeGen.create(false));
+            orderVector1Node = insert(OrderVector1NodeGen.create());
         }
         return orderVector1Node;
     }
@@ -112,7 +110,7 @@ public abstract class Rank extends RBuiltinNode.Arg3 {
             indx[i] = i;
         }
         RAbstractVector x = xa instanceof RAbstractLogicalVector ? xa.castSafe(RType.Integer, isNAProfile) : xa;
-        initOrderVector1().execute(indx, x, RRuntime.LOGICAL_TRUE, false, rho);
+        initOrderVector1().execute(indx, x, RRuntime.LOGICAL_TRUE, false, false);
         initOrderCmp();
         int j;
         for (int i = 0; i < n; i = j + 1) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java
index ec058295772e1fd4df8aa0c514bcf36fe3c7086f..407ce9faac3f31777368b02558b5ce92eb6a1b82 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java
@@ -64,24 +64,27 @@ public abstract class Round extends RBuiltinNode.Arg2 {
         casts.arg("x").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(numericValue().or(complexValue()));
 
         // TODO: this should also accept vectors
-        // TODO: digits argument is rounded, not simply stripped off the decimal part
-        casts.arg("digits").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(numericValue().or(complexValue())).asIntegerVector().findFirst();
+        casts.arg("digits").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(numericValue().or(complexValue())).asDoubleVector().findFirst();
+    }
+
+    protected static boolean isZero(double value) {
+        return value == 0;
     }
 
     @Specialization
-    protected double round(int x, @SuppressWarnings("unused") int digits) {
+    protected double round(int x, @SuppressWarnings("unused") double digits) {
         check.enable(x);
         return check.check(x) ? RRuntime.DOUBLE_NA : x;
     }
 
     @Specialization
-    protected double round(byte x, @SuppressWarnings("unused") int digits) {
+    protected double round(byte x, @SuppressWarnings("unused") double digits) {
         check.enable(x);
         return check.check(x) ? RRuntime.DOUBLE_NA : x;
     }
 
     @Specialization
-    protected RDoubleVector round(RAbstractLogicalVector x, @SuppressWarnings("unused") int digits) {
+    protected RDoubleVector round(RAbstractLogicalVector x, @SuppressWarnings("unused") double digits) {
         double[] data = new double[x.getLength()];
         check.enable(x);
         for (int i = 0; i < data.length; i++) {
@@ -92,7 +95,7 @@ public abstract class Round extends RBuiltinNode.Arg2 {
     }
 
     @Specialization
-    protected RDoubleVector round(RAbstractIntVector x, @SuppressWarnings("unused") int digits) {
+    protected RDoubleVector round(RAbstractIntVector x, @SuppressWarnings("unused") double digits) {
         double[] data = new double[x.getLength()];
         check.enable(x);
         for (int i = 0; i < data.length; i++) {
@@ -102,20 +105,24 @@ public abstract class Round extends RBuiltinNode.Arg2 {
         return RDataFactory.createDoubleVector(data, check.neverSeenNA());
     }
 
-    @Specialization(guards = "digits == 0")
-    protected double round(double x, @SuppressWarnings("unused") int digits) {
+    @Specialization(guards = "isZero(digits)")
+    protected double round(double x, @SuppressWarnings("unused") double digits) {
         check.enable(x);
         return check.check(x) ? RRuntime.DOUBLE_NA : roundOp.op(x);
     }
 
-    @Specialization(guards = "digits != 0")
     protected double roundDigits(double x, int digits) {
         check.enable(x);
         return check.check(x) ? RRuntime.DOUBLE_NA : roundOp.opd(x, digits);
     }
 
-    @Specialization(guards = "digits == 0")
-    protected RDoubleVector round(RAbstractDoubleVector x, int digits) {
+    @Specialization(guards = "!isZero(digits)")
+    protected double roundDigits(double x, double digits) {
+        return roundDigits(x, (int) Math.round(digits));
+    }
+
+    @Specialization(guards = "isZero(digits)")
+    protected RDoubleVector round(RAbstractDoubleVector x, double digits) {
         double[] result = new double[x.getLength()];
         check.enable(x);
         for (int i = 0; i < x.getLength(); i++) {
@@ -127,9 +134,10 @@ public abstract class Round extends RBuiltinNode.Arg2 {
         return ret;
     }
 
-    @Specialization(guards = "digits != 0")
-    protected RDoubleVector roundDigits(RAbstractDoubleVector x, int digits) {
+    @Specialization(guards = "!isZero(dDigits)")
+    protected RDoubleVector roundDigits(RAbstractDoubleVector x, double dDigits) {
         double[] result = new double[x.getLength()];
+        int digits = (int) Math.round(dDigits);
         check.enable(x);
         for (int i = 0; i < x.getLength(); i++) {
             double value = x.getDataAt(i);
@@ -140,20 +148,24 @@ public abstract class Round extends RBuiltinNode.Arg2 {
         return ret;
     }
 
-    @Specialization(guards = "digits == 0")
-    protected RComplex round(RComplex x, @SuppressWarnings("unused") int digits) {
+    @Specialization(guards = "isZero(digits)")
+    protected RComplex round(RComplex x, @SuppressWarnings("unused") double digits) {
         check.enable(x);
         return check.check(x) ? RComplex.createNA() : RComplex.valueOf(roundOp.op(x.getRealPart()), roundOp.op(x.getImaginaryPart()));
     }
 
-    @Specialization(guards = "digits != 0")
     protected RComplex roundDigits(RComplex x, int digits) {
         check.enable(x);
         return check.check(x) ? RComplex.createNA() : roundOp.opd(x.getRealPart(), x.getImaginaryPart(), digits);
     }
 
-    @Specialization(guards = "digits == 0")
-    protected RComplexVector round(RAbstractComplexVector x, int digits) {
+    @Specialization(guards = "!isZero(digits)")
+    protected RComplex roundDigits(RComplex x, double digits) {
+        return roundDigits(x, (int) Math.round(digits));
+    }
+
+    @Specialization(guards = "isZero(digits)")
+    protected RComplexVector round(RAbstractComplexVector x, double digits) {
         double[] result = new double[x.getLength() << 1];
         check.enable(x);
         for (int i = 0; i < x.getLength(); i++) {
@@ -168,8 +180,9 @@ public abstract class Round extends RBuiltinNode.Arg2 {
         return ret;
     }
 
-    @Specialization(guards = "digits != 0")
-    protected RComplexVector roundDigits(RAbstractComplexVector x, int digits) {
+    @Specialization(guards = "!isZero(dDigits)")
+    protected RComplexVector roundDigits(RAbstractComplexVector x, double dDigits) {
+        int digits = (int) Math.round(dDigits);
         double[] result = new double[x.getLength() << 1];
         check.enable(x);
         for (int i = 0; i < x.getLength(); i++) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java
index 1a1e8590b42cc2ed94454809333400f1ef893a0b..b86ea1637eb4b486e0fe268acbe2ce7dde608e54 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java
@@ -383,11 +383,11 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect
 
     private static final int DECIMAL_SHIFT = 350;
     private static final double[][] DECIMAL_VALUES = new double[700][10];
+    private static final double[] DECIMAL_WEIGHTS = new double[700];
     /**
      * This array contains the halves minus the unit of least precision, e.g. 0.499999...
      */
     private static final double[] HALVES_MINUS_ULP = new double[700];
-    private static final double[] DECIMAL_WEIGHTS = new double[700];
 
     static {
         for (int i = 0; i < DECIMAL_WEIGHTS.length; i++) {
@@ -395,9 +395,9 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect
         }
         for (int i = 0; i < DECIMAL_VALUES.length; i++) {
             for (int i2 = 0; i2 < 10; i2++) {
-                DECIMAL_VALUES[i][i2] = Math.pow(10, i - DECIMAL_SHIFT) * i2;
+                DECIMAL_VALUES[i][i2] = i2 / Math.pow(10, DECIMAL_SHIFT - i);
             }
-            HALVES_MINUS_ULP[i] = Double.longBitsToDouble(Double.doubleToLongBits(DECIMAL_VALUES[i][5]) - 1);
+            HALVES_MINUS_ULP[i] = Math.nextDown(DECIMAL_VALUES[i][5]);
         }
     }
 
@@ -458,18 +458,8 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect
                 for (int i = 0; i < blanks; i++) {
                     str.append(' ');
                 }
-
-                double pow10 = DECIMAL_WEIGHTS[-log10 + d + DECIMAL_SHIFT];
-                long mantissa = (long) (x * pow10);
                 // round towards next digit instead of truncating
-                double rounded;
-                if ((mantissa & 1L) == 0) {
-                    // even
-                    rounded = x + HALVES_MINUS_ULP[log10 - d - 1 + DECIMAL_SHIFT];
-                } else {
-                    rounded = x + DECIMAL_VALUES[log10 - d - 1 + DECIMAL_SHIFT][5];
-                }
-
+                double rounded = x + DECIMAL_VALUES[log10 - d - 1 + DECIMAL_SHIFT][5];
                 if (Double.isFinite(rounded)) {
                     x = rounded;
                     // the rounding might have modified the exponent
@@ -504,36 +494,55 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect
                 str.append((char) ('0' + (log10 / 10)));
                 str.append((char) ('0' + (log10 % 10)));
             } else { /* e == 0 */
-                double pow10 = DECIMAL_WEIGHTS[d + DECIMAL_SHIFT];
-                long mantissa = (long) (x * pow10);
-                // round towards next digit instead of truncating
-                if ((mantissa & 1L) == 0) {
-                    // even
-                    x += HALVES_MINUS_ULP[-d - 1 + DECIMAL_SHIFT];
-                } else {
-                    x += DECIMAL_VALUES[-d - 1 + DECIMAL_SHIFT][5];
-                }
-
-                int log10 = x == 0 ? 0 : Math.max((int) Math.log10(x), 0);
-                int blanks = w // target width
-                                - (negated ? 1 : 0) // "-"
-                                - (log10 + 1) // digits before "."
-                                - (d > 0 ? 1 : 0) // "."
-                                - d; // digits after "."
+                boolean finalRun = ((int) x) == x; // within int range is always exact
+                double startingX = x;
+                double halfOfLastDigit = DECIMAL_VALUES[-d - 1 + DECIMAL_SHIFT][5];
+                while (true) {
+                    if (!finalRun) {
+                        double pow10 = x * DECIMAL_WEIGHTS[d + DECIMAL_SHIFT];
+                        double mantissa = Math.floor(pow10);
+                        double rest = pow10 - mantissa;
+
+                        if (rest < 0.49 || rest > 0.99) {
+                            // get the value away from the boundaries
+                            x += halfOfLastDigit;
+                            finalRun = true;
+                        }
+                    }
+                    int log10 = x == 0 ? 0 : Math.max((int) Math.log10(x), 0);
+                    int blanks = w // target width
+                                    - (negated ? 1 : 0) // "-"
+                                    - (log10 + 1) // digits before "."
+                                    - (d > 0 ? 1 : 0) // "."
+                                    - d; // digits after "."
+
+                    for (int i = 0; i < blanks; i++) {
+                        str.append(' ');
+                    }
+                    if (negated) {
+                        str.append('-');
+                    }
+                    for (int i = log10; i >= 0; i--) {
+                        x = appendDigit(x, i, str);
+                    }
+                    if (d > 0) {
+                        str.append(cdec);
+                        for (int i = 1; i <= d; i++) {
+                            x = appendDigit(x, -i, str);
+                        }
+                    }
+                    if (finalRun) {
+                        break;
+                    }
 
-                for (int i = 0; i < blanks; i++) {
-                    str.append(' ');
-                }
-                if (negated) {
-                    str.append('-');
-                }
-                for (int i = log10; i >= 0; i--) {
-                    x = appendDigit(x, i, str);
-                }
-                if (d > 0) {
-                    str.append(cdec);
-                    for (int i = 1; i <= d; i++) {
-                        x = appendDigit(x, -i, str);
+                    boolean even = ((str.charAt(str.length() - 1) - '0') & 1) == 0;
+                    if (even ? x > halfOfLastDigit : x >= halfOfLastDigit) {
+                        // the leftover is large enough to increment from rounding, so re-run
+                        x = startingX + DECIMAL_VALUES[-d + DECIMAL_SHIFT][1];
+                        finalRun = true;
+                        str.setLength(0);
+                    } else {
+                        break;
                     }
                 }
             }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java
index c5c06f0b1ba25280ad228f8b70ee7c7fed3dc939..1300b879387a0e22c3a62a67a5908974d6fd7a69 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java
@@ -35,6 +35,7 @@ import java.security.CodeSource;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TimeZone;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.vm.PolyglotEngine;
@@ -53,15 +54,14 @@ import com.oracle.truffle.r.runtime.ffi.BaseRFFI;
  */
 public final class REnvVars implements RContext.ContextState {
 
-    private final Map<String, String> envVars = new HashMap<>(System.getenv());
+    private final HashMap<String, String> envVars;
 
-    private REnvVars() {
+    private REnvVars(Map<String, String> initialEnvVars) {
+        envVars = new HashMap<>(initialEnvVars);
     }
 
     @Override
     public RContext.ContextState initialize(RContext context) {
-        // explicit environment settings in nested contexts must be installed first
-        checkExplicitEnvSettings(context);
         RCmdOptions cmdOptions = context.getCmdOptions();
         // If running Rscript, R_DEFAULT_PACKAGES may need to be set
         String defaultPackages = cmdOptions.getString(RCmdOption.DEFAULT_PACKAGES);
@@ -125,23 +125,8 @@ public final class REnvVars implements RContext.ContextState {
         return this;
     }
 
-    public static REnvVars newContextState() {
-        return new REnvVars();
-    }
-
-    private void checkExplicitEnvSettings(RContext context) {
-        String[] envs = context.getEnvSettings();
-        if (envs == null || envs.length == 0) {
-            return;
-        }
-        for (String envdef : envs) {
-            String[] parts = envdef.split("=");
-            if (parts.length == 2) {
-                envVars.put(parts[0], parts[1]);
-            } else {
-                // for now just ignore
-            }
-        }
+    public static REnvVars newContextState(Map<String, String> initialEnvVars) {
+        return new REnvVars(initialEnvVars);
     }
 
     private String getEitherCase(String var) {
@@ -290,6 +275,14 @@ public final class REnvVars implements RContext.ContextState {
         }
     }
 
+    public TimeZone getSystemTimeZone() {
+        String tzName = envVars.get("TZ");
+        if (tzName != null) {
+            return TimeZone.getTimeZone(tzName);
+        }
+        return TimeZone.getDefault();
+    }
+
     private String expandParameters(String value) {
         StringBuilder result = new StringBuilder();
         int x = 0;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java
index 4180cd6a52c985c5f926a7c3a4090693052994a6..e8d02437ed8c0daafd4218cd9015ecf3e6356e73 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java
@@ -903,6 +903,7 @@ public final class RError extends RuntimeException implements TruffleException {
         FILE_NOT_FOUND_IN_ZIP("requested file not found in the zip file"),
         LIST_NO_VALID_NAMES("list argument has no valid names"),
         VALUES_MUST_BE_LENGTH("values must be length %s,\n but FUN(X[[%d]]) result is length %s"),
+        OS_REQUEST_LOCALE("OS reports request to set locale to \"%s\" cannot be honored"),
         INVALID_TYPE("invalid type (%s) for '%s' (must be a %s)");
 
         public final String message;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java
index 5b78bfd0da8f665ad8d75373985864007a377ff5..fd95e657f4337607f7886cb8b8635c29516d3793 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java
@@ -767,7 +767,7 @@ public class RErrorHandling {
         // (is 74 a given percentage of console width?)
         if (preamble.length() + 1 + message.length() >= 74) {
             // +1 is for the extra space following the colon
-            return preamble + " \n  " + message;
+            return preamble + "\n  " + message;
         } else {
             return preamble + " " + message;
         }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RLocale.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RLocale.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca3c2f2891a3037cdfdce93a036c7815f916b491
--- /dev/null
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RLocale.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.runtime;
+
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+import java.util.EnumMap;
+import java.util.Locale;
+
+import com.oracle.truffle.r.runtime.RError.Message;
+import com.oracle.truffle.r.runtime.context.RContext;
+import com.oracle.truffle.r.runtime.context.RContext.ContextState;
+
+public enum RLocale {
+    COLLATE(true, true, true),
+    CTYPE(false, true, true),
+    MONETARY(true, true, true),
+    NUMERIC(true, false, true),
+    TIME(true, true, true),
+    MESSAGES(true, true, true),
+    PAPER(false, false, false),
+    MEASUREMENT(false, false, false);
+
+    private final String name;
+    private final boolean needsLocale;
+    private final boolean initializedAtStartup;
+    private final boolean listed;
+
+    RLocale(boolean needsLocale, boolean initializedAtStartup, boolean listed) {
+        this.needsLocale = needsLocale;
+        this.initializedAtStartup = initializedAtStartup;
+        this.listed = listed;
+        this.name = "LC_" + name();
+    }
+
+    public static final class ContextStateImpl implements RContext.ContextState {
+        private final EnumMap<RLocale, Locale> locales = new EnumMap<>(RLocale.class);
+        private final EnumMap<RLocale, Charset> charsets = new EnumMap<>(RLocale.class);
+
+        private ContextStateImpl() {
+            // private constructor
+        }
+
+        private static String getDefinition(String name, REnvVars envVars) {
+            // lookup order: LC_ALL, LC_<name>, LANG
+            for (String identifier : new String[]{"LC_ALL", name, "LANG"}) {
+                String value = envVars.get(identifier);
+                if (value != null && !value.isEmpty()) {
+                    return value;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public ContextState initialize(RContext context) {
+            REnvVars envVars = context.stateREnvVars;
+            for (RLocale locale : RLocale.values()) {
+                if (locale.initializedAtStartup) {
+                    setLocale(locale, getDefinition(locale.name, envVars), true);
+                } else {
+                    setLocale(locale, "C", true);
+                }
+            }
+            return this;
+        }
+
+        private static Charset getCharset(String value) {
+            try {
+                int dot = value.indexOf('.');
+                return dot == -1 ? Charset.forName(value) : Charset.forName(value.substring(dot + 1));
+            } catch (UnsupportedCharsetException | IllegalCharsetNameException e) {
+                return null;
+            }
+        }
+
+        private static Locale getLocale(String value) {
+            int dot = value.indexOf('.');
+            String code = dot == -1 ? value : value.substring(0, dot);
+            Locale.Builder builder = new Locale.Builder();
+            switch (code.length()) {
+                case 2:
+                    return builder.setLanguage(code).build();
+                case 5:
+                    if (code.charAt(2) == '_') {
+                        return builder.setLanguage(code.substring(0, 2)).setRegion(code.substring(3)).build();
+                    }
+                    break;
+                default:
+                    if (code.length() >= 7 && code.charAt(2) == '_' && code.charAt(5) == '_') {
+                        return builder.setLanguage(code.substring(0, 2)).setRegion(code.substring(3)).setVariant(code.substring(6)).build();
+                    }
+                    break;
+            }
+            return null;
+        }
+
+        public void setLocale(RLocale locale, String value) {
+            setLocale(locale, value, false);
+        }
+
+        public void setLocale(RLocale locale, String value, boolean startup) {
+            Charset c = null;
+            Locale l = null;
+            if ("C".equals(value) || "POSIX".equals(value)) {
+                c = StandardCharsets.US_ASCII;
+            } else if (value != null) {
+                c = getCharset(value);
+                l = getLocale(value);
+                if ((c == null && l == null) || (l == null && locale.needsLocale)) {
+                    if (startup) {
+                        RContext.getInstance().getConsole().printErrorln("Setting " + locale.name + " failed, using default");
+                    } else {
+                        RError.warning(RError.SHOW_CALLER, Message.OS_REQUEST_LOCALE, value);
+                    }
+                }
+            }
+            charsets.put(locale, c == null ? StandardCharsets.UTF_8 : c);
+            locales.put(locale, l == null ? Locale.ROOT : l);
+        }
+
+        public Charset getCharset(RLocale locale) {
+            return charsets.get(locale);
+        }
+
+        public Locale getLocale(RLocale locale) {
+            return locales.get(locale);
+        }
+
+        public static ContextStateImpl newContextState() {
+            return new ContextStateImpl();
+        }
+    }
+
+    public String getRepresentation(RContext context) {
+        ContextStateImpl state = context.stateRLocale;
+        Locale l = state.locales.get(this);
+        Charset c = state.charsets.get(this);
+        if (c == StandardCharsets.US_ASCII) {
+            if (l == Locale.ROOT) {
+                return "C";
+            } else {
+                return l.toString();
+            }
+        } else {
+            if (l == Locale.ROOT) {
+                return c.name();
+            } else {
+                return l.toString() + "." + c.name();
+            }
+        }
+    }
+
+    public boolean isListed() {
+        return listed;
+    }
+}
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 5dc6ed526481acc3228f4795854c88f5fa73af48..7f887376309f6383d770b73bcbbbeab0277b5438 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
@@ -475,7 +475,17 @@ public final class Utils {
             // Truffle/R system has started
             return null;
         }
-        return RArguments.unwrap(frameInstance.getFrame(FrameAccess.MATERIALIZE));
+        Frame frame = RArguments.unwrap(frameInstance.getFrame(FrameAccess.MATERIALIZE));
+        if (!RArguments.isRFrame(frame)) {
+            return Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Frame>() {
+                @Override
+                public Frame visitFrame(FrameInstance instance) {
+                    Frame current = RArguments.unwrap(instance.getFrame(FrameAccess.MATERIALIZE));
+                    return RArguments.isRFrame(current) ? current : null;
+                }
+            });
+        }
+        return frame;
     }
 
     private static final class TracebackVisitor implements FrameInstanceVisitor<Frame> {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java
index 851519c9ca49d7f9927a5ab9195e76ce8675e66b..ea6a5e4b639760dee73ee1dda69aa626b3d891bb 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java
@@ -119,8 +119,10 @@ abstract class DelegateRConnection extends RObject implements RConnection, ByteC
         if (!isSeekable()) {
             throw RError.error(RError.SHOW_CALLER, RError.Message.NOT_ENABLED_FOR_THIS_CONN, "seek");
         }
-        final long res = seekInternal(offset, seekMode, seekRWMode);
-        invalidateCache();
+        long res = seekInternal(offset, seekMode, seekRWMode);
+        if (seekMode != SeekMode.ENQUIRE) {
+            invalidateCache();
+        }
         return res;
     }
 
@@ -350,8 +352,8 @@ abstract class DelegateRConnection extends RObject implements RConnection, ByteC
      * <it>Standard</it> means that there is a shared cursor between reading and writing operations.
      * </p>
      */
-    public static long seek(SeekableByteChannel channel, long offset, SeekMode seekMode, @SuppressWarnings("unused") SeekRWMode seekRWMode) throws IOException {
-        long position = channel.position();
+    public static long seek(SeekableByteChannel channel, long offset, SeekMode seekMode, @SuppressWarnings("unused") SeekRWMode seekRWMode, int bytesInCache) throws IOException {
+        long position = channel.position() - bytesInCache;
         switch (seekMode) {
             case ENQUIRE:
                 break;
@@ -601,6 +603,10 @@ abstract class DelegateRConnection extends RObject implements RConnection, ByteC
         }
     }
 
+    protected int bytesInCache() {
+        return cache.remaining();
+    }
+
     @Override
     public OutputStream getOutputStream() throws IOException {
         return Channels.newOutputStream(this);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java
index d7b01f19cd0c90c3661f8388e1a2937d64a062c5..7ff189d0fa6fac2e3b4329be7b9817bd15023b8b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java
@@ -280,7 +280,7 @@ public class FileConnections {
 
         @Override
         public long seekInternal(long offset, SeekMode seekMode, SeekRWMode seekRWMode) throws IOException {
-            return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode);
+            return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode, bytesInCache());
         }
 
         @Override
@@ -342,7 +342,7 @@ public class FileConnections {
 
         @Override
         protected long seekInternal(long offset, SeekMode seekMode, SeekRWMode seekRWMode) throws IOException {
-            return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode);
+            return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode, bytesInCache());
         }
 
         @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java
index bdcd6c61d363601afc703ff79f0609aa8fd7202d..a40ce96e9b708b299c5697038600e8ca607a74ae 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java
@@ -25,7 +25,7 @@ package com.oracle.truffle.r.runtime.context;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.TimeZone;
+import java.util.Map;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -34,8 +34,8 @@ import com.oracle.truffle.api.TruffleContext;
 import com.oracle.truffle.api.vm.PolyglotEngine;
 import com.oracle.truffle.api.vm.PolyglotEngine.Builder;
 import com.oracle.truffle.r.launcher.RCmdOptions;
-import com.oracle.truffle.r.launcher.RStartParams;
 import com.oracle.truffle.r.launcher.RCmdOptions.Client;
+import com.oracle.truffle.r.launcher.RStartParams;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.context.RContext.ContextKind;
 
@@ -71,9 +71,8 @@ public final class ChildContextInfo {
     static final AtomicInteger multiSlotInds = new AtomicInteger(-1);
 
     private final RStartParams startParams;
-    private final String[] env;
+    private final Map<String, String> env;
     private final RContext.ContextKind kind;
-    private final TimeZone systemTimeZone;
 
     /**
      * Any context created by another has a parent. When such a context is destroyed we must reset
@@ -89,7 +88,8 @@ public final class ChildContextInfo {
     private PolyglotEngine vm;
     public Executor executor;
 
-    private ChildContextInfo(RStartParams startParams, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr, TimeZone systemTimeZone, int id,
+    private ChildContextInfo(RStartParams startParams, Map<String, String> env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr,
+                    int id,
                     int multiSlotInd) {
         this.startParams = startParams;
         this.env = env;
@@ -98,7 +98,6 @@ public final class ChildContextInfo {
         this.stdin = stdin;
         this.stdout = stdout;
         this.stderr = stderr;
-        this.systemTimeZone = systemTimeZone;
         this.multiSlotInd = multiSlotInd;
         this.id = id;
     }
@@ -149,10 +148,8 @@ public final class ChildContextInfo {
      * @param kind defines the degree to which this context shares base and package environments
      *            with its parent
      * @param parent if non-null {@code null}, the parent creating the context
-     * @param systemTimeZone the system's time zone
      */
-    public static ChildContextInfo create(RStartParams startParams, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr,
-                    TimeZone systemTimeZone) {
+    public static ChildContextInfo create(RStartParams startParams, Map<String, String> env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) {
         int id = contextInfoIds.incrementAndGet();
         int multiSlotInd = multiSlotInds.get();
         if (kind == ContextKind.SHARE_ALL || kind == ContextKind.SHARE_NOTHING) {
@@ -164,23 +161,18 @@ public final class ChildContextInfo {
             throw RInternalError.shouldNotReachHere();
         }
         assert kind != ContextKind.SHARE_PARENT_RW || (kind == ContextKind.SHARE_PARENT_RW && parent.getKind() == ContextKind.SHARE_NOTHING && parent.getMultiSlotInd() == 0);
-        return new ChildContextInfo(startParams, env, kind, parent, stdin, stdout, stderr, systemTimeZone, id, kind == ContextKind.SHARE_PARENT_RW ? 0 : multiSlotInd);
-    }
-
-    public static ChildContextInfo create(RStartParams startParams, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) {
-        return create(startParams, env, kind, parent, stdin, stdout, stderr, TimeZone.getDefault());
+        return new ChildContextInfo(startParams, env, kind, parent, stdin, stdout, stderr, id, kind == ContextKind.SHARE_PARENT_RW ? 0 : multiSlotInd);
     }
 
     /**
      * Create a context configuration object such that FastR does not restore previously stored
      * sessions on startup.
      *
-     * @param env TODO
      * @param kind defines the degree to which this context shares base and package environments
      *            with its parent
      * @param parent if non-null {@code null}, the parent creating the context
      */
-    public static ChildContextInfo createNoRestore(Client client, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) {
+    public static ChildContextInfo createNoRestore(Client client, Map<String, String> env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) {
         RStartParams params = new RStartParams(RCmdOptions.parseArguments(client, new String[]{"R", "--vanilla", "--slave", "--silent", "--no-restore"}, false), false);
         return create(params, env, kind, parent, stdin, stdout, stderr);
     }
@@ -189,7 +181,7 @@ public final class ChildContextInfo {
         return startParams;
     }
 
-    public String[] getEnv() {
+    public Map<String, String> getEnv() {
         return env;
     }
 
@@ -201,10 +193,6 @@ public final class ChildContextInfo {
         return parent;
     }
 
-    public TimeZone getSystemTimeZone() {
-        return systemTimeZone;
-    }
-
     public int getId() {
         return id;
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
index 41383f5865d7d2582a433d352298175b523f18bd..c20435b25add40eb7965dd44a5b16fb917ddfdfe 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
@@ -40,11 +40,11 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
@@ -80,6 +80,7 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RErrorHandling;
 import com.oracle.truffle.r.runtime.RInternalCode.ContextStateImpl;
 import com.oracle.truffle.r.runtime.RInternalError;
+import com.oracle.truffle.r.runtime.RLocale;
 import com.oracle.truffle.r.runtime.ROptions;
 import com.oracle.truffle.r.runtime.RProfile;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -226,9 +227,7 @@ public final class RContext implements RTruffleObject {
 
     private final RStartParams startParameters;
     private final RCmdOptions cmdOptions;
-    private final String[] environment;
     private final RContext.ContextKind contextKind;
-    private final TimeZone systemTimeZone;
     public final Map<Class<?>, RootCallTarget> nativeCallTargets = new HashMap<>();
 
     public RootCallTarget getOrCreateNativeCallTarget(Class<?> clazz, Supplier<RootCallTarget> creatFunction) {
@@ -332,6 +331,7 @@ public final class RContext implements RTruffleObject {
      * processor, but the set is relatively small, so we just enumerate them here.
      */
     public final REnvVars stateREnvVars;
+    public final RLocale.ContextStateImpl stateRLocale;
     public final TempPathName stateTempPath;
     public final RProfile stateRProfile;
     public final StdConnections.ContextStateImpl stateStdConnections;
@@ -357,7 +357,8 @@ public final class RContext implements RTruffleObject {
     private final AllocationReporter allocationReporter;
 
     private ContextState[] contextStates() {
-        return new ContextState[]{stateREnvVars, stateRProfile, stateTempPath, stateROptions, stateREnvironment, stateRErrorHandling, stateRConnection, stateStdConnections, stateRNG, stateRFFI,
+        return new ContextState[]{stateREnvVars, stateRLocale, stateRProfile, stateTempPath, stateROptions, stateREnvironment, stateRErrorHandling, stateRConnection, stateStdConnections, stateRNG,
+                        stateRFFI,
                         stateRSerialize, stateLazyDBCache, stateInstrumentation, stateDLL};
     }
 
@@ -386,35 +387,33 @@ public final class RContext implements RTruffleObject {
         }
 
         Object initialInfo = env.getConfig().get(ChildContextInfo.CONFIG_KEY);
+        Map<String, String> initialEnvVars;
         if (initialInfo == null) {
             /*
              * This implies that FastR is being invoked initially from another Truffle language or
-             * via RCommand/RscriptCommand. TODO How to deciden if session state is to be restored
-             * stored session should be restored.
+             * via RCommand/RscriptCommand. TODO How to decide if session state is to be restored
              */
             this.cmdOptions = RCmdOptions.parseArguments(Client.R, args, true);
             this.startParameters = new RStartParams(cmdOptions, false);
-            this.environment = null;
             this.contextKind = ContextKind.SHARE_NOTHING;
-            this.systemTimeZone = TimeZone.getDefault();
             this.parentContext = null;
             this.id = ChildContextInfo.contextInfoIds.incrementAndGet();
             this.multiSlotIndex = 0;
-            this.truffleContext = null; // TODO
+            this.truffleContext = null;
             this.executor = null;
+            initialEnvVars = System.getenv();
         } else {
             // child spawned explicitly by R
             ChildContextInfo info = (ChildContextInfo) initialInfo;
             this.cmdOptions = RCmdOptions.parseArguments(Client.R, args, true);
             this.startParameters = info.getStartParams();
-            this.environment = info.getEnv();
             this.contextKind = info.getKind();
-            this.systemTimeZone = info.getSystemTimeZone();
             this.parentContext = info.getParent();
             this.id = info.getId();
             this.multiSlotIndex = info.getMultiSlotInd();
             this.truffleContext = info.getTruffleContext();
             this.executor = info.executor;
+            initialEnvVars = info.getEnv() == null ? Collections.emptyMap() : info.getEnv();
         }
 
         outputWelcomeMessage(startParameters);
@@ -425,7 +424,8 @@ public final class RContext implements RTruffleObject {
 
         this.initial = isInitial;
         this.env = env;
-        this.stateREnvVars = REnvVars.newContextState();
+        this.stateREnvVars = REnvVars.newContextState(initialEnvVars);
+        this.stateRLocale = RLocale.ContextStateImpl.newContextState();
         this.stateTempPath = TempPathName.newContextState();
         this.stateROptions = ROptions.ContextStateImpl.newContextState(stateREnvVars);
         this.stateRProfile = RProfile.newContextState(stateREnvVars);
@@ -502,6 +502,7 @@ public final class RContext implements RTruffleObject {
             doEnvOptionsProfileInitialization();
         }
 
+        stateRLocale.initialize(this);
         stateREnvironment.initialize(this);
         stateRErrorHandling.initialize(this);
         stateRConnection.initialize(this);
@@ -730,10 +731,6 @@ public final class RContext implements RTruffleObject {
         return startParameters;
     }
 
-    public String[] getEnvSettings() {
-        return environment;
-    }
-
     public boolean hasExecutor() {
         return executor != null;
     }
@@ -790,10 +787,6 @@ public final class RContext implements RTruffleObject {
         return loadingBase;
     }
 
-    public TimeZone getSystemTimeZone() {
-        return systemTimeZone;
-    }
-
     public String getNamespaceName() {
         return nameSpaceName;
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java
index 8178d4c0276ae70944915079cd7754463b8c30b2..bd79d8d202587cb25d2552d0c60ec6e3312779a5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java
@@ -22,6 +22,8 @@
  */
 package com.oracle.truffle.r.runtime.data;
 
+import com.oracle.truffle.r.runtime.RRuntime;
+
 /**
  * Internally GNU R distinguishes "strings" and "vectors of strings" using the {@code CHARSXP} and
  * {@code STRSXP} types, respectively. Although this difference is invisible at the R level, it
@@ -32,6 +34,8 @@ package com.oracle.truffle.r.runtime.data;
  * N.B. Use limited to RFFI implementations.
  */
 public final class CharSXPWrapper extends RObject implements RTruffleObject {
+    private static final CharSXPWrapper NA = new CharSXPWrapper(RRuntime.STRING_NA);
+
     private String contents;
 
     private CharSXPWrapper(String contents) {
@@ -48,7 +52,11 @@ public final class CharSXPWrapper extends RObject implements RTruffleObject {
     }
 
     public static CharSXPWrapper create(String contents) {
-        return new CharSXPWrapper(contents);
+        if (contents == RRuntime.STRING_NA) {
+            return NA;
+        } else {
+            return new CharSXPWrapper(contents);
+        }
     }
 
     public long allocateNativeContents() {
diff --git a/com.oracle.truffle.r.test.packages/gated b/com.oracle.truffle.r.test.packages/gated
new file mode 100644
index 0000000000000000000000000000000000000000..f2bc110186ab1197be4bc81b8e2f610e4beebb18
--- /dev/null
+++ b/com.oracle.truffle.r.test.packages/gated
@@ -0,0 +1 @@
+foreign
diff --git a/com.oracle.truffle.r.test.packages/r/install.packages.R b/com.oracle.truffle.r.test.packages/r/install.packages.R
index 95736d4761ccd59263a8e2513862d071e7fce6e8..799db01552808fbf92145817ac5b225c2240e23c 100644
--- a/com.oracle.truffle.r.test.packages/r/install.packages.R
+++ b/com.oracle.truffle.r.test.packages/r/install.packages.R
@@ -45,7 +45,7 @@
 # A list of repos can be provided  with the --repos argument, which ia comma separated string of name=value pairs.
 # The names "CRAN", "BIOC" and "FASTR" are understood and have default values.
 # By default, we use the CRAN mirror specified in the --repos argument or env var CRAN_MIRROR.
-# The default value for --repos is "CRAN=http://cran.cnr.berkeley.edu"
+# The default value for --repos is "CRAN=http://cloud.r-project.org/"
 
 # Packages are installed into the directory specified by the --lib arg (or R_LIBS_USER env var)
 
@@ -279,7 +279,7 @@ set.repos <- function() {
 		} else if (name == "CRAN") {
 			if (is.na(uri)) {
 				# not set on command line
-				cran.mirror <<- Sys.getenv("CRAN_MIRROR", unset = "http://cran.cnr.berkeley.edu/")
+				cran.mirror <<- Sys.getenv("CRAN_MIRROR", unset = "http://cloud.r-project.org/")
 			} else {
 				cran.mirror <- uri
 			}
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 fa331b0089c5f671ce54f0bc0945df6b229f5505..06d54805ff27dfbfbc043ccfef202f211626b0d3 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
@@ -642,11 +642,11 @@ Error: no slot of name "foo" for this object of class "classRepresentation"
 #{ getClass("ClassUnionRepresentation")@virtual }
 [1] FALSE
 
-##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.SideEffects#
 #{ setClass("foo", contains="numeric"); x<-new("foo"); res<-slot(x, ".Data"); removeClass("foo"); res }
 numeric(0)
 
-##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.SideEffects#
 #{ setClass("foo", contains="numeric"); x<-new("foo"); res<-x@.Data; removeClass("foo"); res }
 numeric(0)
 
@@ -1269,7 +1269,7 @@ $vectors
 NULL
 
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa4#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa4#
 #argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))
 $d
 [1] 2.000000 1.732051 1.414214 1.000000
@@ -1327,7 +1327,7 @@ $vt
 #argv <- list(structure(c(1, 1, 3, 3), .Dim = c(2L, 2L)), 'O'); .Internal(La_dgecon(argv[[1]], argv[[2]]))
 [1] 0
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa8#Ignored.Unimplemented#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa8#
 #argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))
 $d
 [1] 8.164129e+03 4.572450e+02 3.245844e+02 1.343122e+02 4.955532e+00
@@ -7417,7 +7417,7 @@ In matrix(1:4, 3, 2) :
 [2,]    3    4
 [3,]    5    6
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#Ignored.ReferenceError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#
 #{ matrix(1i,10,10) }
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,] 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i  0+1i
@@ -7503,7 +7503,7 @@ In matrix(c(1, 2, 3, 4), 3, 2) :
  [9,] 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i 0+  1i
 [10,] 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#Ignored.ReferenceError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#
 #{ matrix(c(1i,NA),10,10) }
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,] 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i  0+1i
@@ -22762,7 +22762,7 @@ FALSE
 #argv <- list(c(0.00508571428571428, 0.876285714285715), structure(1L, class = c('terminal', 'connection')), 69); .Internal(dput(argv[[1]], argv[[2]], argv[[3]]))
 c(0.00508571428571428, 0.876285714285715)
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_dqr.testdqrcf#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_dqr.testdqrcf#
 #.Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L)
 [[1]]
 [1] 1
@@ -23346,60 +23346,1444 @@ character(0)
 [1] NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 0, quote = "", justify = "centre");}
-[1] "a"     "ab"    "abcde" "<NA>"
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='c', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='c', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='l', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='l', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='n', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='n', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='r', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='r', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='c', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='c', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='l', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='l', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='n', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='n', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='r', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='r', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='c', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='c', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='l', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='l', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='n', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='n', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='r', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='r', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='c', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='c', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='l', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='l', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='n', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='n', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='r', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='r', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='c', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='c', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='l', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='l', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='n', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='n', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='r', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='r', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='c', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='c', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='l', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='l', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='n', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='n', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='r', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='r', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='c', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='c', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='l', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='l', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='n', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='n', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='r', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='r', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='c', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='c', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='l', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='l', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='n', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='n', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='r', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='r', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='c', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='c', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA "                 "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='l', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='l', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA "                 "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='n', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='n', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='r', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='r', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] " NA"                 "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='c', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='c', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA "               "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='l', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='l', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA "               "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='n', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='n', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='r', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='r', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] " NA"               "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='c', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='c', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA "
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='l', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='l', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA "
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='n', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='n', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='r', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='r', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         " NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='c', na=F)
+[1] " a "           "ab "           "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='c', na=T)
+[1] " a "           "ab "           "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='l', na=F)
+[1] "a  "           "ab "           "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='l', na=T)
+[1] "a  "           "ab "           "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='n', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='n', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='r', na=F)
+[1] "  a"           " ab"           "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='r', na=T)
+[1] "  a"           " ab"           "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='c', na=F)
+[1] "  \"a\"  "           " \"ab\"  "           "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='c', na=T)
+[1] "  \"a\"  "           " \"ab\"  "           "\"abcde\""
+[4] "  NA   "             "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='l', na=F)
+[1] "\"a\"    "           "\"ab\"   "           "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='l', na=T)
+[1] "\"a\"    "           "\"ab\"   "           "\"abcde\""
+[4] "NA     "             "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='n', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='n', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='r', na=F)
+[1] "    \"a\""           "   \"ab\""           "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='r', na=T)
+[1] "    \"a\""           "   \"ab\""           "\"abcde\""
+[4] "     NA"             "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='c', na=F)
+[1] "  'a'  "           " 'ab'  "           "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='c', na=T)
+[1] "  'a'  "           " 'ab'  "           "'abcde'"
+[4] "  NA   "           "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='l', na=F)
+[1] "'a'    "           "'ab'   "           "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='l', na=T)
+[1] "'a'    "           "'ab'   "           "'abcde'"
+[4] "NA     "           "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='n', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='n', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='r', na=F)
+[1] "    'a'"           "   'ab'"           "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='r', na=T)
+[1] "    'a'"           "   'ab'"           "'abcde'"
+[4] "     NA"           "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='c', na=F)
+[1] "  aaa  "         " aaba  "         "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='c', na=T)
+[1] "  aaa  "         " aaba  "         "aabcdea"         "  NA   "
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='l', na=F)
+[1] "aaa    "         "aaba   "         "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='l', na=T)
+[1] "aaa    "         "aaba   "         "aabcdea"         "NA     "
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='n', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='n', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='r', na=F)
+[1] "    aaa"         "   aaba"         "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='r', na=T)
+[1] "    aaa"         "   aaba"         "aabcdea"         "     NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='c', na=F)
+[1] "   a   "       "  ab   "       " abcde "       NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='c', na=T)
+[1] "   a   "       "  ab   "       " abcde "       " <NA>  "
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='l', na=F)
+[1] "a      "       "ab     "       "abcde  "       NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='l', na=T)
+[1] "a      "       "ab     "       "abcde  "       "<NA>   "
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='n', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='n', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='r', na=F)
+[1] "      a"       "     ab"       "  abcde"       NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='r', na=T)
+[1] "      a"       "     ab"       "  abcde"       "   <NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='c', na=F)
+[1] "     \"a\"     "     "    \"ab\"     "     "   \"abcde\"   "
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='c', na=T)
+[1] "     \"a\"     "     "    \"ab\"     "     "   \"abcde\"   "
+[4] "     NA      "       "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='l', na=F)
+[1] "\"a\"          "     "\"ab\"         "     "\"abcde\"      "
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='l', na=T)
+[1] "\"a\"          "     "\"ab\"         "     "\"abcde\"      "
+[4] "NA           "       "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='n', na=F)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='n', na=T)
+[1] "\"a\""               "\"ab\""              "\"abcde\""
+[4] "NA"                  "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='r', na=F)
+[1] "          \"a\""     "         \"ab\""     "      \"abcde\""
+[4] NA                    "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='r', na=T)
+[1] "          \"a\""     "         \"ab\""     "      \"abcde\""
+[4] "           NA"       "\"\\t\\nሴfoo\\\"'\""
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='c', na=F)
+[1] "     'a'     "     "    'ab'     "     "   'abcde'   "
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='c', na=T)
+[1] "     'a'     "     "    'ab'     "     "   'abcde'   "
+[4] "     NA      "     "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='l', na=F)
+[1] "'a'          "     "'ab'         "     "'abcde'      "
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='l', na=T)
+[1] "'a'          "     "'ab'         "     "'abcde'      "
+[4] "NA           "     "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='n', na=F)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='n', na=T)
+[1] "'a'"               "'ab'"              "'abcde'"
+[4] "NA"                "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='r', na=F)
+[1] "          'a'"     "         'ab'"     "      'abcde'"
+[4] NA                  "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='r', na=T)
+[1] "          'a'"     "         'ab'"     "      'abcde'"
+[4] "           NA"     "'\\t\\nሴfoo\"\\''"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='c', na=F)
+[1] "    aaa     "    "    aaba    "    "  aabcdea   "    NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='c', na=T)
+[1] "    aaa     "    "    aaba    "    "  aabcdea   "    "     NA     "
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='l', na=F)
+[1] "aaa         "    "aaba        "    "aabcdea     "    NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='l', na=T)
+[1] "aaa         "    "aaba        "    "aabcdea     "    "NA          "
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='n', na=F)
+[1] "aaa"             "aaba"            "aabcdea"         NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='n', na=T)
+[1] "aaa"             "aaba"            "aabcdea"         "NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='r', na=F)
+[1] "         aaa"    "        aaba"    "     aabcdea"    NA
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='r', na=T)
+[1] "         aaa"    "        aaba"    "     aabcdea"    "          NA"
+[5] "a\\t\\nሴfoo\"'a"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='c', na=F)
+[1] "    a     "    "    ab    "    "  abcde   "    NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='c', na=T)
+[1] "    a     "    "    ab    "    "  abcde   "    "   <NA>   "
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='l', na=F)
+[1] "a         "    "ab        "    "abcde     "    NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='l', na=T)
+[1] "a         "    "ab        "    "abcde     "    "<NA>      "
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='n', na=F)
+[1] "a"             "ab"            "abcde"         NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='n', na=T)
+[1] "a"             "ab"            "abcde"         "<NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='r', na=F)
+[1] "         a"    "        ab"    "     abcde"    NA
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='r', na=T)
+[1] "         a"    "        ab"    "     abcde"    "      <NA>"
+[5] "\\t\\nሴfoo\"'"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='c', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='c', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='l', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='l', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='n', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='n', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='r', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='"', justify='r', na=T)
+[1] "\"a\"" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 0, quote = "'", justify = "right");}
-[1] "'a'"     "'ab'"    "'abcde'" "NA"
+#encodeString(c('a',NA), width = 0, quote='\'', justify='c', na=F)
+[1] "'a'" NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 0, quote = "'", na.encode=FALSE, justify = "right");}
-[1] "'a'"     "'ab'"    "'abcde'" NA
+#encodeString(c('a',NA), width = 0, quote='\'', justify='c', na=T)
+[1] "'a'" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 2, quote = "'", na.encode=FALSE, justify = "centre");}
-[1] "'a'"     "'ab'"    "'abcde'" NA
+#encodeString(c('a',NA), width = 0, quote='\'', justify='l', na=F)
+[1] "'a'" NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 3, quote = "", na.encode=TRUE, justify = "centre");}
-[1] " a "   "ab "   "abcde" "<NA>"
+#encodeString(c('a',NA), width = 0, quote='\'', justify='l', na=T)
+[1] "'a'" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 3, quote = "'", justify = "centre");}
-[1] "'a'"     "'ab'"    "'abcde'" "NA "
+#encodeString(c('a',NA), width = 0, quote='\'', justify='n', na=F)
+[1] "'a'" NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 3, quote = "'", na.encode=FALSE, justify = "centre");}
-[1] "'a'"     "'ab'"    "'abcde'" NA
+#encodeString(c('a',NA), width = 0, quote='\'', justify='n', na=T)
+[1] "'a'" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 7, quote = "", na.encode=FALSE, justify = "centre");}
-[1] "   a   " "  ab   " " abcde " NA
+#encodeString(c('a',NA), width = 0, quote='\'', justify='r', na=F)
+[1] "'a'" NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 7, quote = "", na.encode=TRUE, justify = "centre");}
-[1] "   a   " "  ab   " " abcde " " <NA>  "
+#encodeString(c('a',NA), width = 0, quote='\'', justify='r', na=T)
+[1] "'a'" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA);}
-[1] "a    " "ab   " "abcde" "<NA> "
+#encodeString(c('a',NA), width = 0, quote='a', justify='c', na=F)
+[1] "aaa" NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, justify = "centre");}
-[1] "  a  " " ab  " "abcde" "<NA> "
+#encodeString(c('a',NA), width = 0, quote='a', justify='c', na=T)
+[1] "aaa" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, justify = "right");}
-[1] "    a" "   ab" "abcde" " <NA>"
+#encodeString(c('a',NA), width = 0, quote='a', justify='l', na=F)
+[1] "aaa" NA
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, quote = "'", justify = "right");}
-[1] "    'a'" "   'ab'" "'abcde'" "     NA"
+#encodeString(c('a',NA), width = 0, quote='a', justify='l', na=T)
+[1] "aaa" "NA"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
-#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, quote = "'", na.encode=FALSE, justify = "right");}
-[1] "    'a'" "   'ab'" "'abcde'" NA
+#encodeString(c('a',NA), width = 0, quote='a', justify='n', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='a', justify='n', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='a', justify='r', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote='a', justify='r', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='c', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='c', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='l', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='l', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='n', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='n', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='r', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 0, quote=, justify='r', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='c', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='c', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='l', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='l', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='n', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='n', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='r', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='"', justify='r', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='c', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='c', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='l', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='l', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='n', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='n', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='r', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='\'', justify='r', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='c', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='c', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='l', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='l', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='n', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='n', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='r', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote='a', justify='r', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='c', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='c', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='l', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='l', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='n', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='n', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='r', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 1, quote=, justify='r', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='c', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='c', na=T)
+[1] "\"a\"" "NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='l', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='l', na=T)
+[1] "\"a\"" "NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='n', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='n', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='r', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='"', justify='r', na=T)
+[1] "\"a\"" " NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='c', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='c', na=T)
+[1] "'a'" "NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='l', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='l', na=T)
+[1] "'a'" "NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='n', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='n', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='r', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='\'', justify='r', na=T)
+[1] "'a'" " NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='c', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='c', na=T)
+[1] "aaa" "NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='l', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='l', na=T)
+[1] "aaa" "NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='n', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='n', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='r', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote='a', justify='r', na=T)
+[1] "aaa" " NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='c', na=F)
+[1] " a " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='c', na=T)
+[1] " a "  "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='l', na=F)
+[1] "a  " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='l', na=T)
+[1] "a  "  "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='n', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='n', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='r', na=F)
+[1] "  a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 3, quote=, justify='r', na=T)
+[1] "  a"  "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='c', na=F)
+[1] "  \"a\"  " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='c', na=T)
+[1] "  \"a\"  " "  NA   "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='l', na=F)
+[1] "\"a\"    " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='l', na=T)
+[1] "\"a\"    " "NA     "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='n', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='n', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='r', na=F)
+[1] "    \"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='"', justify='r', na=T)
+[1] "    \"a\"" "     NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='c', na=F)
+[1] "  'a'  " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='c', na=T)
+[1] "  'a'  " "  NA   "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='l', na=F)
+[1] "'a'    " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='l', na=T)
+[1] "'a'    " "NA     "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='n', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='n', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='r', na=F)
+[1] "    'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='\'', justify='r', na=T)
+[1] "    'a'" "     NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='c', na=F)
+[1] "  aaa  " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='c', na=T)
+[1] "  aaa  " "  NA   "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='l', na=F)
+[1] "aaa    " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='l', na=T)
+[1] "aaa    " "NA     "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='n', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='n', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='r', na=F)
+[1] "    aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote='a', justify='r', na=T)
+[1] "    aaa" "     NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='c', na=F)
+[1] "   a   " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='c', na=T)
+[1] "   a   " " <NA>  "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='l', na=F)
+[1] "a      " NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='l', na=T)
+[1] "a      " "<NA>   "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='n', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='n', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='r', na=F)
+[1] "      a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = 7, quote=, justify='r', na=T)
+[1] "      a" "   <NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='c', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='c', na=T)
+[1] "\"a\" " " NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='l', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='l', na=T)
+[1] "\"a\" " "NA  "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='n', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='n', na=T)
+[1] "\"a\"" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='r', na=F)
+[1] "\"a\"" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='"', justify='r', na=T)
+[1] " \"a\"" "  NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='c', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='c', na=T)
+[1] "'a' " " NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='l', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='l', na=T)
+[1] "'a' " "NA  "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='n', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='n', na=T)
+[1] "'a'" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='r', na=F)
+[1] "'a'" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='\'', justify='r', na=T)
+[1] " 'a'" "  NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='c', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='c', na=T)
+[1] "aaa " " NA "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='l', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='l', na=T)
+[1] "aaa " "NA  "
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='n', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='n', na=T)
+[1] "aaa" "NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='r', na=F)
+[1] "aaa" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote='a', justify='r', na=T)
+[1] " aaa" "  NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='c', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='c', na=T)
+[1] "a "   "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='l', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='l', na=T)
+[1] "a "   "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='n', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='n', na=T)
+[1] "a"    "<NA>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='r', na=F)
+[1] "a" NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString#
+#encodeString(c('a',NA), width = NA, quote=, justify='r', na=T)
+[1] " a"   "<NA>"
 
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testencodeString1#
 #argv <- list(c('1', '2', NA), 0L, '\'', 0L, FALSE); .Internal(encodeString(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))
@@ -24901,6 +26285,89 @@ NULL
 Warning message:
 In formals(argv[[1]]) : argument is not a function
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#.Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.'))
+[1] "<environment: R_GlobalEnv>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=-10)
+[1] "1.1e+00"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=FALSE)
+[1] "1.1"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=TRUE)
+[1] "1.1e+00"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=c(-10, 1))
+Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  :
+  invalid 'scientific' argument
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.1, scientific=c(TRUE, FALSE))
+Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  :
+  invalid 'scientific' argument
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.6000085, digits=7)
+[1] "1.600008"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.6001095, digits=7)
+[1] "1.60011"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(1.60085, digits=5)
+[1] "1.6009"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#Ignored.OutputFormatting#
+#format(1.6011095, digits=7)
+[1] "1.601109"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(4.125e-04, digits=3)
+[1] "0.000412"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(4.135e-04, digits=3)
+[1] "0.000414"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(7)
+[1] "7"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(7.42)
+[1] "7.42"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(9.999999995, digits=10)
+[1] "9.999999995"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(9.999999999995, digits=13); format(9.999999999995, digits=11)
+[1] "9.999999999995"
+[1] "10"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(7,42))
+[1] " 7" "42"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(7.42,42.7))
+[1] " 7.42" "42.70"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(7.42,42.7,NA))
+[1] " 7.42" "42.70" "   NA"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#
+#format(c(9.99951, 13.1), digits=4)
+[1] "10.0" "13.1"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testformat1#Output.IgnoreErrorMessage#
 #argv <- list(structure(c(0, 72.7, 56.4, 72.7, 0, 63.3, 56.4, 63.3, 0), .Dim = c(3L, 3L), .Dimnames = list(c('Girth', 'Height', 'Volume'), c('Girth', 'Height', 'Volume'))), FALSE, 7L, 0L, NULL, 3L, TRUE, NA, "."); .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]], argv[[9]], , argv[[9]]))
 Error in .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]],  :
@@ -26696,6 +28163,33 @@ Error: unexpected '[' in "argv <- list(''(["
 attr(,"Rd_tag")
 [1] "TEXT"
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#
+#Sys.setlocale('LC_CTYPE', 'C'); iconv(c('²a²²','b')); Sys.setlocale('LC_CTYPE', 'UTF-8'); iconv(c('²a²²','b'))
+[1] "C"
+[1] NA  "b"
+[1] "UTF-8"
+[1] "²a²²" "b"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#
+#iconv('foo²²', 'UTF8', 'ASCII')
+[1] NA
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#
+#iconv('foo²²', 'UTF8', 'ASCII', sub='')
+[1] "foo"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#Ignored.Unimplemented#
+#iconv('foo²²', 'UTF8', 'ASCII', sub='byte')
+[1] "foo<c2><b2><c2><b2>"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#
+#iconv('foo²²', 'UTF8', 'ASCII', sub='f')
+[1] "fooffff"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#Ignored.Unimplemented#
+#iconv('foo²²', 'UTF8', 'ASCII', sub='fooooo')
+[1] "foofooooofooooofooooofooooo"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#
 #{ .Internal(iconv("7", "latin1", "ASCII", 42, T, F)) }
 Error: invalid 'sub' argument
@@ -43832,6 +45326,13 @@ Error in options(NA) : invalid argument
 #options(list(NULL));
 Error in options(list(NULL)) : list argument has no valid names
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder#
+#invisible(Sys.setlocale('LC_COLLATE', 'EN_us')); str(as.data.frame(list(a=c('A wo','Far ','abc ')))); invisible(Sys.setlocale('LC_COLLATE', 'C')); str(as.data.frame(list(a=c('A wo','Far ','abc '))));
+'data.frame':	3 obs. of  1 variable:
+ $ a: Factor w/ 3 levels "A wo","abc ",..: 1 3 2
+'data.frame':	3 obs. of  1 variable:
+ $ a: Factor w/ 3 levels "A wo","Far ",..: 1 2 3
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder#
 #order(c('40 50', '405', '40 51', '4028', '40 20', '40 30', '404'))
 [1] 5 6 1 3 4 7 2
@@ -49298,7 +50799,15 @@ Error in rmultinom(1, 1, NULL) : no positive probabilities
 #{ round(1.1234+1i, 3.1+1i); }
 [1] 1.123+1i
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
+#{ round(1.123456,digit=2.3) }
+[1] 1.12
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
+#{ round(1.123456,digit=2.5) }
+[1] 1.123
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
 #{ round(1.123456,digit=2.8) }
 [1] 1.123
 
@@ -49310,6 +50819,18 @@ Error in rmultinom(1, 1, NULL) : no positive probabilities
 #{ round(1/0) }
 [1] Inf
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
+#{ round(12344.123456,digit=-2.3) }
+[1] 12300
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
+#{ round(12344.123456,digit=-2.5) }
+[1] 12300
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
+#{ round(12344.126,digit=-2.8) }
+[1] 12000
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#
 #{ round(1L) }
 [1] 1
@@ -69312,6 +70833,11 @@ In sum(argv[[1]]) : integer overflow - use sum(as.numeric(.))
 #sum( );
 [1] 0
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_summary.testSummary#
+#summary(c(1.601,1.616))
+   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
+  1.601   1.605   1.609   1.609   1.612   1.616
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_summary.testsummary1#Ignored.OutputFormatting#
 #argv <- structure(list(object = structure(c(4L, 4L, 4L, 4L, 4L,     3L, 4L, 4L, 4L, 4L, 3L, 4L, 3L, 4L, 4L, 4L, 4L, 2L, 4L, 3L,     4L, 4L, 4L, 2L), .Dim = c(6L, 4L), .Dimnames = structure(list(c('25-34',     '35-44', '45-54', '55-64', '65-74', '75+'), c('0-39g/day',     '40-79', '80-119', '120+')), .Names = c('', '')), class = 'table')),     .Names = 'object');do.call('summary', argv)
 Number of cases in table: 88
@@ -74127,6 +75653,14 @@ In f() : foo
 Warning message:
 In f() : foo
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning#
+#options(warn=1); f <- function() warning('foo'); f()
+Warning in f() : foo
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning#
+#options(warn=1); f <- function() warning('foo'); f2 <- function() f(); f2()
+Warning in f() : foo
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning#
 #warning('foo')
 Warning message:
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java
index 0d85c13983bd226b426faee46368da5d0a04519a..e054c71b60788326bb17fb7676cf485e902cb1da 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java
@@ -51,8 +51,8 @@ public class TestS4 extends TestRBase {
         assertEval("{ x<-42; slot(x, \".Data\") }");
 
         // disabled because of side effects causing other tests to fail
-        assertEval(Ignored.ImplementationError, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-x@.Data; removeClass(\"foo\"); res }");
-        assertEval(Ignored.ImplementationError, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-slot(x, \".Data\"); removeClass(\"foo\"); res }");
+        assertEval(Ignored.SideEffects, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-x@.Data; removeClass(\"foo\"); res }");
+        assertEval(Ignored.SideEffects, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-slot(x, \".Data\"); removeClass(\"foo\"); res }");
 
         assertEval(Output.IgnoreErrorContext, "{ getClass(\"ClassUnionRepresentation\")@foo }");
         assertEval(Output.IgnoreErrorContext, "{ c(42)@foo }");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java
index bedd0f6b53227c781598001fa35e63bb4713b65e..4c37f829ff859a89fd7aeb5697cdde53896eac4d 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java
@@ -42,9 +42,7 @@ public class TestBuiltin_La extends TestBase {
 
     @Test
     public void testLa4() {
-        // FIXME RInternalError: not implemented: .Internal La_svd
-        assertEval(Ignored.Unimplemented,
-                        "argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))");
+        assertEval("argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))");
     }
 
     @Test
@@ -67,9 +65,7 @@ public class TestBuiltin_La extends TestBase {
 
     @Test
     public void testLa8() {
-        // FIXME RInternalError: not implemented: .Internal La_svd
-        assertEval(Ignored.Unimplemented,
-                        "argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))");
+        assertEval("argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java
index c309948ee3e21f721b0e009da320699eae989429..c5201e71ff258f8289ac4fca78add57bdfc7f271 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java
@@ -60,8 +60,8 @@ public class TestBuiltin_asmatrix extends TestBase {
         assertEval("{ matrix(c(1+1i,2+2i,3+3i,4+4i),2) }");
         assertEval("{ matrix(nrow=2,ncol=2) }");
         assertEval("{ matrix(1:4,2,2) }");
-        assertEval(Ignored.ReferenceError, "{ matrix(1i,10,10) }");
-        assertEval(Ignored.ReferenceError, "{ matrix(c(1i,NA),10,10) }");
+        assertEval("{ matrix(1i,10,10) }");
+        assertEval("{ matrix(c(1i,NA),10,10) }");
         assertEval("{ matrix(c(10+10i,5+5i,6+6i,20-20i),2) }");
         assertEval("{ matrix(c(1i,100i),10,10) }");
         assertEval("{ matrix(1:6, nrow=3,byrow=TRUE)}");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java
index 20fbc5bba758da0032fc387b4528b797258e17af..6d8d3d0603b1eeb5cf07ea4d2857a0794054ad8b 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java
@@ -36,7 +36,7 @@ public class TestBuiltin_dqr extends TestBase {
 
     @Test
     public void testdqrcf() {
-        assertEval(Ignored.OutputFormatting, ".Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L)");
+        assertEval(".Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L)");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java
index 6f0d875ceb61aedff8536e61195001ab6d670712..29a4623970125f5ee95b1fd6c2a7ebcf21e9d8a9 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java
@@ -78,19 +78,11 @@ public class TestBuiltin_encodeString extends TestBase {
 
     @Test
     public void testEncodeString() {
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA);}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, justify = \"right\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, quote = \"'\", justify = \"right\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 0, quote = \"'\", justify = \"right\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 0, quote = \"\", justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 3, quote = \"'\", justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, quote = \"'\", na.encode=FALSE, justify = \"right\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 0, quote = \"'\", na.encode=FALSE, justify = \"right\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 3, quote = \"'\", na.encode=FALSE, justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 2, quote = \"'\", na.encode=FALSE, justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 7, quote = \"\", na.encode=FALSE, justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 7, quote = \"\", na.encode=TRUE, justify = \"centre\");}");
-        assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 3, quote = \"\", na.encode=TRUE, justify = \"centre\");}");
+        String[] strings = new String[]{"c('a','ab','abcde',NA,'\\t\\n\\u1234foo\\\"\\'')", "c('a',NA)"};
+        String[] widths = new String[]{"0", "1", "3", "7", "NA"};
+        String[] quote = new String[]{"'a'", "'\\''", "'\"'", ""};
+        String[] justify = new String[]{"'l'", "'r'", "'c'", "'n'"};
+        String[] naEncode = new String[]{"T", "F"};
+        assertEval(template("encodeString(%0, width = %1, quote=%2, justify=%3, na=%4)", strings, widths, quote, justify, naEncode));
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java
index 80326152032cc3ce626d8515c6e1cd03b8773f53..a05621fb9d16772182e1bc1ba1712193235e1935 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java
@@ -287,17 +287,27 @@ public class TestBuiltin_format extends TestBase {
         assertEval("x <- c(1.0,2.0);names(x) <- c(\"x\",\"y\");argv <- list(x, FALSE, NULL, 0L, NULL, 0L, FALSE, FALSE, \".\");names(.Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]], argv[[9]])))");
     }
 
+    @Test
     public void testFormat() {
-        assertEval("{ format(7) }");
-        assertEval("{ format(7.42) }");
-        assertEval("{ format(c(7,42)) }");
-        assertEval("{ format(c(7.42,42.7)) }");
-        assertEval("{ format(c(7.42,42.7,NA)) }");
-        assertEval("{ .Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.')) }");
-        assertEval("{ format(1.1, scientific=TRUE) }");
-        assertEval("{ format(1.1, scientific=FALSE) }");
-        assertEval("{ format(1.1, scientific=c(TRUE, FALSE)) }");
-        assertEval("{ format(1.1, scientific=-10) }");
-        assertEval("{ format(1.1, scientific=c(-10, 1)) }");
+        assertEval("format(7)");
+        assertEval("format(7.42)");
+        assertEval("format(c(7,42))");
+        assertEval("format(c(7.42,42.7))");
+        assertEval("format(c(7.42,42.7,NA))");
+        assertEval(".Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.'))");
+        assertEval("format(1.1, scientific=TRUE)");
+        assertEval("format(1.1, scientific=FALSE)");
+        assertEval("format(1.1, scientific=c(TRUE, FALSE))");
+        assertEval("format(1.1, scientific=-10)");
+        assertEval("format(1.1, scientific=c(-10, 1))");
+        assertEval("format(c(9.99951, 13.1), digits=4)");
+        assertEval("format(1.60085, digits=5)");
+        assertEval("format(1.6000085, digits=7)");
+        assertEval("format(1.6001095, digits=7)");
+        assertEval(Ignored.OutputFormatting, "format(1.6011095, digits=7)");
+        assertEval("format(4.125e-04, digits=3)");
+        assertEval("format(4.135e-04, digits=3)");
+        assertEval("format(9.999999999995, digits=13); format(9.999999999995, digits=11)");
+        assertEval("format(9.999999995, digits=10)");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java
index b06ef8da33a6fdabcc15fc22b44759eca66e6e7d..9bb79a5737fe67f7dd476bf9b6253da18a1fe47f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java
@@ -79,5 +79,11 @@ public class TestBuiltin_iconv extends TestBase {
         assertEval("{ .Internal(iconv(\"7\", \"latin1\", character(), \"42\", T, F)) }");
         assertEval("{ .Internal(iconv(\"7\", \"latin1\", \"ASCII\", 42, T, F)) }");
         assertEval("{ .Internal(iconv(\"7\", \"latin1\", \"ASCII\", character(), T, F)) }");
+        assertEval("Sys.setlocale('LC_CTYPE', 'C'); iconv(c('²a²²','b')); Sys.setlocale('LC_CTYPE', 'UTF-8'); iconv(c('²a²²','b'))");
+        assertEval("iconv('foo²²', 'UTF8', 'ASCII')");
+        assertEval(Ignored.Unimplemented, "iconv('foo²²', 'UTF8', 'ASCII', sub='byte')");
+        assertEval(Ignored.Unimplemented, "iconv('foo²²', 'UTF8', 'ASCII', sub='fooooo')");
+        assertEval("iconv('foo²²', 'UTF8', 'ASCII', sub='f')");
+        assertEval("iconv('foo²²', 'UTF8', 'ASCII', sub='')");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java
index c9fd1e66c528a19b8c3428e924043b95eb401e2e..5763cc90d503db4d178973cc9159ce6ebe5f1fa8 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java
@@ -164,5 +164,7 @@ public class TestBuiltin_order extends TestBase {
         assertEval("order(c('40 50', '405', '40 51', '4028', '40 20', '40 30', '404'))");
 
         assertEval("order(c(1,2,0), decreasing=NA)");
+
+        assertEval("invisible(Sys.setlocale('LC_COLLATE', 'EN_us')); str(as.data.frame(list(a=c('A wo','Far ','abc ')))); invisible(Sys.setlocale('LC_COLLATE', 'C')); str(as.data.frame(list(a=c('A wo','Far ','abc '))));");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java
index 1101dc9b129c1b46fa0d40ad1ca5fa7bc23745c4..e5981201e3b595f02f0d3b8d867d8e62a2568657 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java
@@ -48,9 +48,12 @@ public class TestBuiltin_round extends TestBase {
         assertEval("{ round(c(0,0.2,NaN,0.6,NA,1)) }");
         assertEval("{ round(as.complex(c(0,0.2,NaN,0.6,NA,1))) }");
 
-        // FIXME: we need to decide whether 2.8 means three digits (GnuR) or two (FastR) when
-        // calling round()
-        assertEval(Ignored.ImplementationError, "{ round(1.123456,digit=2.8) }");
+        assertEval("{ round(1.123456,digit=2.8) }");
+        assertEval("{ round(1.123456,digit=2.5) }");
+        assertEval("{ round(1.123456,digit=2.3) }");
+        assertEval("{ round(12344.126,digit=-2.8) }");
+        assertEval("{ round(12344.123456,digit=-2.5) }");
+        assertEval("{ round(12344.123456,digit=-2.3) }");
 
         assertEval("{ typeof(round(42L)); }");
         assertEval("{ typeof(round(TRUE)); }");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java
index bdd46202cfd8e039ae46b5be09f8b5380c8cd6d1..4005ecd53c17e83c5bade73b380d933bb474080d 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java
@@ -37,4 +37,9 @@ public class TestBuiltin_summary extends TestBase {
         assertEval("argv <- structure(list(object = structure(list(Sepal.Length = c(5.1,     4.9, 4.7, 4.6, 5, 5.4, 4.6, 5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3,     5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5,     5, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5, 5.5, 4.9, 4.4,     5.1, 5, 4.5, 4.4, 5, 5.1, 4.8, 5.1, 4.6, 5.3, 5, 7, 6.4,     6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5, 5.9, 6, 6.1, 5.6,     6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8,     6.7, 6, 5.7, 5.5, 5.5, 5.8, 6, 5.4, 6, 6.7, 6.3, 5.6, 5.5,     5.5, 6.1, 5.8, 5, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 6.3, 5.8,     7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7,     5.8, 6.4, 6.5, 7.7, 7.7, 6, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2,     6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4,     6, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9),     Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9,         3.1, 3.7, 3.4, 3, 3, 4, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4,         3.7, 3.6, 3.3, 3.4, 3, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4,         4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3, 3.4, 3.5, 2.3, 3.2,         3.5, 3.8, 3, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, 2.3,         2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2, 3, 2.2, 2.9, 2.9, 3.1,         3, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3, 2.8, 3,         2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3, 3.4, 3.1, 2.3, 3, 2.5,         2.6, 3, 2.6, 2.3, 2.7, 3, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7,         3, 2.9, 3, 3, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3, 2.5, 2.8,         3.2, 3, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2,         2.8, 3, 2.8, 3, 2.8, 3.8, 2.8, 2.8, 2.6, 3, 3.4, 3.1,         3, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3, 2.5, 3, 3.4, 3),     Petal.Length = c(1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5,         1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7,         1.5, 1.7, 1.5, 1, 1.7, 1.9, 1.6, 1.6, 1.5, 1.4, 1.6,         1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3, 1.5, 1.3,         1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 4.7, 4.5,         4.9, 4, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4, 4.7,         3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4, 4.9, 4.7, 4.3,         4.4, 4.8, 5, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5,         4.7, 4.4, 4.1, 4, 4.4, 4.6, 4, 3.3, 4.2, 4.2, 4.2, 4.3,         3, 4.1, 6, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1,         5.1, 5.3, 5.5, 5, 5.1, 5.3, 5.5, 6.7, 6.9, 5, 5.7, 4.9,         6.7, 4.9, 5.7, 6, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6,         5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9,         5.7, 5.2, 5, 5.2, 5.4, 5.1), Petal.Width = c(0.2, 0.2,         0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1,         0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5,         0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2,         0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3,         0.2, 0.2, 0.2, 0.2, 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6,         1, 1.3, 1.4, 1, 1.5, 1, 1.4, 1.3, 1.4, 1.5, 1, 1.5, 1.1,         1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1, 1.1,         1, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4,         1.2, 1, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1,         1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2, 1.9, 2.1, 2, 2.4,         2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2, 2, 1.8, 2.1, 1.8, 1.8,         1.8, 2.1, 1.6, 1.9, 2, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8,         1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2, 2.3,         1.8), Species = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,         1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,         1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,         1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,         1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,         2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,         2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,         2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L,         3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,         3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,         3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,         3L, 3L, 3L), .Label = c('setosa', 'versicolor', 'virginica'),         class = 'factor')), .Names = c('Sepal.Length', 'Sepal.Width',     'Petal.Length', 'Petal.Width', 'Species'), row.names = c(NA,     -150L), class = 'data.frame')), .Names = 'object');" +
                         "do.call('summary', argv)");
     }
+
+    @Test
+    public void testSummary() {
+        assertEval("summary(c(1.601,1.616))");
+    }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java
index 32105348fa57130763f66c036128cdf7a7b1df13..bfdb68d4c6605342b937132948869c7d43c28705 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2014, Purdue University
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -22,6 +22,8 @@ public class TestBuiltin_warning extends TestBase {
     public void testwarning() {
         assertEval("warning('foo')");
         assertEval("f <- function() warning('foo'); f()");
+        assertEval("options(warn=1); f <- function() warning('foo'); f()");
         assertEval("f <- function() warning('foo'); f2 <- function() f(); f2()");
+        assertEval("options(warn=1); f <- function() warning('foo'); f2 <- function() f(); f2()");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java
index e3311fb6481737378c6d2f478032e554e08fd14b..b03e4a7ac0b900141e3d85fbb33ac7dc3232e026 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java
@@ -30,7 +30,8 @@ import java.nio.CharBuffer;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CodingErrorAction;
 import java.nio.charset.StandardCharsets;
-import java.util.TimeZone;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -113,7 +114,9 @@ public final class FastRSession implements RSession {
 
     public ChildContextInfo createContextInfo(ContextKind contextKind) {
         RStartParams params = new RStartParams(RCmdOptions.parseArguments(Client.R, new String[]{"R", "--vanilla", "--slave", "--silent", "--no-restore"}, false), false);
-        return ChildContextInfo.create(params, null, contextKind, mainContext, input, output, output, TimeZone.getTimeZone("GMT"));
+        Map<String, String> env = new HashMap<>();
+        env.put("TZ", "GMT");
+        return ChildContextInfo.create(params, env, contextKind, mainContext, input, output, output);
     }
 
     private FastRSession() {
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java
index 8c6ba569e21b2e0d0dde22e63cefc4b910037fa3..bc65c7c6312c41b0e8b947e6f27be1bd0cdb6f5a 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java
@@ -86,6 +86,8 @@ public class GnuROneShotRSession implements RSession {
         // fix time zone to "GMT" (to create consistent expected output)
         pb.environment().put("TZ", "GMT");
         pb.environment().remove("R_HOME"); // don't confuse GnuR with FastR!
+        pb.environment().remove("LC_ALL");
+        pb.environment().remove("LC_COLLATE");
         pb.redirectErrorStream(true);
         Process p = pb.start();
         p.getOutputStream().write(GNUR_OPTIONS.getBytes());
diff --git a/mx.fastr/mx_fastr_pkgs.py b/mx.fastr/mx_fastr_pkgs.py
index 83b8f238bb76e900bbfc48565c9688313bb431ec..a505536eba508fd6134f03d5a50c02deca8d5317 100644
--- a/mx.fastr/mx_fastr_pkgs.py
+++ b/mx.fastr/mx_fastr_pkgs.py
@@ -313,8 +313,11 @@ def _get_test_outputs(rvm, pkg_name, test_info):
         for f in files:
             ext = os.path.splitext(f)[1]
             # suppress .pdf's for now (we can't compare them)
-            ignore = ['.R', '.Rin', '.prev', '.bug', '.pdf', '.save']
-            if f == 'test_time' or ext in ignore:
+            # ignore = ['.R', '.Rin', '.prev', '.bug', '.pdf', '.save']
+            # if f == 'test_time' or ext in ignore:
+            #     continue
+            included = ['.Rout', '.fail']
+            if f == 'test_time' or not ext in included:
                 continue
             status = "OK"
             if ext == '.fail':
@@ -498,7 +501,13 @@ def _find_line(gnur_line, fastr_content, fastr_i):
         fastr_i = fastr_i + 1
     return -1
 
+def _replace_engine_references(output):
+    for idx, val in enumerate(output):
+        output[idx] = val.replace('fastr', '<engine>').replace('gnur', '<engine>')
+
 def _fuzzy_compare(gnur_content, fastr_content):
+    _replace_engine_references(gnur_content)
+    _replace_engine_references(fastr_content)
     gnur_start = _find_start(gnur_content)
     gnur_end = _find_end(gnur_content)
     fastr_start = _find_start(fastr_content)