diff --git a/user/super/com/google/gwt/emul/java/util/stream/BaseStream.java b/user/super/com/google/gwt/emul/java/util/stream/BaseStream.java
index 66a5a7c..3692d8c 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/BaseStream.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/BaseStream.java
@@ -41,5 +41,6 @@
 
   S onClose(Runnable closeHandler);
 
+  @Override
   void close();
 }
diff --git a/user/super/com/google/gwt/emul/java/util/stream/DoubleStream.java b/user/super/com/google/gwt/emul/java/util/stream/DoubleStream.java
index 99c0771..bfe782c 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/DoubleStream.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/DoubleStream.java
@@ -16,7 +16,6 @@
 
 package java.util.stream;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalState;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 import static javaemul.internal.InternalPreconditions.checkState;
 
@@ -73,7 +72,7 @@
 
       @Override
       public DoubleStream build() {
-        checkCriticalState(items != null, "Builder already built");
+        checkState(items != null, "Builder already built");
         DoubleStream stream = Arrays.stream(items);
         items = null;
         return stream;
@@ -90,44 +89,42 @@
     // TODO replace this flatMap-ish spliterator with one that directly combines the two root
     // streams
     Spliterator<? extends DoubleStream> spliteratorOfStreams = Arrays.asList(a, b).spliterator();
-    DoubleStream result =
-        new DoubleStreamSource(
-            null,
-            new Spliterators.AbstractDoubleSpliterator(Long.MAX_VALUE, 0) {
-              DoubleStream nextStream;
-              Spliterator.OfDouble next;
 
-              @Override
-              public boolean tryAdvance(DoubleConsumer action) {
-                // look for a new spliterator
-                while (advanceToNextSpliterator()) {
-                  // if we have one, try to read and use it
-                  if (next.tryAdvance(action)) {
-                    return true;
-                  } else {
-                    nextStream = null;
-                    // failed, null it out so we can find another
-                    next = null;
-                  }
-                }
+    Spliterator.OfDouble spliterator =
+        new Spliterators.AbstractDoubleSpliterator(Long.MAX_VALUE, 0) {
+          Spliterator.OfDouble next;
+
+          @Override
+          public boolean tryAdvance(DoubleConsumer action) {
+            // look for a new spliterator
+            while (advanceToNextSpliterator()) {
+              // if we have one, try to read and use it
+              if (next.tryAdvance(action)) {
+                return true;
+              } else {
+                // failed, null it out so we can find another
+                next = null;
+              }
+            }
+            return false;
+          }
+
+          private boolean advanceToNextSpliterator() {
+            while (next == null) {
+              if (!spliteratorOfStreams.tryAdvance(
+                  n -> {
+                    if (n != null) {
+                      next = n.spliterator();
+                    }
+                  })) {
                 return false;
               }
+            }
+            return true;
+          }
+        };
 
-              private boolean advanceToNextSpliterator() {
-                while (next == null) {
-                  if (!spliteratorOfStreams.tryAdvance(
-                      n -> {
-                        if (n != null) {
-                          nextStream = n;
-                          next = n.spliterator();
-                        }
-                      })) {
-                    return false;
-                  }
-                }
-                return true;
-              }
-            });
+    DoubleStream result = new DoubleStreamSource(null, spliterator);
 
     result.onClose(a::close);
     result.onClose(b::close);
@@ -140,7 +137,7 @@
   }
 
   static DoubleStream generate(DoubleSupplier s) {
-    return StreamSupport.doubleStream(
+    Spliterator.OfDouble spliterator =
         new Spliterators.AbstractDoubleSpliterator(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           @Override
@@ -148,12 +145,13 @@
             action.accept(s.getAsDouble());
             return true;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.doubleStream(spliterator, false);
   }
 
   static DoubleStream iterate(double seed, DoubleUnaryOperator f) {
-    return StreamSupport.doubleStream(
+    Spliterator.OfDouble spliterator =
         new Spliterators.AbstractDoubleSpliterator(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           private double next = seed;
@@ -164,8 +162,9 @@
             next = f.applyAsDouble(next);
             return true;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.doubleStream(spliterator, false);
   }
 
   static DoubleStream of(double... values) {
@@ -220,6 +219,7 @@
 
   void forEachOrdered(DoubleConsumer action);
 
+  @Override
   PrimitiveIterator.OfDouble iterator();
 
   DoubleStream limit(long maxSize);
@@ -238,6 +238,7 @@
 
   boolean noneMatch(DoublePredicate predicate);
 
+  @Override
   DoubleStream parallel();
 
   DoubleStream peek(DoubleConsumer action);
@@ -246,12 +247,14 @@
 
   double reduce(double identity, DoubleBinaryOperator op);
 
+  @Override
   DoubleStream sequential();
 
   DoubleStream skip(long n);
 
   DoubleStream sorted();
 
+  @Override
   Spliterator.OfDouble spliterator();
 
   double sum();
@@ -669,9 +672,10 @@
 
     @Override
     public boolean tryAdvance(DoubleConsumer action) {
-      if (limit <= position) {
+      if (position >= limit) {
         return false;
       }
+
       boolean result = original.tryAdvance(action);
       position++;
       return result;
@@ -752,30 +756,20 @@
 
     @Override
     public OptionalDouble min() {
-      terminate();
-      final ValueConsumer holder = new ValueConsumer();
-      if (spliterator.tryAdvance((double value) -> holder.value = value)) {
-        spliterator.forEachRemaining(
-            (double value) -> {
-              holder.value = Math.min(holder.value, value);
-            });
-        return OptionalDouble.of(holder.value);
+      DoubleSummaryStatistics stats = summaryStatistics();
+      if (stats.getCount() == 0) {
+        return OptionalDouble.empty();
       }
-      return OptionalDouble.empty();
+      return OptionalDouble.of(stats.getMin());
     }
 
     @Override
     public OptionalDouble max() {
-      terminate();
-      final ValueConsumer holder = new ValueConsumer();
-      if (spliterator.tryAdvance((double value) -> holder.value = value)) {
-        spliterator.forEachRemaining(
-            (double value) -> {
-              holder.value = Math.max(holder.value, value);
-            });
-        return OptionalDouble.of(holder.value);
+      DoubleSummaryStatistics stats = summaryStatistics();
+      if (stats.getCount() == 0) {
+        return OptionalDouble.empty();
       }
-      return OptionalDouble.empty();
+      return OptionalDouble.of(stats.getMax());
     }
 
     @Override
@@ -866,7 +860,7 @@
     @Override
     public <U> Stream<U> mapToObj(DoubleFunction<? extends U> mapper) {
       throwIfTerminated();
-      return new Stream.StreamSource(this, new MapToObjSpliterator<U>(mapper, spliterator));
+      return new Stream.StreamSource<U>(this, new MapToObjSpliterator<U>(mapper, spliterator));
     }
 
     @Override
@@ -886,8 +880,8 @@
       throwIfTerminated();
       final Spliterator<? extends DoubleStream> spliteratorOfStreams =
           new MapToObjSpliterator<DoubleStream>(mapper, spliterator);
-      return new DoubleStreamSource(
-          this,
+
+      Spliterator.OfDouble flatMapSpliterator =
           new Spliterators.AbstractDoubleSpliterator(Long.MAX_VALUE, 0) {
             DoubleStream nextStream;
             Spliterator.OfDouble next;
@@ -923,7 +917,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new DoubleStreamSource(this, flatMapSpliterator);
     }
 
     @Override
@@ -936,8 +932,8 @@
     @Override
     public DoubleStream sorted() {
       throwIfTerminated();
-      return new DoubleStreamSource(
-          this,
+
+      Spliterator.OfDouble sortingSpliterator =
           new Spliterators.AbstractDoubleSpliterator(
               spliterator.estimateSize(), spliterator.characteristics() | Spliterator.SORTED) {
             Spliterator.OfDouble ordered = null;
@@ -957,22 +953,26 @@
               }
               return ordered.tryAdvance(action);
             }
-          });
+          };
+
+      return new DoubleStreamSource(this, sortingSpliterator);
     }
 
     @Override
     public DoubleStream peek(DoubleConsumer action) {
       checkNotNull(action);
       throwIfTerminated();
-      return new DoubleStreamSource(
-          this,
+
+      Spliterator.OfDouble peekSpliterator =
           new Spliterators.AbstractDoubleSpliterator(
               spliterator.estimateSize(), spliterator.characteristics()) {
             @Override
             public boolean tryAdvance(final DoubleConsumer innerAction) {
               return spliterator.tryAdvance(action.andThen(innerAction));
             }
-          });
+          };
+
+      return new DoubleStreamSource(this, peekSpliterator);
     }
 
     @Override
diff --git a/user/super/com/google/gwt/emul/java/util/stream/IntStream.java b/user/super/com/google/gwt/emul/java/util/stream/IntStream.java
index c6c42e9..1a2b3fd 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/IntStream.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/IntStream.java
@@ -16,7 +16,6 @@
 
 package java.util.stream;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalState;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 import static javaemul.internal.InternalPreconditions.checkState;
 
@@ -29,6 +28,7 @@
 import java.util.PrimitiveIterator;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import java.util.Spliterators.AbstractIntSpliterator;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.DoubleConsumer;
@@ -74,7 +74,7 @@
 
       @Override
       public IntStream build() {
-        checkCriticalState(items != null, "Builder already built");
+        checkState(items != null, "Builder already built");
         IntStream stream = Arrays.stream(items);
         items = null;
         return stream;
@@ -91,44 +91,42 @@
     // TODO replace this flatMap-ish spliterator with one that directly combines the two root
     // streams
     Spliterator<? extends IntStream> spliteratorOfStreams = Arrays.asList(a, b).spliterator();
-    IntStream result =
-        new IntStreamSource(
-            null,
-            new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE, 0) {
-              IntStream nextStream;
-              Spliterator.OfInt next;
 
-              @Override
-              public boolean tryAdvance(IntConsumer action) {
-                // look for a new spliterator
-                while (advanceToNextSpliterator()) {
-                  // if we have one, try to read and use it
-                  if (next.tryAdvance(action)) {
-                    return true;
-                  } else {
-                    nextStream = null;
-                    // failed, null it out so we can find another
-                    next = null;
-                  }
-                }
+    Spliterator.OfInt spliterator =
+        new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE, 0) {
+          Spliterator.OfInt next;
+
+          @Override
+          public boolean tryAdvance(IntConsumer action) {
+            // look for a new spliterator
+            while (advanceToNextSpliterator()) {
+              // if we have one, try to read and use it
+              if (next.tryAdvance(action)) {
+                return true;
+              } else {
+                // failed, null it out so we can find another
+                next = null;
+              }
+            }
+            return false;
+          }
+
+          private boolean advanceToNextSpliterator() {
+            while (next == null) {
+              if (!spliteratorOfStreams.tryAdvance(
+                  n -> {
+                    if (n != null) {
+                      next = n.spliterator();
+                    }
+                  })) {
                 return false;
               }
+            }
+            return true;
+          }
+        };
 
-              private boolean advanceToNextSpliterator() {
-                while (next == null) {
-                  if (!spliteratorOfStreams.tryAdvance(
-                      n -> {
-                        if (n != null) {
-                          nextStream = n;
-                          next = n.spliterator();
-                        }
-                      })) {
-                    return false;
-                  }
-                }
-                return true;
-              }
-            });
+    IntStream result = new IntStreamSource(null, spliterator);
 
     result.onClose(a::close);
     result.onClose(b::close);
@@ -141,7 +139,7 @@
   }
 
   static IntStream generate(final IntSupplier s) {
-    return StreamSupport.intStream(
+    AbstractIntSpliterator spliterator =
         new Spliterators.AbstractIntSpliterator(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           @Override
@@ -149,12 +147,14 @@
             action.accept(s.getAsInt());
             return true;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.intStream(spliterator, false);
   }
 
   static IntStream iterate(int seed, IntUnaryOperator f) {
-    return StreamSupport.intStream(
+
+    AbstractIntSpliterator spliterator =
         new Spliterators.AbstractIntSpliterator(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           private int next = seed;
@@ -165,8 +165,9 @@
             next = f.applyAsInt(next);
             return true;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.intStream(spliterator, false);
   }
 
   static IntStream of(int... values) {
@@ -191,7 +192,7 @@
     }
     int count = endInclusive - startInclusive + 1;
 
-    return StreamSupport.intStream(
+    AbstractIntSpliterator spliterator =
         new Spliterators.AbstractIntSpliterator(
             count,
             Spliterator.IMMUTABLE
@@ -215,8 +216,9 @@
             }
             return false;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.intStream(spliterator, false);
   }
 
   /**
@@ -266,6 +268,7 @@
 
   void forEachOrdered(IntConsumer action);
 
+  @Override
   PrimitiveIterator.OfInt iterator();
 
   IntStream limit(long maxSize);
@@ -284,6 +287,7 @@
 
   boolean noneMatch(IntPredicate predicate);
 
+  @Override
   IntStream parallel();
 
   IntStream peek(IntConsumer action);
@@ -292,12 +296,14 @@
 
   int reduce(int identity, IntBinaryOperator op);
 
+  @Override
   IntStream sequential();
 
   IntStream skip(long n);
 
   IntStream sorted();
 
+  @Override
   Spliterator.OfInt spliterator();
 
   int sum();
@@ -727,7 +733,7 @@
 
     @Override
     public boolean tryAdvance(IntConsumer action) {
-      if (limit <= position) {
+      if (position >= limit) {
         return false;
       }
       boolean result = original.tryAdvance(action);
@@ -819,24 +825,20 @@
 
     @Override
     public OptionalInt max() {
-      terminate();
-      final ValueConsumer holder = new ValueConsumer();
-      if (spliterator.tryAdvance((int value) -> holder.value = value)) {
-        spliterator.forEachRemaining((int value) -> holder.value = Math.max(holder.value, value));
-        return OptionalInt.of(holder.value);
+      IntSummaryStatistics stats = summaryStatistics();
+      if (stats.getCount() == 0) {
+        return OptionalInt.empty();
       }
-      return OptionalInt.empty();
+      return OptionalInt.of(stats.getMax());
     }
 
     @Override
     public OptionalInt min() {
-      terminate();
-      final ValueConsumer holder = new ValueConsumer();
-      if (spliterator.tryAdvance((int value) -> holder.value = value)) {
-        spliterator.forEachRemaining((int value) -> holder.value = Math.min(holder.value, value));
-        return OptionalInt.of(holder.value);
+      IntSummaryStatistics stats = summaryStatistics();
+      if (stats.getCount() == 0) {
+        return OptionalInt.empty();
       }
-      return OptionalInt.empty();
+      return OptionalInt.of(stats.getMin());
     }
 
     @Override
@@ -914,7 +916,7 @@
     @Override
     public <U> Stream<U> mapToObj(IntFunction<? extends U> mapper) {
       throwIfTerminated();
-      return new Stream.StreamSource(this, new MapToObjSpliterator<U>(mapper, spliterator));
+      return new Stream.StreamSource<U>(this, new MapToObjSpliterator<U>(mapper, spliterator));
     }
 
     @Override
@@ -935,8 +937,8 @@
       throwIfTerminated();
       final Spliterator<? extends IntStream> spliteratorOfStreams =
           new MapToObjSpliterator<>(mapper, spliterator);
-      return new IntStreamSource(
-          this,
+
+      Spliterator.OfInt flatMapSpliterator =
           new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE, 0) {
             IntStream nextStream;
             Spliterator.OfInt next;
@@ -972,7 +974,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new IntStreamSource(this, flatMapSpliterator);
     }
 
     @Override
@@ -985,8 +989,8 @@
     @Override
     public IntStream sorted() {
       throwIfTerminated();
-      return new IntStreamSource(
-          this,
+
+      AbstractIntSpliterator sortedSpliterator =
           new Spliterators.AbstractIntSpliterator(
               spliterator.estimateSize(), spliterator.characteristics() | Spliterator.SORTED) {
             Spliterator.OfInt ordered = null;
@@ -1006,22 +1010,26 @@
               }
               return ordered.tryAdvance(action);
             }
-          });
+          };
+
+      return new IntStreamSource(this, sortedSpliterator);
     }
 
     @Override
     public IntStream peek(IntConsumer action) {
       checkNotNull(action);
       throwIfTerminated();
-      return new IntStreamSource(
-          this,
+
+      AbstractIntSpliterator peekSpliterator =
           new Spliterators.AbstractIntSpliterator(
               spliterator.estimateSize(), spliterator.characteristics()) {
             @Override
             public boolean tryAdvance(final IntConsumer innerAction) {
               return spliterator.tryAdvance(action.andThen(innerAction));
             }
-          });
+          };
+
+      return new IntStreamSource(this, peekSpliterator);
     }
 
     @Override
diff --git a/user/super/com/google/gwt/emul/java/util/stream/LongStream.java b/user/super/com/google/gwt/emul/java/util/stream/LongStream.java
index 9f354b7..6981225 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/LongStream.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/LongStream.java
@@ -16,7 +16,6 @@
 
 package java.util.stream;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalState;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 import static javaemul.internal.InternalPreconditions.checkState;
 
@@ -29,6 +28,7 @@
 import java.util.PrimitiveIterator;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import java.util.Spliterators.AbstractLongSpliterator;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.DoubleConsumer;
@@ -74,7 +74,7 @@
 
       @Override
       public LongStream build() {
-        checkCriticalState(items != null, "Builder already built");
+        checkState(items != null, "Builder already built");
         LongStream stream = Arrays.stream(items);
         items = null;
         return stream;
@@ -91,44 +91,42 @@
     // TODO replace this flatMap-ish spliterator with one that directly combines the two root
     // streams
     Spliterator<? extends LongStream> spliteratorOfStreams = Arrays.asList(a, b).spliterator();
-    LongStream result =
-        new LongStreamSource(
-            null,
-            new Spliterators.AbstractLongSpliterator(Long.MAX_VALUE, 0) {
-              LongStream nextStream;
-              Spliterator.OfLong next;
 
-              @Override
-              public boolean tryAdvance(LongConsumer action) {
-                // look for a new spliterator
-                while (advanceToNextSpliterator()) {
-                  // if we have one, try to read and use it
-                  if (next.tryAdvance(action)) {
-                    return true;
-                  } else {
-                    nextStream = null;
-                    // failed, null it out so we can find another
-                    next = null;
-                  }
-                }
+    AbstractLongSpliterator spliterator =
+        new Spliterators.AbstractLongSpliterator(Long.MAX_VALUE, 0) {
+          Spliterator.OfLong next;
+
+          @Override
+          public boolean tryAdvance(LongConsumer action) {
+            // look for a new spliterator
+            while (advanceToNextSpliterator()) {
+              // if we have one, try to read and use it
+              if (next.tryAdvance(action)) {
+                return true;
+              } else {
+                // failed, null it out so we can find another
+                next = null;
+              }
+            }
+            return false;
+          }
+
+          private boolean advanceToNextSpliterator() {
+            while (next == null) {
+              if (!spliteratorOfStreams.tryAdvance(
+                  n -> {
+                    if (n != null) {
+                      next = n.spliterator();
+                    }
+                  })) {
                 return false;
               }
+            }
+            return true;
+          }
+        };
 
-              private boolean advanceToNextSpliterator() {
-                while (next == null) {
-                  if (!spliteratorOfStreams.tryAdvance(
-                      n -> {
-                        if (n != null) {
-                          nextStream = n;
-                          next = n.spliterator();
-                        }
-                      })) {
-                    return false;
-                  }
-                }
-                return true;
-              }
-            });
+    LongStream result = new LongStreamSource(null, spliterator);
 
     result.onClose(a::close);
     result.onClose(b::close);
@@ -141,7 +139,7 @@
   }
 
   static LongStream generate(LongSupplier s) {
-    return StreamSupport.longStream(
+    AbstractLongSpliterator spltierator =
         new Spliterators.AbstractLongSpliterator(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           @Override
@@ -149,12 +147,13 @@
             action.accept(s.getAsLong());
             return true;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.longStream(spltierator, false);
   }
 
   static LongStream iterate(long seed, LongUnaryOperator f) {
-    return StreamSupport.longStream(
+    AbstractLongSpliterator spliterator =
         new Spliterators.AbstractLongSpliterator(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           private long next = seed;
@@ -165,8 +164,8 @@
             next = f.applyAsLong(next);
             return true;
           }
-        },
-        false);
+        };
+    return StreamSupport.longStream(spliterator, false);
   }
 
   static LongStream of(long... values) {
@@ -191,7 +190,7 @@
     }
     long count = endInclusive - startInclusive + 1;
 
-    return StreamSupport.longStream(
+    AbstractLongSpliterator spliterator =
         new Spliterators.AbstractLongSpliterator(
             count,
             Spliterator.IMMUTABLE
@@ -215,8 +214,9 @@
             }
             return false;
           }
-        },
-        false);
+        };
+
+    return StreamSupport.longStream(spliterator, false);
   }
 
   /**
@@ -264,6 +264,7 @@
 
   void forEachOrdered(LongConsumer action);
 
+  @Override
   PrimitiveIterator.OfLong iterator();
 
   LongStream limit(long maxSize);
@@ -282,6 +283,7 @@
 
   boolean noneMatch(LongPredicate predicate);
 
+  @Override
   LongStream parallel();
 
   LongStream peek(LongConsumer action);
@@ -290,12 +292,14 @@
 
   long reduce(long identity, LongBinaryOperator op);
 
+  @Override
   LongStream sequential();
 
   LongStream skip(long n);
 
   LongStream sorted();
 
+  @Override
   Spliterator.OfLong spliterator();
 
   long sum();
@@ -717,7 +721,7 @@
 
     @Override
     public boolean tryAdvance(LongConsumer action) {
-      if (limit <= position) {
+      if (position >= limit) {
         return false;
       }
       boolean result = original.tryAdvance(action);
@@ -799,24 +803,20 @@
 
     @Override
     public OptionalLong min() {
-      terminate();
-      final ValueConsumer holder = new ValueConsumer();
-      if (spliterator.tryAdvance((long value) -> holder.value = value)) {
-        spliterator.forEachRemaining((long value) -> holder.value = Math.min(holder.value, value));
-        return OptionalLong.of(holder.value);
+      LongSummaryStatistics stats = summaryStatistics();
+      if (stats.getCount() == 0) {
+        return OptionalLong.empty();
       }
-      return OptionalLong.empty();
+      return OptionalLong.of(stats.getMin());
     }
 
     @Override
     public OptionalLong max() {
-      terminate();
-      final ValueConsumer holder = new ValueConsumer();
-      if (spliterator.tryAdvance((long value) -> holder.value = value)) {
-        spliterator.forEachRemaining((long value) -> holder.value = Math.max(holder.value, value));
-        return OptionalLong.of(holder.value);
+      LongSummaryStatistics stats = summaryStatistics();
+      if (stats.getCount() == 0) {
+        return OptionalLong.empty();
       }
-      return OptionalLong.empty();
+      return OptionalLong.of(stats.getMax());
     }
 
     @Override
@@ -905,7 +905,7 @@
     @Override
     public <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) {
       throwIfTerminated();
-      return new Stream.StreamSource(this, new MapToObjSpliterator<U>(mapper, spliterator));
+      return new Stream.StreamSource<U>(this, new MapToObjSpliterator<U>(mapper, spliterator));
     }
 
     @Override
@@ -926,8 +926,8 @@
       throwIfTerminated();
       final Spliterator<? extends LongStream> spliteratorOfStreams =
           new MapToObjSpliterator<>(mapper, spliterator);
-      return new LongStreamSource(
-          this,
+
+      AbstractLongSpliterator flatMapSpliterator =
           new Spliterators.AbstractLongSpliterator(Long.MAX_VALUE, 0) {
             LongStream nextStream;
             Spliterator.OfLong next;
@@ -963,7 +963,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new LongStreamSource(this, flatMapSpliterator);
     }
 
     @Override
@@ -976,8 +978,8 @@
     @Override
     public LongStream sorted() {
       throwIfTerminated();
-      return new LongStreamSource(
-          this,
+
+      AbstractLongSpliterator sortedSpliterator =
           new Spliterators.AbstractLongSpliterator(
               spliterator.estimateSize(), spliterator.characteristics() | Spliterator.SORTED) {
             Spliterator.OfLong ordered = null;
@@ -997,22 +999,26 @@
               }
               return ordered.tryAdvance(action);
             }
-          });
+          };
+
+      return new LongStreamSource(this, sortedSpliterator);
     }
 
     @Override
     public LongStream peek(LongConsumer action) {
       checkNotNull(action);
       throwIfTerminated();
-      return new LongStreamSource(
-          this,
+
+      AbstractLongSpliterator peekSpliterator =
           new Spliterators.AbstractLongSpliterator(
               spliterator.estimateSize(), spliterator.characteristics()) {
             @Override
             public boolean tryAdvance(final LongConsumer innerAction) {
               return spliterator.tryAdvance(action.andThen(innerAction));
             }
-          });
+          };
+
+      return new LongStreamSource(this, peekSpliterator);
     }
 
     @Override
diff --git a/user/super/com/google/gwt/emul/java/util/stream/Stream.java b/user/super/com/google/gwt/emul/java/util/stream/Stream.java
index dfd6d8a..a313f4a 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/Stream.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/Stream.java
@@ -16,7 +16,6 @@
 
 package java.util.stream;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalState;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 import static javaemul.internal.InternalPreconditions.checkState;
 
@@ -30,6 +29,10 @@
 import java.util.Optional;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import java.util.Spliterators.AbstractDoubleSpliterator;
+import java.util.Spliterators.AbstractIntSpliterator;
+import java.util.Spliterators.AbstractLongSpliterator;
+import java.util.Spliterators.AbstractSpliterator;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.BinaryOperator;
@@ -78,7 +81,7 @@
       @Override
       @SuppressWarnings("unchecked")
       public Stream<T> build() {
-        checkCriticalState(items != null, "Builder already built");
+        checkState(items != null, "Builder already built");
         Stream<T> stream = (Stream<T>) Arrays.stream(items);
         items = null;
         return stream;
@@ -96,44 +99,42 @@
     // streams
     Spliterator<? extends Stream<? extends T>> spliteratorOfStreams =
         Arrays.asList(a, b).spliterator();
-    Stream<T> result =
-        new StreamSource<T>(
-            null,
-            new Spliterators.AbstractSpliterator<T>(Long.MAX_VALUE, 0) {
-              Stream<? extends T> nextStream;
-              Spliterator<? extends T> next;
 
-              @Override
-              public boolean tryAdvance(Consumer<? super T> action) {
-                // look for a new spliterator
-                while (advanceToNextSpliterator()) {
-                  // if we have one, try to read and use it
-                  if (next.tryAdvance(action)) {
-                    return true;
-                  } else {
-                    nextStream = null;
-                    // failed, null it out so we can find another
-                    next = null;
-                  }
-                }
+    AbstractSpliterator<T> spliterator =
+        new Spliterators.AbstractSpliterator<T>(Long.MAX_VALUE, 0) {
+          Spliterator<? extends T> next;
+
+          @Override
+          public boolean tryAdvance(Consumer<? super T> action) {
+            // look for a new spliterator
+            while (advanceToNextSpliterator()) {
+              // if we have one, try to read and use it
+              if (next.tryAdvance(action)) {
+                return true;
+              } else {
+                // failed, null it out so we can find another
+                next = null;
+              }
+            }
+            return false;
+          }
+
+          private boolean advanceToNextSpliterator() {
+            while (next == null) {
+              if (!spliteratorOfStreams.tryAdvance(
+                  n -> {
+                    if (n != null) {
+                      next = n.spliterator();
+                    }
+                  })) {
                 return false;
               }
+            }
+            return true;
+          }
+        };
 
-              private boolean advanceToNextSpliterator() {
-                while (next == null) {
-                  if (!spliteratorOfStreams.tryAdvance(
-                      n -> {
-                        if (n != null) {
-                          nextStream = n;
-                          next = n.spliterator();
-                        }
-                      })) {
-                    return false;
-                  }
-                }
-                return true;
-              }
-            });
+    Stream<T> result = new StreamSource<T>(null, spliterator);
 
     result.onClose(a::close);
     result.onClose(b::close);
@@ -146,7 +147,7 @@
   }
 
   static <T> Stream<T> generate(Supplier<T> s) {
-    return StreamSupport.stream(
+    AbstractSpliterator<T> spliterator =
         new Spliterators.AbstractSpliterator<T>(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           @Override
@@ -154,12 +155,12 @@
             action.accept(s.get());
             return true;
           }
-        },
-        false);
+        };
+    return StreamSupport.stream(spliterator, false);
   }
 
   static <T> Stream<T> iterate(T seed, UnaryOperator<T> f) {
-    return StreamSupport.stream(
+    AbstractSpliterator<T> spliterator =
         new Spliterators.AbstractSpliterator<T>(
             Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED) {
           private T next = seed;
@@ -170,8 +171,8 @@
             next = f.apply(next);
             return true;
           }
-        },
-        false);
+        };
+    return StreamSupport.stream(spliterator, false);
   }
 
   static <T> Stream<T> of(T t) {
@@ -702,7 +703,7 @@
 
     @Override
     public boolean tryAdvance(Consumer<? super T> action) {
-      if (limit <= position) {
+      if (position >= limit) {
         return false;
       }
       boolean result = original.tryAdvance(action);
@@ -901,8 +902,8 @@
       throwIfTerminated();
       final Spliterator<? extends Stream<? extends R>> spliteratorOfStreams =
           new MapToObjSpliterator<>(mapper, spliterator);
-      return new StreamSource<R>(
-          this,
+
+      AbstractSpliterator<R> flatMapSpliterator =
           new Spliterators.AbstractSpliterator<R>(Long.MAX_VALUE, 0) {
             Stream<? extends R> nextStream;
             Spliterator<? extends R> next;
@@ -938,7 +939,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new StreamSource<R>(this, flatMapSpliterator);
     }
 
     @Override
@@ -946,8 +949,8 @@
       throwIfTerminated();
       final Spliterator<? extends IntStream> spliteratorOfStreams =
           new MapToObjSpliterator<>(mapper, spliterator);
-      return new IntStream.IntStreamSource(
-          this,
+
+      AbstractIntSpliterator flatMapSpliterator =
           new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE, 0) {
             IntStream nextStream;
             Spliterator.OfInt next;
@@ -983,7 +986,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new IntStream.IntStreamSource(this, flatMapSpliterator);
     }
 
     @Override
@@ -991,8 +996,8 @@
       throwIfTerminated();
       final Spliterator<? extends LongStream> spliteratorOfStreams =
           new MapToObjSpliterator<>(mapper, spliterator);
-      return new LongStream.LongStreamSource(
-          this,
+
+      AbstractLongSpliterator flatMapSpliterator =
           new Spliterators.AbstractLongSpliterator(Long.MAX_VALUE, 0) {
             LongStream nextStream;
             Spliterator.OfLong next;
@@ -1028,7 +1033,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new LongStream.LongStreamSource(this, flatMapSpliterator);
     }
 
     @Override
@@ -1036,8 +1043,8 @@
       throwIfTerminated();
       final Spliterator<? extends DoubleStream> spliteratorOfStreams =
           new MapToObjSpliterator<>(mapper, spliterator);
-      return new DoubleStream.DoubleStreamSource(
-          this,
+
+      AbstractDoubleSpliterator flatMapSpliterator =
           new Spliterators.AbstractDoubleSpliterator(Long.MAX_VALUE, 0) {
             DoubleStream nextStream;
             Spliterator.OfDouble next;
@@ -1073,7 +1080,9 @@
               }
               return true;
             }
-          });
+          };
+
+      return new DoubleStream.DoubleStreamSource(this, flatMapSpliterator);
     }
 
     @Override
@@ -1093,8 +1102,8 @@
     @Override
     public Stream<T> sorted(final Comparator<? super T> comparator) {
       throwIfTerminated();
-      return new StreamSource<>(
-          this,
+
+      AbstractSpliterator<T> sortedSpliterator =
           new Spliterators.AbstractSpliterator<T>(
               spliterator.estimateSize(), spliterator.characteristics() | Spliterator.SORTED) {
             Spliterator<T> ordered = null;
@@ -1114,15 +1123,17 @@
               }
               return ordered.tryAdvance(action);
             }
-          });
+          };
+
+      return new StreamSource<>(this, sortedSpliterator);
     }
 
     @Override
     public Stream<T> peek(final Consumer<? super T> action) {
       checkNotNull(action);
       throwIfTerminated();
-      return new StreamSource<>(
-          this,
+
+      AbstractSpliterator<T> peekSpliterator =
           new Spliterators.AbstractSpliterator<T>(
               spliterator.estimateSize(), spliterator.characteristics()) {
             @Override
@@ -1133,7 +1144,9 @@
                     innerAction.accept(item);
                   });
             }
-          });
+          };
+
+      return new StreamSource<>(this, peekSpliterator);
     }
 
     @Override
