diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java
index 4ae24f5e2e47a25d860367ee362878e297f1eb80..bba18408c849acbd6d23dfd1cdb051f33380400a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GitIndex.java
@@ -244,7 +244,11 @@ public void read() throws IOException {
 			entries.clear();
 			for (int i = 0; i < header.entries; ++i) {
 				Entry entry = new Entry(buffer);
+				final GitIndex.Entry existing = entries.get(entry.name);
 				entries.put(entry.name, entry);
+				if (existing != null) {
+					entry.stages |= existing.stages;
+				}
 			}
 			lastCacheTime = cacheFile.lastModified();
 		} finally {
@@ -374,6 +378,8 @@ public class Entry {
 
 		private byte[] name;
 
+		private int stages;
+
 		Entry(byte[] key, File f, int stage)
 				throws IOException {
 			ctime = f.lastModified() * 1000000L;
@@ -391,6 +397,7 @@ public class Entry {
 			sha1 = writer.writeBlob(f);
 			name = key;
 			flags = (short) ((stage << 12) | name.length); // TODO: fix flags
+			stages = (1 >> getStage());
 		}
 
 		Entry(byte[] key, File f, int stage, byte[] newContent)
@@ -410,6 +417,7 @@ public class Entry {
 			sha1 = writer.writeBlob(newContent);
 			name = key;
 			flags = (short) ((stage << 12) | name.length); // TODO: fix flags
+			stages = (1 >> getStage());
 		}
 
 		Entry(TreeEntry f, int stage) {
@@ -429,6 +437,7 @@ public class Entry {
 			sha1 = f.getId();
 			name = Constants.encode(f.getFullName());
 			flags = (short) ((stage << 12) | name.length); // TODO: fix flags
+			stages = (1 >> getStage());
 		}
 
 		Entry(ByteBuffer b) {
@@ -445,6 +454,7 @@ public class Entry {
 			b.get(sha1bytes);
 			sha1 = ObjectId.fromRaw(sha1bytes);
 			flags = b.getShort();
+			stages = (1 << getStage());
 			name = new byte[flags & 0xFFF];
 			b.get(name);
 			b
@@ -643,6 +653,19 @@ public boolean isModified(File wd, boolean forceContentCheck) {
 			return false;
 		}
 
+		/**
+		 * Returns the stages in which the entry's file is recorded in the index.
+		 * The stages are bit-encoded: bit N is set if the file is present
+		 * in stage N. In particular, the N-th bit will be set if this entry
+		 * itself is in stage N (see getStage()).
+		 *
+		 * @return flags denoting stages
+		 * @see #getStage()
+		 */
+		public int getStages() {
+			return stages;
+		}
+
 		// for testing
 		void forceRecheck() {
 			mtime = -1;