Index: src/test/org/apache/lucene/util/TestBitVector.java
===================================================================
--- src/test/org/apache/lucene/util/TestBitVector.java	(revision 723148)
+++ src/test/org/apache/lucene/util/TestBitVector.java	(working copy)
@@ -20,6 +20,7 @@
 import java.io.IOException;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.RAMDirectory;
 
@@ -201,6 +202,30 @@
         bv.write(d, "TESTBV");
       }
     }
+    
+    public void testDocIdSet() throws IOException {
+      int[] ints = new int[] {0,1,2,3,5,8};
+      BitVector bv = new BitVector(9);
+      for (int x=0; x < ints.length; x++) {
+      	bv.set(ints[x]);
+      }
+      tstDocIdSet(ints, bv);
+    }
+      
+    private void tstDocIdSet(int[] ints, BitVector bitVector) throws IOException {
+      for (int i = 0; i < ints.length; i++) {
+        if ((i > 0) && (ints[i-1] == ints[i])) {
+          return; // DocNrSkipper should not skip to same document.
+        }
+      }
+      DocIdSetIterator m = bitVector.iterator();
+      for (int i = 0; i < ints.length; i++) {
+        assertTrue("No end of Matcher at: " + i, m.next());
+        assertEquals(ints[i], m.doc());
+      }
+      assertTrue("End of Matcher", (! m.next()));
+    }
+    
     /**
      * Compare two BitVectors.
      * This should really be an equals method on the BitVector itself.
Index: src/java/org/apache/lucene/util/BitVector.java
===================================================================
--- src/java/org/apache/lucene/util/BitVector.java	(revision 723148)
+++ src/java/org/apache/lucene/util/BitVector.java	(working copy)
@@ -19,6 +19,8 @@
 
 import java.io.IOException;
 
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
@@ -35,7 +37,7 @@
 
   @version $Id$
   */
-public final class BitVector {
+public final class BitVector extends DocIdSet {
 
   private byte[] bits;
   private int size;
@@ -46,7 +48,42 @@
     size = n;
     bits = new byte[(size >> 3) + 1];
   }
+  
+  public DocIdSetIterator iterator() {
+    return new BitVectorDocIdSetIterator();
+  }
+	   
+  private class BitVectorDocIdSetIterator extends DocIdSetIterator {
+	int doc = -1;
+	int i = 0;
+		
+	public int doc() {
+	  return doc;
+	}
+		
+	/**
+	 * Implements next from DocIdSetIterator
+	 */
+	public boolean next() throws IOException {
+	  while (i < size) {
+	    if (get(i)) {
+	      doc = i;
+	      i++;
+	      return true;
+	    } else i++;
+	  }
+	  return false;
+    }
+		
+    // Not sure if there is an optimized way to do this
+    public boolean skipTo(int target) throws IOException {
+	  if (target < i) throw new IOException("target less than current position");
+		i = target;
+		return next();
+	}
+  } 
 
+  
   /** Sets the value of <code>bit</code> to one. */
   public final void set(int bit) {
     if (bit >= size) {
