diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java
index 3afaee6ca7f692e6b86148c1165ee05d18b886c1..09f92a36fd485e1cb5a0d73873a393f98a9f98af 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/color/Col2RGB.java
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1997-2014, The R Core Team
  * Copyright (c) 2003, The R Foundation
- * Copyright (c) 2017, Oracle and/or its affiliates
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -27,7 +27,7 @@ import com.oracle.truffle.r.library.fastrGrid.GridColorUtils;
 import com.oracle.truffle.r.library.fastrGrid.GridContext;
 import com.oracle.truffle.r.library.fastrGrid.GridState.GridPalette;
 import com.oracle.truffle.r.library.fastrGrid.device.GridColor;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 import com.oracle.truffle.r.nodes.function.opt.ShareObjectNode;
 import com.oracle.truffle.r.runtime.RError.Message;
@@ -59,7 +59,7 @@ public abstract class Col2RGB extends RExternalBuiltinNode.Arg2 {
     @Specialization
     @TruffleBoundary
     Object execute(RAbstractVector col, boolean alpha,
-                    @Cached("create()") GetNamesAttributeNode getNames) {
+                    @Cached("create()") ExtractNamesAttributeNode extractNames) {
         int length = col.getLength();
         int columns = alpha ? 4 : 3;
         int[] result = new int[length * columns];
@@ -108,7 +108,7 @@ public abstract class Col2RGB extends RExternalBuiltinNode.Arg2 {
             Arrays.fill(result, RRuntime.INT_NA);
         }
 
-        RStringVector names = getNames.getNames(col);
+        RStringVector names = extractNames.execute(col);
         RList dimNames = RDataFactory.createList(new Object[]{alpha ? NAMES_ALPHA : NAMES, names == null ? RNull.instance : names});
         return RDataFactory.createIntVector(result, false, new int[]{columns, length}, null, dimNames);
     }
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java
index ad560f471c1f8e794e525b770770c2932c34fbe6..d503a383abb3361671aec1bb5aaacf94d36d3425 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Covcor.java
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1995-2012, The R Core Team
  * Copyright (c) 2003, The R Foundation
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RShareable;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.nodes.GetReadonlyData;
 import com.oracle.truffle.r.runtime.nmath.RMath;
@@ -795,6 +796,9 @@ public abstract class Covcor extends RExternalBuiltinNode.Arg4 {
                 if (dimNames != null) {
                     Object names = dimNames.getDataAt(1);
                     if (names != RNull.instance) {
+                        if (names instanceof RShareable && !((RShareable) names).isShared()) {
+                            ((RShareable) names).incRefCount();
+                        }
                         newDimNames = RDataFactory.createList(new Object[]{names, names});
                     }
                 }
@@ -804,6 +808,12 @@ public abstract class Covcor extends RExternalBuiltinNode.Arg4 {
                 Object namesX = dimNamesX.getLength() >= 2 ? dimNamesX.getDataAt(1) : RNull.instance;
                 Object namesY = dimNamesY.getLength() >= 2 ? dimNamesY.getDataAt(1) : RNull.instance;
                 if (namesX != RNull.instance || namesY != RNull.instance) {
+                    if (namesX instanceof RShareable && !((RShareable) namesX).isShared()) {
+                        ((RShareable) namesX).incRefCount();
+                    }
+                    if (namesY instanceof RShareable && !((RShareable) namesY).isShared()) {
+                        ((RShareable) namesY).incRefCount();
+                    }
                     newDimNames = RDataFactory.createList(new Object[]{namesX, namesY});
                 }
             }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java
index 2bf26e03612ee11a3c3458c7f959dc8a0e4622bf..7139930df041522007009b725c638afec6a756a6 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AsCall.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, 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
@@ -72,12 +72,12 @@ public abstract class AsCall extends RBuiltinNode.Arg1 {
 
     private ArgumentsSignature createSignature(RAbstractContainer x) {
         int length = x.getLength() - 1;
-        if (nullNamesProfile.profile(getNamesNode.getNames(x) == null)) {
+        RStringVector ns = getNamesNode.getNames(x);
+        if (nullNamesProfile.profile(ns == null)) {
             return ArgumentsSignature.empty(length);
         } else {
             String[] names = new String[length];
             // extract names, converting "" to null
-            RStringVector ns = getNamesNode.getNames(x);
             for (int i = 0; i < length; i++) {
                 String name = ns.getDataAt(i + 1);
                 if (name != null && !name.isEmpty()) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java
index 33364751766bc9dd9cd61da732615d77464bd0bb..165ad928eaa36e1efebf1232f3bd27e18f9670b2 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, 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
@@ -39,7 +39,7 @@ import com.oracle.truffle.r.nodes.RASTUtils;
 import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
@@ -154,7 +154,7 @@ public abstract class Bind extends RBaseNode {
     }
 
     private Object bindInternal(int deparseLevel, Object[] args, RArgsValuesAndNames promiseArgs, CastNode castNode, boolean needsVectorCast, SetDimAttributeNode setDimNode,
-                    GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) {
+                    GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) {
         ArgumentsSignature signature = promiseArgs.getSignature();
         String[] vecNames = nullNamesProfile.profile(signature.getNonNullCount() == 0) ? null : new String[signature.getLength()];
         RAbstractVector[] vectors = new RAbstractVector[args.length];
@@ -205,10 +205,10 @@ public abstract class Bind extends RBaseNode {
 
         if (type == BindType.cbind) {
             return genericCBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, deparseLevel, setDimNode, getDimNamesNode,
-                            getNamesNode);
+                            extractNamesNode);
         } else {
             return genericRBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, deparseLevel, setDimNode, getDimNamesNode,
-                            getNamesNode);
+                            extractNamesNode);
         }
     }
 
@@ -236,8 +236,8 @@ public abstract class Bind extends RBaseNode {
                     @Cached("create()") CastLogicalNode cast,
                     @Cached("create()") SetDimAttributeNode setDimNode,
                     @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
-        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode);
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
+        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode);
     }
 
     @Specialization(guards = {"precedence == INT_PRECEDENCE", "args.length > 1"})
@@ -245,8 +245,8 @@ public abstract class Bind extends RBaseNode {
                     @Cached("create()") CastIntegerNode cast,
                     @Cached("create()") SetDimAttributeNode setDimNode,
                     @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
-        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode);
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
+        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode);
     }
 
     @Specialization(guards = {"precedence == DOUBLE_PRECEDENCE", "args.length > 1"})
@@ -254,8 +254,8 @@ public abstract class Bind extends RBaseNode {
                     @Cached("create()") CastDoubleNode cast,
                     @Cached("create()") SetDimAttributeNode setDimNode,
                     @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
-        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode);
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
+        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode);
     }
 
     @Specialization(guards = {"precedence == STRING_PRECEDENCE", "args.length> 1"})
@@ -263,8 +263,8 @@ public abstract class Bind extends RBaseNode {
                     @Cached("create()") CastStringNode cast,
                     @Cached("create()") SetDimAttributeNode setDimNode,
                     @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
-        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode);
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
+        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode);
     }
 
     @Specialization(guards = {"precedence == COMPLEX_PRECEDENCE", "args.length > 1"})
