diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Array.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Array.java
index 86adf44..ccd73ed 100644
--- a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Array.java
+++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Array.java
@@ -40,6 +40,13 @@
   private static Array protoTypeArray;
 
   /**
+   * Creates a copy of the specified array.
+   */
+  public static <T> T[] clone(T[] array) {
+    return cloneSubrange(array, 0, array.length);
+  }
+
+  /**
    * Creates a copy of a subrange of the specified array.
    */
   public static <T> T[] cloneSubrange(T[] array, int fromIndex, int toIndex) {
@@ -47,11 +54,18 @@
     Array result = arraySlice(a, fromIndex, toIndex);
     initValues(a.getClass(), a.typeId, a.queryId, result);
     // implicit type arg not inferred (as of JDK 1.5.0_07)
-    return Array.<T>asArray(result);
+    return Array.<T> asArray(result);
   }
 
   /**
-   * Creates a new array of the exact same type as a given array but with the
+   * Creates a new array of the exact same type and length as a given array.
+   */
+  public static <T> T[] clonify(T[] array) {
+    return clonify(array, array.length);
+  }
+
+  /**
+   * Creates an empty array of the exact same type as a given array, with the
    * specified length.
    */
   public static <T> T[] clonify(T[] array, int length) {
@@ -59,7 +73,7 @@
     Array result = createFromSeed(NULL_SEED_TYPE, length);
     initValues(a.getClass(), a.typeId, a.queryId, result);
     // implicit type arg not inferred (as of JDK 1.5.0_07)
-    return Array.<T>asArray(result);
+    return Array.<T> asArray(result);
   }
 
   /**
diff --git a/user/super/com/google/gwt/emul/java/util/ArrayList.java b/user/super/com/google/gwt/emul/java/util/ArrayList.java
index 39add41..b2597d7 100644
--- a/user/super/com/google/gwt/emul/java/util/ArrayList.java
+++ b/user/super/com/google/gwt/emul/java/util/ArrayList.java
@@ -185,6 +185,12 @@
     return size;
   }
 
+  @Override
+  public Object[] toArray() {
+    // TODO: Array.clone() variant
+    return super.toArray();
+  }
+  
   /*
    * Faster than the iterator-based implementation in AbstractCollection.
    */
diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java
index 2f44c60..6259023 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -66,7 +66,7 @@
      */
     @Override
     public Object[] toArray() {
-      return toArray(Array.clonify(array, size()));
+      return toArray(Array.clonify(array));
     }
 
     /*
diff --git a/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java b/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java
index beac1d5..3690fc7 100644
--- a/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java
@@ -40,9 +40,9 @@
     return value;
   }
 
-  public V setValue(V object) {
-    V old = value;
-    value = object;
+  public V setValue(V value) {
+    V old = getValue();
+    this.value = value;
     return old;
   }
 }
