diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java
index 4df7b6905fc49ccf0a9c85da1bd25854a7a25507..75a2ea15c3029a50da3eb3d6002cffa57e7f9501 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java
@@ -44,7 +44,9 @@ final class AttributesPrinter implements ValuePrinter<RAttributable> {
         }
 
         final StringBuilder savedBuffer = printCtx.getTagBuffer();
-        printCtx.resetTagBuffer();
+        if (printCtx.attrDepth() == 0) {
+            printCtx.resetTagBuffer();
+        }
         for (RAttributesLayout.RAttribute a : RAttributesLayout.asIterable(attrs)) {
             if (useSlots && RRuntime.CLASS_SYMBOL.equals(a.getName())) {
                 continue;
@@ -88,22 +90,25 @@ final class AttributesPrinter implements ValuePrinter<RAttributable> {
             } else {
                 tag = String.format("attr(,\"%s\")", a.getName());
             }
-            out.println(tag);
 
             StringBuilder buff = printCtx.getOrCreateTagBuffer();
             int origLen = buff.length();
             buff.append(tag);
-
-            RContext ctx = RContext.getInstance();
-            if (ctx.isMethodTableDispatchOn() && utils.isS4(a.getValue())) {
-                S4ObjectPrinter.printS4(printCtx, a.getValue());
-                // throw new UnsupportedOperationException("TODO");
-            } else {
-                if (a.getValue() instanceof RAttributable && ((RAttributable) a.getValue()).isObject()) {
-                    RContext.getEngine().printResult(ctx, a.getValue());
+            out.println(buff);
+            printCtx.updateAttrDepth(+1);
+            try {
+                RContext ctx = RContext.getInstance();
+                if (ctx.isMethodTableDispatchOn() && utils.isS4(a.getValue())) {
+                    S4ObjectPrinter.printS4(printCtx, a.getValue());
                 } else {
-                    ValuePrinters.INSTANCE.print(a.getValue(), printCtx);
+                    if (a.getValue() instanceof RAttributable && ((RAttributable) a.getValue()).isObject()) {
+                        RContext.getEngine().printResult(ctx, a.getValue());
+                    } else {
+                        ValuePrinters.INSTANCE.print(a.getValue(), printCtx);
+                    }
                 }
+            } finally {
+                printCtx.updateAttrDepth(-1);
             }
 
             // restore tag buffer to its original value
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java
index e4dc0a297c9d59a31b7fe63e5f9df8a7bce5a39f..a021acd4bac26b9657e6ffcd616ded9d13bb87ee 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java
@@ -35,6 +35,7 @@ final class PrintContext {
     private final PrettyPrintWriter out;
     private final Map<String, Object> attrs = new HashMap<>();
     private StringBuilder tagbuf;
+    private int attrDepth;
 
     private static final ThreadLocal<ArrayDeque<PrintContext>> printCtxTL = new ThreadLocal<>();
 
@@ -92,6 +93,15 @@ final class PrintContext {
         attrs.put(attrName, attrValue);
     }
 
+    public int attrDepth() {
+        return attrDepth;
+    }
+
+    public void updateAttrDepth(int attrDepthDiff) {
+        attrDepth += attrDepthDiff;
+        assert (attrDepth >= 0) : "Invalid attrDepth=" + attrDepth;
+    }
+
     public PrintContext cloneContext() {
         PrintContext cloned = new PrintContext(pn, params.cloneParameters(), out);
         cloned.attrs.putAll(attrs);
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 c0d15c5eb83077efeb6892b339c0b28dbaee9538..9ac630fd27319195129f2260540384875c86d636 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
@@ -10746,7 +10746,7 @@ $class
 #argv <- list(c(1000, 1e+07, 1));attributes(argv[[1]]);
 NULL
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_attributes.testattributes23#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_attributes.testattributes23#Ignored.OutputFormatting#
 #argv <- list(structure(list(), .Names = character(0), arguments = structure('object', simpleOnly = TRUE), signatures = list(), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')), class = structure('listOfMethods', package = 'methods')));attributes(argv[[1]]);
 $names
 character(0)
@@ -15842,7 +15842,7 @@ attr(,"class")
 attr(,"class")attr(,"package")
 [1] "methods"
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_classassign.testclassassign18#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_classassign.testclassassign18#Output.IgnoreWhitespace#
 #argv <- list(structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);
 function (x, y = NULL)
 .Internal(crossprod(x, y))
@@ -16728,7 +16728,7 @@ Warning message:
 In format.data.frame(x, digits = digits, na.encode = FALSE) :
   corrupt data frame: columns will be truncated or padded with NAs
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_copyDFattr.testcopyDFattr13#Ignored.ReferenceError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_copyDFattr.testcopyDFattr13#Ignored.ImplementationError#
 #argv <- list(structure(list(x = 1:10, y = c(-0.626453810742332, 0.183643324222082, -0.835628612410047, 1.59528080213779, 0.329507771815361, -0.820468384118015, 0.487429052428485, 0.738324705129217, 0.575781351653492, -0.305388387156356), z = structure(c(9L, 3L, 6L, 2L, 10L, 5L, 1L, 4L, 8L, 7L), .Label = c('a', 'c', 'f', 'h', 'i', 'p', 'v', 'x', 'y', 'z'), class = 'factor')), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv')), structure(list(x = NULL, y = NULL, z = NULL), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv'))); .Internal(copyDFattr(argv[[1]], argv[[2]]))
 $x
 NULL
@@ -35813,7 +35813,7 @@ TRUE
 [1] "2003-10-09 04:00:00 GMT"
 
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist19#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist19#Ignored.OutputFormatting#
 #argv <- list(arguments = structure('object', simpleOnly = TRUE), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')));list(argv[[1]],argv[[2]]);
 [[1]]
 [1] "object"
@@ -36161,7 +36161,7 @@ x@aa[[i]]
 [1] TRUE
 
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist32#Ignored.ImplementationError#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist32#Ignored.OutputFormatting#
 #argv <- list(structure(function (e1, e2) standardGeneric('Ops'), generic = structure('Ops', package = 'base'), package = 'base', group = list(), valueClass = character(0), signature = c('e1', 'e2'), default = quote(`\001NULL\001`), skeleton = quote((function (e1, e2) stop('invalid call in method dispatch to Ops (no default method)', domain = NA))(e1, e2)), groupMembers = list('Arith', 'Compare', 'Logic'), class = structure('groupGenericFunction', package = 'methods')));list(argv[[1]]);
 [[1]]
 function (e1, e2)
@@ -37028,7 +37028,7 @@ attr(,"constant")
 [1] 0.5234843
 
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist65#Output.IgnoreWhitespace#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist65#Output.IgnoreWhitespace#
 #argv <- list(ANY = structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = structure('crossprod', package = 'base'), class = structure('derivedDefaultMethod', package = 'methods')));list(argv[[1]]);
 [[1]]
 function (x, y = NULL)
@@ -45680,7 +45680,7 @@ FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 #argv <- list(structure(c(1208822400, 1208908800, 1208995200, 1209081600, 1209168000, 1209254400), class = c('POSIXct', 'POSIXt'), tzone = 'GMT'), structure(1209168000, class = c('POSIXct', 'POSIXt'), tzone = 'GMT'));`<=`(argv[[1]],argv[[2]]);
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators257#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators257#
 #argv <- list(structure(c(1, 1.4142135623731, 1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459, 2.82842712474619, 3, 3.16227766016838), id = 'test 1', class = structure('withId', package = '.GlobalEnv')), 1);`%%`(argv[[1]],argv[[2]]);
  [1] 0.0000000 0.4142136 0.7320508 0.0000000 0.2360680 0.4494897 0.6457513
  [8] 0.8284271 0.0000000 0.1622777
@@ -46171,7 +46171,7 @@ Error in |argv[[1]] : 1 argument passed to '|' which requires 2
 [1,]  TRUE TRUE
 [2,] FALSE TRUE
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators31#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators31#
 #argv <- list(structure(FALSE, class = structure('foo', package = '.GlobalEnv')), NA);`+`(argv[[1]],argv[[2]]);
 [1] NA
 attr(,"class")
@@ -46884,7 +46884,7 @@ function (x, base = exp(1))  .Primitive("log")
 2 NA  NA     NA NA    NA <NA>
 3  1 2.0 3.0+0i NA  TRUE  def
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators355#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators355#
 #argv <- list(structure(NA, .Dim = c(1L, 1L), name = 'Sam', class = structure('Foo', package = '.GlobalEnv')));`(`(argv[[1]]);
      [,1]
 [1,]   NA
@@ -47939,7 +47939,7 @@ FALSE FALSE FALSE FALSE FALSE FALSE
 gridSVG2
     TRUE
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators9#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators9#
 #argv <- list(structure(1:10, class = structure('NumericNotStructure', package = '.GlobalEnv')), 1);`+`(argv[[1]],argv[[2]]);
  [1]  2  3  4  5  6  7  8  9 10 11
 attr(,"class")
@@ -71502,7 +71502,7 @@ numeric(0)
         ar1         ar2   intercept       trend
 0.100911916 0.103585134 0.246129163 0.008388095
 
-##com.oracle.truffle.r.test.builtins.TestBuiltin_sqrt.testsqrt7#Ignored.OutputFormatting#
+##com.oracle.truffle.r.test.builtins.TestBuiltin_sqrt.testsqrt7#
 #argv <- list(structure(1:10, id = 'test 1', class = structure('withId', package = '.GlobalEnv')));sqrt(argv[[1]]);
  [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
  [9] 3.000000 3.162278
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java
index 778809e2c2a806f00968e4465ce7a58f6ee1fdad..0a5b88ca84a285c9b46903509a4fdfbbedaa65ba 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java
@@ -105,6 +105,10 @@ public class TestR5 extends TestBase {
 
         // list/modify methods
         assertEval("{ clazz <- setRefClass('Foo19R5'); clazz$methods('inexistingMethod') }");
+        // FastR does not output environment info in output while GnuR does:
+        // function (object)
+        // standardGeneric("gen")
+        // <environment: 0x...>
         assertSuppress(Ignored.OutputFormatting, "clazz <- setRefClass('Foo20R5', methods = list(foo = function() NULL)); clazz$methods('foo')");
         assertSuppress("clazz <- setRefClass('Foo21R5', methods = list(foo = function() NULL)); clazz$new()$foo(); clazz$methods(foo = function(x) x); clazz$new()$foo(3)");
 
@@ -128,6 +132,7 @@ public class TestR5 extends TestBase {
         assertSuppress("A1R5 <- setRefClass('A1R5', methods = list(foo = function() { print('hello') })); B1R5 <- setRefClass('B1R5', contains = 'A1R5'); obj <- B1R5$new(); obj$foo()");
         assertSuppress("A2R5 <- setRefClass('A2R5', methods = list(foo = function() { print('hello') })); B2R5 <- setRefClass('B2R5', methods = list(foo = function() { print('world') }), contains = 'A2R5'); obj <- B2R5$new(); obj$foo()");
         assertSuppress("A3R5 <- setRefClass('A3R5', methods = list(foo = function() { print('hello') })); B3R5 <- setRefClass('B3R5', methods = list(foo = function() { callSuper(); print('world') }), contains = 'A3R5'); obj <- B3R5$new(); obj$foo()");
+        // "Class methods sorted differently => Ignored.OutputFormatting
         assertSuppress(Ignored.OutputFormatting, "{ setRefClass('A4R5', fields = c('a')); setRefClass('B4R5', contains = 'A4R5', methods = list(set_a = function(a){ a <<- a })) }");
         assertEval("A5R5 <- setRefClass('A5R5', field = c('a'), methods = list(initialize <- function() { a <<- 0 })); B5R5 <- setRefClass('B5R5', field = c('a'), methods = list(initialize <- function() { a <<- 'hello' })); C5R5 <- setRefClass('C5R5', contains = c('A5R5', 'B5R5')); obj <- C5R5$new(); obj$a <- raw(0)");
     }
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 633c0c63c65d43fbc8c0e5e7db50339f8ff3a86b..06c265e265259c9c24f49bb013144799fca8b1bc 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
@@ -112,6 +112,9 @@ public class TestS4 extends TestRBase {
     @Test
     public void testMethods() {
         // output slightly different from GNU R even though we use R's "show" method to print it
+        // GNU R shows environment info:
+        // function(object) standardGeneric("gen")
+        // <environment: 0x...>
         assertEval(Ignored.OutputFormatting, "{ setGeneric(\"gen\", function(object) standardGeneric(\"gen\")); res<-print(gen); removeGeneric(\"gen\"); res }");
         assertEval(Ignored.OutputFormatting, "{ gen<-function(object) 0; setGeneric(\"gen\"); res<-print(gen); removeGeneric(\"gen\"); res }");
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java
index 7e3bdde2b505a414a1a61b49ed2c9a61da682ed1..ce5e6d262c52e817fa787d4b1a7b92160cbf3d34 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java
@@ -675,42 +675,48 @@ public class TestBase {
                     microTestFailed();
                     if (!ProcessFailedTests || ShowFailedTestsResults) {
                         // Show hint where first diff occurs - use preprocessed text
-                        int len = Math.min(checkResult.expected.length(), checkResult.result.length());
+                        int expectedLen = checkResult.expected.length();
+                        int testLen = checkResult.result.length();
+                        int len = Math.min(expectedLen, testLen);
                         int line = 0;
                         int col = 0;
+                        StringBuilder sb = new StringBuilder(128);
                         for (int i = 0; i < len; i++) {
                             char c = checkResult.expected.charAt(i);
                             if (c != checkResult.result.charAt(i)) {
-                                StringBuilder sb = new StringBuilder(64);
-                                sb.append("index=").append(i).append('[').append(line + 1).append(':').append(col + 1).append("] \"");
-                                int dLen = Math.min(i + 20, len);
-                                for (int j = i; j < dLen; j++) {
-                                    char ch = checkResult.expected.charAt(j);
-                                    switch (ch) {
-                                        case '\n':
-                                            sb.append("\\n");
-                                            break;
-                                        case '\r':
-                                            sb.append("\\r");
-                                            break;
-                                        case '\t':
-                                            sb.append("\\t");
-                                            break;
-                                        case '\b':
-                                            sb.append("\\b");
-                                            break;
-                                        case '\f':
-                                            sb.append("\\f");
-                                            break;
-                                        default:
-                                            sb.append(ch);
+                                sb.append("First different char index: ").append(i).append('[').append(line + 1).append(':').append(col + 1).append("]\n    Expected: ");
+                                for (int type = 0; type <= 1; type++) {
+                                    int maxLen = (type == 0) ? expectedLen : testLen;
+                                    int dLen = Math.min(i + 60, maxLen);
+                                    for (int j = i; j < dLen; j++) {
+                                        char ch = ((type == 0) ? checkResult.expected : checkResult.result).charAt(j);
+                                        switch (ch) {
+                                            case '\n':
+                                                sb.append("\\n");
+                                                break;
+                                            case '\r':
+                                                sb.append("\\r");
+                                                break;
+                                            case '\t':
+                                                sb.append("\\t");
+                                                break;
+                                            case '\b':
+                                                sb.append("\\b");
+                                                break;
+                                            case '\f':
+                                                sb.append("\\f");
+                                                break;
+                                            default:
+                                                sb.append(ch);
+                                        }
+                                    }
+                                    if (dLen < maxLen) {
+                                        sb.append("...");
+                                    }
+                                    if (type == 0) {
+                                        sb.append("\n       FastR: ");
                                     }
                                 }
-                                if (dLen < len) {
-                                    sb.append("...");
-                                }
-                                sb.append('"');
-                                System.err.printf("%16s %s%n", "Prepr.text diff:", sb);
                                 break;
                             }
                             col++;
@@ -719,6 +725,7 @@ public class TestBase {
                                 col = 0;
                             }
                         }
+                        System.err.println(sb);
                     }
 
                     if (inputs.length > 1) {
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java
index d5425ad60c595995c9591d1886dfa45285e53db4..14f523cdfde53f810bec0325381111ffd3ffbc1f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java
@@ -129,8 +129,10 @@ public class TestBuiltin_attributes extends TestBase {
 
     @Test
     public void testattributes23() {
-        // FIXME several differences in output
-        assertEval(Ignored.ImplementationError,
+        // Quotes vs. apostrophes
+        // GnuR: standardGeneric("show")
+        // FastR: standardGeneric('show')
+        assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(list(), .Names = character(0), arguments = structure('object', simpleOnly = TRUE), signatures = list(), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')), class = structure('listOfMethods', package = 'methods')));attributes(argv[[1]]);");
     }
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java
index 4cd74097c70bd35476de9207d4172a73b4f34fc1..2d8fe885a66a6fc743b46658e2289ea24705c064 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -19,7 +19,9 @@ public class TestBuiltin_classassign extends TestBase {
 
     @Test
     public void testclassassign1() {
-        // GnuR: extra newline before '.Ignored' and several 'attr(,"class")'
+        // Quotes vs. apostrophes:
+        // GnuR: function (x, mode = "any")
+        // FastR: function (x, mode = 'any')
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (x, mode = 'any') .Internal(as.vector(x, mode)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
@@ -43,7 +45,9 @@ public class TestBuiltin_classassign extends TestBase {
 
     @Test
     public void testclassassign5() {
-        // GnuR: extra 'attr(,"class")'
+        // FastR does not output the following:
+        // attr(,"class")attr(,"package")
+        // [1] "methods"
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(character(0), .Names = character(0), package = character(0), class = structure('signature', package = 'methods')), value = structure('signature', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
@@ -65,7 +69,9 @@ public class TestBuiltin_classassign extends TestBase {
 
     @Test
     public void testclassassign9() {
-        // GnuR: extra 'attr(,"class")'
+        // FastR does not output the following:
+        // attr(,"class")attr(,"package")
+        // [1] ".GlobalEnv"
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(c(1, 0, 0, 0, 1, 0, 0, 0, 1), .Dim = c(3L, 3L), class = structure('mmat2', package = '.GlobalEnv')), value = structure('mmat2', package = '.GlobalEnv'));`class<-`(argv[[1]],argv[[2]]);");
     }
@@ -91,14 +97,16 @@ public class TestBuiltin_classassign extends TestBase {
 
     @Test
     public void testclassassign13() {
-        // GnuR: extra 'attr(,"class")'
+        // Quotes vs. apostrophes in output
+        // Expected: "qr.fitted")attr(,"target")qr"ANY"attr(,...
+        // FastR: 'qr.fitted')attr(,"target")qr"ANY"attr(,...
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (qr, y, k = qr$rank) standardGeneric('qr.fitted'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'qr', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'qr', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
 
     @Test
     public void testclassassign14() {
-        // GnuR: extra 'attr(,"class")'
+        // Quotes vs. apostrophes in output
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (x = 1, nrow, ncol) standardGeneric('diag'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
@@ -110,28 +118,27 @@ public class TestBuiltin_classassign extends TestBase {
 
     @Test
     public void testclassassign16() {
-        // GnuR: extra 'attr(,"class")'
+        // Quotes vs. apostrophes in output
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (x, y, ...) standardGeneric('plot'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
 
     @Test
     public void testclassassign17() {
-        // GnuR: extra 'attr(,"class")'
+        // Quotes vs. apostrophes in output
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (x, logarithm = TRUE, ...) UseMethod('determinant'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
 
     @Test
     public void testclassassign18() {
-        // GnuR: extra 'attr(,"class")'
-        assertEval(Ignored.OutputFormatting,
+        assertEval(Output.IgnoreWhitespace,
                         "argv <- list(structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
 
     @Test
     public void testclassassign19() {
-        // GnuR: extra 'attr(,"class")'
+        // Quotes vs. apostrophes in output
         assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (obj, force = FALSE) standardGeneric('unname'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'obj', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'obj', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);");
     }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java
index eab5145ae376887c17bb8c306b7c4e2645a03f1a..91d5e42577e88276bdeb5b1599408f48c8f7720f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -82,8 +82,10 @@ public class TestBuiltin_copyDFattr extends TestBase {
 
     @Test
     public void testcopyDFattr13() {
-        // GnuR extra attr(,"class") in output - not sure if appropriate
-        assertEval(Ignored.ReferenceError,
+        // GNU R forces row.names=c(NA, 10L) to become 1 2 3 4 5 6 7 8 9 10
+        // while FastR retains c(NA, 10L)
+        // manual says that row.names should have the same size like vector and do not contain NAs
+        assertEval(Ignored.ImplementationError,
                         "argv <- list(structure(list(x = 1:10, y = c(-0.626453810742332, 0.183643324222082, -0.835628612410047, 1.59528080213779, 0.329507771815361, -0.820468384118015, 0.487429052428485, 0.738324705129217, 0.575781351653492, -0.305388387156356), z = structure(c(9L, 3L, 6L, 2L, 10L, 5L, 1L, 4L, 8L, 7L), .Label = c('a', 'c', 'f', 'h', 'i', 'p', 'v', 'x', 'y', 'z'), class = 'factor')), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv')), structure(list(x = NULL, y = NULL, z = NULL), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv'))); .Internal(copyDFattr(argv[[1]], argv[[2]]))");
     }
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java
index 7b5ffe64deb8b49683d103d3d20bccf3a60bdb27..526022c053c57324511482cbd3024bb1b4f3cf0d 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -114,7 +114,8 @@ public class TestBuiltin_list extends TestBase {
 
     @Test
     public void testlist19() {
-        assertEval(Ignored.ImplementationError,
+        // Quotes vs. apostrophes and whitespace diffs
+        assertEval(Ignored.OutputFormatting,
                         "argv <- list(arguments = structure('object', simpleOnly = TRUE), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')));list(argv[[1]],argv[[2]]);");
     }
 
@@ -181,7 +182,8 @@ public class TestBuiltin_list extends TestBase {
 
     @Test
     public void testlist32() {
-        assertEval(Ignored.ImplementationError,
+        // Quotes vs. apostrophes and whitespace diffs
+        assertEval(Ignored.OutputFormatting,
                         "argv <- list(structure(function (e1, e2) standardGeneric('Ops'), generic = structure('Ops', package = 'base'), package = 'base', group = list(), valueClass = character(0), signature = c('e1', 'e2'), default = quote(`\\001NULL\\001`), skeleton = quote((function (e1, e2) stop('invalid call in method dispatch to Ops (no default method)', domain = NA))(e1, e2)), groupMembers = list('Arith', 'Compare', 'Logic'), class = structure('groupGenericFunction', package = 'methods')));list(argv[[1]]);");
     }
 
@@ -342,12 +344,7 @@ public class TestBuiltin_list extends TestBase {
 
     @Test
     public void testlist65() {
-        // FIXME Besides whitespace diff in "function (x, y..." output there's
-        // at several places e.g. after '[1] "signature"' GnuR outputs
-        // attr(,"class")attr(,"package")
-        // while FastR outputs just
-        // attr(,"package")
-        assertEval(Output.IgnoreWhitespace, Ignored.OutputFormatting,
+        assertEval(Output.IgnoreWhitespace,
                         "argv <- list(ANY = structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = structure('crossprod', package = 'base'), class = structure('derivedDefaultMethod', package = 'methods')));list(argv[[1]]);");
     }
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java
index 26b615f6c3acf80d6ac4057e0c3500c8138d7d37..264dc766209354b3b3f1d30bac00c647d1dfe7c8 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java
@@ -60,13 +60,7 @@ public class TestBuiltin_operators extends TestBase {
 
     @Test
     public void testoperators9() {
-        // FIXME GnuR outputs extra 'attr(,"class")' for the following:
-        // [1] "NumericNotStructure"
-        // attr(,"class")attr(,"package")
-        // FastR outputs
-        // [1] "NumericNotStructure"
-        // attr(,"package")
-        assertEval(Ignored.OutputFormatting, "argv <- list(structure(1:10, class = structure('NumericNotStructure', package = '.GlobalEnv')), 1);`+`(argv[[1]],argv[[2]]);");
+        assertEval("argv <- list(structure(1:10, class = structure('NumericNotStructure', package = '.GlobalEnv')), 1);`+`(argv[[1]],argv[[2]]);");
     }
 
     @Test
@@ -176,13 +170,7 @@ public class TestBuiltin_operators extends TestBase {
 
     @Test
     public void testoperators31() {
-        // FIXME GnuR outputs extra 'attr(,"class")' for the following:
-        // [1] "foo"
-        // attr(,"class")attr(,"package")
-        // FastR outputs
-        // [1] "foo"
-        // attr(,"package")
-        assertEval(Ignored.OutputFormatting, "argv <- list(structure(FALSE, class = structure('foo', package = '.GlobalEnv')), NA);`+`(argv[[1]],argv[[2]]);");
+        assertEval("argv <- list(structure(FALSE, class = structure('foo', package = '.GlobalEnv')), NA);`+`(argv[[1]],argv[[2]]);");
     }
 
     @Test
@@ -1308,14 +1296,7 @@ public class TestBuiltin_operators extends TestBase {
 
     @Test
     public void testoperators257() {
-        // FIXME GnuR outputs extra 'attr(,"class")' for the following:
-        // [1] "withId"
-        // attr(,"class")attr(,"package")
-        // FastR outputs
-        // [1] "withId"
-        // attr(,"package")
-        assertEval(Ignored.OutputFormatting,
-                        "argv <- list(structure(c(1, 1.4142135623731, 1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459, 2.82842712474619, 3, 3.16227766016838), id = 'test 1', class = structure('withId', package = '.GlobalEnv')), 1);`%%`(argv[[1]],argv[[2]]);");
+        assertEval("argv <- list(structure(c(1, 1.4142135623731, 1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459, 2.82842712474619, 3, 3.16227766016838), id = 'test 1', class = structure('withId', package = '.GlobalEnv')), 1);`%%`(argv[[1]],argv[[2]]);");
     }
 
     @Test
@@ -1832,13 +1813,7 @@ public class TestBuiltin_operators extends TestBase {
 
     @Test
     public void testoperators355() {
-        // FIXME GnuR outputs extra 'attr(,"class")' for the following:
-        // [1] "Foo"
-        // attr(,"class")attr(,"package")
-        // FastR outputs
-        // [1] "Foo"
-        // attr(,"package")
-        assertEval(Ignored.OutputFormatting, "argv <- list(structure(NA, .Dim = c(1L, 1L), name = 'Sam', class = structure('Foo', package = '.GlobalEnv')));`(`(argv[[1]]);");
+        assertEval("argv <- list(structure(NA, .Dim = c(1L, 1L), name = 'Sam', class = structure('Foo', package = '.GlobalEnv')));`(`(argv[[1]]);");
     }
 
     @Test
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java
index 05d9ab1503af4b5050944b0b305e6c6516595cd7..910e69287b4a5d667f5a6698abc4b6a973175dc1 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2014, Purdue University
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -104,7 +104,6 @@ public class TestBuiltin_setS4Object extends TestBase {
         // length of 'dimnames' [1] not equal to array extent
 
         // FastR uses apostrophes to quote string: function (object) cat('I am a \'foo\'\n')
-        // GnuR outputs several attr(,"class")attr(,"package") while GnuR just attr(,"package")
         assertEval(Ignored.ImplementationError,
                         "argv <- list(structure(list(`NA` = structure(function (object) cat('I am a \\\'foo\\\'\\n'), target = structure('foo', .Names = 'object', package = 'myTst', class = structure('signature', package = 'methods')), defined = structure('foo', .Names = 'object', package = 'myTst', class = structure('signature', package = 'methods')), generic = structure('show', package = 'methods'), class = structure('MethodDefinition', package = 'methods'))), .Names = NA_character_, arguments = structure('object', simpleOnly = TRUE), signatures = list(), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')), class = structure('listOfMethods', package = 'methods')), TRUE, 0L); .Internal(setS4Object(argv[[1]], argv[[2]], argv[[3]]))");
     }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java
index cc75851fa2cb41368f94ef8fa984ccec610f710d..99e9165c19d1c0af3dc4372a0375afe906d205e3 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -49,11 +49,7 @@ public class TestBuiltin_sqrt extends TestBase {
 
     @Test
     public void testsqrt7() {
-        // FIXME GnuR outputs
-        // attr(,"class")attr(,"package")
-        // while FastR outputs just
-        // attr(,"package")
-        assertEval(Ignored.OutputFormatting, "argv <- list(structure(1:10, id = 'test 1', class = structure('withId', package = '.GlobalEnv')));sqrt(argv[[1]]);");
+        assertEval("argv <- list(structure(1:10, id = 'test 1', class = structure('withId', package = '.GlobalEnv')));sqrt(argv[[1]]);");
     }
 
     @Test