@@ -272,8 +272,8 @@ public abstract class Bind extends RBaseNode {
                     @Cached("create()") CastComplexNode cast,
                     @Cached("create()") SetDimAttributeNode setDimNode,
                     @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
-        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, getNamesNode);
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
+        return bindInternal(deparseLevel, args, promiseArgs, cast, true, setDimNode, getDimNamesNode, extractNamesNode);
     }
 
     @Specialization(guards = {"precedence == LIST_PRECEDENCE", "args.length > 1"})
@@ -281,15 +281,15 @@ public abstract class Bind extends RBaseNode {
                     @Cached("create()") CastListNode cast,
                     @Cached("create()") SetDimAttributeNode setDimNode,
                     @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
-        return bindInternal(deparseLevel, args, promiseArgs, cast, false, setDimNode, getDimNamesNode, getNamesNode);
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
+        return bindInternal(deparseLevel, args, promiseArgs, cast, false, setDimNode, getDimNamesNode, extractNamesNode);
     }
 
     /**
      * Compute dimnames for rows (cbind) or columns (rbind) from names of elements of combined
      * vectors.
      */
-    protected Object getDimResultNamesFromElements(RAbstractVector vec, int dimLength, int dimInd, GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) {
+    protected Object getDimResultNamesFromElements(RAbstractVector vec, int dimLength, int dimInd, GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) {
         Object firstDimResultNames = RNull.instance;
         Object firstDimNames = RNull.instance;
         int[] dim = getVectorDimensions(vec);
@@ -300,7 +300,7 @@ public abstract class Bind extends RBaseNode {
             }
         } else {
             if (!GetDimAttributeNode.isArray(dim) || dim.length == 1) {
-                RStringVector names = getNamesNode.getNames(vec);
+                RStringVector names = extractNamesNode.execute(vec);
                 firstDimNames = names == null ? RNull.instance : names;
             } else {
                 RInternalError.unimplemented("binding multi-dimensional arrays is not supported");
@@ -436,7 +436,7 @@ public abstract class Bind extends RBaseNode {
 
     @Specialization(guards = {"precedence != NO_PRECEDENCE", "args.length == 1"})
     protected Object allOneElem(int deparseLevel, Object[] args, RArgsValuesAndNames promiseArgs, @SuppressWarnings("unused") int precedence,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
 
         RAbstractVector vec = vectorProfile.profile(castVector(args[0]));
         int[] rawDimensions = null;
@@ -447,7 +447,7 @@ public abstract class Bind extends RBaseNode {
 
         // for cbind dimNamesA is names for the 1st dim and dimNamesB is names for 2nd dim; for
         // rbind the other way around
-        Object dimNamesA = getNamesNode.getNames(vec);
+        Object dimNamesA = extractNamesNode.execute(vec);
         if (dimNamesA == null) {
             dimNamesA = RNull.instance;
         }
@@ -480,7 +480,7 @@ public abstract class Bind extends RBaseNode {
 
     public RVector<?> genericCBind(RArgsValuesAndNames promiseArgs, RAbstractVector[] vectors, RVector<?> result, int[] resultDimensions, int[] secondDims, boolean rowsAndColumnsNotEqual,
                     boolean allEmpty, String[] vecNames, int deparseLevel, SetDimAttributeNode setDimNode,
-                    GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) {
+                    GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) {
 
         int ind = 0;
         Object rowDimResultNames = RNull.instance;
@@ -491,7 +491,7 @@ public abstract class Bind extends RBaseNode {
             RAbstractVector vec = vectorProfile.profile(vectors[i]);
             if (rowDimResultNames == RNull.instance) {
                 // get the first valid names value
-                rowDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[0], 0, getDimNamesNode, getNamesNode);
+                rowDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[0], 0, getDimNamesNode, extractNamesNode);
             }
 
             // compute dimnames for the second dimension
@@ -662,7 +662,7 @@ public abstract class Bind extends RBaseNode {
 
     public RVector<?> genericRBind(RArgsValuesAndNames promiseArgs, RAbstractVector[] vectors, RVector<?> result, int[] resultDimensions, int[] firstDims, boolean rowsAndColumnsNotEqual,
                     boolean allEmpty, String[] vecNames, int deparseLevel, SetDimAttributeNode setDimNode,
-                    GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) {
+                    GetDimNamesAttributeNode getDimNamesNode, ExtractNamesAttributeNode extractNamesNode) {
 
         Object colDimResultNames = RNull.instance;
         String[] rowDimNamesArray = new String[resultDimensions[0]];
@@ -673,7 +673,7 @@ public abstract class Bind extends RBaseNode {
             RAbstractVector vec = vectorProfile.profile(vectors[i]);
             if (colDimResultNames == RNull.instance) {
                 // get the first valid names value
-                colDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[1], 1, getDimNamesNode, getNamesNode);
+                colDimResultNames = getDimResultNamesFromElements(vec, resultDimensions[1], 1, getDimNamesNode, extractNamesNode);
             }
 
             // compute dimnames for the second dimension
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java
index deb22fedc6ec8eb660b1ac3195d127d86619fe9c..874f8e320fef45f3adb59da7f008c49b2a4d5e44 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Combine.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -49,7 +49,8 @@ import com.oracle.truffle.api.nodes.NodeCost;
 import com.oracle.truffle.api.profiles.BranchProfile;
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.api.profiles.ValueProfile;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.unary.CastComplexNodeGen;
@@ -479,8 +480,8 @@ public abstract class Combine extends RBuiltinNode.Arg2 {
 
     protected static final class CombineInputCast extends Node {
 
-        @Child private GetDimNamesAttributeNode getDimNamesNode;
-        @Child private GetNamesAttributeNode getNamesNode;
+        @Child private ExtractDimNamesAttributeNode extractDimNamesNode;
+        @Child private ExtractNamesAttributeNode extractNamesNode;
 
         private final ValueProfile valueProfile = ValueProfile.createClassProfile();
         private final ValueProfile inputValueProfile = ValueProfile.createClassProfile();
@@ -493,29 +494,29 @@ public abstract class Combine extends RBuiltinNode.Arg2 {
             if (profiled instanceof RVector<?>) {
                 RVector<?> vector = (RVector<?>) profiled;
                 if (vector.getAttributes() != null) {
-                    if (getNamesNode == null) {
+                    if (extractNamesNode == null) {
                         CompilerDirectives.transferToInterpreterAndInvalidate();
-                        getNamesNode = insert(GetNamesAttributeNode.create());
+                        extractNamesNode = insert(ExtractNamesAttributeNode.create());
                     }
                     if (hasNamesProfile == null) {
                         CompilerDirectives.transferToInterpreterAndInvalidate();
                         hasNamesProfile = ConditionProfile.createBinaryProfile();
                     }
-                    RStringVector vecNames = getNamesNode.getNames(vector);
+                    RStringVector vecNames = extractNamesNode.execute(vector);
                     if (hasNamesProfile.profile(vecNames != null)) {
                         RVector<?> result = vector.copyDropAttributes();
                         result.initAttributes(RAttributesLayout.createNames(vecNames));
                         return result;
                     } else {
-                        if (getDimNamesNode == null) {
+                        if (extractDimNamesNode == null) {
                             CompilerDirectives.transferToInterpreterAndInvalidate();
-                            getDimNamesNode = insert(GetDimNamesAttributeNode.create());
+                            extractDimNamesNode = insert(ExtractDimNamesAttributeNode.create());
                         }
                         if (hasDimNamesProfile == null) {
                             CompilerDirectives.transferToInterpreterAndInvalidate();
                             hasDimNamesProfile = ConditionProfile.createBinaryProfile();
                         }
-                        RList dimNames = getDimNamesNode.getDimNames(vector);
+                        RList dimNames = extractDimNamesNode.execute(vector);
                         if (hasDimNamesProfile.profile(dimNames != null)) {
                             RVector<?> result = vector.copyDropAttributes();
                             result.initAttributes(RAttributesLayout.createDimNames(dimNames));
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java
index b21e15c0bcfccc12fd6186f06637d87390850e3c..37f7e4ef581c20c6d95e0b220ecc7bc914b7d392 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMax.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.
  */
@@ -25,7 +25,7 @@ import java.util.Arrays;
 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.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -44,7 +44,7 @@ import com.oracle.truffle.r.runtime.ops.na.NACheck;
 public abstract class CumMax extends RBuiltinNode.Arg1 {
 
     private final NACheck na = NACheck.create();
-    @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create();
 
     static {
         Casts casts = new Casts(CumMax.class);
@@ -110,7 +110,7 @@ public abstract class CumMax extends RBuiltinNode.Arg1 {
             }
             cmaxV[i] = max;
         }
-        return RDataFactory.createDoubleVector(cmaxV, na.neverSeenNA(), getNamesNode.getNames(v));
+        return RDataFactory.createDoubleVector(cmaxV, na.neverSeenNA(), extractNamesNode.execute(v));
     }
 
     @Specialization(replaces = "cummaxIntSequence")
@@ -131,6 +131,6 @@ public abstract class CumMax extends RBuiltinNode.Arg1 {
             }
             cmaxV[i] = max;
         }
-        return RDataFactory.createIntVector(cmaxV, na.neverSeenNA(), getNamesNode.getNames(v));
+        return RDataFactory.createIntVector(cmaxV, na.neverSeenNA(), extractNamesNode.execute(v));
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java
index c558b2df55593104dfa129c01f52fedb1118e3a6..8f3f91ee46b8c53d41f44164ccd4d814b8039a2d 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumMin.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.
  */
@@ -25,7 +25,7 @@ import java.util.Arrays;
 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.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -44,7 +44,7 @@ import com.oracle.truffle.r.runtime.ops.na.NACheck;
 public abstract class CumMin extends RBuiltinNode.Arg1 {
 
     private final NACheck na = NACheck.create();
-    @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create();
 
     static {
         Casts casts = new Casts(CumMin.class);
@@ -110,7 +110,7 @@ public abstract class CumMin extends RBuiltinNode.Arg1 {
             }
             cminV[i] = min;
         }
-        return RDataFactory.createDoubleVector(cminV, na.neverSeenNA(), getNamesNode.getNames(v));
+        return RDataFactory.createDoubleVector(cminV, na.neverSeenNA(), extractNamesNode.execute(v));
     }
 
     @Specialization(replaces = "cumminIntSequence")
@@ -131,6 +131,6 @@ public abstract class CumMin extends RBuiltinNode.Arg1 {
             }
             cminV[i] = min;
         }
-        return RDataFactory.createIntVector(cminV, na.neverSeenNA(), getNamesNode.getNames(v));
+        return RDataFactory.createIntVector(cminV, na.neverSeenNA(), extractNamesNode.execute(v));
     }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java
index c89d7c817a7af2462be489289b92eece6e822f67..a54fc11fc16cca93fd804c4f7786395fdfb300bf 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumProd.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.
  */
@@ -21,7 +21,7 @@ import java.util.Arrays;
 
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -31,6 +31,8 @@ import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RShareable;
+import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
@@ -40,12 +42,12 @@ import com.oracle.truffle.r.runtime.ops.BinaryArithmetic;
 @RBuiltin(name = "cumprod", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE)
 public abstract class CumProd extends RBuiltinNode.Arg1 {
 
-    @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create();
     @Child private BinaryArithmetic mul = BinaryArithmetic.MULTIPLY.createOperation();
 
     static {
         Casts casts = new Casts(CumProd.class);
-        casts.arg("x").allowNull().mustBe(missingValue().not(), RError.Message.ARGUMENT_EMPTY, 0, "cumsum", 1).mapIf(complexValue().not(), asDoubleVector(true, false, false));
+        casts.arg("x").allowNull().mustBe(missingValue().not(), RError.Message.ARGUMENT_EMPTY, 0, "cumprod", 1).mapIf(complexValue().not(), asDoubleVector(true, false, false));
     }
 
     @Specialization
@@ -78,7 +80,7 @@ public abstract class CumProd extends RBuiltinNode.Arg1 {
                 assert !RRuntime.isNA(prev) : "double multiplication should not introduce NAs";
                 array[iter.getIndex()] = prev;
             }
-            return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x));
+            return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x));
         }
     }
 
@@ -105,7 +107,7 @@ public abstract class CumProd extends RBuiltinNode.Arg1 {
                 array[iter.getIndex() * 2] = prev.getRealPart();
                 array[iter.getIndex() * 2 + 1] = prev.getImaginaryPart();
             }
-            return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x));
+            return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x));
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java
index a84d226b6aa3e719e9a0865df57368ac10a44e67..649244b6678a969e8a25d511ec4e97c5531d95e5 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/CumSum.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -38,7 +38,7 @@ import java.util.Arrays;
 
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -49,6 +49,8 @@ import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RIntVector;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RShareable;
+import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
@@ -60,7 +62,7 @@ import com.oracle.truffle.r.runtime.ops.BinaryArithmetic;
 @RBuiltin(name = "cumsum", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE)
 public abstract class CumSum extends RBuiltinNode.Arg1 {
 
-    @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create();
     @Child private BinaryArithmetic add = BinaryArithmetic.ADD.createOperation();
 
     static {
@@ -86,17 +88,17 @@ public abstract class CumSum extends RBuiltinNode.Arg1 {
 
     @Specialization(guards = "x.getLength()==0")
     protected RAbstractVector cumEmpty(RAbstractComplexVector x) {
-        return RDataFactory.createComplexVector(new double[0], true, getNamesNode.getNames(x));
+        return RDataFactory.createComplexVector(new double[0], true, extractNamesNode.execute(x));
     }
 
     @Specialization(guards = "x.getLength()==0")
     protected RAbstractVector cumEmpty(RAbstractDoubleVector x) {
-        return RDataFactory.createDoubleVector(new double[0], true, getNamesNode.getNames(x));
+        return RDataFactory.createDoubleVector(new double[0], true, extractNamesNode.execute(x));
     }
 
     @Specialization(guards = "x.getLength()==0")
     protected RAbstractVector cumEmpty(RAbstractIntVector x) {
-        return RDataFactory.createIntVector(new int[0], true, getNamesNode.getNames(x));
+        return RDataFactory.createIntVector(new int[0], true, extractNamesNode.execute(x));
     }
 
     @Specialization(guards = "xAccess.supports(x)")
@@ -119,7 +121,7 @@ public abstract class CumSum extends RBuiltinNode.Arg1 {
                 }
                 array[iter.getIndex()] = prev;
             }
-            return RDataFactory.createIntVector(array, xAccess.na.neverSeenNA() && !add.introducesNA(), getNamesNode.getNames(x));
+            return RDataFactory.createIntVector(array, xAccess.na.neverSeenNA() && !add.introducesNA(), extractNamesNode.execute(x));
         }
     }
 
@@ -148,7 +150,7 @@ public abstract class CumSum extends RBuiltinNode.Arg1 {
                 assert !RRuntime.isNA(prev) : "double addition should not introduce NAs";
                 array[iter.getIndex()] = prev;
             }
-            return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x));
+            return RDataFactory.createDoubleVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x));
         }
     }
 
