diff --git a/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java b/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java
index e774a78d228..a63918434b3 100644
--- a/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java
+++ b/lucene/core/src/java/org/apache/lucene/index/PostingsEnum.java
@@ -55,6 +55,23 @@ public abstract class PostingsEnum extends DocIdSetIterator {
    */
   public static final short ALL = OFFSETS | PAYLOADS;
 
+
+  /** Value indicating that explicit indexed position lengths are not available */
+  public static final short NO_INDEXED_POSITION_LENGTH = 0;
+
+  /** Value indicating that indexed position length does not vary for this
+   * term in this doc */
+  public static final short FIXED_POSITION_LENGTH = 1;
+
+  /** Value indicating that indexed position length is variable for this
+   * term in this doc */
+  public static final short VARIABLE_POSITION_LENGTH = 2;
+
+  /** Value indicating that indexed position length for this term in this doc varies
+   * such that endPosition may decrease across subsequent instances */
+  public static final short VOLATILE_POSITION_LENGTH = 3;
+
+
   /**
    * Returns true if the given feature is requested in the flags, false otherwise.
    */
@@ -79,12 +96,50 @@ public abstract class PostingsEnum extends DocIdSetIterator {
    */
   public abstract int freq() throws IOException;
 
+  /**
+   * Returns information about the characteristics of indexed position length
+   * for this term in this document. Returned information may be useful,
+   * e.g., for optimizing proximity queries. */
+  public abstract int positionLengthInfo() throws IOException;
+
+  /**
+   * Returns the actual maximum position length for this term in this doc;
+   * returns -1 if positions were not indexed; if this information is unavailable,
+   * returns default value of 1.
+   */
+  public abstract int maxPositionLength() throws IOException;
+
+  /**
+   * Returns an upper bound (inclusive) on the amount by which end position may decrease
+   * from any instance to any subsequent instance of this term in this doc. Decrease includes
+   * measurement across end positions of any number of (not necessarily order-adjacent)
+   * instances. Returns -1 if positions were not indexed; where {@link #positionLengthInfo()}
+   * returns {@link #VOLATILE_POSITION_LENGTH}, the return value will be greater than 0;
+   * otherwise the return value will be 0.
+   */
+  public abstract int endPositionDecreaseCeiling() throws IOException;
+
+  /**
+   * Returns a lower bound (inclusive) on the value that will be returned
+   * by the subsequent call to {@link #nextPosition()}. Returns -1 if positions
+   * were not indexed; if this information is unavailable, return value defaults
+   * to current position, or 0 if unpositioned.
+   */
+  public abstract int nextPositionFloor() throws IOException;
+
   /**
    * Returns the next position, or -1 if positions were not indexed.
    * Calling this more than {@link #freq()} times is undefined.
    */
   public abstract int nextPosition() throws IOException;
 
+  /**
+   * Returns the position length for the current position, or -1
+   * if positions were not indexed, or a default value of 1 if indexed
+   * position length is not available.
+   */
+  public abstract int positionLength() throws IOException;
+
   /** Returns start offset for the current position, or -1
    *  if offsets were not indexed. */
   public abstract int startOffset() throws IOException;
