Index: lucene/src/test/org/apache/lucene/search/TestFieldCacheRewriteMethod.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/TestFieldCacheRewriteMethod.java	(revision 1188010)
+++ lucene/src/test/org/apache/lucene/search/TestFieldCacheRewriteMethod.java	(working copy)
@@ -30,10 +30,10 @@
   /** Test fieldcache rewrite against filter rewrite */
   @Override
   protected void assertSame(String regexp) throws IOException {   
-    RegexpQuery fieldCache = new RegexpQuery(new Term("field", regexp), RegExp.NONE);
+    RegexpQuery fieldCache = new RegexpQuery(new Term(fieldName, regexp), RegExp.NONE);
     fieldCache.setRewriteMethod(new FieldCacheRewriteMethod());
     
-    RegexpQuery filter = new RegexpQuery(new Term("field", regexp), RegExp.NONE);
+    RegexpQuery filter = new RegexpQuery(new Term(fieldName, regexp), RegExp.NONE);
     filter.setRewriteMethod(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE);
     
     TopDocs fieldCacheDocs = searcher1.search(fieldCache, 25);
Index: lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java
===================================================================
--- lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java	(revision 1188010)
+++ lucene/src/test/org/apache/lucene/search/TestRegexpRandom2.java	(working copy)
@@ -55,16 +55,18 @@
   protected IndexSearcher searcher2;
   private IndexReader reader;
   private Directory dir;
-  
+  protected String fieldName;
+
   @Override
   public void setUp() throws Exception {
     super.setUp();
     dir = newDirectory();
+    fieldName = random.nextBoolean() ? "field" : ""; // sometimes use an empty string as field name
     RandomIndexWriter writer = new RandomIndexWriter(random, dir, 
         newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random, MockTokenizer.KEYWORD, false))
         .setMaxBufferedDocs(_TestUtil.nextInt(random, 50, 1000)));
     Document doc = new Document();
-    Field field = newField("field", "", StringField.TYPE_UNSTORED);
+    Field field = newField(fieldName, "", StringField.TYPE_UNSTORED);
     doc.add(field);
     List<String> terms = new ArrayList<String>();
     int num = atLeast(200);
@@ -141,7 +143,7 @@
   public void testRegexps() throws Exception {
     // we generate aweful regexps: good for testing.
     // but for preflex codec, the test can be very slow, so use less iterations.
-    int num = CodecProvider.getDefault().getFieldCodec("field").equals("PreFlex") ? 100 * RANDOM_MULTIPLIER : atLeast(1000);
+    int num = CodecProvider.getDefault().getFieldCodec(fieldName).equals("PreFlex") ? 100 * RANDOM_MULTIPLIER : atLeast(1000);
     for (int i = 0; i < num; i++) {
       String reg = AutomatonTestUtil.randomRegexp(random);
       if (VERBOSE) {
@@ -155,8 +157,8 @@
    * simple regexpquery implementation.
    */
   protected void assertSame(String regexp) throws IOException {   
-    RegexpQuery smart = new RegexpQuery(new Term("field", regexp), RegExp.NONE);
-    DumbRegexpQuery dumb = new DumbRegexpQuery(new Term("field", regexp), RegExp.NONE);
+    RegexpQuery smart = new RegexpQuery(new Term(fieldName, regexp), RegExp.NONE);
+    DumbRegexpQuery dumb = new DumbRegexpQuery(new Term(fieldName, regexp), RegExp.NONE);
    
     TopDocs smartDocs = searcher1.search(smart, 25);
     TopDocs dumbDocs = searcher2.search(dumb, 25);
Index: lucene/src/test/org/apache/lucene/index/TestIndexWriter.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestIndexWriter.java	(revision 1188010)
+++ lucene/src/test/org/apache/lucene/index/TestIndexWriter.java	(working copy)
@@ -869,6 +869,24 @@
     writer.close();
     dir.close();
   }
+  
+  public void testEmptyFieldNameTerms() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)));
+    Document doc = new Document();
+    doc.add(newField("", "a b c", TextField.TYPE_UNSTORED));
+    writer.addDocument(doc);  
+    writer.close();
+    IndexReader reader = IndexReader.open(dir, true);
+    IndexReader subreader = getOnlySegmentReader(reader);
+    TermsEnum te = subreader.fields().terms("").iterator();
+    assertEquals(new BytesRef("a"), te.next());
+    assertEquals(new BytesRef("b"), te.next());
+    assertEquals(new BytesRef("c"), te.next());
+    assertNull(te.next());
+    reader.close();
+    dir.close();
+  }
 
 
 
Index: lucene/src/java/org/apache/lucene/index/CheckIndex.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/CheckIndex.java	(revision 1188017)
+++ lucene/src/java/org/apache/lucene/index/CheckIndex.java	(working copy)
@@ -726,6 +726,9 @@
           }
 
           final int docFreq = terms.docFreq();
+          if (docFreq <= 0) {
+            throw new RuntimeException("docfreq: " + docFreq + " is out of bounds");
+          }
           status.totFreq += docFreq;
           sumDocFreq += docFreq;
 
@@ -823,6 +826,9 @@
             throw new RuntimeException("term " + term + " docFreq=" + docFreq + " != tot docs w/o deletions " + docCount);
           }
           if (hasTotalTermFreq) {
+            if (totalTermFreq2 <= 0) {
+              throw new RuntimeException("totalTermFreq: " + totalTermFreq2 + " is out of bounds");
+            }
             sumTotalTermFreq += totalTermFreq;
             if (totalTermFreq != totalTermFreq2) {
               throw new RuntimeException("term " + term + " totalTermFreq=" + totalTermFreq2 + " != recomputed totalTermFreq=" + totalTermFreq);
Index: lucene/src/java/org/apache/lucene/index/codecs/preflex/PreFlexFields.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/preflex/PreFlexFields.java	(revision 1188010)
+++ lucene/src/java/org/apache/lucene/index/codecs/preflex/PreFlexFields.java	(working copy)
@@ -711,7 +711,12 @@
       } else {
         getTermsDict().seekEnum(termEnum, term, true);
       }
-      skipNext = true;
+      if (internedFieldName == "") {
+        // hackedy-hack: we aren't actually positioned yet
+        skipNext = false;
+      } else {
+        skipNext = true;
+      }
 
       unicodeSortOrder = sortTermsByUnicode();
 
Index: lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java
===================================================================
--- lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java	(revision 1188010)
+++ lucene/src/test-framework/org/apache/lucene/index/codecs/preflexrw/TermInfosWriter.java	(working copy)
@@ -199,6 +199,11 @@
       if (ch1 != ch2)
         return ch1-ch2;
     }
+    if (utf16Result1.length == 0 && lastFieldNumber == -1) {
+      // If there is a field named "" (empty string) with a term text of "" (empty string) then we
+      // will get 0 on this comparison, yet, it's "OK". 
+      return -1;
+    }
     return utf16Result1.length - utf16Result2.length;
   }
 