@@ -175,7 +177,7 @@ public abstract class CumSum extends RBuiltinNode.Arg1 {
                 array[iter.getIndex() * 2] = prev.getRealPart();
                 array[iter.getIndex() * 2 + 1] = prev.getImaginaryPart();
             }
-            return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), getNamesNode.getNames(x));
+            return RDataFactory.createComplexVector(array, xAccess.na.neverSeenNA(), extractNamesNode.execute(x));
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java
index 37d8da2fa8707921e44f38ef3b1093974fe2838c..0f70cd2f0de9e97467f409bfaff47d53d1389d2d 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsNA.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -33,8 +33,8 @@ import com.oracle.truffle.api.dsl.ImportStatic;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
@@ -59,8 +59,8 @@ public abstract class IsNA extends RBuiltinNode.Arg1 {
 
     @Child private VectorFactory factory = VectorFactory.create();
     @Child private GetDimAttributeNode getDimsNode = GetDimAttributeNode.create();
-    @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
-    @Child private GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNamesNode = ExtractNamesAttributeNode.create();
+    @Child private ExtractDimNamesAttributeNode extractDimNamesNode = ExtractDimNamesAttributeNode.create();
 
     static {
         Casts.noCasts(IsNA.class);
@@ -143,7 +143,7 @@ public abstract class IsNA extends RBuiltinNode.Arg1 {
                 }
                 data[iter.getIndex()] = RRuntime.asLogical(isNA);
             }
-            return factory.createLogicalVector(data, RDataFactory.COMPLETE_VECTOR, getDimsNode.getDimensions(vector), getNamesNode.getNames(vector), getDimNamesNode.getDimNames(vector));
+            return factory.createLogicalVector(data, RDataFactory.COMPLETE_VECTOR, getDimsNode.getDimensions(vector), extractNamesNode.execute(vector), extractDimNamesNode.execute(vector));
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java
index 6c7d0b0488098623f3dbabf3e319dc1b7368bb0c..d13b44e5c9c3c93526c95a9cc2a1eaffe2b81e77 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.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.
  */
@@ -32,7 +32,7 @@ import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode;
 import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
 import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
 import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNodeGen;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.builtin.base.LapplyNodeGen.LapplyInternalNodeGen;
 import com.oracle.truffle.r.nodes.control.RLengthNode;
@@ -84,10 +84,10 @@ public abstract class Lapply extends RBuiltinNode.Arg2 {
 
     @Specialization
     protected Object lapply(VirtualFrame frame, RAbstractVector vec, RFunction fun,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
         Object[] result = lapply.execute(frame, vec, fun);
         // set here else it gets overridden by the iterator evaluation
-        return RDataFactory.createList(result, getNamesNode.getNames(vec));
+        return RDataFactory.createList(result, extractNamesNode.execute(vec));
     }
 
     @Specialization
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java
index 286ed49c6b59006cfbce45ef2992eb83e971dd03..7046d59e62a772f6534c0513b0ff6287260fbb19 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/MatMult.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -53,6 +53,7 @@ import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RIntVector;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RShareable;
 import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
@@ -237,10 +238,16 @@ public abstract class MatMult extends RBuiltinNode.Arg2 {
         Object dimName1 = RNull.instance;
         if (aDimNames != null && aDimNames.getLength() > 0) {
             dimName1 = aDimNames.getDataAt(0);
+            if (dimName1 instanceof RShareable && !((RShareable) dimName1).isShared()) {
+                ((RShareable) dimName1).incRefCount();
+            }
         }
         Object dimName2 = RNull.instance;
         if (bDimNames != null && bDimNames.getLength() > 1) {
             dimName2 = bDimNames.getDataAt(1);
+            if (dimName2 instanceof RShareable && !((RShareable) dimName2).isShared()) {
+                ((RShareable) dimName2).incRefCount();
+            }
         }
         setDimNamesNode.setDimNames(resultVec, RDataFactory.createList(new Object[]{dimName1, dimName2}));
         return resultVec;
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java
index a9b767a2be16d0c3bfe87321b1dedbf798b052bf..05f0fff0a9cb34a3aeb3dbc64532ac3d6c12b35e 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -35,8 +35,8 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.api.profiles.LoopConditionProfile;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError.Message;
@@ -76,8 +76,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 {
                     @Cached("createBinaryProfile()") ConditionProfile keepNAProfile,
                     @Cached("create()") GetDimAttributeNode getDimNode,
                     @Cached("create()") SetDimNamesAttributeNode setDimNamesNode,
-                    @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
+                    @Cached("create()") ExtractDimNamesAttributeNode extractDimNamesNode,
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
         convertType(type);
         boolean keepNA = keepNAProfile.profile(keepNAIn);
         int len = vector.getLength();
@@ -93,8 +93,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 {
                 result[i] = (int) (Math.log10(x) + 1); // not the fastest one
             }
         }
-        RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), getNamesNode.getNames(vector));
-        RList dimNames = getDimNamesNode.getDimNames(vector);
+        RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), extractNamesNode.execute(vector));
+        RList dimNames = extractDimNamesNode.execute(vector);
         if (nullDimNamesProfile.profile(dimNames != null)) {
             setDimNamesNode.setDimNames(resultVector, dimNames);
         }
