http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
 
b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index 09cf3c3..a45e9fc 100644
--- 
a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ 
b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -34,6 +34,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxId;
@@ -72,6 +73,12 @@ public class LuceneMailboxMessageSearchIndexTest {
             + "It has " + RHUBARD + ".\r\n" + "It has " + CUSTARD + ".\r\n"
             + "It needs naught else.\r\n";
 
+    private MessageUid uid1;
+    private MessageUid uid2;
+    private MessageUid uid3;
+    private MessageUid uid4;
+    private MessageUid uid5;
+
     protected boolean useLenient() {
         return true;
     }
@@ -98,28 +105,34 @@ public class LuceneMailboxMessageSearchIndexTest {
         headersTestSubject.put("From", "test12 <test12@localhost>");
         headersTestSubject.put("Cc", "test211 <test21@localhost>, test6 
<test6@foobar>");
         
-        SimpleMailboxMembership m2 = new 
SimpleMailboxMembership(mailbox2.getMailboxId(),1, 0, new Date(), 20, new 
Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
-        index.add(null, mailbox2, m2);
-
-        SimpleMailboxMembership m = new 
SimpleMailboxMembership(mailbox.getMailboxId(),1, 0, new Date(), 200, new 
Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
+        uid1 = MessageUid.of(1);
+        SimpleMailboxMembership m = new 
SimpleMailboxMembership(mailbox.getMailboxId(), uid1, 0, new Date(), 200, new 
Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
         index.add(null, mailbox, m);
+
+        uid2 = MessageUid.of(1);
+        SimpleMailboxMembership m2 = new 
SimpleMailboxMembership(mailbox2.getMailboxId(), uid2, 0, new Date(), 20, new 
Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
+        index.add(null, mailbox2, m2);
         
+        uid3 = MessageUid.of(2);
         Calendar cal = Calendar.getInstance();
         cal.set(1980, 2, 10);
-        SimpleMailboxMembership m3 = new 
SimpleMailboxMembership(mailbox.getMailboxId(),2, 0, cal.getTime(), 20, new 
Flags(Flag.DELETED), "My Otherbody".getBytes(), headersTest);
+        SimpleMailboxMembership m3 = new 
SimpleMailboxMembership(mailbox.getMailboxId(), uid3, 0, cal.getTime(), 20, new 
Flags(Flag.DELETED), "My Otherbody".getBytes(), headersTest);
         index.add(null, mailbox, m3);
+        
+        uid4 = MessageUid.of(3);
         Calendar cal2 = Calendar.getInstance();
         cal2.set(8000, 2, 10);
-        SimpleMailboxMembership m4 = new 
SimpleMailboxMembership(mailbox.getMailboxId(),3, 0, cal2.getTime(), 20, new 
Flags(Flag.DELETED), "My Otherbody2".getBytes(), headersTestSubject);
+        SimpleMailboxMembership m4 = new 
SimpleMailboxMembership(mailbox.getMailboxId(), uid4, 0, cal2.getTime(), 20, 
new Flags(Flag.DELETED), "My Otherbody2".getBytes(), headersTestSubject);
         index.add(null, mailbox, m4);
         
+        uid5 = MessageUid.of(10);
         MessageBuilder builder = new MessageBuilder();
         builder.header("From", "test <[email protected]>");
         builder.header("To", FROM_ADDRESS);
         builder.header("Subject", "A " + SUBJECT_PART + " Multipart Mail");
         builder.header("Date", "Thu, 14 Feb 2008 12:00:00 +0000 (GMT)");
         builder.body = Charset.forName("us-ascii").encode(BODY).array();
-        builder.uid = 10;
+        builder.uid = uid5;
         builder.mailboxId = mailbox3.getMailboxId();
         
         index.add(null, mailbox3, builder.build());
@@ -133,15 +146,15 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(CUSTARD));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
 
     @Test
     public void bodySearchShouldNotMatchAbsentPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(CUSTARD + CUSTARD));
-        Iterator<Long> result = index.search(session, mailbox3, query);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
     
@@ -149,15 +162,15 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldBeCaseInsensitive() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(RHUBARD));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
 
     @Test
     public void bodySearchNotMatchPhraseOnlyInFrom() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(FROM_ADDRESS));
-        Iterator<Long> result = index.search(session, mailbox3, query);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -165,7 +178,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldNotMatchPhraseOnlyInSubject() throws Exception 
{
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(SUBJECT_PART));
-        Iterator<Long> result = index.search(session, mailbox3, query);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -173,15 +186,15 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(CUSTARD));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
 
     @Test
     public void textSearchShouldNotAbsentMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(CUSTARD + CUSTARD));
-        Iterator<Long> result = index.search(session, mailbox3, query);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -189,84 +202,84 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchMatchShouldBeCaseInsensitive() throws Exception {
         SearchQuery query = new SearchQuery();
         
query.andCriteria(SearchQuery.mailContains(RHUBARD.toLowerCase(Locale.US)));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
 
     @Test
     public void addressSearchShouldMatchToFullAddress() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,FROM_ADDRESS));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
 
     @Test
     public void addressSearchShouldMatchToDisplayName() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,"Harry"));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
     
     @Test
     public void addressSearchShouldMatchToEmail() throws Exception {
         SearchQuery query = new SearchQuery();
         
query.andCriteria(SearchQuery.address(AddressType.To,"[email protected]"));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
     
     @Test
     public void addressSearchShouldMatchFrom() throws Exception {
         SearchQuery query = new SearchQuery();
         
query.andCriteria(SearchQuery.address(AddressType.From,"[email protected]"));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
 
     @Test
     public void textSearchShouldMatchPhraseOnlyInToHeader() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(FROM_ADDRESS));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
     
     @Test
     public void textSearchShouldMatchPhraseOnlyInSubjectHeader() throws 
Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(SUBJECT_PART));
-        Iterator<Long> result = index.search(session, mailbox3, query);
-        assertThat(result).containsExactly(10L);
+        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        assertThat(result).containsExactly(uid5);
     }
     
     @Test
     public void searchAllShouldMatchAllMailboxEmails() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Iterator<Long> result = index.search(session, mailbox2, query);
-        assertThat(result).containsExactly(1L);
+        Iterator<MessageUid> result = index.search(session, mailbox2, query);
+        assertThat(result).containsExactly(uid2);
     }
 
     @Test
     public void searchBodyInAllMailboxesShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("My Body"));
-        Map<MailboxId, Collection<Long>> result = index.search(session, 
MultimailboxesSearchQuery.from(query).build());
+        Map<MailboxId, Collection<MessageUid>> result = index.search(session, 
MultimailboxesSearchQuery.from(query).build());
         assertThat(result).hasSize(2);
-        assertThat(result.get(mailbox.id)).containsExactly(1L);
-        assertThat(result.get(mailbox2.id)).containsExactly(1L);
+        assertThat(result.get(mailbox.id)).containsExactly(uid1);
+        assertThat(result.get(mailbox2.id)).containsExactly(uid2);
     }
 
     @Test
     public void searchBodyInSpecificMailboxesShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("My Body"));
