Index: lucene/CHANGES.txt
===================================================================
--- lucene/CHANGES.txt	(revision 1042678)
+++ lucene/CHANGES.txt	(working copy)
@@ -339,6 +339,10 @@
 * LUCENE-2633: PackedInts Packed32 and Packed64 did not support internal
   structures larger than 256MB (Toke Eskildsen via Mike McCandless)
 
+* LUCENE-2802: NRT DirectoryReader returned incorrect values from
+  getVersion, isOptimized, getCommitUserData, getIndexCommit and isCurrent due
+  to a mutable reference to the IndexWriters SegmentInfos. (Simon Willnauer)
+
 ======================= Lucene 3.x (not yet released) =======================
 
 Changes in backwards compatibility policy
Index: lucene/src/java/org/apache/lucene/index/DirectoryReader.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/DirectoryReader.java	(revision 1042678)
+++ lucene/src/java/org/apache/lucene/index/DirectoryReader.java	(working copy)
@@ -55,8 +55,7 @@
 
   private IndexDeletionPolicy deletionPolicy;
   private Lock writeLock;
-  private SegmentInfos segmentInfos;
-  private SegmentInfos segmentInfosStart;
+  private final SegmentInfos segmentInfos;
   private boolean stale;
   private final int termInfosIndexDivisor;
 
@@ -106,7 +105,6 @@
     this.segmentInfos = sis;
     this.deletionPolicy = deletionPolicy;
     this.termInfosIndexDivisor = termInfosIndexDivisor;
-
     if (codecs == null) {
       this.codecs = CodecProvider.getDefault();
     } else {
@@ -145,8 +143,7 @@
   DirectoryReader(IndexWriter writer, SegmentInfos infos, int termInfosIndexDivisor, CodecProvider codecs) throws IOException {
     this.directory = writer.getDirectory();
     this.readOnly = true;
-    segmentInfos = infos;
-    segmentInfosStart = (SegmentInfos) infos.clone();
+    segmentInfos = (SegmentInfos) infos.clone();// make sure we clone otherwise we share mutable state with IW
     this.termInfosIndexDivisor = termInfosIndexDivisor;
     if (codecs == null) {
       this.codecs = CodecProvider.getDefault();
@@ -860,7 +857,7 @@
       // we loaded SegmentInfos from the directory
       return SegmentInfos.readCurrentVersion(directory, codecs) == segmentInfos.getVersion();
     } else {
-      return writer.nrtIsCurrent(segmentInfosStart);
+      return writer.nrtIsCurrent(segmentInfos);
     }
   }
 
Index: lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java	(revision 1042678)
+++ lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java	(working copy)
@@ -102,32 +102,72 @@
     
     r1.close();
     writer.close();
-    assertTrue(r2.isCurrent());
+    assertFalse(r2.isCurrent());
     
     IndexReader r3 = IndexReader.open(dir1, true);
     assertTrue(r3.isCurrent());
-    assertTrue(r2.isCurrent());
+    assertFalse(r2.isCurrent());
     assertEquals(0, count(new Term("id", id10), r3));
     assertEquals(1, count(new Term("id", Integer.toString(8000)), r3));
 
     writer = new IndexWriter(dir1, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer()));
     Document doc = new Document();
     doc.add(newField("field", "a b c", Field.Store.NO, Field.Index.ANALYZED));
+
     writer.addDocument(doc);
-    assertTrue(r2.isCurrent());
+    assertFalse(r2.isCurrent());
     assertTrue(r3.isCurrent());
-
     writer.close();
-
+    
     assertFalse(r2.isCurrent());
-    assertTrue(!r3.isCurrent());
+    assertFalse(r3.isCurrent());
 
+
     r2.close();
     r3.close();
     
     dir1.close();
   }
   
+  public void testIsCurrent() throws IOException {
+    Directory dir = newDirectory();
+    IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer());
+    
+    IndexWriter writer = new IndexWriter(dir, iwc);
+    Document doc = new Document();
+    doc.add(newField("field", "a b c", Field.Store.NO, Field.Index.ANALYZED));
+    writer.addDocument(doc);
+    writer.close();
+    
+    iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer());
+    writer = new IndexWriter(dir, iwc);
+    doc = new Document();
+    doc.add(newField("field", "a b c", Field.Store.NO, Field.Index.ANALYZED));
+    IndexReader nrtReader = writer.getReader();
+    assertTrue(nrtReader.isCurrent());
+    writer.addDocument(doc);
+    assertFalse(nrtReader.isCurrent()); // should see the changes
+    writer.waitForMerges();
+    assertFalse(nrtReader.isCurrent());
+    nrtReader.close();
+
+    IndexReader dirReader = IndexReader.open(dir);
+    nrtReader = writer.getReader();
+    
+    assertTrue(dirReader.isCurrent());
+    assertTrue(nrtReader.isCurrent());
+    assertEquals(2, nrtReader.maxDoc()); // sees the actual document added
+    assertEquals(1, dirReader.maxDoc());
+    writer.close(); // close is actually a commit both should see the changes
+    assertFalse(nrtReader.isCurrent()); 
+    assertFalse(dirReader.isCurrent());
+    
+    dirReader.close();
+    nrtReader.close();
+    dir.close();
+
+  }
+  
   /**
    * Test using IW.addIndexes
    * 