@@ -109,8 +109,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 {
                     @Cached("createBinaryProfile()") ConditionProfile keepNAProfile,
                     @Cached("create()") GetDimAttributeNode getDimNode,
                     @Cached("create()") SetDimNamesAttributeNode setDimNamesNode,
-                    @Cached("create()") GetDimNamesAttributeNode getDimNamesNode,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
+                    @Cached("create()") ExtractDimNamesAttributeNode extractDimNamesNode,
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
         convertType(type);
         boolean keepNA = keepNAProfile.profile(keepNAIn);
         int len = vector.getLength();
@@ -126,8 +126,8 @@ public abstract class NChar extends RBuiltinNode.Arg4 {
                 result[i] = item.length();
             }
         }
-        RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), getNamesNode.getNames(vector));
-        RList dimNames = getDimNamesNode.getDimNames(vector);
+        RIntVector resultVector = RDataFactory.createIntVector(result, isComplete, getDimNode.getDimensions(vector), extractNamesNode.execute(vector));
+        RList dimNames = extractDimNamesNode.execute(vector);
         if (nullDimNamesProfile.profile(dimNames != null)) {
             setDimNamesNode.setDimNames(resultVector, dimNames);
         }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java
index d0b58d9b2f95e060ff3699ad2b2a08deef9f89b7..0cbba8600c47507e83e6e659b4620b82e98f2548 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Scan.java
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1995, 1996, Robert Gentleman and Ross Ihaka
  * Copyright (c) 1998-2013, The R Core Team
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -34,7 +34,7 @@ import java.util.HashMap;
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Specialization;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.unary.CastToVectorNode;
 import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen;
