diff --git a/user/super/com/google/gwt/emul/java/util/PriorityQueue.java b/user/super/com/google/gwt/emul/java/util/PriorityQueue.java
index 59de7e9..90480b8 100644
--- a/user/super/com/google/gwt/emul/java/util/PriorityQueue.java
+++ b/user/super/com/google/gwt/emul/java/util/PriorityQueue.java
@@ -124,8 +124,31 @@
 
   @Override
   public Iterator<E> iterator() {
-    // TODO(jat): PriorityQueue is supposed to have a modifiable iterator.
-    return Collections.unmodifiableList(heap).iterator();
+    return new Iterator<E>() {
+      private E current = null;
+      // Make a copy of the elements so that remove() doesn't screw up the order.
+      Iterator<E> elementsToTraverse = new ArrayList<>(heap).iterator();
+      @Override
+      public boolean hasNext() {
+        return elementsToTraverse.hasNext();
+      }
+
+      @Override
+      public E next() {
+        current = elementsToTraverse.next();
+        return current;
+      }
+
+      @Override
+      public void remove() {
+        if (current == null) {
+          throw new IllegalStateException("remove() called before iteration or removed already.");
+        }
+        // Remove the current element. Keep on iterating.
+        PriorityQueue.this.remove(current);
+        current = null;
+      }
+    };
   }
 
   @Override
diff --git a/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java b/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java
index 6b07adf..4f10055 100644
--- a/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,6 +21,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.TreeSet;
@@ -186,7 +187,7 @@
     assertTrue(queue.contains(3));
     assertFalse(queue.contains(4));
   }
-  
+
   public void testPeekElement() {
     PriorityQueue<Integer> queue = new PriorityQueue<>();
     try {
@@ -245,5 +246,40 @@
     PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
     addArray(pq, values);
     return pq;
-  } 
+  }
+
+  public void testIteratorRemove() {
+    PriorityQueue<Integer> queue = new PriorityQueue<>();
+    queue.add(1);
+    queue.add(2);
+    queue.add(3);
+    queue.add(5);
+    queue.add(6);
+
+    int sum = 0;
+    Iterator<Integer> it = queue.iterator();
+    while (it.hasNext()) {
+      int i = it.next();
+      if (i == 2) {
+        it.remove();
+      }
+      sum += i;
+    }
+    assertEquals(17, sum);
+    assertEquals(4, queue.size());
+
+    try {
+      queue.iterator().remove();
+      fail();
+    } catch (IllegalStateException e) { }
+
+    try {
+      Iterator<Integer> itt = queue.iterator();
+      while (itt.hasNext()) {
+        it.remove();
+        it.remove();
+        fail();
+      }
+    } catch (IllegalStateException e) { };
+  }
 }