-        Map<MailboxId, Collection<Long>> result = index.search(session, 
+        Map<MailboxId, Collection<MessageUid>> result = index.search(session, 
                 MultimailboxesSearchQuery.from(query).inMailboxes(mailbox.id, 
mailbox3.id).build());
         assertThat(result).hasSize(1);
-        assertThat(result.get(mailbox.id)).containsExactly(1L);
+        assertThat(result.get(mailbox.id)).containsExactly(uid1);
     }
 
 
@@ -274,7 +287,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void searchAllShouldMatchAllUserEmails() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Map<MailboxId, Collection<Long>> result = index.search(session, 
MultimailboxesSearchQuery.from(query).build());
+        Map<MailboxId, Collection<MessageUid>> result = index.search(session, 
MultimailboxesSearchQuery.from(query).build());
         assertThat(result).hasSize(3);
     }
     
@@ -282,48 +295,48 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void flagSearchShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.flagIsSet(Flag.DELETED));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4);
     }
     
     @Test
     public void bodySearchShouldMatchSeveralEmails() throws Exception {    
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("body"));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
     public void textSearchShouldMatchSeveralEmails() throws Exception {    
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains("body"));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
     public void headerSearchShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.headerContains("Subject", "test"));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid4);
     }
     
     @Test
     public void headerExistsShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.headerExists("Subject"));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid4);
     }
     
     @Test
     public void flagUnsetShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.flagIsUnSet(Flag.DRAFT));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
@@ -333,8 +346,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateBefore(cal.getTime(), 
DateResolution.Day));
         
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3);
     }
     
     
@@ -344,8 +357,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateAfter(cal.getTime(), 
DateResolution.Day));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid4);
     }
     
     
@@ -356,8 +369,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateOn(cal.getTime(), 
DateResolution.Day));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1);
     }
     
     @Test
@@ -365,9 +378,9 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
-        query.andCriteria(SearchQuery.uid(new SearchQuery.NumericRange[] {new 
SearchQuery.NumericRange(1)}));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L);
+        query.andCriteria(SearchQuery.uid(new SearchQuery.UidRange[] {new 
SearchQuery.UidRange(uid1)}));
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1);
     }
     
     @Test
@@ -375,41 +388,41 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
-        query.andCriteria(SearchQuery.uid(new SearchQuery.NumericRange[] {new 
SearchQuery.NumericRange(1), new SearchQuery.NumericRange(2,3)}));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        query.andCriteria(SearchQuery.uid(new SearchQuery.UidRange[] {new 
SearchQuery.UidRange(uid1), new SearchQuery.UidRange(uid3,uid4)}));
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
     public void sizeEqualsShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeEquals(200));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1);
     }
     
     @Test
     public void sizeLessThanShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeLessThan(200));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4);
     }
     
     @Test
     public void sizeGreaterThanShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeGreaterThan(6));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
     public void uidShouldBeSorted() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
@@ -417,8 +430,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Uid, 
true)));
         query.andCriteria(SearchQuery.all());
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(3L, 2L, 1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid4, uid3, uid1);
     }
     
     @Test
@@ -426,8 +439,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.SentDate, 
false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L, 1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
     @Test
@@ -435,8 +448,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.SentDate, 
true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 3L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid4, uid3);
     }
 
     @Test
@@ -444,8 +457,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.BaseSubject, false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 1L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
     @Test
@@ -453,8 +466,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.BaseSubject, true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(3L, 1L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
     @Test
@@ -462,8 +475,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.MailboxFrom, false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L, 1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
     @Test
@@ -471,8 +484,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.MailboxFrom, true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 3L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid4, uid3);
     }
     
     @Test
@@ -480,8 +493,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.MailboxCc, false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
@@ -489,8 +502,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.MailboxCc, true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L, 1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
     @Test
