diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java
index 9fa81603085da0e17618c7d8aa953a5e9100bfb3..32febbca73729ef55673ab2bf20f085d5d7cec95 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, 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
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.nodes.builtin.base;
 
 import static com.oracle.truffle.r.runtime.RBuiltinKind.*;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.access.*;
@@ -44,9 +45,10 @@ public abstract class Exists extends RBuiltinNode {
     }
 
     @Specialization
+    @TruffleBoundary
     @SuppressWarnings("unused")
     protected byte existsStringEnv(RAbstractStringVector nameVec, REnvironment env, String mode, byte inherits) {
-        final String name = nameVec.getDataAt(0);
+        String name = nameVec.getDataAt(0);
         controlVisibility();
         if (inherits == RRuntime.LOGICAL_FALSE) {
             return RRuntime.asLogical(env.get(name) != null);
@@ -58,5 +60,4 @@ public abstract class Exists extends RBuiltinNode {
         }
         return RRuntime.LOGICAL_FALSE;
     }
-
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java
index 9847b35ee448dbf363301e7aaf324ced8f60b8ea..8e41ae987e549bd19f21c4563f1fc3c267dac26d 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java
@@ -23,7 +23,6 @@
 package com.oracle.truffle.r.nodes;
 
 import com.oracle.truffle.api.dsl.*;
-import com.oracle.truffle.r.runtime.*;
 import com.oracle.truffle.r.runtime.conn.*;
 import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.env.*;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java
index 9c1811d758a705a6f24ac4b7db6fede669094937..086c14ac289474db436afdafba579112a5397eea 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java
@@ -480,23 +480,29 @@ public abstract class ArrayPositionCast extends ArrayPositionsCastBase {
                 } else {
                     return assignment ? operand : RRuntime.INT_NA;
                 }
-            } else if (operand < 0 && -operand > dimSize) {
-                outOfBoundsNegative.enter();
-                if (dimSizeOneProfile.profile(dimSize == 1)) {
-                    // e.g. c(7)[-2] vs c(7)[[-2]]
-                    return isSubset ? /* only one element to be picked */1 : /* ultimately an error */operand;
-                } else {
-                    // e.g. c(7, 42)[-7] vs c(, 427)[[-7]]
-                    return isSubset ? expandMissing(container) : operand;
-                }
             } else if (operand < 0) {
-                negative.enter();
-                if (dimSizeOneProfile.profile(dimSize == 1)) {
-                    // it's negative, but not out of bounds and dimension has length one - result is
-                    // no dimensions left
-                    return 0;
+                if (-operand > dimSize) {
+                    outOfBoundsNegative.enter();
+                    if (dimSizeOneProfile.profile(dimSize == 1)) {
+                        /*
+                         * e.g. c(7)[-2] vs c(7)[[-2]]
+                         * 
+                         * only one element to be picked or ultimately an error caused by operand
+                         */
+                        return isSubset ? 1 : operand;
+                    } else {
+                        // e.g. c(7, 42)[-7] vs c(, 427)[[-7]]
+                        return isSubset ? expandMissing(container) : operand;
+                    }
                 } else {
-                    return doIntNegativeMultiDim(frame, container, operand);
+                    negative.enter();
+                    if (dimSizeOneProfile.profile(dimSize == 1)) {
+                        // it's negative, but not out of bounds and dimension has length one -
+                        // result is no dimensions left
+                        return 0;
+                    } else {
+                        return doIntNegativeMultiDim(frame, container, operand);
+                    }
                 }
             } else {
                 nonNegative.enter();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java
index 8fcc031a2128446f52ed31fe60b093a0347e438d..5d288e6f12b3b092805039b1aa82299ec5e267dd 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java
@@ -676,20 +676,20 @@ public abstract class UpdateArrayHelperNode extends RNode {
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
             int orgLength = resultVector.getLength();
-            resultVector.resize(highestPos, false);
+            resultVector = (RList) resultVector.resize(highestPos, false);
             for (int i = orgLength; i < highestPos; i++) {
                 resultVector.updateDataAt(i, RNull.instance, null);
             }
-        } else if (resetDims) {
-            vectorNoDims.enter();
-            resultVector.setDimensions(null);
-            resultVector.setDimNames(null);
-        }
-        if (resultVector.isShared()) {
+        } else if (resultVector.isShared()) {
             vectorShared.enter();
             resultVector = (RList) vector.copy();
             resultVector.markNonTemporary();
         }
+        if (resetDims) {
+            vectorNoDims.enter();
+            resultVector.setDimensions(null);
+            resultVector.setDimNames(null);
+        }
         return resultVector;
     }
 
@@ -1096,9 +1096,8 @@ public abstract class UpdateArrayHelperNode extends RNode {
         RIntVector resultVector = vector.materialize();
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
-            resultVector.resize(highestPos, false);
-        }
-        if (resultVector.isShared()) {
+            resultVector = (RIntVector) resultVector.resize(highestPos, false);
+        } else if (resultVector.isShared()) {
             vectorShared.enter();
             resultVector = (RIntVector) vector.copy();
             resultVector.markNonTemporary();
@@ -1268,9 +1267,8 @@ public abstract class UpdateArrayHelperNode extends RNode {
         RDoubleVector resultVector = vector.materialize();
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
-            resultVector.resize(highestPos, false);
-        }
-        if (resultVector.isShared()) {
+            resultVector = (RDoubleVector) resultVector.resize(highestPos, false);
+        } else if (resultVector.isShared()) {
             vectorShared.enter();
             resultVector = (RDoubleVector) vector.copy();
             resultVector.markNonTemporary();
@@ -1443,9 +1441,8 @@ public abstract class UpdateArrayHelperNode extends RNode {
         RLogicalVector resultVector = vector;
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
-            resultVector.resize(highestPos, false);
-        }
-        if (vector.isShared()) {
+            resultVector = (RLogicalVector) resultVector.resize(highestPos, false);
+        } else if (vector.isShared()) {
             vectorShared.enter();
             resultVector = (RLogicalVector) vector.copy();
             resultVector.markNonTemporary();
@@ -1553,9 +1550,8 @@ public abstract class UpdateArrayHelperNode extends RNode {
         RStringVector resultVector = vector;
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
-            resultVector.resize(highestPos, false);
-        }
-        if (vector.isShared()) {
+            resultVector = (RStringVector) resultVector.resize(highestPos, false);
+        } else if (vector.isShared()) {
             vectorShared.enter();
             resultVector = (RStringVector) vector.copy();
             resultVector.markNonTemporary();
@@ -1694,9 +1690,8 @@ public abstract class UpdateArrayHelperNode extends RNode {
         RComplexVector resultVector = vector;
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
-            resultVector.resize(highestPos, false);
-        }
-        if (vector.isShared()) {
+            resultVector = (RComplexVector) resultVector.resize(highestPos, false);
+        } else if (vector.isShared()) {
             vectorShared.enter();
             resultVector = (RComplexVector) vector.copy();
             resultVector.markNonTemporary();
@@ -1897,9 +1892,8 @@ public abstract class UpdateArrayHelperNode extends RNode {
         RRawVector resultVector = vector;
         if (resultVector.getLength() < highestPos) {
             vectorTooShort.enter();
-            resultVector.resize(highestPos, false);
-        }
-        if (vector.isShared()) {
+            resultVector = (RRawVector) resultVector.resize(highestPos, false);
+        } else if (vector.isShared()) {
             vectorShared.enter();
             resultVector = (RRawVector) vector.copy();
             resultVector.markNonTemporary();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
index 9f063f6348531ba9ce45617142836aa65c497644..d405af097f468df0bc6c7508f4815b85afd67055 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
@@ -234,6 +234,9 @@ public class ReadVariableNode extends RNode implements VisibilityController {
         @Override
         public Object execute(VirtualFrame frame, Frame variableFrame) throws InvalidAssumptionException, LayoutChangedException, FrameSlotTypeException {
             Object value = profiledGetValue(variableFrame, slot);
+            if (kind == ReadKind.SilentLocal && value == RMissing.instance) {
+                return null;
+            }
             if (checkType(frame, value)) {
                 throw new LayoutChangedException();
             }
@@ -277,6 +280,9 @@ public class ReadVariableNode extends RNode implements VisibilityController {
         @Override
         public Object execute(VirtualFrame frame, Frame variableFrame) throws LayoutChangedException, FrameSlotTypeException {
             Object value = profiledGetValue(variableFrame, slot);
+            if (kind == ReadKind.SilentLocal && value == RMissing.instance) {
+                return null;
+            }
             if (!checkType(frame, value)) {
                 throw new LayoutChangedException();
             }
@@ -432,7 +438,11 @@ public class ReadVariableNode extends RNode implements VisibilityController {
             if (frameSlot != null) {
                 Object value = getValue(current, frameSlot);
                 valueAssumption = FrameSlotChangeMonitor.getStableValueAssumption(currentDescriptor, frameSlot, value);
-                match = checkType(frame, value);
+                if (kind == ReadKind.SilentLocal && value == RMissing.instance) {
+                    match = false;
+                } else {
+                    match = checkType(frame, value);
+                }
             }
 
             // figure out how to get to the next frame or descriptor
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
index d59112ef93a92a217b7ce04867d215ed55487113..cc33accc134da828eecd9d09a6de632b0e5ad4b5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
@@ -318,14 +318,14 @@ public class RPromise extends RLanguageRep {
      *
      * @param underEvaluation The new value to set
      */
-    public void setUnderEvaluation(boolean underEvaluation) {
+    public final void setUnderEvaluation(boolean underEvaluation) {
         this.underEvaluation = underEvaluation;
     }
 
     /**
      * @return The state of the {@link #underEvaluation} flag.
      */
-    public boolean isUnderEvaluation() {
+    public final boolean isUnderEvaluation() {
         return underEvaluation;
     }
 
@@ -350,7 +350,7 @@ public class RPromise extends RLanguageRep {
      * originally read from has not been altered in the mean time. If this cannot be guaranteed for
      * any reason, a Promise gets {@link #deoptimize()} (which includes {@link #materialize()}ion).
      */
-    public static class EagerPromise extends RPromise {
+    public static final class EagerPromise extends RPromise {
         protected final Object eagerValue;
 
         private final FrameSlotInfo notChangedNonLocally;