diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index a599abda672da1e7437a5bf453fdda0dda395ff7..6b07d3fcc4f1c5ff38fe0654ed10589ef3ad6cc3 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2003-01-03  Eric Blake  <ebb9@email.byu.edu>
+
+	* java/util/TreeMap.java (fabricateTree): Fix off-by-one error.
+	(TreeIterator.remove): Prefer IllegalStateException over
+	ConcurrentModificationException, to match Sun.
+
 2002-12-22  Anthony Green  <green@redhat.com>
 
 	* boehm.cc (_Jv_MarkObj): Mark the protectionDomain of a class.
diff --git a/libjava/java/util/TreeMap.java b/libjava/java/util/TreeMap.java
index dfa9bc638812beac4de761a4697b3de4c4cf3f6b..e0cff28e02c66542be3c6ce97117139c2041cb93 100644
--- a/libjava/java/util/TreeMap.java
+++ b/libjava/java/util/TreeMap.java
@@ -865,7 +865,7 @@ public class TreeMap extends AbstractMap
     int rowsize;
 
     // Fill each row that is completely full of nodes.
-    for (rowsize = 2; rowsize + rowsize < count; rowsize <<= 1)
+    for (rowsize = 2; rowsize + rowsize <= count; rowsize <<= 1)
       {
         Node parent = row;
         Node last = null;
@@ -1468,10 +1468,10 @@ public class TreeMap extends AbstractMap
      */
     public void remove()
     {
-      if (knownMod != modCount)
-        throw new ConcurrentModificationException();
       if (last == null)
         throw new IllegalStateException();
+      if (knownMod != modCount)
+        throw new ConcurrentModificationException();
 
       removeNode(last);
       last = null;