Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempBlockTermsReader.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempBlockTermsReader.java	(revision 1513311)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempBlockTermsReader.java	(working copy)
@@ -167,7 +167,7 @@
         final long sumTotalTermFreq = fieldInfo.getIndexOptions() == IndexOptions.DOCS_ONLY ? -1 : in.readVLong();
         final long sumDocFreq = in.readVLong();
         final int docCount = in.readVInt();
-        final int longsSize = in.readVInt();
+        final int longsSize = version >= TempBlockTermsWriter.TERMS_VERSION_META_ARRAY ? in.readVInt() : 0;
         if (docCount < 0 || docCount > info.getDocCount()) { // #docs with field must be <= #docs
           throw new CorruptIndexException("invalid docCount: " + docCount + " maxDoc: " + info.getDocCount() + " (resource=" + in + ")");
         }
Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempBlockTermsWriter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempBlockTermsWriter.java	(revision 1513311)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempBlockTermsWriter.java	(working copy)
@@ -212,8 +212,11 @@
   /** Append-only */
   public static final int TERMS_VERSION_APPEND_ONLY = 1;
 
+  /** Metadata encoded in long[] and byte[] array */
+  public static final int TERMS_VERSION_META_ARRAY = 2;
+
   /** Current terms format. */
-  public static final int TERMS_VERSION_CURRENT = TERMS_VERSION_APPEND_ONLY;
+  public static final int TERMS_VERSION_CURRENT = TERMS_VERSION_META_ARRAY;
 
   /** Extension of terms index file */
   static final String TERMS_INDEX_EXTENSION = "tip";
@@ -225,8 +228,11 @@
   /** Append-only */
   public static final int TERMS_INDEX_VERSION_APPEND_ONLY = 1;
 
+  /** Metadata encoded in long[] and byte[] array */
+  public static final int TERMS_INDEX_VERSION_META_ARRAY = 2;
+
   /** Current index format. */
-  public static final int TERMS_INDEX_VERSION_CURRENT = TERMS_INDEX_VERSION_APPEND_ONLY;
+  public static final int TERMS_INDEX_VERSION_CURRENT = TERMS_INDEX_VERSION_META_ARRAY;
 
   private final IndexOutput out;
   private final IndexOutput indexOut;
Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempPostingsReader.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempPostingsReader.java	(revision 1513311)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempPostingsReader.java	(working copy)
@@ -62,6 +62,8 @@
 
   private final ForUtil forUtil;
 
+  private final int version;
+
   // public static boolean DEBUG = false;
 
   /** Sole constructor. */
