Index: src/test/org/apache/lucene/search/TestPhraseQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestPhraseQuery.java	(revision 697073)
+++ src/test/org/apache/lucene/search/TestPhraseQuery.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.lucene.document.*;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.queryParser.QueryParser;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.RAMDirectory;
 
@@ -354,6 +355,17 @@
     assertEquals(2, hits[2].doc);
     QueryUtils.check(query,searcher);        
   }
+  
+  public void testToString() throws Exception {
+    StopAnalyzer analyzer = new StopAnalyzer();
+    StopFilter.setEnablePositionIncrementsDefault(true);
+    QueryParser qp = new QueryParser("field", analyzer);
+    qp.setEnablePositionIncrements(true);
+    PhraseQuery q = (PhraseQuery)qp.parse("\"this hi this is a test is\"");
+    assertEquals("field:\"? hi ? ? ? test\"", q.toString());
+    q.add(new Term("field", "hello"), 1);
+    assertEquals("field:\"? hi|hello ? ? ? test\"", q.toString());
+  }
 
   public void testWrappedPhrase() throws IOException {
     query.add(new Term("repeated", "first"));
Index: src/java/org/apache/lucene/search/PhraseQuery.java
===================================================================
--- src/java/org/apache/lucene/search/PhraseQuery.java	(revision 697073)
+++ src/java/org/apache/lucene/search/PhraseQuery.java	(working copy)
@@ -35,6 +35,7 @@
   private String field;
   private ArrayList terms = new ArrayList(4);
   private ArrayList positions = new ArrayList(4);
+  private int maxPosition = 0;
   private int slop = 0;
 
   /** Constructs an empty phrase query. */
@@ -87,6 +88,7 @@
 
       terms.add(term);
       positions.add(new Integer(position));
+      if (position > maxPosition) maxPosition = position;
   }
 
   /** Returns the set of terms in this phrase. */
@@ -261,11 +263,28 @@
     }
 
     buffer.append("\"");
+    String[] pieces = new String[maxPosition + 1];
     for (int i = 0; i < terms.size(); i++) {
-      buffer.append(((Term)terms.get(i)).text());
-      if (i != terms.size()-1)
-  buffer.append(" ");
+      int pos = ((Integer)positions.get(i)).intValue();
+      String s = pieces[pos];
+      if (s == null) {
+        s = ((Term)terms.get(i)).text();
+      } else {
+        s = s + "|" + ((Term)terms.get(i)).text();
+      }
+      pieces[pos] = s;
     }
+    for (int i = 0; i < pieces.length; i++) {
+      if (i > 0) {
+        buffer.append(' ');
+      }
+      String s = pieces[i];
+      if (s == null) {
+        buffer.append('?');
+      } else {
+        buffer.append(s);
+      }
+    }
     buffer.append("\"");
 
     if (slop != 0) {
