diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java
index c66079bf6e6e723802b7c99c7355f7918945afdb..bd4a64d4495fafce14268ffefce2f12595c60e04 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java
@@ -150,20 +150,32 @@ public class InitialPhaseBuilder<T> extends ArgCastBuilder<T, InitialPhaseBuilde
         return this;
     }
 
-    public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) {
-        pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes);
+    public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) {
+        pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes, reuseNonShared);
         return new CoercedPhaseBuilder<>(pipelineBuilder(), Integer.class);
     }
 
+    public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) {
+        return asIntegerVector(preserveNames, preserveDimensions, preserveAttributes, false);
+    }
+
     public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector() {
-        return asIntegerVector(false, false, false);
+        return asIntegerVector(false, false, false, false);
     }
 
-    public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) {
-        pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes);
+    public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean reuseNonShared) {
+        return asIntegerVector(false, false, false, reuseNonShared);
+    }
+
+    public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) {
+        pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes, reuseNonShared);
         return new CoercedPhaseBuilder<>(pipelineBuilder(), Double.class);
     }
 
+    public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) {
+        return asDoubleVector(preserveNames, preserveDimensions, preserveAttributes, false);
+    }
+
     public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector() {
         return asDoubleVector(false, false, false);
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java
index b0be4bf824b26e2a8147df4946a1ef51324462c2..bc3596e0b7faebc9e59ce4739bb16883a28503f5 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java
@@ -84,6 +84,11 @@ public final class PipelineBuilder {
         append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes, true, false));
     }
 
+    public void appendAsVector(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) {
+        assert type == RType.Integer || type == RType.Double || type == RType.Complex || type == RType.Character || type == RType.Logical || type == RType.Raw;
+        append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes, true, reuseNonShared));
+    }
+
     public void appendNotNA(Object naReplacement, Message message, Object[] messageArgs) {
         append(new NotNAStep<>(naReplacement, createMessage(message, messageArgs)));
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java
index cd0d124a10d0e064aa7f9a459cfe999da4f4e50c..e978790e993e88ae7858bcdb73eee4f7fc9dffc4 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java
@@ -184,7 +184,8 @@ public abstract class CastBaseNode extends CastNode {
     }
 
     protected boolean isReusable(RAbstractVector v) {
-        if (reuseNonShared && v instanceof RSharingAttributeStorage) {
+        // Reusing only of complete vectors otherwise we will produce different warning output
+        if (reuseNonShared && v.isComplete() && v instanceof RSharingAttributeStorage) {
             return !((RSharingAttributeStorage) v).isShared();
         }
         return false;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
index f455f2677381788864593d2b3382480eea1fdf60..1abeca2dcef292e1dd7cf185cde76e143bddf694 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
@@ -182,7 +182,7 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
 
     @Specialization(guards = "!isReusable(operand)")
     protected RIntVector doDoubleVector(RAbstractDoubleVector operand) {
-        return createResultVector(operand, index -> naCheck.convertDoubleToInt(operand.getDataAt(index)));
+        return vectorCopy(operand, naCheck.convertDoubleVectorToIntData(operand), operand.isComplete());
     }
 
     @Specialization(guards = "!isReusable(operand)")
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 7378e3a895004313e7d816a5c6603e2812406799..0ce65d24bf23991d78283fc76837e4c42ee96134 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
@@ -6928,6 +6928,12 @@ NAs introduced by coercion
 #{ as.integer(c(1.0,2.5,3.9)) }
 [1] 1 2 3
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_asinteger.testAsInteger#
+#{ as.integer(c(100, -1e-13, Inf, -Inf, NaN, 3.14159265358979, NA)) }
+[1] 100   0  NA  NA  NA   3  NA
+Warning message:
+NAs introduced by coercion to integer range
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_asinteger.testAsInteger#Output.IgnoreWarningContext#
 #{ as.integer(c(3+3i, 4+4i)) }
 [1] 3 4
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java
index 19aeddb65d4d96a5da38c47f76af20880fac9004..a50e12c6b81ab1ec737b653fa8a9dbb25323af97 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java
@@ -147,5 +147,6 @@ public class TestBuiltin_asinteger extends TestBase {
         assertEval("{ as.integer(as.character(NA)) }");
         assertEval("{ as.integer(\"1\", as.character(NA)) }");
         assertEval("{ as.integer.cls <- function(x) 42; as.integer(structure(c(1,2), class='cls')); }");
+        assertEval("{ as.integer(c(100, -1e-13, Inf, -Inf, NaN, 3.14159265358979, NA)) }");
     }
 }