diff --git a/user/super/com/google/gwt/emul/java/util/AbstractMap.java b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
index c9f838e..eae9667 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
@@ -160,27 +160,35 @@
     return size() == 0;
   }
 
+  @Override
   public Set<K> keySet() {
-    final Set<Entry<K, V>> entrySet = entrySet();
     return new AbstractSet<K>() {
       @Override
+      public void clear() {
+        AbstractMap.this.clear();
+      }
+
+      @Override
       public boolean contains(Object key) {
         return containsKey(key);
       }
 
       @Override
       public Iterator<K> iterator() {
-        final Iterator<Entry<K, V>> outerIter = entrySet.iterator();
+        final Iterator<Entry<K, V>> outerIter = entrySet().iterator();
         return new Iterator<K>() {
+          @Override
           public boolean hasNext() {
             return outerIter.hasNext();
           }
 
+          @Override
           public K next() {
-            Map.Entry<K, V> entry = outerIter.next();
+            Entry<K, V> entry = outerIter.next();
             return entry.getKey();
           }
 
+          @Override
           public void remove() {
             outerIter.remove();
           }
@@ -188,8 +196,17 @@
       }
 
       @Override
+      public boolean remove(Object key) {
+        if (containsKey(key)) {
+          AbstractMap.this.remove(key);
+          return true;
+        }
+        return false;
+      }
+
+      @Override
       public int size() {
-        return entrySet.size();
+        return AbstractMap.this.size();
       }
     };
   }
@@ -233,27 +250,35 @@
     return s + "}";
   }
 
+  @Override
   public Collection<V> values() {
-    final Set<Entry<K, V>> entrySet = entrySet();
     return new AbstractCollection<V>() {
       @Override
+      public void clear() {
+        AbstractMap.this.clear();
+      }
+
+      @Override
       public boolean contains(Object value) {
         return containsValue(value);
       }
 
       @Override
       public Iterator<V> iterator() {
-        final Iterator<Entry<K, V>> outerIter = entrySet.iterator();
+        final Iterator<Entry<K, V>> outerIter = entrySet().iterator();
         return new Iterator<V>() {
+          @Override
           public boolean hasNext() {
             return outerIter.hasNext();
           }
 
+          @Override
           public V next() {
-            V value = outerIter.next().getValue();
-            return value;
+            Entry<K, V> entry = outerIter.next();
+            return entry.getValue();
           }
 
+          @Override
           public void remove() {
             outerIter.remove();
           }
@@ -262,7 +287,7 @@
 
       @Override
       public int size() {
-        return entrySet.size();
+        return AbstractMap.this.size();
       }
     };
   }
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractSet.java b/user/super/com/google/gwt/emul/java/util/AbstractSet.java
index dc30516..cfc81b4 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractSet.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractSet.java
@@ -36,18 +36,10 @@
     }
 
     Set<?> other = (Set<?>) o;
-
     if (other.size() != size()) {
       return false;
     }
-
-    for (Iterator<?> iter = other.iterator(); iter.hasNext();) {
-      Object otherItem = iter.next();
-      if (!contains(otherItem)) {
-        return false;
-      }
-    }
-    return true;
+    return containsAll(other);
   }
 
   @Override
diff --git a/user/super/com/google/gwt/emul/java/util/Collections.java b/user/super/com/google/gwt/emul/java/util/Collections.java
index 88f474c..d0aeddd 100644
--- a/user/super/com/google/gwt/emul/java/util/Collections.java
+++ b/user/super/com/google/gwt/emul/java/util/Collections.java
@@ -253,11 +253,6 @@
     }
 
     @Override
-    public <T> T[] toArray(T[] a) {
-      return keySet().toArray(a);
-    }
-
-    @Override
     public String toString() {
       return keySet().toString();
     }
diff --git a/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java b/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
index 51a7e5a..6b7f958 100644
--- a/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
+++ b/user/super/com/google/gwt/emul/java/util/LinkedHashMap.java
@@ -51,7 +51,6 @@
 
     public ChainEntry(K key, V value) {
       super(key, value);
-      next = prev = null;
     }
 
     /**
@@ -147,8 +146,18 @@
     }
 
     @Override
+    public boolean remove(Object entry) {
+      if (contains(entry)) {
+        Object key = ((Map.Entry<?, ?>) entry).getKey();
+        LinkedHashMap.this.remove(key);
+        return true;
+      }
+      return false;
+    }
+
+    @Override
     public int size() {
-      return map.size();
+      return LinkedHashMap.this.size();
     }
   }
 
@@ -172,35 +181,37 @@
    */
   private final transient HashMap<K, ChainEntry> map = new HashMap<K, ChainEntry>();
 
-  {
-    // Initialize the empty linked list.
-    head.prev = head;
-    head.next = head;
-  }
-
   public LinkedHashMap() {
+    resetChainEntries();
   }
 
   public LinkedHashMap(int ignored) {
-    super(ignored);
+    this(ignored, 0);
   }
 
   public LinkedHashMap(int ignored, float alsoIgnored) {
     super(ignored, alsoIgnored);
+    resetChainEntries();
   }
 
   public LinkedHashMap(int ignored, float alsoIgnored, boolean accessOrder) {
     super(ignored, alsoIgnored);
     this.accessOrder = accessOrder;
+    resetChainEntries();
   }
 
   public LinkedHashMap(Map<? extends K, ? extends V> toBeCopied) {
+    resetChainEntries();
     this.putAll(toBeCopied);
   }
 
   @Override
   public void clear() {
     map.clear();
+    resetChainEntries();
+  }
+
+  private void resetChainEntries() {
     head.prev = head;
     head.next = head;
   }
diff --git a/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java b/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
index cadb6a0..52a0b63 100644
--- a/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
+++ b/user/super/com/google/gwt/emul/java/util/LinkedHashSet.java
@@ -26,30 +26,20 @@
 public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable {
 
   public LinkedHashSet() {
-    super(new LinkedHashMap<E, Object>(16, .75f));
+    super(new LinkedHashMap<E, Object>());
   }
 
-  /**
-   * @param c
-   */
   public LinkedHashSet(Collection<? extends E> c) {
-    super(new LinkedHashMap<E, Object>(16, .75f));
+    super(new LinkedHashMap<E, Object>());
     addAll(c);
   }
 
-  /**
-   * @param initialCapacity
-   */
-  public LinkedHashSet(int initialCapacity) {
-    super(new LinkedHashMap<E, Object>(initialCapacity, .75f));
+  public LinkedHashSet(int ignored) {
+    super(new LinkedHashMap<E, Object>(ignored));
   }
 
-  /**
-   * @param initialCapacity
-   * @param loadFactor
-   */
-  public LinkedHashSet(int initialCapacity, float loadFactor) {
-    super(new LinkedHashMap<E, Object>(initialCapacity, loadFactor));
+  public LinkedHashSet(int ignored, float alsoIgnored) {
+    super(new LinkedHashMap<E, Object>(ignored, alsoIgnored));
   }
 
   @Override