@@ -64,7 +64,7 @@ public abstract class Scan extends RBuiltinNode.Arg19 {
     private static final int NO_COMCHAR = 100000; /* won't occur even in Unicode */
 
     private final NACheck naCheck = NACheck.create();
-    @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNames = ExtractNamesAttributeNode.create();
 
     @Child private CastToVectorNode castVector;
 
@@ -315,7 +315,7 @@ public abstract class Scan extends RBuiltinNode.Arg19 {
                 list.updateDataAt(i, vec.createEmptySameType(blockSize, RDataFactory.COMPLETE_VECTOR), null);
             }
         }
-        list.setNames(getNames.getNames(what));
+        list.setNames(extractNames.execute(what));
 
         naCheck.enable(true);
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java
index 9d9e87d1c0e3cc7a032311959d65dec6d46c54e4..3658cf4856dd0b53191a21110105b48e4ea5523c 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ShortRowNames.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -29,10 +29,12 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
 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.api.profiles.IntValueProfile;
 import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetRowNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
+import com.oracle.truffle.r.nodes.function.opt.UpdateShareableChildValueNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
@@ -46,8 +48,10 @@ public abstract class ShortRowNames extends RBuiltinNode.Arg2 {
 
     private final BranchProfile naValueMet = BranchProfile.create();
     private final ValueProfile operandTypeProfile = ValueProfile.createClassProfile();
+    private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile();
 
     @Child private GetRowNamesAttributeNode getRowNamesNode = GetRowNamesAttributeNode.create();
+    @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create();
 
     static {
         Casts casts = new Casts(ShortRowNames.class);
@@ -73,6 +77,10 @@ public abstract class ShortRowNames extends RBuiltinNode.Arg2 {
         if (type >= 1) {
             int n = calculateN(rowNames);
             rowNames = type == 1 ? n : Math.abs(n);
+        } else {
+            if (nonNullValue.profile(rowNames != null)) {
+                updateRefCount.updateState(operand, rowNames);
+            }
         }
 
         if (rowNames == null) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java
index 7078e5bb37dc2d44cc13d2f0b43f9c34110d81e9..9c5686314c4c9935d6627395193aa7f205573c25 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLowerOrUpper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -34,7 +34,7 @@ import com.oracle.truffle.api.profiles.LoopConditionProfile;
 import com.oracle.truffle.r.nodes.attributes.CopyOfRegAttributesNode;
 import com.oracle.truffle.r.nodes.attributes.CopyOfRegAttributesNodeGen;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.profile.VectorLengthProfile;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -52,7 +52,7 @@ public abstract class ToLowerOrUpper {
         private final VectorLengthProfile lengthProfile = VectorLengthProfile.create();
         private final LoopConditionProfile loopProfile = LoopConditionProfile.createCountingProfile();
         private final NACheck na = NACheck.create();
-        @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create();
+        @Child private ExtractNamesAttributeNode extractNames = ExtractNamesAttributeNode.create();
 
         @Child private CopyOfRegAttributesNode copyAttributes = CopyOfRegAttributesNodeGen.create();
         @Child private GetDimAttributeNode getDimNode = GetDimAttributeNode.create();
@@ -83,7 +83,7 @@ public abstract class ToLowerOrUpper {
                 String value = vector.getDataAt(i);
                 stringVector[i] = elementFunction(value, i, function);
             }
-            RStringVector result = RDataFactory.createStringVector(stringVector, vector.isComplete(), getDimNode.getDimensions(vector), getNames.getNames(vector));
+            RStringVector result = RDataFactory.createStringVector(stringVector, vector.isComplete(), getDimNode.getDimensions(vector), extractNames.execute(vector));
             copyAttributes.execute(vector, result);
             return result;
         }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java
index e48d76d60b510b783cc077266c62cd66f2114f8d..6ee0bd71c9059fa8f27e81e34a64ce30e5612cbb 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java
@@ -6,7 +6,7 @@
  * Copyright (c) 1995, 1996, 1997  Robert Gentleman and Ross Ihaka
  * Copyright (c) 1995-2014, The R Core Team
  * Copyright (c) 2002-2008, The R Foundation
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -26,7 +26,7 @@ import com.oracle.truffle.r.nodes.attributes.InitAttributesNode;
 import com.oracle.truffle.r.nodes.attributes.SetFixedAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.function.opt.ReuseNonSharedNode;
 import com.oracle.truffle.r.nodes.profile.VectorLengthProfile;
@@ -58,7 +58,7 @@ public abstract class Transpose extends RBuiltinNode.Arg1 {
     @Child private SetFixedAttributeNode putDimensions = SetFixedAttributeNode.createDim();
     @Child private SetFixedAttributeNode putDimNames = SetFixedAttributeNode.createDimNames();
     @Child private GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create();
-    @Child private GetNamesAttributeNode getAxisNamesNode = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractAxisNamesNode = ExtractNamesAttributeNode.create();
     @Child private GetDimAttributeNode getDimNode = GetDimAttributeNode.create();
     @Child private ReuseNonSharedNode reuseNonShared = ReuseNonSharedNode.create();
 
@@ -224,7 +224,7 @@ public abstract class Transpose extends RBuiltinNode.Arg1 {
         if (dimNames != null) {
             hasDimNamesProfile.enter();
             assert dimNames.getLength() == 2;
-            RStringVector axisNames = getAxisNamesNode.getNames(dimNames);
+            RStringVector axisNames = extractAxisNamesNode.execute(dimNames);
             RStringVector transAxisNames = axisNames == null ? null : RDataFactory.createStringVector(new String[]{axisNames.getDataAt(1), axisNames.getDataAt(0)}, true);
             RList newDimNames = RDataFactory.createList(new Object[]{dimNames.getDataAt(1), dimNames.getDataAt(0)}, transAxisNames);
             putDimNames.execute(dest.getAttributes(), newDimNames);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java
index c4ef69e257b504728928dec2d04497c9b409c195..cd1813dd6fa3375eea5bc6dcb880c2f3ae689654 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/VApply.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, 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
@@ -34,7 +34,7 @@ import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.profiles.ConditionProfile;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetNamesAttributeNode;
@@ -96,8 +96,8 @@ public abstract class VApply extends RBuiltinNode.Arg4 {
     @Child private CastLogicalNode castLogical;
     @Child private CastStringNode castString;
     @Child private SetDimAttributeNode setDimNode;
-    @Child private GetNamesAttributeNode getColNamesNode = GetNamesAttributeNode.create();
-    @Child private GetNamesAttributeNode getRowNamesNode = GetNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractColNamesNode = ExtractNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractRowNamesNode = ExtractNamesAttributeNode.create();
     @Child private SetDimNamesAttributeNode setDimNamesNode = SetDimNamesAttributeNode.create();
     @Child private SetNamesAttributeNode setNamesNode = SetNamesAttributeNode.create();
 
@@ -210,7 +210,7 @@ public abstract class VApply extends RBuiltinNode.Arg4 {
 
             if (useNamesProfile.profile(useNames)) {
                 // the names from the input vector are used as the column names in the result
-                RStringVector names = getColNamesNode.getNames(vecMat);
+                RStringVector names = extractColNamesNode.execute(vecMat);
                 RStringVector colNames = null;
                 if (names != null) {
                     colNames = names;
@@ -222,7 +222,7 @@ public abstract class VApply extends RBuiltinNode.Arg4 {
                     // take the names from the first input vector and use it as the row names in the
                     // result
                     Object firstVec = applyResult[0];
-                    Object rn = getRowNamesNode.getNames(firstVec);
+                    Object rn = extractRowNamesNode.execute(firstVec);
                     rowNames = rn == null ? RNull.instance : rn;
                 }
                 if (colNames != null) {
@@ -230,7 +230,7 @@ public abstract class VApply extends RBuiltinNode.Arg4 {
                 }
             }
         } else if (useNamesProfile.profile(useNames)) {
-            RStringVector names = getColNamesNode.getNames(vecMat);
+            RStringVector names = extractColNamesNode.execute(vecMat);
             RStringVector newNames = null;
             if (names != null) {
                 newNames = names;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java
index d11144c8c2e8a2439546f6f3d208b9bcc756a160..e30bc965b2099203e4140436e17dea1c5ad8691a 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, 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
@@ -26,7 +26,7 @@ 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.access.vector.PositionsCheckNode.PositionProfile;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -60,7 +60,7 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode {
 
     @Specialization
     protected RAbstractVector doLogical(PositionProfile statistics, int dimSize, RAbstractLogicalVector position, int positionLength,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
         positionNACheck.enable(position);
         byte value = position.getDataAt(0);
         if (positionLength != 1) {
@@ -76,12 +76,12 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode {
             }
         }
 
-        return doIntegerImpl(statistics, dimSize, positionNACheck.convertLogicalToInt(value), position, getNamesNode);
+        return doIntegerImpl(statistics, dimSize, positionNACheck.convertLogicalToInt(value), position, extractNamesNode);
     }
 
     @Specialization
     protected RAbstractVector doInteger(PositionProfile profile, int dimSize, RAbstractIntVector position, int positionLength,
-                    @Cached("create()") GetNamesAttributeNode getNamesNode) {
+                    @Cached("create()") ExtractNamesAttributeNode extractNamesNode) {
         if (positionLength != 1) {
             error.enter();
             Message message;
@@ -99,10 +99,10 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode {
         }
         assert positionLength == 1;
         positionNACheck.enable(position);
-        return doIntegerImpl(profile, dimSize, position.getDataAt(0), position, getNamesNode);
+        return doIntegerImpl(profile, dimSize, position.getDataAt(0), position, extractNamesNode);
     }
 
-    private RAbstractVector doIntegerImpl(PositionProfile profile, int dimSize, int value, RAbstractVector originalVector, GetNamesAttributeNode getNamesNode) {
+    private RAbstractVector doIntegerImpl(PositionProfile profile, int dimSize, int value, RAbstractVector originalVector, ExtractNamesAttributeNode extractNamesNode) {
         int result;
         if (greaterZero.profile(value > 0)) {
             // fast path
@@ -119,7 +119,7 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode {
         }
         profile.selectedPositionsCount = 1;
 
-        RStringVector names = getNamesNode.getNames(originalVector);
+        RStringVector names = extractNamesNode.execute(originalVector);
         if (names != null) {
             return RDataFactory.createIntVector(new int[]{result}, !profile.containsNA, names);
         } else {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java
index 312e5a7de419c353ac5b8a5446d7e8eac69f192e..aad0f72b6b7ef6e2ea83e31af1300e2d506c1518 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/CopyAttributesNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, 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
@@ -28,6 +28,7 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.api.profiles.BranchProfile;
 import com.oracle.truffle.api.profiles.ConditionProfile;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
@@ -52,6 +53,7 @@ public abstract class CopyAttributesNode extends RBaseNode {
 
     @Child protected HasFixedAttributeNode hasDimNode = HasFixedAttributeNode.createDim();
     @Child protected GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create();
+    @Child protected ExtractDimNamesAttributeNode extractDimNamesNode = ExtractDimNamesAttributeNode.create();
     @Child protected GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
 
     protected CopyAttributesNode(boolean copyAllAttributes) {
@@ -181,7 +183,7 @@ public abstract class CopyAttributesNode extends RBaseNode {
         putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR));
 
         if (result != left) {
-            RList newDimNames = getDimNamesNode.getDimNames(left);
+            RList newDimNames = extractDimNamesNode.execute(left);
             if (hasDimNames.profile(newDimNames != null)) {
                 putDimNames.execute(result.getAttributes(), newDimNames);
 
@@ -189,7 +191,7 @@ public abstract class CopyAttributesNode extends RBaseNode {
                 return result;
             }
             if (result != right) {
-                newDimNames = getDimNamesNode.getDimNames(right);
+                newDimNames = extractDimNamesNode.execute(right);
                 if (hasDimNames.profile(newDimNames != null)) {
                     setDimNamesNode.setDimNames(result, newDimNames);
                 }
@@ -247,7 +249,7 @@ public abstract class CopyAttributesNode extends RBaseNode {
         RVector.verifyDimensions(result.getLength(), newDimensions, this);
         putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR));
         if (rightNotResult) {
-            RList newDimNames = getDimNamesNode.getDimNames(right);
+            RList newDimNames = extractDimNamesNode.execute(right);
             if (hasDimNames.profile(newDimNames != null)) {
                 setDimNamesNode.setDimNames(result, newDimNames);
             }
@@ -297,7 +299,7 @@ public abstract class CopyAttributesNode extends RBaseNode {
         }
         putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR));
         if (left != result) {
-            RList newDimNames = getDimNamesNode.getDimNames(left);
+            RList newDimNames = extractDimNamesNode.execute(left);
             if (hasDimNames.profile(newDimNames != null)) {
                 setDimNamesNode.setDimNames(result, newDimNames);
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java
index 9065b89e74f397e6f32b6da70e6924e22a20495a..bbf2c3212f896341f230fc57e5380797c2c54d57 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/SpecialAttributesFunctions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2018, 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
@@ -34,6 +34,7 @@ import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.access.vector.ExtractListElement;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctionsFactory.GetDimAttributeNodeGen;
 import com.oracle.truffle.r.nodes.function.opt.ShareObjectNode;
+import com.oracle.truffle.r.nodes.function.opt.UpdateShareableChildValueNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -466,6 +467,30 @@ public final class SpecialAttributesFunctions {
         }
     }
 
+    public abstract static class ExtractNamesAttributeNode extends RBaseNode {
+
+        @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create();
+        @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create();
+
+        private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile();
+
+        public static ExtractNamesAttributeNode create() {
+            return SpecialAttributesFunctionsFactory.ExtractNamesAttributeNodeGen.create();
+        }
+
+        public abstract RStringVector execute(Object x);
+
+        @Specialization
+        protected RStringVector extractNames(Object x) {
+            RStringVector names = getNames.getNames(x);
+            if (nonNullValue.profile(names != null)) {
+                updateRefCount.updateState(x, names);
+            }
+            return names;
+        }
+
+    }
+
     public abstract static class SetDimAttributeNode extends SetSpecialAttributeNode {
 
         private final ConditionProfile nullDimProfile = ConditionProfile.createBinaryProfile();
@@ -903,13 +928,37 @@ public final class SpecialAttributesFunctions {
         }
     }
 
+    public abstract static class ExtractDimNamesAttributeNode extends RBaseNode {
+
+        @Child private GetDimNamesAttributeNode getDimNames = GetDimNamesAttributeNode.create();
+        @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create();
+
+        private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile();
+
+        public static ExtractDimNamesAttributeNode create() {
+            return SpecialAttributesFunctionsFactory.ExtractDimNamesAttributeNodeGen.create();
+        }
+
+        public abstract RList execute(Object x);
+
+        @Specialization
+        protected RList extractDimNames(Object x) {
+            RList dimNames = getDimNames.getDimNames(x);
+            if (nonNullValue.profile(dimNames != null)) {
+                updateRefCount.updateState(x, dimNames);
+            }
+            return dimNames;
+        }
+
+    }
+
     public abstract static class InitDimsNamesDimNamesNode extends RBaseNode {
 
         private final ConditionProfile doAnythingProfile = ConditionProfile.createBinaryProfile();
 
         @Child private GetDimAttributeNode getDimNode;
-        @Child private GetNamesAttributeNode getNamesNode;
-        @Child private GetDimNamesAttributeNode getDimNamesNode;
+        @Child private ExtractNamesAttributeNode extractNamesNode;
+        @Child private ExtractDimNamesAttributeNode extractDimNamesNode;
 
         protected InitDimsNamesDimNamesNode() {
         }
@@ -929,15 +978,15 @@ public final class SpecialAttributesFunctions {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
                 getDimNode = insert(GetDimAttributeNode.create());
             }
-            if (getNamesNode == null) {
+            if (extractNamesNode == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                getNamesNode = insert(GetNamesAttributeNode.create());
+                extractNamesNode = insert(ExtractNamesAttributeNode.create());
             }
-            if (getDimNamesNode == null) {
+            if (extractDimNamesNode == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                getDimNamesNode = insert(GetDimNamesAttributeNode.create());
+                extractDimNamesNode = insert(ExtractDimNamesAttributeNode.create());
             }
-            this.initAttributes(x, getDimNode.getDimensions(source), getNamesNode.getNames(source), getDimNamesNode.getDimNames(source));
+            this.initAttributes(x, getDimNode.getDimensions(source), extractNamesNode.execute(source), extractDimNamesNode.execute(source));
         }
 
         public abstract void execute(RAbstractContainer x, int[] dimensions, RStringVector names, RList dimNames);
@@ -1247,4 +1296,29 @@ public final class SpecialAttributesFunctions {
             return getClassAttr(x) != null ? true : false;
         }
     }
+
+    public abstract static class ExtractClassAttributeNode extends RBaseNode {
+
+        @Child private GetClassAttributeNode getClassAttr = GetClassAttributeNode.create();
+        @Child private UpdateShareableChildValueNode updateRefCount = UpdateShareableChildValueNode.create();
+
+        private final ConditionProfile nonNullValue = ConditionProfile.createBinaryProfile();
+
+        public static ExtractClassAttributeNode create() {
+            return SpecialAttributesFunctionsFactory.ExtractClassAttributeNodeGen.create();
+        }
+
+        public abstract RStringVector execute(Object x);
+
+        @Specialization
+        protected RStringVector extractClassAttr(Object x) {
+            RStringVector classAttr = getClassAttr.getClassAttr(x);
+            if (nonNullValue.profile(classAttr != null)) {
+                updateRefCount.updateState(x, classAttr);
+            }
+            return classAttr;
+        }
+
+    }
+
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java
index 3452bef34398d5ec2e810c7f78b2d0ed1a543fdf..7d3c0b125a4507dbb285911c9df407c4ab6b9158 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/attributes/UnaryCopyAttributesNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, 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
@@ -26,6 +26,7 @@ import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.api.profiles.ConditionProfile;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
@@ -52,6 +53,7 @@ public abstract class UnaryCopyAttributesNode extends RBaseNode {
     protected final boolean copyAllAttributes;
 
     @Child protected HasFixedAttributeNode hasDimNode = HasFixedAttributeNode.createDim();
+    @Child protected ExtractDimNamesAttributeNode extractDimNamesNode = ExtractDimNamesAttributeNode.create();
     @Child protected GetDimNamesAttributeNode getDimNamesNode = GetDimNamesAttributeNode.create();
     @Child protected GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
 
@@ -122,7 +124,7 @@ public abstract class UnaryCopyAttributesNode extends RBaseNode {
 
         putDim.execute(initAttributes.execute(result), RDataFactory.createIntVector(newDimensions, RDataFactory.COMPLETE_VECTOR));
 
-        RList newDimNames = getDimNamesNode.getDimNames(source);
+        RList newDimNames = extractDimNamesNode.execute(source);
         if (hasDimNames.profile(newDimNames != null)) {
             updateRefCountNode.execute(updateChildRefCountNode.updateState(source, newDimNames));
             putDimNames.execute(result.getAttributes(), newDimNames);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java
index 1ee0499aa4ace76f7fa3e2b83eadb38ac6d32d38..02783204a1feec72503aee2c11b83b5acd909c23 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, 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
@@ -34,9 +34,9 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractDimNamesAttributeNode;
+import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.ExtractNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
@@ -61,8 +61,8 @@ public abstract class UnaryNotNode extends RBuiltinNode.Arg1 {
     private final NAProfile naProfile = NAProfile.create();
 
     @Child private GetDimAttributeNode getDims = GetDimAttributeNode.create();
-    @Child private GetNamesAttributeNode getNames = GetNamesAttributeNode.create();
-    @Child private GetDimNamesAttributeNode getDimNames = GetDimNamesAttributeNode.create();
+    @Child private ExtractNamesAttributeNode extractNames = ExtractNamesAttributeNode.create();
+    @Child private ExtractDimNamesAttributeNode extractDimNames = ExtractDimNamesAttributeNode.create();
 
     static {
         Casts.noCasts(UnaryNotNode.class);
@@ -171,7 +171,7 @@ public abstract class UnaryNotNode extends RBuiltinNode.Arg1 {
                     if (vectorAccess.getType() == RType.Logical) {
                         ((RVector<?>) result).copyAttributesFrom(vector);
                     } else {
-                        factory.reinitializeAttributes((RVector<?>) result, getDims.getDimensions(vector), getNames.getNames(vector), getDimNames.getDimNames(vector));
+                        factory.reinitializeAttributes((RVector<?>) result, getDims.getDimensions(vector), extractNames.execute(vector), extractDimNames.execute(vector));
                     }
                     break;
             }
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 78a3639e84a9cc6129a18ff01a5a2b53b2b5fc1f..cd370d6523e88dfacbdd0f04daf20995a2ed5a4b 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
@@ -16720,6 +16720,11 @@ C 50 122 194
 [2,] 6.208008e+00 -25013.757
 [3,] 1.665335e-16   8362.723
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_cummax.testCumulativeMax#
+#a <- structure(1:3, names=c('a1','a2','a3')); b<-cummax(a); names(b)[1]<-'x'; a; 
+a1 a2 a3
+ 1  2  3
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_cummax.testCumulativeMax#
 #values <- c(1,2,NA,1, NaN); cummax(values); cummax(as.integer(values))
 [1]  1  2 NA NA NA
@@ -16810,6 +16815,11 @@ numeric(0)
 #argv <- list(structure(numeric(0), .Dim = c(0L, 0L)));cummax(argv[[1]]);
 numeric(0)
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_cummin.testCumulativeMin#
+#a <- structure(1:3, names=c('a1','a2','a3')); b<-cummin(a); names(b)[1]<-'x'; a; 
+a1 a2 a3
+ 1  2  3
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_cummin.testCumulativeMin#
 #values <- c(1,2,NA,1, NaN); cummin(values); cummin(as.integer(values))
 [1]  1  1 NA NA NA
@@ -16900,6 +16910,11 @@ numeric(0)
 #argv <- list(FALSE);cummin(argv[[1]]);
 [1] 0
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_cumprod.testCumProd#
+#a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumprod(a); names(b)[1]<-'x'; a; 
+a1 a2 a3
+ 1  2  3
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_cumprod.testCumProd#
 #values <- c(1,2,NA,1, NaN); cumprod(values); cumprod(as.integer(values))
 [1]  1  2 NA NA NA
@@ -16971,6 +16986,11 @@ numeric(0)
 #argv <- list(character(0));cumprod(argv[[1]]);
 numeric(0)
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_cumsum.testCumulativeSum#
+#a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumsum(a); names(b)[1]<-'x'; a; 
+a1 a2 a3
+ 1  2  3
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_cumsum.testCumulativeSum#
 #values <- c(1,2,NA,1, NaN); cumsum(values); cumsum(as.integer(values))
 [1]  1  3 NA NA NA
@@ -74466,6 +74486,11 @@ y ~ 0 + x
 Time differences in mins
 [1]    6.666667 1366.500000
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_tolower.testCharUtils#
+#a <- structure(c('X', 'Y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; 
+ a1  a2
+"X" "Y"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_tolower.testCharUtils#
 #tolower(NA_integer_)
 [1] NA
@@ -74598,6 +74623,11 @@ character(0)
 #argv <- structure(list(x = c('NA', NA, 'BANANA')), .Names = 'x');do.call('tolower', argv)
 [1] "na"     NA       "banana"
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_toupper.testCharUtils#
+#a <- structure(c('x', 'y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; 
+ a1  a2
+"x" "y"
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_toupper.testCharUtils#
 #{ m <- matrix("hi") ; toupper(m) }
      [,1]
@@ -77642,6 +77672,11 @@ Error in vapply(quote(a), function(x) quote(b), quote(a)) :
 #{ a <- vapply(list(a=1:20,b=1:20), function (x) x, FUN.VALUE=1:20); attributes(a); a[1:5] }
 [1] 1 2 3 4 5
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_vapply.testVapplyNames#
+#{ a<-structure(1:2, names=c('a1','a2')); b<-vapply(a, function(v) v + 3, 0); names(b)[1]<-'x'; a }
+a1 a2
+ 1  2
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_vapply.testVapplyNames#
 #{ b <- list(a=structure(c(1:3), names=c('x','y')),b=structure(c(1:3), names=c('x2','y2','z2'))); a <- vapply(b, function (x) x, FUN.VALUE=1:3); attributes(a); a[1:5] }
 [1] 1 2 3 1 2
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java
index 79f0191cc5ed936e7602b81288318bbc4c49e21d..0cb95f712430c9af6b5ac262fe9a263edb6a3d2d 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummax.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.
  */
@@ -72,5 +72,7 @@ public class TestBuiltin_cummax extends TestBase {
 
         assertEval("values <- c(1,2,NaN,1, NA); cummax(values); cummax(as.integer(values))");
         assertEval("values <- c(1,2,NA,1, NaN); cummax(values); cummax(as.integer(values))");
+
+        assertEval("a <- structure(1:3, names=c('a1','a2','a3')); b<-cummax(a); names(b)[1]<-'x'; a; ");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java
index d6a462e391d8f69bda7a900a845598efbec4a165..fd3c8004bd1f11be744d9a84dae97d8ac8327fc0 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cummin.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.
  */
@@ -71,5 +71,7 @@ public class TestBuiltin_cummin extends TestBase {
 
         assertEval("values <- c(1,2,NaN,1, NA); cummin(values); cummin(as.integer(values))");
         assertEval("values <- c(1,2,NA,1, NaN); cummin(values); cummin(as.integer(values))");
+
+        assertEval("a <- structure(1:3, names=c('a1','a2','a3')); b<-cummin(a); names(b)[1]<-'x'; a; ");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java
index 4a3dd190b5ae4ade5904660e8cecd9f983a90816..d002c089983c108ec4543cebbd33de63b0fa0df8 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumprod.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.
  */
@@ -71,5 +71,7 @@ public class TestBuiltin_cumprod extends TestBase {
     public void testCumProd() {
         assertEval("values <- c(1,2,NaN,1, NA); cumprod(values); cumprod(as.integer(values))");
         assertEval("values <- c(1,2,NA,1, NaN); cumprod(values); cumprod(as.integer(values))");
+
+        assertEval("a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumprod(a); names(b)[1]<-'x'; a; ");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java
index cee940d99ed89219bd8ec43a0c114b25be6d8ad6..ccd1bb25699060fd9c0e919e599a76ff648ed24c 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cumsum.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.
  */
@@ -117,5 +117,7 @@ public class TestBuiltin_cumsum extends TestBase {
 
         assertEval("values <- c(1,2,NaN,1, NA); cumsum(values); cumsum(as.integer(values))");
         assertEval("values <- c(1,2,NA,1, NaN); cumsum(values); cumsum(as.integer(values))");
+
+        assertEval("a <- structure(c(1,2,3), names=c('a1','a2','a3')); b<-cumsum(a); names(b)[1]<-'x'; a; ");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java
index 7128a9526223d8293b3fee9d16a167918f2a8e1b..2cfea5cb98d1c6d90c98de898c0289d7f9fe7e91 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tolower.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -64,5 +64,6 @@ public class TestBuiltin_tolower extends TestBase {
         assertEval("tolower(c('NA', 'na'))");
         assertEval("tolower(NA_integer_)");
         assertEval("tolower(NA_real_)");
+        assertEval("a <- structure(c('X', 'Y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; ");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java
index fe8582dd9dbe41b8ac5bf513a9ccc690285fce6e..056c61bb1f11eae7a71f33684e27ad08f9fd0f94 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_toupper.java
@@ -4,7 +4,7 @@
  * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * Copyright (c) 2012-2014, Purdue University
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates
  *
  * All rights reserved.
  */
@@ -51,5 +51,6 @@ public class TestBuiltin_toupper extends TestBase {
         assertEval("{ toupper(1E100) }");
         assertEval("{ m <- matrix(\"hi\") ; toupper(m) }");
         assertEval("{ toupper(c(a=\"hi\", \"hello\")) }");
+        assertEval("a <- structure(c('x', 'y'), names=c('a1','a2')); b<-toupper(a); names(b)[1]<-'bb'; a; ");
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java
index 69b4df6cae9b6e07aea08cb05c4a8b3944c89ec5..279ae37c652f8cb2e1040f81d845fbc33e25203e 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_vapply.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.
  */
@@ -62,5 +62,6 @@ public class TestBuiltin_vapply extends TestBase {
     public void testVapplyNames() {
         assertEval("{ a <- vapply(list(a=1:20,b=1:20), function (x) x, FUN.VALUE=1:20); attributes(a); a[1:5] }");
         assertEval("{ b <- list(a=structure(c(1:3), names=c('x','y')),b=structure(c(1:3), names=c('x2','y2','z2'))); a <- vapply(b, function (x) x, FUN.VALUE=1:3); attributes(a); a[1:5] }");
+        assertEval("{ a<-structure(1:2, names=c('a1','a2')); b<-vapply(a, function(v) v + 3, 0); names(b)[1]<-'x'; a }");
     }
 }