@@ -498,8 +511,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.MailboxTo, false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(3L, 1L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
     @Test
@@ -507,8 +520,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.MailboxTo, true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 1L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
     @Test
@@ -516,8 +529,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.DisplayTo, false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(3L, 1L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
     @Test
@@ -525,8 +538,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.DisplayTo, true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 1L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
     @Test
@@ -534,8 +547,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.DisplayFrom, false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L, 1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
     @Test
@@ -543,8 +556,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new 
SearchQuery.Sort(SortClause.DisplayFrom, true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 3L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid4, uid3);
     }
     
     @Test
@@ -552,8 +565,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Arrival, 
false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 1L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
     @Test
@@ -561,8 +574,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Arrival, 
true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(3L, 1L, 2L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
     @Test
@@ -570,8 +583,8 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Size, 
false)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L, 1L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
     @Test
@@ -579,16 +592,16 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
         query.setSorts(Arrays.asList(new SearchQuery.Sort(SortClause.Size, 
true)));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(1L, 2L, 3L);
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
     @Test
     public void notOperatorShouldReverseMatching() throws Exception {
         SearchQuery query = new SearchQuery();
-        query.andCriteria(SearchQuery.not(SearchQuery.uid(new 
SearchQuery.NumericRange[] { new SearchQuery.NumericRange(1)})));
-        Iterator<Long> result = index.search(session, mailbox, query);
-        assertThat(result).containsExactly(2L, 3L);
+        query.andCriteria(SearchQuery.not(SearchQuery.uid(new 
SearchQuery.UidRange[] { new SearchQuery.UidRange(uid1)})));
+        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        assertThat(result).containsExactly(uid3, uid4);
     }
     
     private final class SimpleMailbox implements Mailbox {

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index 0c8c308..12e0d4c 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -46,6 +46,7 @@ import org.apache.commons.lang.ArrayUtils;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLEntryKey;
@@ -53,6 +54,9 @@ import 
org.apache.james.mailbox.model.MailboxACL.MailboxACLRights;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.SimpleMailboxACL;
 
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
 public class MaildirFolder {
 
     public static final String VALIDITY_FILE = "james-uidvalidity";
@@ -69,7 +73,7 @@ public class MaildirFolder {
     private final File uidFile;
     private final File aclFile;
     
-    private long lastUid = -1;
+    private Optional<MessageUid> lastUid;
     private int messageCount = 0;
     private long uidValidity = -1;
     private MailboxACL acl;
@@ -93,6 +97,7 @@ public class MaildirFolder {
         this.aclFile = new File(rootFolder, ACL_FILE);
         this.locker = locker;
         this.path = path;
+        this.lastUid = Optional.absent();
     }
 
     private MaildirMessageName newMaildirMessageName(MaildirFolder folder, 
String fullName) {
@@ -181,20 +186,22 @@ public class MaildirFolder {
     
     /**
      * Returns the nextUid value and increases it.
-     * @return nextUid
      */
-    private long getNextUid() {
-        return ++lastUid;
+    private MessageUid getNextUid() {
+        MessageUid nextUid = lastUid.transform(new Function<MessageUid, 
MessageUid>() {
+            @Override
+            public MessageUid apply(MessageUid input) {
+                return input.next();
+            }}).or(MessageUid.MIN_VALUE);
+        lastUid = Optional.of(nextUid);
+        return nextUid;
     }
     
     /**
      * Returns the last uid used in this mailbox
-     * @param session
-     * @return lastUid
-     * @throws MailboxException
      */
-    public long getLastUid(MailboxSession session) throws MailboxException {
-        if (lastUid == -1) {
+    public Optional<MessageUid> getLastUid(MailboxSession session) throws 
MailboxException {
+        if (!lastUid.isPresent()) {
             readLastUid(session);
         }
         return lastUid;
@@ -328,7 +335,7 @@ public class MaildirFolder {
      * @return The {@link MaildirMessageName} that belongs to the uid
      * @throws IOException If the uidlist file cannot be found or read
      */
-    public MaildirMessageName getMessageNameByUid(final MailboxSession 
session, final Long uid) throws MailboxException {
+    public MaildirMessageName getMessageNameByUid(final MailboxSession 
session, final MessageUid uid) throws MailboxException {
        
         return locker.executeWithLock(session, path, new 
LockAwareExecution<MaildirMessageName>() {
             
@@ -340,7 +347,7 @@ public class MaildirFolder {
                 try {
                     fileReader = new FileReader(uidList);
                     reader = new BufferedReader(fileReader);
-                    String uidString = String.valueOf(uid);
+                    String uidString = String.valueOf(uid.asLong());
                     String line = reader.readLine(); // the header
                     int lineNumber = 1;
                     while ((line = reader.readLine()) != null) {
@@ -380,13 +387,13 @@ public class MaildirFolder {
      * @return a {@link Map} whith all uids in the given range and associated 
{@link MaildirMessageName}s
      * @throws MailboxException if there is a problem with the uid list file
      */
-    public SortedMap<Long, MaildirMessageName> getUidMap(final MailboxSession 
session, final long from, final long to)
+    public SortedMap<MessageUid, MaildirMessageName> getUidMap(final 
MailboxSession session, final MessageUid from, final MessageUid to)
     throws MailboxException {
-        return locker.executeWithLock(session, path, new 
LockAwareExecution<SortedMap<Long, MaildirMessageName>>() {
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<SortedMap<MessageUid, MaildirMessageName>>() {
             
             @Override
-            public SortedMap<Long, MaildirMessageName> execute() throws 
MailboxException {
-                final SortedMap<Long, MaildirMessageName> uidMap = new 
TreeMap<Long, MaildirMessageName>();
+            public SortedMap<MessageUid, MaildirMessageName> execute() throws 
MailboxException {
+                final SortedMap<MessageUid, MaildirMessageName> uidMap = new 
TreeMap<MessageUid, MaildirMessageName>();
 
                 File uidList = uidFile;
 
@@ -413,11 +420,11 @@ public class MaildirFolder {
         }, true);
     }
     
-    public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession 
session, FilenameFilter filter, long from, long to)
+    public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession 
session, FilenameFilter filter, MessageUid from, MessageUid to)
     throws MailboxException {
-        SortedMap<Long, MaildirMessageName> allUids = getUidMap(session, from, 
to);
-        SortedMap<Long, MaildirMessageName> filteredUids = new TreeMap<Long, 
MaildirMessageName>();
-        for (Entry<Long, MaildirMessageName> entry : allUids.entrySet()) {
+        SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(session, 
from, to);
+        SortedMap<MessageUid, MaildirMessageName> filteredUids = new 
TreeMap<MessageUid, MaildirMessageName>();
+        for (Entry<MessageUid, MaildirMessageName> entry : allUids.entrySet()) 
{
             if (filter.accept(null, entry.getValue().getFullName()))
                 filteredUids.put(entry.getKey(), entry.getValue());
         }
@@ -436,14 +443,15 @@ public class MaildirFolder {
      * @return A {@link Map} with all uids and associated {@link 
MaildirMessageName}s
      * @throws MailboxException if there is a problem with the uid list file
      */
-    public SortedMap<Long, MaildirMessageName> getUidMap(MailboxSession 
session, FilenameFilter filter, int limit) throws MailboxException {
-        SortedMap<Long, MaildirMessageName> allUids = getUidMap(session, 0, 
-1);
-        SortedMap<Long, MaildirMessageName> filteredUids = new TreeMap<Long, 
MaildirMessageName>();
+    public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession 
session, FilenameFilter filter, int limit) throws MailboxException {
+        MessageUid to = null;
+        SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(session, 
MessageUid.MIN_VALUE, to);
+        SortedMap<MessageUid, MaildirMessageName> filteredUids = new 
TreeMap<MessageUid, MaildirMessageName>();
         int theLimit = limit;
         if (limit < 1)
             theLimit = allUids.size();
         int counter = 0;
-        for (Entry<Long, MaildirMessageName> entry : allUids.entrySet()) {
+        for (Entry<MessageUid, MaildirMessageName> entry : allUids.entrySet()) 
{
             if (counter >= theLimit)
                 break;
             if (filter.accept(null, entry.getValue().getFullName())) {
@@ -461,15 +469,15 @@ public class MaildirFolder {
      * @return A {@link Map} with all uids and associated {@link 
MaildirMessageName}s of recent messages
      * @throws MailboxException If there is a problem with the uid list file
      */
-    public SortedMap<Long, MaildirMessageName> getRecentMessages(final 
MailboxSession session) throws MailboxException {
+    public SortedMap<MessageUid, MaildirMessageName> getRecentMessages(final 
MailboxSession session) throws MailboxException {
         final String[] recentFiles = getNewFolder().list();
         final LinkedList<String> lines = new LinkedList<String>();
         final int theLimit = recentFiles.length;
-        return locker.executeWithLock(session, path, new 
LockAwareExecution<SortedMap<Long, MaildirMessageName>>() {
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<SortedMap<MessageUid, MaildirMessageName>>() {
             
             @Override
-            public SortedMap<Long, MaildirMessageName> execute() throws 
MailboxException {
-                final SortedMap<Long, MaildirMessageName> recentMessages = new 
TreeMap<Long, MaildirMessageName>();
+            public SortedMap<MessageUid, MaildirMessageName> execute() throws 
MailboxException {
+                final SortedMap<MessageUid, MaildirMessageName> recentMessages 
= new TreeMap<MessageUid, MaildirMessageName>();
 
                 File uidList = uidFile;
 
@@ -482,7 +490,7 @@ public class MaildirFolder {
                         messageCount = curFiles.length + newFiles.length;
                         String[] allFiles = (String[]) 
ArrayUtils.addAll(curFiles, newFiles);
                         for (String file : allFiles)
-                            lines.add(String.valueOf(getNextUid()) + " " + 
file);
+                            lines.add(String.valueOf(getNextUid().asLong()) + 
" " + file);
                         PrintWriter pw = new PrintWriter(uidList);
                         try {
                             pw.println(createUidListHeader());
@@ -525,7 +533,7 @@ public class MaildirFolder {
                                 continue;
                             }
                             
-                            Long uid = Long.valueOf(line.substring(0, gap));
+                            MessageUid uid = 
MessageUid.of(Long.valueOf(line.substring(0, gap)));
                             String name = line.substring(gap + 1, 
line.length());
                             for (String recentFile : recentFiles) {
                                 if (recentFile.equals(name)) {
@@ -548,27 +556,25 @@ public class MaildirFolder {
     /**
      * Creates and returns a uid map (uid -> {@link MaildirMessageName}) and 
writes it to the disk
      * @return The uid map
-     * @throws MailboxException
      */
-    private Map<Long, MaildirMessageName> createUidFile() throws 
MailboxException {
-        final Map<Long, MaildirMessageName> uidMap = new TreeMap<Long, 
MaildirMessageName>();
+    private Map<MessageUid, MaildirMessageName> createUidFile() throws 
MailboxException {
+        final Map<MessageUid, MaildirMessageName> uidMap = new 
TreeMap<MessageUid, MaildirMessageName>();
         File uidList = uidFile;
         PrintWriter pw = null;
         try {
             if (!uidList.createNewFile())
                 throw new IOException("Could not create file " + uidList);
-            lastUid = 0;
+            lastUid = Optional.absent();
             String[] curFiles = curFolder.list();
             String[] newFiles = newFolder.list();
             messageCount = curFiles.length + newFiles.length;
             String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, 
newFiles);
             for (String file : allFiles)
                 uidMap.put(getNextUid(), 
newMaildirMessageName(MaildirFolder.this, file));
-            //uidMap = new TreeMap<Long, MaildirMessageName>(uidMap);
             pw = new PrintWriter(uidList);
             pw.println(createUidListHeader());
-            for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet())
-                pw.println(String.valueOf(entry.getKey()) + " " + 
entry.getValue().getFullName());
+            for (Entry<MessageUid, MaildirMessageName> entry : 
uidMap.entrySet())
+                pw.println(String.valueOf(entry.getKey().asLong()) + " " + 
entry.getValue().getFullName());
         } catch (IOException e) {
             throw new MailboxException("Unable to create uid file", e);
         } finally {
@@ -578,13 +584,13 @@ public class MaildirFolder {
         return uidMap;
     }
     
-    private Map<Long, MaildirMessageName> updateUidFile() throws 
MailboxException {
-        final Map<Long, MaildirMessageName> uidMap = new TreeMap<Long, 
MaildirMessageName>();
+    private Map<MessageUid, MaildirMessageName> updateUidFile() throws 
MailboxException {
+        final Map<MessageUid, MaildirMessageName> uidMap = new 
TreeMap<MessageUid, MaildirMessageName>();
         File uidList = uidFile;
         String[] curFiles = curFolder.list();
         String[] newFiles = newFolder.list();
         messageCount = curFiles.length + newFiles.length;
-        HashMap<String, Long> reverseUidMap = new HashMap<String, 
Long>(messageCount);
+        HashMap<String, MessageUid> reverseUidMap = new HashMap<String, 
MessageUid>(messageCount);
         FileReader fileReader = null;
         BufferedReader reader = null;
         PrintWriter pw = null;
@@ -603,7 +609,7 @@ public class MaildirFolder {
                         // there must be some issues in the file if no gap can 
be found
                         throw new MailboxException("Corrupted entry in 
uid-file " + uidList + " line " + lineNumber++);
                     }
-                    Long uid = Long.valueOf(line.substring(0, gap));
+                    MessageUid uid = 
MessageUid.of(Long.valueOf(line.substring(0, gap)));
                     String name = line.substring(gap + 1, line.length());
                     reverseUidMap.put(stripMetaFromName(name), uid);
                 }
@@ -611,15 +617,15 @@ public class MaildirFolder {
             String[] allFiles = (String[]) ArrayUtils.addAll(curFiles, 
newFiles);
             for (String file : allFiles) {
                 MaildirMessageName messageName = 
newMaildirMessageName(MaildirFolder.this, file);
-                Long uid = reverseUidMap.get(messageName.getBaseName());
+                MessageUid uid = reverseUidMap.get(messageName.getBaseName());
                 if (uid == null)
                     uid = getNextUid();
                 uidMap.put(uid, messageName);
             }
             pw = new PrintWriter(uidList);
             pw.println(createUidListHeader());
-            for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet())
-                pw.println(String.valueOf(entry.getKey()) + " " + 
entry.getValue().getFullName());
+            for (Entry<MessageUid, MaildirMessageName> entry : 
uidMap.entrySet())
+                pw.println(String.valueOf(entry.getKey().asLong()) + " " + 
entry.getValue().getFullName());
         } catch (IOException e) {
             throw new MailboxException("Unable to update uid file", e);
         } finally {
@@ -630,8 +636,8 @@ public class MaildirFolder {
         return uidMap;
     }
 
-    private Map<Long, MaildirMessageName> readUidFile(MailboxSession session, 
long from, long to) throws MailboxException {
-        final Map<Long, MaildirMessageName> uidMap = new HashMap<Long, 
MaildirMessageName>();
+    private Map<MessageUid, MaildirMessageName> readUidFile(MailboxSession 
session, MessageUid from, MessageUid to) throws MailboxException {
+        final Map<MessageUid, MaildirMessageName> uidMap = new 
HashMap<MessageUid, MaildirMessageName>();
 
         File uidList = uidFile;
         FileReader fileReader = null;
@@ -654,11 +660,12 @@ public class MaildirFolder {
                        session.getLog().info("Corrupted entry in uid-file " + 
uidList + " line " + lineNumber++);
                         continue;
                     }
-
-                    Long uid = Long.valueOf(line.substring(0, gap));
-                    if (uid >= from) {
-                        if (to != -1 && uid > to)
+                    
+                    MessageUid uid = 
MessageUid.of(Long.valueOf(line.substring(0, gap)));
+                    if (uid.compareTo(from) >= 0) {
+                        if (to != null && uid.compareTo(to) > 0) {
                             break;
+                        }
                         String name = line.substring(gap + 1, line.length());
                         uidMap.put(uid, 
newMaildirMessageName(MaildirFolder.this, name));
                     }
@@ -677,17 +684,17 @@ public class MaildirFolder {
     
     /**
      * Sorts the given map and returns a subset which is constricted by a 
lower and an upper limit.
-     * @param source The source map
+     * @param map The source map
      * @param from The lower limit
      * @param to The upper limit; <code>-1</code> disables the upper limit.
      * @return The sorted subset
      */
-    private SortedMap<Long, MaildirMessageName> truncateMap(Map<Long, 
MaildirMessageName> source, long from, long to) {
-        TreeMap<Long, MaildirMessageName> sortedMap;
-        if (source instanceof TreeMap<?, ?>) sortedMap = (TreeMap<Long, 
MaildirMessageName>) source;
-        else sortedMap = new TreeMap<Long, MaildirMessageName>(source);
-        if (to != -1)
-            return sortedMap.subMap(from, to + 1);
+    private SortedMap<MessageUid, MaildirMessageName> 
truncateMap(Map<MessageUid, MaildirMessageName> map, MessageUid from, 
MessageUid to) {
+        TreeMap<MessageUid, MaildirMessageName> sortedMap;
+        if (map instanceof TreeMap<?, ?>) sortedMap = (TreeMap<MessageUid, 
MaildirMessageName>) map;
+        else sortedMap = new TreeMap<MessageUid, MaildirMessageName>(map);
+        if (to != null)
+            return sortedMap.subMap(from, to.next());
         return sortedMap.tailMap(from);
     }
     
@@ -710,7 +717,7 @@ public class MaildirFolder {
         if (version != 1)
             throw new IOException("Cannot read uidlists with versions other 
than 1.");
         int gap2 = line.indexOf(" ", gap1 + 1);
-        lastUid = Long.valueOf(line.substring(gap1 + 1, gap2));
+        lastUid = Optional.of(MessageUid.of(Long.valueOf(line.substring(gap1 + 
1, gap2))));
         messageCount = Integer.valueOf(line.substring(gap2 + 1, 
line.length()));
     }
     
@@ -719,7 +726,14 @@ public class MaildirFolder {
      * @return the line which ought to be the header
      */
     private String createUidListHeader() {
-        return "1 " + String.valueOf(lastUid) + " " + 
String.valueOf(messageCount);
+        Long last = lastUid.transform(new Function<MessageUid, Long>() {
+            @Override
+            public Long apply(MessageUid input) {
+                return input.asLong();
+            }
+            
+        }).or(0L);
+        return "1 " + String.valueOf(last) + " " + 
String.valueOf(messageCount);
     }
     
     /**
@@ -741,15 +755,14 @@ public class MaildirFolder {
      * @param session
      * @param name The name of the message's file
      * @return The uid of the message
-     * @throws IOException
      */
-    public long appendMessage(MailboxSession session, final String name) 
throws MailboxException {
-        return locker.executeWithLock(session, path, new 
LockAwareExecution<Long>() {
+    public MessageUid appendMessage(MailboxSession session, final String name) 
throws MailboxException {
+        return locker.executeWithLock(session, path, new 
LockAwareExecution<MessageUid>() {
             
             @Override
-            public Long execute() throws MailboxException {
+            public MessageUid execute() throws MailboxException {
                 File uidList = uidFile;
-                long uid = -1;
+                MessageUid uid = null;
                 FileReader fileReader = null;
                 BufferedReader reader = null;
                 PrintWriter pw = null;
@@ -765,7 +778,7 @@ public class MaildirFolder {
                         while ((line = reader.readLine()) != null)
                             lines.add(line);
                         uid = getNextUid();
-                        lines.add(String.valueOf(uid) + " " + name);
+                        lines.add(String.valueOf(uid.asLong()) + " " + name);
                         messageCount++;
                         pw = new PrintWriter(uidList);
                         pw.println(createUidListHeader());
@@ -782,8 +795,8 @@ public class MaildirFolder {
                         ArrayList<String> lines = new ArrayList<String>();
                         String[] allFiles = (String[]) 
ArrayUtils.addAll(curFiles, newFiles);
                         for (String file : allFiles) {
-                            long theUid = getNextUid();
-                            lines.add(String.valueOf(theUid) + " " + file);
+                            MessageUid theUid = getNextUid();
+                            lines.add(String.valueOf(theUid.asLong()) + " " + 
file);
                             // the listed names already include the message to 
append
                             if (file.equals(name))
                                 uid = theUid;
@@ -800,7 +813,7 @@ public class MaildirFolder {
                     IOUtils.closeQuietly(reader);
                     IOUtils.closeQuietly(fileReader);
                 }
-                if (uid == -1) {
+                if (uid == null) {
                     throw new MailboxException("Unable to append msg");
                 } else {
                    return uid;
@@ -817,7 +830,7 @@ public class MaildirFolder {
      * @param messageName
      * @throws MailboxException
      */
-    public void update(MailboxSession session, final long uid, final String 
messageName) throws MailboxException {
+    public void update(MailboxSession session, final MessageUid uid, final 
String messageName) throws MailboxException {
         locker.executeWithLock(session, path, new LockAwareExecution<Void>() {
             
             @Override
@@ -833,8 +846,9 @@ public class MaildirFolder {
                     readUidListHeader(line);
                     ArrayList<String> lines = new ArrayList<String>();
                     while ((line = reader.readLine()) != null) {
-                        if (uid == Long.valueOf(line.substring(0, 
line.indexOf(" "))))
-                            line = String.valueOf(uid) + " " + messageName;
+                        if 
(uid.equals(MessageUid.of(Long.valueOf(line.substring(0, line.indexOf(" ")))))) 
{
+                            line = String.valueOf(uid.asLong()) + " " + 
messageName;
+                        }
                         lines.add(line);
                     }
                     writer = new PrintWriter(uidList);
@@ -861,7 +875,7 @@ public class MaildirFolder {
      * @return The {@link MaildirMessageName} of the deleted message
      * @throws MailboxException If the file cannot be deleted of there is a 
problem with the uid list
      */
-    public MaildirMessageName delete(final MailboxSession session, final long 
uid) throws MailboxException {        
+    public MaildirMessageName delete(final MailboxSession session, final 
MessageUid uid) throws MailboxException {        
         return locker.executeWithLock(session, path, new 
LockAwareExecution<MaildirMessageName>() {
             
             @Override
@@ -888,7 +902,7 @@ public class MaildirFolder {
                             continue;
                         }
                         
-                        if (uid == Long.valueOf(line.substring(0, 
line.indexOf(" ")))) {
+                        if 
(uid.equals(MessageUid.of(Long.valueOf(line.substring(0, line.indexOf(" ")))))) 
{
                             deletedMessage = 
newMaildirMessageName(MaildirFolder.this, line.substring(gap + 1, 
line.length()));
                             messageCount--;
                         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index ee21117..5b90a01 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxConstants;
@@ -34,6 +35,9 @@ import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
 public class MaildirStore implements UidProvider, ModSeqProvider {
 
     public static final String PATH_USER = "%user";
@@ -237,13 +241,15 @@ public class MaildirStore implements UidProvider, 
ModSeqProvider {
         return getFolderName(mailboxPath.getNamespace(), 
mailboxPath.getUser(), mailboxPath.getName());
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.UidProvider#nextUid(org.apache.james.mailbox.MailboxSession,
 org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
     @Override
-    public long nextUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException {
+    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException {
         try {
-            return createMaildirFolder(mailbox).getLastUid(session) +1;
+            return 
createMaildirFolder(mailbox).getLastUid(session).transform(new 
Function<MessageUid, MessageUid>() {
+                @Override
+                public MessageUid apply(MessageUid input) {
+                    return input.next();
+                }
+            }).or(MessageUid.MIN_VALUE);
         } catch (MailboxException e) {
             throw new MailboxException("Unable to generate next uid", e);
         }
@@ -264,7 +270,7 @@ public class MaildirStore implements UidProvider, 
ModSeqProvider {
     }
 
     @Override
-    public long lastUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException {
+    public Optional<MessageUid> lastUid(MailboxSession session, Mailbox 
mailbox) throws MailboxException {
        return createMaildirFolder(mailbox).getLastUid(session);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 86924f5..d00220a 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -36,6 +36,7 @@ import javax.mail.Flags.Flag;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -62,9 +63,6 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
         this.maildirStore = maildirStore;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#countMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
     @Override
     public long countMessagesInMailbox(Mailbox mailbox) throws 
MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -78,9 +76,6 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
         return newFiles.length + curFiles.length;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#countUnseenMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
     @Override
     public long countUnseenMessagesInMailbox(Mailbox mailbox) throws 
MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -94,10 +89,6 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
         return newUnseenMessages.length + unseenMessages.length;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#delete(org.apache.james.mailbox.store.mail.model.Mailbox,
-     *      MailboxMessage)
-     */
     @Override
     public void delete(Mailbox mailbox, MailboxMessage message) throws 
MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -108,25 +99,20 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
         }
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
-     *      org.apache.james.mailbox.model.MessageRange,
-     *      org.apache.james.mailbox.store.mail.MessageMapper.FetchType, int)
-     */
     @Override
     public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, 
MessageRange set, FetchType fType, int max)
             throws MailboxException {
         final List<MailboxMessage> results;
-        final long from = set.getUidFrom();
-        final long to = set.getUidTo();
+        final MessageUid from = set.getUidFrom();
+        final MessageUid to = set.getUidTo();
         final Type type = set.getType();
         switch (type) {
         default:
         case ALL:
-            results = findMessagesInMailboxBetweenUIDs(mailbox, null, 0, -1, 
max);
+            results = findMessagesInMailboxBetweenUIDs(mailbox, null, 
MessageUid.MIN_VALUE, null, max);
             break;
         case FROM:
-            results = findMessagesInMailboxBetweenUIDs(mailbox, null, from, 
-1, max);
+            results = findMessagesInMailboxBetweenUIDs(mailbox, null, from, 
null, max);
             break;
         case ONE:
             results = findMessageInMailboxWithUID(mailbox, from);
@@ -139,22 +125,16 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
 
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findRecentMessageUidsInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
     @Override
-    public List<Long> findRecentMessageUidsInMailbox(Mailbox mailbox) throws 
MailboxException {
+    public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) 
throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        SortedMap<Long, MaildirMessageName> recentMessageNames = 
folder.getRecentMessages(mailboxSession);
-        return new ArrayList<Long>(recentMessageNames.keySet());
+        SortedMap<MessageUid, MaildirMessageName> recentMessageNames = 
folder.getRecentMessages(mailboxSession);
+        return new ArrayList<MessageUid>(recentMessageNames.keySet());
 
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findFirstUnseenMessageUid(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
     @Override
-    public Long findFirstUnseenMessageUid(Mailbox mailbox) throws 
MailboxException {
+    public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws 
MailboxException {
         List<MailboxMessage> result = findMessagesInMailbox(mailbox, 
MaildirMessageName.FILTER_UNSEEN_MESSAGES, 1);
         if (result.isEmpty()) {
             return null;
@@ -214,7 +194,7 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
 
                     updatedFlags.add(new UpdatedFlags(member.getUid(), modSeq, 
originalFlags, newFlags));
 
-                    long uid = member.getUid();
+                    MessageUid uid = member.getUid();
                     folder.update(mailboxSession, uid, newMessageName);
                 }
             } catch (IOException e) {
@@ -227,11 +207,11 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
     }
 
     @Override
-    public Map<Long, MessageMetaData> 
expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set)
+    public Map<MessageUid, MessageMetaData> 
expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set)
             throws MailboxException {
         List<MailboxMessage> results = new ArrayList<MailboxMessage>();
-        final long from = set.getUidFrom();
-        final long to = set.getUidTo();
+        final MessageUid from = set.getUidFrom();
+        final MessageUid to = set.getUidTo();
         final Type type = set.getType();
         switch (type) {
         default:
@@ -239,7 +219,7 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
             results = findMessagesInMailbox(mailbox, 
MaildirMessageName.FILTER_DELETED_MESSAGES, -1);
             break;
         case FROM:
-            results = findMessagesInMailboxBetweenUIDs(mailbox, 
MaildirMessageName.FILTER_DELETED_MESSAGES, from, -1,
+            results = findMessagesInMailboxBetweenUIDs(mailbox, 
MaildirMessageName.FILTER_DELETED_MESSAGES, from, null,
                     -1);
             break;
         case ONE:
@@ -250,9 +230,9 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
                     -1);
             break;
         }
-        Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>();
+        Map<MessageUid, MessageMetaData> uids = new HashMap<MessageUid, 
MessageMetaData>();
         for (MailboxMessage m : results) {
-            long uid = m.getUid();
+            MessageUid uid = m.getUid();
             uids.put(uid, new SimpleMessageMetaData(m));
             delete(mailbox, m);
         }
@@ -271,13 +251,8 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
         throw new UnsupportedOperationException("Not implemented - see 
https://issues.apache.org/jira/browse/IMAP-370";);
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache
-     *      .james.mailbox.store.mail.model.Mailbox, long, long,
-     *      MailboxMessage)
-     */
     @Override
-    protected MessageMetaData copy(Mailbox mailbox, long uid, long modSeq, 
MailboxMessage original)
+    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long 
modSeq, MailboxMessage original)
             throws MailboxException {
         SimpleMailboxMessage theCopy = 
SimpleMailboxMessage.copy(mailbox.getMailboxId(), original);
         Flags flags = theCopy.createFlags();
@@ -293,7 +268,7 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
     @Override
     protected MessageMetaData save(Mailbox mailbox, MailboxMessage message) 
throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        long uid = 0;
+        MessageUid uid = MessageUid.MIN_VALUE;
         // a new message
         // save file to "tmp" folder
         File tmpFolder = folder.getTmpFolder();
@@ -377,28 +352,28 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
 
     }
 
-    private List<MailboxMessage> findMessageInMailboxWithUID(Mailbox mailbox, 
long uid)
+    private List<MailboxMessage> findMessageInMailboxWithUID(Mailbox mailbox, 
MessageUid from)
             throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            MaildirMessageName messageName = 
folder.getMessageNameByUid(mailboxSession, uid);
+            MaildirMessageName messageName = 
folder.getMessageNameByUid(mailboxSession, from);
 
             ArrayList<MailboxMessage> messages = new 
ArrayList<MailboxMessage>();
             if (messageName != null && messageName.getFile().exists()) {
-                messages.add(new MaildirMailboxMessage(mailbox, uid, 
messageName));
+                messages.add(new MaildirMailboxMessage(mailbox, from, 
messageName));
             }
             return messages;
 
         } catch (IOException e) {
-            throw new MailboxException("Failure while search for 
MailboxMessage with uid " + uid + " in Mailbox " + mailbox, e);
+            throw new MailboxException("Failure while search for 
MailboxMessage with uid " + from + " in Mailbox " + mailbox, e);
         }
     }
 
     private List<MailboxMessage> findMessagesInMailboxBetweenUIDs(Mailbox 
mailbox, FilenameFilter filter,
-                                                                             
long from, long to, int max) throws MailboxException {
+                                                                             
MessageUid from, MessageUid to, int max) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         int cur = 0;
-        SortedMap<Long, MaildirMessageName> uidMap = null;
+        SortedMap<MessageUid, MaildirMessageName> uidMap = null;
         try {
             if (filter != null)
                 uidMap = folder.getUidMap(mailboxSession, filter, from, to);
@@ -406,7 +381,7 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
                 uidMap = folder.getUidMap(mailboxSession, from, to);
 
             ArrayList<MailboxMessage> messages = new 
ArrayList<MailboxMessage>();
-            for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet()) {
+            for (Entry<MessageUid, MaildirMessageName> entry : 
uidMap.entrySet()) {
                 messages.add(new MaildirMailboxMessage(mailbox, 
entry.getKey(), entry.getValue()));
                 if (max != -1) {
                     cur++;
@@ -425,10 +400,10 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
             throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            SortedMap<Long, MaildirMessageName> uidMap = 
folder.getUidMap(mailboxSession, filter, limit);
+            SortedMap<MessageUid, MaildirMessageName> uidMap = 
folder.getUidMap(mailboxSession, filter, limit);
 
             ArrayList<MailboxMessage> filtered = new 
ArrayList<MailboxMessage>(uidMap.size());
-            for (Entry<Long, MaildirMessageName> entry : uidMap.entrySet())
+            for (Entry<MessageUid, MaildirMessageName> entry : 
uidMap.entrySet())
                 filtered.add(new MaildirMailboxMessage(mailbox, 
entry.getKey(), entry.getValue()));
             return filtered;
         } catch (IOException e) {
@@ -437,7 +412,7 @@ public class MaildirMessageMapper extends 
AbstractMessageMapper {
 
     }
 
-    private List<MailboxMessage> findDeletedMessageInMailboxWithUID(Mailbox 
mailbox, long uid)
+    private List<MailboxMessage> findDeletedMessageInMailboxWithUID(Mailbox 
mailbox, MessageUid uid)
             throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
index ca5ff52..ec0c361 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirId;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -39,15 +40,15 @@ public class MaildirMailboxMessage extends 
DelegatingMailboxMessage {
     private boolean recent;
     private boolean seen;
     private final Mailbox mailbox;
-    private long uid;
+    private MessageUid uid;
     protected boolean newMessage;
     private long modSeq;
     
-    public MaildirMailboxMessage(Mailbox mailbox, long uid, MaildirMessageName 
messageName) throws IOException {
+    public MaildirMailboxMessage(Mailbox mailbox, MessageUid messageUid, 
MaildirMessageName messageName) throws IOException {
         super(new MaildirMessage(messageName));
 
         this.mailbox = mailbox;
-        setUid(uid);
+        setUid(messageUid);
         setModSeq(messageName.getFile().lastModified());
         Flags flags = messageName.getFlags();
         
@@ -74,12 +75,12 @@ public class MaildirMailboxMessage extends 
DelegatingMailboxMessage {
     }
 
     @Override
-    public long getUid() {
+    public MessageUid getUid() {
         return uid;
     }
 
     @Override
-    public void setUid(long uid) {
+    public void setUid(MessageUid uid) {
         this.uid = uid;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
index ea8c926..9d2a5a6 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
@@ -31,6 +31,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -45,38 +46,34 @@ import 
org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 
 public class InMemoryMessageMapper extends AbstractMessageMapper {
 
-    private final Map<InMemoryId, Map<Long, MailboxMessage>> mailboxByUid;
+    private final Map<InMemoryId, Map<MessageUid, MailboxMessage>> 
mailboxByUid;
     private static final int INITIAL_SIZE = 256;
 
     public InMemoryMessageMapper(MailboxSession session, UidProvider 
uidProvider,
             ModSeqProvider modSeqProvider) {
         super(session, uidProvider, modSeqProvider);
-        this.mailboxByUid = new ConcurrentHashMap<InMemoryId, Map<Long, 
MailboxMessage>>(INITIAL_SIZE);
+        this.mailboxByUid = new ConcurrentHashMap<InMemoryId, Map<MessageUid, 
MailboxMessage>>(INITIAL_SIZE);
     }
 
-    private Map<Long, MailboxMessage> getMembershipByUidForMailbox(Mailbox 
mailbox) {
+    private Map<MessageUid, MailboxMessage> 
getMembershipByUidForMailbox(Mailbox mailbox) {
         return getMembershipByUidForId((InMemoryId) mailbox.getMailboxId());
     }
 
-    private Map<Long, MailboxMessage> getMembershipByUidForId(InMemoryId id) {
-        Map<Long, MailboxMessage> membershipByUid = mailboxByUid.get(id);
+    private Map<MessageUid, MailboxMessage> getMembershipByUidForId(InMemoryId 
id) {
+        Map<MessageUid, MailboxMessage> membershipByUid = mailboxByUid.get(id);
         if (membershipByUid == null) {
-            membershipByUid = new ConcurrentHashMap<Long, 
MailboxMessage>(INITIAL_SIZE);
+            membershipByUid = new ConcurrentHashMap<MessageUid, 
MailboxMessage>(INITIAL_SIZE);
             mailboxByUid.put(id, membershipByUid);
         }
         return membershipByUid;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#countMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
+    @Override
     public long countMessagesInMailbox(Mailbox mailbox) throws 
MailboxException {
         return getMembershipByUidForMailbox(mailbox).size();
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#countUnseenMessagesInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
+    @Override
     public long countUnseenMessagesInMailbox(Mailbox mailbox) throws 
MailboxException {
         long count = 0;
         for (MailboxMessage member : 
getMembershipByUidForMailbox(mailbox).values()) {
@@ -87,10 +84,7 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
         return count;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#delete(org.apache.james.mailbox.store.mail.model.Mailbox,
-     *      MailboxMessage)
-     */
+    @Override
     public void delete(Mailbox mailbox, MailboxMessage message) throws 
MailboxException {
         getMembershipByUidForMailbox(mailbox).remove(message.getUid());
     }
@@ -98,53 +92,22 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
     @Override
     public MessageMetaData move(Mailbox mailbox, MailboxMessage original) 
throws MailboxException {
         InMemoryId originalMailboxId = (InMemoryId) original.getMailboxId();
-        long uid = original.getUid();
+        MessageUid uid = original.getUid();
         MessageMetaData messageMetaData = copy(mailbox, original);
         getMembershipByUidForId(originalMailboxId).remove(uid);
         return messageMetaData;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
-     *      org.apache.james.mailbox.model.MessageRange,
-     *      org.apache.james.mailbox.store.mail.MessageMapper.FetchType, int)
-     */
+    @Override
     public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, 
MessageRange set, FetchType ftype, int max)
             throws MailboxException {
-        List<MailboxMessage> results;
-        final MessageRange.Type type = set.getType();
-        switch (type) {
-        case ALL:
-            results = new 
ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values());
-            break;
-        case FROM:
-            results = new 
ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values());
-            for (Iterator<MailboxMessage> it = results.iterator(); 
it.hasNext();) {
-                if (it.next().getUid() < set.getUidFrom()) {
-                    it.remove();
-                }
+        List<MailboxMessage> results = new 
ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values());
+        for (Iterator<MailboxMessage> it = results.iterator(); it.hasNext();) {
+            if (!set.includes(it.next().getUid())) {
+                it.remove();
             }
-            break;
-        case RANGE:
-            results = new 
ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values());
-            for (Iterator<MailboxMessage> it = results.iterator(); 
it.hasNext();) {
-                final long uid = it.next().getUid();
-                if (uid < set.getUidFrom() || uid > set.getUidTo()) {
-                    it.remove();
-                }
-            }
-            break;
-        case ONE:
-            results = new ArrayList<MailboxMessage>(1);
-            final MailboxMessage member = 
getMembershipByUidForMailbox(mailbox).get(set.getUidFrom());
-            if (member != null) {
-                results.add(member);
-            }
-            break;
-        default:
-            results = new ArrayList<MailboxMessage>();
-            break;
         }
+        
         Collections.sort(results);
 
         if (max > 0 && results.size() > max) {
@@ -153,11 +116,9 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
         return results.iterator();
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findRecentMessageUidsInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
-    public List<Long> findRecentMessageUidsInMailbox(Mailbox mailbox) throws 
MailboxException {
-        final List<Long> results = new ArrayList<Long>();
+    @Override
+    public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) 
throws MailboxException {
+        final List<MessageUid> results = new ArrayList<MessageUid>();
         for (MailboxMessage member : 
getMembershipByUidForMailbox(mailbox).values()) {
             if (member.isRecent()) {
                 results.add(member.getUid());
@@ -168,10 +129,8 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
         return results;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#findFirstUnseenMessageUid(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
-    public Long findFirstUnseenMessageUid(Mailbox mailbox) throws 
MailboxException {
+    @Override
+    public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws 
MailboxException {
         List<MailboxMessage> memberships = new 
ArrayList<MailboxMessage>(getMembershipByUidForMailbox(mailbox).values());
         Collections.sort(memberships);
         for (MailboxMessage m : memberships) {
@@ -183,9 +142,9 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
     }
 
     @Override
-    public Map<Long, MessageMetaData> 
expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set)
+    public Map<MessageUid, MessageMetaData> 
expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set)
             throws MailboxException {
-        final Map<Long, MessageMetaData> filteredResult = new HashMap<Long, 
MessageMetaData>();
+        final Map<MessageUid, MessageMetaData> filteredResult = new 
HashMap<MessageUid, MessageMetaData>();
 
         Iterator<MailboxMessage> it = findInMailbox(mailbox, set, 
FetchType.Metadata, -1);
         while (it.hasNext()) {
@@ -203,18 +162,13 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
         mailboxByUid.clear();
     }
 
-    /**
-     * Do nothing
-     */
+    @Override
     public void endRequest() {
         // Do nothing
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox,
-     *      long, long, MailboxMessage)
-     */
-    protected MessageMetaData copy(Mailbox mailbox, long uid, long modSeq, 
MailboxMessage original)
+    @Override
+    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long 
modSeq, MailboxMessage original)
             throws MailboxException {
         SimpleMailboxMessage message = 
SimpleMailboxMessage.copy(mailbox.getMailboxId(), original);
         message.setUid(uid);
@@ -227,10 +181,7 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
         return save(mailbox, message);
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox,
-     *      MailboxMessage)
-     */
+    @Override
     protected MessageMetaData save(Mailbox mailbox, MailboxMessage message) 
throws MailboxException {
         SimpleMailboxMessage copy = 
SimpleMailboxMessage.copy(mailbox.getMailboxId(), message);
         copy.setUid(message.getUid());
@@ -240,23 +191,17 @@ public class InMemoryMessageMapper extends 
AbstractMessageMapper {
         return new SimpleMessageMetaData(message);
     }
 
-    /**
-     * Do nothing
-     */
+    @Override
     protected void begin() throws MailboxException {
 
     }
 
-    /**
-     * Do nothing
-     */
+    @Override
     protected void commit() throws MailboxException {
 
     }
 
-    /**
-     * Do nothing
-     */
+    @Override
     protected void rollback() throws MailboxException {
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
index d9004e8..c942068 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
@@ -24,35 +24,45 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 
+import com.google.common.base.Optional;
+
 public class InMemoryUidProvider implements UidProvider{
 
     private final ConcurrentMap<InMemoryId, AtomicLong> map = new 
ConcurrentHashMap<InMemoryId, AtomicLong>();
     
     @Override
-    public long nextUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException {
-        return getLast((InMemoryId) mailbox.getMailboxId()).incrementAndGet();
+    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException {
+        InMemoryId mailboxId = (InMemoryId) mailbox.getMailboxId();
+        AtomicLong uid = getLast(mailboxId);
+        if (uid != null) {
+            return MessageUid.of(uid.incrementAndGet());
+        }
+        AtomicLong initialUid = new AtomicLong(MessageUid.MIN_VALUE.asLong());
+        AtomicLong previousUid = map.putIfAbsent(mailboxId, initialUid);
+        if (previousUid != null) {
+            return MessageUid.of(previousUid.incrementAndGet());
+        } else {
+            return MessageUid.MIN_VALUE;
+        }
     }
 
     @Override
-    public long lastUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException {
-        return getLast((InMemoryId) mailbox.getMailboxId()).get();
+    public Optional<MessageUid> lastUid(MailboxSession session, Mailbox 
mailbox) throws MailboxException {
+        AtomicLong last = getLast((InMemoryId) mailbox.getMailboxId());
+        if (last == null) {
+            return Optional.absent();
+        }
+        return Optional.of(MessageUid.of(last.get()));
     }
     
     private AtomicLong getLast(InMemoryId id) {
-        AtomicLong uid = map.get(id);
-        if (uid == null) {
-            uid = new AtomicLong(0);
-            AtomicLong u = map.putIfAbsent(id, uid);
-            if (u != null) {
-                uid = u;
-            }
-        }
-        return uid;
+        return map.get(id);
     }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to