Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempFSTTermsReader.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempFSTTermsReader.java	(revision 1503274)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempFSTTermsReader.java	(working copy)
@@ -317,9 +317,8 @@
       public BytesRef next() throws IOException {
         if (seekPending) {  // previously positioned, but termOutputs not fetched
           seekPending = false;
-          if (seekCeil(term, false) != SeekStatus.FOUND) {
-            return term;
-          }
+          SeekStatus status = seekCeil(term, false);
+          assert status == SeekStatus.FOUND;  // must positioned on valid term
         }
         updateEnum(fstEnum.next());
         return term;
Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempFSTTermsWriter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempFSTTermsWriter.java	(revision 1503274)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempFSTTermsWriter.java	(working copy)
@@ -64,7 +64,6 @@
     this.fieldInfos = state.fieldInfos;
     this.out = state.directory.createOutput(termsFileName, state.context);
 
-    // nocommit: why try catch here? not catching createOutput?
     boolean success = false;
     try {
       writeHeader(out);
Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempTermOutputs.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempTermOutputs.java	(revision 1503274)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempTermOutputs.java	(working copy)
@@ -29,7 +29,6 @@
 import org.apache.lucene.util.fst.Outputs;
 import org.apache.lucene.util.LongsRef;
 
-
 // NOTE: outputs should be per-field, since
 // longsSize is fixed for each field
 public class TempTermOutputs extends Outputs<TempTermOutputs.TempMetaData> {
@@ -55,23 +54,31 @@
       this.docFreq = docFreq;
       this.totalTermFreq = totalTermFreq;
     }
+
     @Override
+    // NOTE: we don't actually implement hashCode here, 
+    // because FST nodes are seldom identical when outputs
+    // on thier arcs aren't NO_OUTPUTs.
     public int hashCode() {
-      int hash = 0;
-      if (longs != null) {
-        final int end = longs.length;
-        for (int i = 0; i < end; i++) {
-          hash -= longs[i];
-        }
+      if (this == NO_OUTPUT) {
+        return 0;
+      } else {
+        return 1;
       }
-      if (bytes != null) {
-        hash = -hash;
-        final int end = bytes.length;
-        for (int i = 0; i < end; i++) {
-          hash += bytes[i];
-        }
+    }
+
+    @Override
+    public boolean equals(Object other_) {
+      if (other_ == this) {
+        return true;
+      } else if (!(other_ instanceof TempTermOutputs.TempMetaData)) {
+        return false;
       }
-      return hash;
+      TempMetaData other = (TempMetaData) other_;
+      return statsEqual(this, other) && 
+             longsEqual(this, other) && 
+             bytesEqual(this, other);
+
     }
     public String toString() {
       if (this == NO_OUTPUT) {
@@ -149,7 +156,7 @@
         ret = new TempMetaData(min, null, 0, -1);
       }
     } else {  // equal long[]
-      if (statsEqual(t1, t2) && (t1.bytes == null || bytesEqual(t1, t2))) {
+      if (statsEqual(t1, t2) && bytesEqual(t1, t2)) {
         ret = t1;
       } else if (allZero(min)) {
         ret = NO_OUTPUT;
@@ -310,8 +317,17 @@
     return t1.docFreq == t2.docFreq && t1.totalTermFreq == t2.totalTermFreq;
   }
   static boolean bytesEqual(final TempMetaData t1, final TempMetaData t2) {
-    return Arrays.equals(t1.bytes, t2.bytes);
+    if (t1.bytes == null && t2.bytes == null) {
+      return true;
+    }
+    return t1.bytes != null && t2.bytes !=null && Arrays.equals(t1.bytes, t2.bytes);
   }
+  static boolean longsEqual(final TempMetaData t1, final TempMetaData t2) {
+    if (t1.longs == null && t2.longs == null) {
+      return true;
+    }
+    return t1.longs != null && t2.longs !=null && Arrays.equals(t1.longs, t2.longs);
+  }
   static boolean allZero(final long[] l) {
     for (int i = 0; i < l.length; i++) {
       if (l[i] != 0) {
