     return .Some((e0!, e1!))
   }
 
-  var baseStreams: (E0, E1)
-  var reachedEnd: Bool = false
+  internal var _baseStreams: (Generator1, Generator2)
+  internal var _reachedEnd: Bool = false
 }
 
 /// A sequence of pairs built out of two underlying sequences, where
 /// the elements of the `i`th pair are the `i`th elements of each
 /// underlying sequence.
-public struct Zip2<S0: SequenceType, S1: SequenceType> : SequenceType
-{
-  public typealias Stream1 = S0.Generator
-  public typealias Stream2 = S1.Generator
-  
+public struct Zip2<Sequence1 : SequenceType, Sequence2 : SequenceType>
+  : SequenceType {
+
+  public typealias Stream1 = Sequence1.Generator
+  public typealias Stream2 = Sequence2.Generator
+
   /// A type whose instances can produce the elements of this
   /// sequence, in order.
   public typealias Generator = ZipGenerator2<Stream1, Stream2>
 
-  /// Construct an instance that makes pairs of elements from `s0` and
-  /// `s1`.
-  public init(_ s0: S0, _ s1: S1) {
-    sequences = (s0,s1)
+  /// Construct an instance that makes pairs of elements from `sequence1` and
+  /// `sequence2`.
+  public init(_ sequence1: Sequence1, _ sequence2: Sequence2) {
+    _sequences = (sequence1, sequence2)
   }
 
   /// Return a *generator* over the elements of this *sequence*.

  /// - complexity: O(1)
  public func generate() -> Generator {
    return Generator(
      sequences.0.generate(), 
      sequences.1.generate())
  }

  var sequences: (S0,S1)
}

/// A sequence of pairs built out of two underlying sequences, where
/// the elements of the `i`th pair are the `i`th elements of each
/// underlying sequence.
public func zip<Sequence1 : SequenceType, Sequence2 : SequenceType>(
  sequence1: Sequence1, _ sequence2: Sequence2
) -> Zip2<Sequence1, Sequence2> {
  return Zip2(sequence1, sequence2)
}

/// A generator for the `Zip2` sequence
public struct ZipGenerator2<
  Generator1 : GeneratorType, Generator2 : GeneratorType
> : GeneratorType {
  /// The type of element returned by `next()`.
  public typealias Element = (Generator1.Element, Generator2.Element)

  /// Construct around a pair of underlying generators.
  public init(_ generator1: Generator1, _ generator2: Generator2) {
    baseStreams = (generator1, generator2)
  }

  /// Advance to the next element and return it, or `nil` if no next