@@ -73,27 +75,21 @@
     try {
       docIn = dir.openInput(IndexFileNames.segmentFileName(segmentInfo.name, segmentSuffix, TempBlockPostingsFormat.DOC_EXTENSION),
                             ioContext);
-      CodecUtil.checkHeader(docIn,
-                            TempPostingsWriter.DOC_CODEC,
-                            TempPostingsWriter.VERSION_CURRENT,
-                            TempPostingsWriter.VERSION_CURRENT);
+      version = CodecUtil.checkHeader(docIn,
+                                      TempPostingsWriter.DOC_CODEC,
+                                      TempPostingsWriter.VERSION_START,
+                                      TempPostingsWriter.VERSION_CURRENT);
       forUtil = new ForUtil(docIn);
 
       if (fieldInfos.hasProx()) {
         posIn = dir.openInput(IndexFileNames.segmentFileName(segmentInfo.name, segmentSuffix, TempBlockPostingsFormat.POS_EXTENSION),
                               ioContext);
-        CodecUtil.checkHeader(posIn,
-                              TempPostingsWriter.POS_CODEC,
-                              TempPostingsWriter.VERSION_CURRENT,
-                              TempPostingsWriter.VERSION_CURRENT);
+        CodecUtil.checkHeader(posIn, TempPostingsWriter.POS_CODEC, version, version);
 
         if (fieldInfos.hasPayloads() || fieldInfos.hasOffsets()) {
           payIn = dir.openInput(IndexFileNames.segmentFileName(segmentInfo.name, segmentSuffix, TempBlockPostingsFormat.PAY_EXTENSION),
                                 ioContext);
-          CodecUtil.checkHeader(payIn,
-                                TempPostingsWriter.PAY_CODEC,
-                                TempPostingsWriter.VERSION_CURRENT,
-                                TempPostingsWriter.VERSION_CURRENT);
+          CodecUtil.checkHeader(payIn, TempPostingsWriter.PAY_CODEC, version, version);
         }
       }
 
@@ -203,35 +199,89 @@
   public void decodeTerm(long[] longs, DataInput in, FieldInfo fieldInfo, TempTermState _termState)
     throws IOException {
     final IntBlockTermState termState = (IntBlockTermState) _termState;
+    final boolean isFirstTerm = termState.termBlockOrd == 0;
     final boolean fieldHasPositions = fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0;
     final boolean fieldHasOffsets = fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0;
     final boolean fieldHasPayloads = fieldInfo.hasPayloads();
-    
-    termState.docStartFP = longs[0];
-    if (fieldHasPositions) {
-      termState.posStartFP = longs[1];
-      if (fieldHasOffsets || fieldHasPayloads) {
-        termState.payStartFP = longs[2];
+   
+    if (version >= TempPostingsWriter.VERSION_META_ARRAY) {
+      termState.docStartFP = longs[0];
+      if (fieldHasPositions) {
+        termState.posStartFP = longs[1];
+        if (fieldHasOffsets || fieldHasPayloads) {
+          termState.payStartFP = longs[2];
+        }
       }
-    }
 
-    if (termState.docFreq == 1) {
-      termState.singletonDocID = in.readVInt();
-    } else {
-      termState.singletonDocID = -1;
-    }
-    if (fieldHasPositions) {
-      if (termState.totalTermFreq > BLOCK_SIZE) {
-        termState.lastPosBlockOffset = in.readVLong();
+      if (termState.docFreq == 1) {
+        termState.singletonDocID = in.readVInt();
       } else {
-        termState.lastPosBlockOffset = -1;
+        termState.singletonDocID = -1;
       }
-    }
+      if (fieldHasPositions) {
+        if (termState.totalTermFreq > BLOCK_SIZE) {
+          termState.lastPosBlockOffset = in.readVLong();
+        } else {
+          termState.lastPosBlockOffset = -1;
+        }
+      }
 
-    if (termState.docFreq > BLOCK_SIZE) {
-      termState.skipOffset = in.readVLong();
+      if (termState.docFreq > BLOCK_SIZE) {
+        termState.skipOffset = in.readVLong();
+      } else {
+        termState.skipOffset = -1;
+      }
     } else {
-      termState.skipOffset = -1;
+      if (isFirstTerm) {
+        if (termState.docFreq == 1) {
+          termState.singletonDocID = in.readVInt();
+          termState.docStartFP = 0;
+        } else {
+          termState.singletonDocID = -1;
+          termState.docStartFP = in.readVLong();
+        }
+        if (fieldHasPositions) {
+          termState.posStartFP = in.readVLong();
+          if (termState.totalTermFreq > BLOCK_SIZE) {
+            termState.lastPosBlockOffset = in.readVLong();
+          } else {
+            termState.lastPosBlockOffset = -1;
+          }
+          if ((fieldHasPayloads || fieldHasOffsets) && termState.totalTermFreq >= BLOCK_SIZE) {
+            termState.payStartFP = in.readVLong();
+          } else {
+            termState.payStartFP = -1;
+          }
+        }
+      } else {
+        if (termState.docFreq == 1) {
+          termState.singletonDocID = in.readVInt();
+        } else {
+          termState.singletonDocID = -1;
+          termState.docStartFP += in.readVLong();
+        }
+        if (fieldHasPositions) {
+          termState.posStartFP += in.readVLong();
+          if (termState.totalTermFreq > BLOCK_SIZE) {
+            termState.lastPosBlockOffset = in.readVLong();
+          } else {
+            termState.lastPosBlockOffset = -1;
+          }
+          if ((fieldHasPayloads || fieldHasOffsets) && termState.totalTermFreq >= BLOCK_SIZE) {
+            long delta = in.readVLong();
+            if (termState.payStartFP == -1) {
+              termState.payStartFP = delta;
+            } else {
+              termState.payStartFP += delta;
+            }
+          }
+        }
+      }
+      if (termState.docFreq > BLOCK_SIZE) {
+        termState.skipOffset = in.readVLong();
+      } else {
+        termState.skipOffset = -1;
+      }
     }
   }
     
Index: lucene/core/src/java/org/apache/lucene/codecs/temp/TempPostingsWriter.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/temp/TempPostingsWriter.java	(revision 1513311)
+++ lucene/core/src/java/org/apache/lucene/codecs/temp/TempPostingsWriter.java	(working copy)
@@ -68,8 +68,12 @@
 
   // Increment version to change it
   final static int VERSION_START = 0;
-  final static int VERSION_CURRENT = VERSION_START;
 
+  // Explicitly encode part of metadata with monotonic long[]
+  final static int VERSION_META_ARRAY = 1;
+
+  final static int VERSION_CURRENT = VERSION_META_ARRAY;
+
   final IndexOutput docOut;
   final IndexOutput posOut;
   final IndexOutput payOut;
