diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
index a81e194adf7fd2e3bade2b07eff2102740d98f8a..71a7e7c7183b7deb12ec8bcccd4e06d9167c3026 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
@@ -352,7 +352,7 @@ final class CachedReplaceVectorNode extends CachedVectorNode {
         if (castType == RType.List) {
             return CastListNodeGen.create(true, false, true);
         } else {
-            return CastTypeNode.createCast(castType, true, true, true);
+            return CastTypeNode.createCast(castType, true, true, true, false);
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java
index 65e0a251a686ca0150292f619be37dd2f3af7466..144f9715275a59198d1cb573a887ef75bcf9c106 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java
@@ -63,7 +63,12 @@ public abstract class CastTypeNode extends RBaseNode {
 
     @TruffleBoundary
     public static CastNode createCast(RType type) {
-        return createCast(type, false, false, false);
+        return createCast(type, false, false, false, false);
+    }
+
+    @TruffleBoundary
+    public static CastNode createCast(RType type, boolean reuseNonShared) {
+        return createCast(type, false, false, false, reuseNonShared);
     }
 
     public static CastTypeNode create() {
@@ -71,16 +76,16 @@ public abstract class CastTypeNode extends RBaseNode {
     }
 
     @TruffleBoundary
-    public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) {
+    public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) {
         switch (type) {
             case Character:
                 return CastStringNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
             case Complex:
                 return CastComplexNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
             case Double:
-                return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
+                return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared);
             case Integer:
-                return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
+                return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared);
             case Logical:
                 return CastLogicalNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
             case Raw:
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 997193d66f30f27c89311fbdcccac51030e7012c..f455f2677381788864593d2b3382480eea1fdf60 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
@@ -175,17 +175,17 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
         return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile());
     }
 
-    @Specialization
+    @Specialization(guards = "!isReusable(operand)")
     public RIntVector doLogicalVector(RAbstractLogicalVector operand) {
         return createResultVector(operand, index -> naCheck.convertLogicalToInt(operand.getDataAt(index)));
     }
 
-    @Specialization
+    @Specialization(guards = "!isReusable(operand)")
     protected RIntVector doDoubleVector(RAbstractDoubleVector operand) {
         return createResultVector(operand, index -> naCheck.convertDoubleToInt(operand.getDataAt(index)));
     }
 
-    @Specialization
+    @Specialization(guards = "!isReusable(operand)")
     protected RIntVector doRawVector(RAbstractRawVector operand) {
         return createResultVector(operand, index -> RRuntime.raw2int(operand.getDataAt(index)));
     }
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 933cf6864b43b7abc5a6bcfaaa216a5720dba576..7378e3a895004313e7d816a5c6603e2812406799 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
@@ -69567,6 +69567,54 @@ Error in t.default(new.env()) : argument is not a matrix
 b 1
 c 2
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(1:8, 2, 4) ; t(m) }
+     [,1] [,2]
+[1,]    1    2
+[2,]    3    4
+[3,]    5    6
+[4,]    7    8
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) }
+     [,1] [,2]
+[1,]   01   02
+[2,]   03   04
+[3,]   05   06
+[4,]   07   08
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) }
+     [,1] [,2]
+[1,] "1"  "2"
+[2,] "3"  "4"
+[3,] "5"  "6"
+[4,] "7"  "8"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) }
+      [,1]  [,2]
+[1,]  TRUE FALSE
+[2,] FALSE FALSE
+[3,]  TRUE FALSE
+[4,] FALSE  TRUE
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) }
+     [,1] [,2]
+[1,] 1    2
+[2,] 3    4
+[3,] 5    6
+[4,] 7    8
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) }
+     [,1] [,2]
+[1,]  0.1  0.2
+[2,]  0.3  0.4
+[3,]  0.5  0.6
+[4,]  0.7  0.8
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeSquare#
 #{ m <- matrix(1:64, 8, 8) ; sum(m * t(m)) }
 [1] 72976
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java
index d1708c7290420ee542611c772ded21eb3fd00318..2ab45b0034fd6500e88a16c9aea9a9723e40fec6 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java
@@ -59,4 +59,15 @@ public class TestBuiltin_t extends TestBase {
         assertEval("{ m <- matrix(as.raw(c(1,2,3,4)), 2, 2); t(m) }");
         assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4), 2, 2); t(m) }");
     }
+
+    @Test
+    public void testTransposeNotSquare() {
+        // test square matrices
+        assertEval("{ m <- matrix(1:8, 2, 4) ; t(m) }");
+        assertEval("{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) }");
+        assertEval("{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) }");
+        assertEval("{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) }");
+        assertEval("{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) }");
+        assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) }");
+    }
 }