http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
index a48aab8..61f7f61 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
@@ -25,6 +25,7 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxACL;
 
 /**
@@ -33,22 +34,22 @@ import org.apache.james.mailbox.model.MailboxACL;
 public class MailboxMetaData implements MessageManager.MetaData {
 
     private final long recentCount;
-    private final List<Long> recent;
+    private final List<MessageUid> recent;
     private final Flags premanentFlags;
     private final long uidValidity;
-    private final long nextUid;
+    private final MessageUid nextUid;
     private final long messageCount;
     private final long unseenCount;
-    private final Long firstUnseen;
+    private final MessageUid firstUnseen;
     private final boolean writeable;
     private final long highestModSeq;
     private final boolean modSeqPermanent;
     private final MailboxACL acl;
 
-    public MailboxMetaData(List<Long> recent, Flags premanentFlags, long 
uidValidity, long nextUid, long highestModSeq, long messageCount, long 
unseenCount, Long firstUnseen, boolean writeable, boolean modSeqPermanent, 
MailboxACL acl) {
+    public MailboxMetaData(List<MessageUid> recent, Flags premanentFlags, long 
uidValidity, MessageUid uidNext, long highestModSeq, long messageCount, long 
unseenCount, MessageUid firstUnseen, boolean writeable, boolean 
modSeqPermanent, MailboxACL acl) {
         super();
         if (recent == null) {
-            this.recent = new ArrayList<Long>();
+            this.recent = new ArrayList<MessageUid>();
         } else {
             this.recent = recent;
 
@@ -58,7 +59,7 @@ public class MailboxMetaData implements 
MessageManager.MetaData {
 
         this.premanentFlags = premanentFlags;
         this.uidValidity = uidValidity;
-        this.nextUid = nextUid;
+        this.nextUid = uidNext;
         this.messageCount = messageCount;
         this.unseenCount = unseenCount;
         this.firstUnseen = firstUnseen;
@@ -81,10 +82,8 @@ public class MailboxMetaData implements 
MessageManager.MetaData {
         return premanentFlags;
     }
 
-    /**
-     * @see MailboxMetaData#getRecent()
-     */
-    public List<Long> getRecent() {
+    @Override
+    public List<MessageUid> getRecent() {
         return recent;
     }
 
@@ -95,10 +94,7 @@ public class MailboxMetaData implements 
MessageManager.MetaData {
         return uidValidity;
     }
 
-    /**
-     * @see MailboxMetaData#getUidNext()
-     */
-    public long getUidNext() {
+    public MessageUid getUidNext() {
         return nextUid;
     }
 
@@ -116,10 +112,7 @@ public class MailboxMetaData implements 
MessageManager.MetaData {
         return unseenCount;
     }
 
-    /**
-     * @see MailboxMetaData#getFirstUnseen()
-     */
-    public Long getFirstUnseen() {
+    public MessageUid getFirstUnseen() {
         return firstUnseen;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
index b0dce83..6b79611 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
@@ -29,6 +29,7 @@ import java.util.Map;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.Headers;
@@ -41,6 +42,8 @@ import 
org.apache.james.mailbox.store.streaming.InputStreamContent;
 import org.apache.james.mailbox.store.streaming.InputStreamContent.Type;
 import org.apache.james.mime4j.MimeException;
 
+import com.google.common.base.Objects;
+
 /**
  * Bean based implementation.
  */
@@ -63,16 +66,12 @@ public class MessageResultImpl implements MessageResult {
         
     }
 
-    /**
-     * @see org.apache.james.mailbox.model.MessageResult#getUid()
-     */
-    public long getUid() {
+    @Override
+    public MessageUid getUid() {
         return message.getUid();
     }
 
-    /**
-     * @see org.apache.james.mailbox.model.MessageResult#getInternalDate()
-     */
+    @Override
     public Date getInternalDate() {
         return message.getInternalDate();
     }
@@ -91,35 +90,16 @@ public class MessageResultImpl implements MessageResult {
         return message.getFullContentOctets();
     }
 
-    /**
-     * @see java.lang.Comparable#compareTo(java.lang.Object)
-     */
+    @Override
     public int compareTo(MessageResult that) {
-        if (getUid() > 0 && that.getUid() > 0) {
-            // TODO: this seems inefficient
-            return 
Long.valueOf(getUid()).compareTo(Long.valueOf(that.getUid()));
-        } else {
-            // TODO: throwing an undocumented untyped runtime seems wrong
-            // TODO: if uids must be greater than zero then this should be
-            // enforced
-            // TODO: on the way in
-            // TODO: probably an IllegalArgumentException would be better
-            throw new RuntimeException("can't compare");
-        }
-
+        return this.getUid().compareTo(that.getUid());
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public int hashCode() {
-        return 37 * 17 + (int)getUid();
+        return Objects.hashCode(getUid());
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
@@ -128,7 +108,6 @@ public class MessageResultImpl implements MessageResult {
         if (obj instanceof MessageResultImpl) {
             MessageResultImpl that = (MessageResultImpl)obj;
             return this.headers.equals(that.headers) && 
this.message.equals(that.message);
-//            return this.message.equals(that.message);
         }
         return false;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMessageMetaData.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMessageMetaData.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMessageMetaData.java
index 5c88a13..7f01b2c 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMessageMetaData.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMessageMetaData.java
@@ -23,18 +23,21 @@ import java.util.Date;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
+import com.google.common.base.Objects;
+
 
 public class SimpleMessageMetaData implements MessageMetaData{
-    private final long uid;
+    private final MessageUid uid;
     private final Flags flags;
     private final long size;
     private final Date internalDate;
     private final long modSeq;
 
-    public SimpleMessageMetaData(long uid, long modSeq, Flags flags, long 
size, Date internalDate) {
+    public SimpleMessageMetaData(MessageUid uid, long modSeq, Flags flags, 
long size, Date internalDate) {
         this.uid = uid;
         this.flags = flags;
         this.size = size;
@@ -46,53 +49,40 @@ public class SimpleMessageMetaData implements 
MessageMetaData{
         this(message.getUid(), message.getModSeq(), message.createFlags(), 
message.getFullContentOctets(), message.getInternalDate());
     }
     
-    /**
-     * @see org.apache.james.mailbox.model.MessageMetaData#getFlags()
-     */
+    @Override
     public Flags getFlags() {
         return flags;
     }
 
-    /**
-     * @see org.apache.james.mailbox.model.MessageMetaData#getSize()
-     */
+    @Override
     public long getSize() {
         return size;
     }
 
-    /**
-     * @see org.apache.james.mailbox.model.MessageMetaData#getInternalDate()
-     */
+    @Override
     public Date getInternalDate() {
         return internalDate;
     }
 
-    /**
-     * @see org.apache.james.mailbox.model.MessageMetaData#getUid()
-     */
-    public long getUid() {
+    @Override
+    public MessageUid getUid() {
         return uid;
     }
 
     @Override
     public boolean equals(Object obj) {
         if(obj instanceof SimpleMessageMetaData) {
-            return uid == ((SimpleMessageMetaData) obj).getUid();
+            return uid.equals(((SimpleMessageMetaData) obj).getUid());
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + (int) (uid ^ (uid >>> 32));
-        return result;
+        return Objects.hashCode(uid);
     }
 
-    /**
-     * @see org.apache.james.mailbox.model.MessageMetaData#getModSeq()
-     */
+    @Override
     public long getModSeq() {
         return modSeq;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 6bdb110..ba073d2 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSession.SessionType;
 import org.apache.james.mailbox.MailboxSessionIdGenerator;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.RequestAware;
 import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
@@ -639,7 +640,7 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     @Override
-    public Map<MailboxId, Collection<Long>> search(MultimailboxesSearchQuery 
expression, MailboxSession session) throws MailboxException {
+    public Map<MailboxId, Collection<MessageUid>> 
search(MultimailboxesSearchQuery expression, MailboxSession session) throws 
MailboxException {
         return index.search(session, expression);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index f84daa9..171c457 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -89,6 +90,7 @@ import org.apache.james.mime4j.stream.RecursionMode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 
 /**
@@ -244,26 +246,19 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
         return true;
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.MessageManager#expunge(org.apache.james.mailbox.model.MessageRange,
-     *      org.apache.james.mailbox.MailboxSession)
-     */
-    public Iterator<Long> expunge(MessageRange set, MailboxSession 
mailboxSession) throws MailboxException {
+    @Override
+    public Iterator<MessageUid> expunge(MessageRange set, MailboxSession 
mailboxSession) throws MailboxException {
         if (!isWriteable(mailboxSession)) {
             throw new ReadOnlyException(getMailboxPath(), 
mailboxSession.getPathDelimiter());
         }
-        Map<Long, MessageMetaData> uids = deleteMarkedInMailbox(set, 
mailboxSession);
+        Map<MessageUid, MessageMetaData> uids = deleteMarkedInMailbox(set, 
mailboxSession);
 
         dispatcher.expunged(mailboxSession, uids, getMailboxEntity());
         return uids.keySet().iterator();
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.MessageManager#appendMessage(java.io.InputStream,
-     *      java.util.Date, org.apache.james.mailbox.MailboxSession, boolean,
-     *      javax.mail.Flags)
-     */
-    public long appendMessage(InputStream msgIn, Date internalDate, final 
MailboxSession mailboxSession, boolean isRecent, Flags flagsToBeSet) throws 
MailboxException {
+    @Override
+    public MessageUid appendMessage(InputStream msgIn, Date internalDate, 
final MailboxSession mailboxSession, boolean isRecent, Flags flagsToBeSet) 
throws MailboxException {
 
         File file = null;
         TeeInputStream tmpMsgIn = null;
@@ -390,13 +385,13 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
             new QuotaChecker(quotaManager, quotaRootResolver, 
mailbox).tryAddition(1, size);
 
-            return locker.executeWithLock(mailboxSession, getMailboxPath(), 
new MailboxPathLocker.LockAwareExecution<Long>() {
+            return locker.executeWithLock(mailboxSession, getMailboxPath(), 
new MailboxPathLocker.LockAwareExecution<MessageUid>() {
 
                 @Override
-                public Long execute() throws MailboxException {
+                public MessageUid execute() throws MailboxException {
                     MessageMetaData data = appendMessageToStore(message, 
attachments, mailboxSession);
 
-                    SortedMap<Long, MessageMetaData> uids = new TreeMap<Long, 
MessageMetaData>();
+                    SortedMap<MessageUid, MessageMetaData> uids = new 
TreeMap<MessageUid, MessageMetaData>();
                     uids.put(data.getUid(), data);
                     dispatcher.added(mailboxSession, uids, getMailboxEntity());
                     return data.getUid();
@@ -465,14 +460,19 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
      */
     public MetaData getMetaData(boolean resetRecent, MailboxSession 
mailboxSession, org.apache.james.mailbox.MessageManager.MetaData.FetchGroup 
fetchGroup) throws MailboxException {
 
-        final List<Long> recent;
+        final List<MessageUid> recent;
         final Flags permanentFlags = getPermanentFlags(mailboxSession);
         final long uidValidity = getMailboxEntity().getUidValidity();
-        final long uidNext = 
mapperFactory.getMessageMapper(mailboxSession).getLastUid(mailbox) + 1;
+        MessageUid uidNext = 
mapperFactory.getMessageMapper(mailboxSession).getLastUid(mailbox)
+                .transform(new Function<MessageUid, MessageUid>() {
+                    public MessageUid apply(MessageUid input) {
+                        return input.next();
+                    }})
+                .or(MessageUid.MIN_VALUE);
         final long highestModSeq = 
mapperFactory.getMessageMapper(mailboxSession).getHighestModSeq(mailbox);
         final long messageCount;
         final long unseenCount;
-        final Long firstUnseen;
+        final MessageUid firstUnseen;
         switch (fetchGroup) {
         case UNSEEN_COUNT:
             unseenCount = countUnseenMessagesInMailbox(mailboxSession);
@@ -503,7 +503,7 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
             if (resetRecent) {
                 recent(resetRecent, mailboxSession);
             }
-            recent = new ArrayList<Long>();
+            recent = new ArrayList<MessageUid>();
             break;
         }
         MailboxACL resolvedAcl = getResolvedMailboxACL(mailboxSession);
@@ -550,12 +550,12 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
      *      boolean, boolean, org.apache.james.mailbox.model.MessageRange,
      *      org.apache.james.mailbox.MailboxSession)
      */
-    public Map<Long, Flags> setFlags(final Flags flags, final FlagsUpdateMode 
flagsUpdateMode, final MessageRange set, MailboxSession mailboxSession) throws 
MailboxException {
+    public Map<MessageUid, Flags> setFlags(final Flags flags, final 
FlagsUpdateMode flagsUpdateMode, final MessageRange set, MailboxSession 
mailboxSession) throws MailboxException {
 
         if (!isWriteable(mailboxSession)) {
             throw new ReadOnlyException(getMailboxPath(), 
mailboxSession.getPathDelimiter());
         }
-        final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, 
Flags>();
+        final SortedMap<MessageUid, Flags> newFlagsByUid = new 
TreeMap<MessageUid, Flags>();
 
         trimFlags(flags, mailboxSession);
 
@@ -568,7 +568,7 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
             }
         });
 
-        final SortedMap<Long, UpdatedFlags> uFlags = new TreeMap<Long, 
UpdatedFlags>();
+        final SortedMap<MessageUid, UpdatedFlags> uFlags = new 
TreeMap<MessageUid, UpdatedFlags>();
 
         while (it.hasNext()) {
             UpdatedFlags flag = it.next();
@@ -576,7 +576,7 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
             uFlags.put(flag.getUid(), flag);
         }
 
-        dispatcher.flagsUpdated(mailboxSession, new 
ArrayList<Long>(uFlags.keySet()), getMailboxEntity(), new 
ArrayList<UpdatedFlags>(uFlags.values()));
+        dispatcher.flagsUpdated(mailboxSession, new 
ArrayList<MessageUid>(uFlags.keySet()), getMailboxEntity(), new 
ArrayList<UpdatedFlags>(uFlags.values()));
 
         return newFlagsByUid;
     }
@@ -598,9 +598,9 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
             @Override
             public List<MessageRange> execute() throws MailboxException {
-                SortedMap<Long, MessageMetaData> copiedUids = copy(set, 
toMailbox, session);
+                SortedMap<MessageUid, MessageMetaData> copiedUids = copy(set, 
toMailbox, session);
                 dispatcher.added(session, copiedUids, 
toMailbox.getMailboxEntity());
-                return MessageRange.toRanges(new 
ArrayList<Long>(copiedUids.keySet()));
+                return MessageRange.toRanges(new 
ArrayList<MessageUid>(copiedUids.keySet()));
             }
         }, true);
     }
@@ -626,9 +626,9 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
             @Override
             public List<MessageRange> execute() throws MailboxException {
-                SortedMap<Long, MessageMetaData> movedUids = move(set, 
toMailbox, session);
+                SortedMap<MessageUid, MessageMetaData> movedUids = move(set, 
toMailbox, session);
                 dispatcher.added(session, movedUids, 
toMailbox.getMailboxEntity());
-                return MessageRange.toRanges(new 
ArrayList<Long>(movedUids.keySet()));
+                return MessageRange.toRanges(new 
ArrayList<MessageUid>(movedUids.keySet()));
             }
         }, true);
     }
@@ -670,13 +670,8 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
     /**
      * Return a List which holds all uids of recent messages and optional reset
      * the recent flag on the messages for the uids
-     * 
-     * @param reset
-     * @param mailboxSession
-     * @return list
-     * @throws MailboxException
      */
-    protected List<Long> recent(final boolean reset, MailboxSession 
mailboxSession) throws MailboxException {
+    protected List<MessageUid> recent(final boolean reset, MailboxSession 
mailboxSession) throws MailboxException {
         if (reset) {
             if (!isWriteable(mailboxSession)) {
                 throw new ReadOnlyException(getMailboxPath(), 
mailboxSession.getPathDelimiter());
@@ -684,10 +679,10 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
         }
         final MessageMapper messageMapper = 
mapperFactory.getMessageMapper(mailboxSession);
 
-        return messageMapper.execute(new Mapper.Transaction<List<Long>>() {
+        return messageMapper.execute(new 
Mapper.Transaction<List<MessageUid>>() {
 
-            public List<Long> run() throws MailboxException {
-                final List<Long> members = 
messageMapper.findRecentMessageUidsInMailbox(getMailboxEntity());
+            public List<MessageUid> run() throws MailboxException {
+                final List<MessageUid> members = 
messageMapper.findRecentMessageUidsInMailbox(getMailboxEntity());
 
                 // Convert to MessageRanges so we may be able to optimize the
                 // flag update
@@ -705,24 +700,21 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
     }
 
-    protected Map<Long, MessageMetaData> deleteMarkedInMailbox(final 
MessageRange range, MailboxSession session) throws MailboxException {
+    protected Map<MessageUid, MessageMetaData> deleteMarkedInMailbox(final 
MessageRange range, MailboxSession session) throws MailboxException {
 
         final MessageMapper messageMapper = 
mapperFactory.getMessageMapper(session);
 
-        return messageMapper.execute(new Mapper.Transaction<Map<Long, 
MessageMetaData>>() {
+        return messageMapper.execute(new Mapper.Transaction<Map<MessageUid, 
MessageMetaData>>() {
 
-            public Map<Long, MessageMetaData> run() throws MailboxException {
+            public Map<MessageUid, MessageMetaData> run() throws 
MailboxException {
                 return 
messageMapper.expungeMarkedForDeletionInMailbox(getMailboxEntity(), range);
             }
 
         });
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.MessageManager#search(org.apache.james.mailbox.model.SearchQuery,
-     *      org.apache.james.mailbox.MailboxSession)
-     */
-    public Iterator<Long> search(SearchQuery query, MailboxSession 
mailboxSession) throws MailboxException {
+    @Override
+    public Iterator<MessageUid> search(SearchQuery query, MailboxSession 
mailboxSession) throws MailboxException {
         return index.search(mailboxSession, getMailboxEntity(), query);
     }
 
@@ -766,12 +758,12 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
        }
 
 
-    private SortedMap<Long, MessageMetaData> copy(MessageRange set, 
StoreMessageManager to, MailboxSession session) throws MailboxException {
+    private SortedMap<MessageUid, MessageMetaData> copy(MessageRange set, 
StoreMessageManager to, MailboxSession session) throws MailboxException {
         Iterator<MailboxMessage> originalRows = retrieveOriginalRows(set, 
session);
         return collectMetadata(to.copy(originalRows, session));
     }
 
-    private SortedMap<Long, MessageMetaData> move(MessageRange set, 
StoreMessageManager to, MailboxSession session) throws MailboxException {
+    private SortedMap<MessageUid, MessageMetaData> move(MessageRange set, 
StoreMessageManager to, MailboxSession session) throws MailboxException {
         Iterator<MailboxMessage> originalRows = retrieveOriginalRows(set, 
session);
         MoveResult moveResult = to.move(originalRows, session);
         dispatcher.expunged(session, 
collectMetadata(moveResult.getOriginalMessages()), getMailboxEntity());
@@ -783,8 +775,8 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
         return messageMapper.findInMailbox(mailbox, set, FetchType.Full, -1);
     }
 
-    private SortedMap<Long, MessageMetaData> 
collectMetadata(Iterator<MessageMetaData> ids) {
-        final SortedMap<Long, MessageMetaData> copiedMessages = new 
TreeMap<Long, MessageMetaData>();
+    private SortedMap<MessageUid, MessageMetaData> 
collectMetadata(Iterator<MessageMetaData> ids) {
+        final SortedMap<MessageUid, MessageMetaData> copiedMessages = new 
TreeMap<MessageUid, MessageMetaData>();
         while (ids.hasNext()) {
             MessageMetaData data = ids.next();
             copiedMessages.put(data.getUid(), data);
@@ -805,12 +797,8 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
     /**
      * Return the uid of the first unseen message or null of none is found
-     * 
-     * @param session
-     * @return uid
-     * @throws MailboxException
      */
-    protected Long findFirstUnseenMessageUid(MailboxSession session) throws 
MailboxException {
+    protected MessageUid findFirstUnseenMessageUid(MailboxSession session) 
throws MailboxException {
         MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
         return messageMapper.findFirstUnseenMessageUid(getMailboxEntity());
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
index 8193273..84ea6ce 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
@@ -25,6 +25,7 @@ import java.util.NoSuchElementException;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.Headers;
@@ -40,15 +41,17 @@ import 
org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
+import com.google.common.base.Objects;
+
 public class StoreMessageResultIterator implements MessageResultIterator {
 
     private Iterator<MailboxMessage> next = null;
     private MailboxException exception;
     private final Mailbox mailbox;
     private final FetchGroup group;
-    private final long from;
-    private long cursor;
-    private final long to;
+    private final MessageUid from;
+    private MessageUid cursor;
+    private final MessageUid to;
     private final int batchSize;
     private final Type type;
     private final MessageMapper mapper;
@@ -116,7 +119,7 @@ public class StoreMessageResultIterator implements 
MessageResultIterator {
 
     @Override
     public boolean hasNext() {
-        if (cursor > to) 
+        if (cursor.compareTo(to) > 0) 
           return false;
 
         if (next == null || !next.hasNext()) {
@@ -167,7 +170,7 @@ public class StoreMessageResultIterator implements 
MessageResultIterator {
             result = new UnloadedMessageResult(message, e);
         }
 
-        cursor++;
+        cursor = cursor.next();
         return result;
     }
 
@@ -188,7 +191,7 @@ public class StoreMessageResultIterator implements 
MessageResultIterator {
 
         private final long size;
 
-        private final long uid;
+        private final MessageUid uid;
 
         private final Flags flags;
 
@@ -224,26 +227,17 @@ public class StoreMessageResultIterator implements 
MessageResultIterator {
             return size;
         }
 
-        public long getUid() {
+        public MessageUid getUid() {
             return uid;
         }
 
         public int compareTo(MessageResult that) {
-            // Java 1.5 return (int) Math.signum(uid - that.getUid());
-            long diff = uid - that.getUid();
-            return (int) diff == 0 ? 0 : diff > 0 ? 1 : -1;
+            return uid.compareTo(that.getUid());
         }
 
         @Override
         public int hashCode() {
-            int ret = 19 * 37;
-            ret = ret * 37 + exception.hashCode();
-            ret = ret * 37 + internalDate.hashCode();
-            ret = ret * 37 + (int)size;
-            ret = ret * 37 + (int)uid;
-            ret = ret * 37 + flags.hashCode();
-            ret = ret * 37 + (int)modSeq;
-            return ret;
+            return Objects.hashCode(exception, internalDate, size, uid, flags, 
modSeq);
         }
 
         @Override
@@ -253,7 +247,7 @@ public class StoreMessageResultIterator implements 
MessageResultIterator {
             }
             if (obj instanceof UnloadedMessageResult) {
                 UnloadedMessageResult that = (UnloadedMessageResult)obj;
-                return (size == that.size) && (uid == that.uid) && (modSeq == 
that.modSeq) && exception.equals(that.exception)
+                return (size == that.size) && (uid.equals(that.uid)) && 
(modSeq == that.modSeq) && exception.equals(that.exception)
                         && internalDate.equals(that.internalDate) && 
flags.equals(that.flags);
             }
             return false;

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
index deb6c1a..f2da9e5 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
@@ -25,6 +25,7 @@ import java.util.SortedMap;
 
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -41,20 +42,20 @@ public class EventFactory {
     }
 
     public final class AddedImpl extends MailboxListener.Added implements 
MailboxAware {
-        private final Map<Long, MessageMetaData> added;
+        private final Map<MessageUid, MessageMetaData> added;
         private final Mailbox mailbox;
 
-        public AddedImpl(MailboxSession session, Mailbox mailbox, 
SortedMap<Long, MessageMetaData> added) {
+        public AddedImpl(MailboxSession session, Mailbox mailbox, 
SortedMap<MessageUid, MessageMetaData> uids) {
             super(session, new StoreMailboxPath(mailbox));
-            this.added = ImmutableMap.copyOf(added);
+            this.added = ImmutableMap.copyOf(uids);
             this.mailbox = mailbox;
         }
 
-        public List<Long> getUids() {
+        public List<MessageUid> getUids() {
             return ImmutableList.copyOf(added.keySet());
         }
 
-        public MessageMetaData getMetaData(long uid) {
+        public MessageMetaData getMetaData(MessageUid uid) {
             return added.get(uid);
         }
 
@@ -64,20 +65,20 @@ public class EventFactory {
     }
 
     public final class ExpungedImpl extends MailboxListener.Expunged 
implements MailboxAware {
-        private final Map<Long, MessageMetaData> uids;
+        private final Map<MessageUid, MessageMetaData> uids;
         private final Mailbox mailbox;
 
-        public ExpungedImpl(MailboxSession session, Mailbox mailbox,  
Map<Long, MessageMetaData> uids) {
+        public ExpungedImpl(MailboxSession session, Mailbox mailbox,  
Map<MessageUid, MessageMetaData> uids) {
             super(session,  new StoreMailboxPath(mailbox));
             this.uids = ImmutableMap.copyOf(uids);
             this.mailbox = mailbox;
         }
 
-        public List<Long> getUids() {
+        public List<MessageUid> getUids() {
             return ImmutableList.copyOf(uids.keySet());
         }
 
-        public MessageMetaData getMetaData(long uid) {
+        public MessageMetaData getMetaData(MessageUid uid) {
             return uids.get(uid);
         }
 
@@ -87,20 +88,20 @@ public class EventFactory {
     }
 
     public final class FlagsUpdatedImpl extends MailboxListener.FlagsUpdated 
implements MailboxAware {
-        private final List<Long> uids;
+        private final List<MessageUid> uids;
 
         private final Mailbox mailbox;
 
         private final List<UpdatedFlags> uFlags;
 
-        public FlagsUpdatedImpl(MailboxSession session, Mailbox mailbox, 
List<Long> uids, List<UpdatedFlags> uFlags) {
+        public FlagsUpdatedImpl(MailboxSession session, Mailbox mailbox, 
List<MessageUid> uids, List<UpdatedFlags> uFlags) {
             super(session, new StoreMailboxPath(mailbox));
             this.uids = ImmutableList.copyOf(uids);
             this.uFlags = ImmutableList.copyOf(uFlags);
             this.mailbox = mailbox;
         }
 
-        public List<Long> getUids() {
+        public List<MessageUid> getUids() {
             return uids;
         }
 
@@ -166,15 +167,15 @@ public class EventFactory {
         }
     }
 
-    public MailboxListener.Added added(MailboxSession session, SortedMap<Long, 
MessageMetaData> uids, Mailbox mailbox) {
+    public MailboxListener.Added added(MailboxSession session, 
SortedMap<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
         return new AddedImpl(session, mailbox, uids);
     }
 
-    public MailboxListener.Expunged expunged(MailboxSession session,  
Map<Long, MessageMetaData> uids, Mailbox mailbox) {
+    public MailboxListener.Expunged expunged(MailboxSession session,  
Map<MessageUid, MessageMetaData> uids, Mailbox mailbox) {
         return new ExpungedImpl(session, mailbox, uids);
     }
 
-    public MailboxListener.FlagsUpdated flagsUpdated(MailboxSession session, 
List<Long> uids, Mailbox mailbox, List<UpdatedFlags> uflags) {
+    public MailboxListener.FlagsUpdated flagsUpdated(MailboxSession session, 
List<MessageUid> uids, Mailbox mailbox, List<UpdatedFlags> uflags) {
         return new FlagsUpdatedImpl(session, mailbox, uids, uflags);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
index acf5ee1..47a1e7a 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxEventDispatcher.java
@@ -25,6 +25,7 @@ import java.util.SortedMap;
 
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -51,7 +52,7 @@ public class MailboxEventDispatcher {
      * @param uids Sorted map with uids and message meta data
      * @param mailbox The mailbox
      */
-    public void added(MailboxSession session, SortedMap<Long, MessageMetaData> 
uids, Mailbox mailbox) {
+    public void added(MailboxSession session, SortedMap<MessageUid, 
MessageMetaData> uids, Mailbox mailbox) {
         listener.event(eventFactory.added(session, uids, mailbox));
     }
 
@@ -63,7 +64,7 @@ public class MailboxEventDispatcher {
      * @param uids Sorted map with uids and message meta data
      * @param mailbox The mailbox
      */
-    public void expunged(MailboxSession session,  Map<Long, MessageMetaData> 
uids, Mailbox mailbox) {
+    public void expunged(MailboxSession session,  Map<MessageUid, 
MessageMetaData> uids, Mailbox mailbox) {
         listener.event(eventFactory.expunged(session, uids, mailbox));
     }
 
@@ -71,7 +72,7 @@ public class MailboxEventDispatcher {
      * Should get called when the message flags were update in a Mailbox. All
      * registered MailboxListener will get triggered then
      */
-    public void flagsUpdated(MailboxSession session, List<Long> uids, Mailbox 
mailbox, List<UpdatedFlags> uflags) {
+    public void flagsUpdated(MailboxSession session, List<MessageUid> uids, 
Mailbox mailbox, List<UpdatedFlags> uflags) {
         listener.event(eventFactory.flagsUpdated(session, uids, mailbox, 
uflags));
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JacksonEventSerializer.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JacksonEventSerializer.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JacksonEventSerializer.java
index 41b0c2a..17e4d44 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JacksonEventSerializer.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JacksonEventSerializer.java
@@ -19,12 +19,24 @@
 
 package org.apache.james.mailbox.store.json;
 
+import java.io.IOException;
+
 import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.store.event.EventSerializer;
 import org.apache.james.mailbox.store.json.event.EventConverter;
 import org.apache.james.mailbox.store.json.event.dto.EventDataTransferObject;
 
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.KeyDeserializer;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 
 public class JacksonEventSerializer implements EventSerializer {
 
@@ -44,4 +56,51 @@ public class JacksonEventSerializer implements 
EventSerializer {
         EventDataTransferObject eventDataTransferObject = 
objectMapper.readValue(serializedEvent, EventDataTransferObject.class);
         return eventConverter.retrieveEvent(eventDataTransferObject);
     }
+
+    public static ObjectMapper configureObjectMapper(ObjectMapper 
objectMapper) {
+        SimpleModule module = new SimpleModule();
+        module.addDeserializer(MessageUid.class, new MessageUidDeserializer());
+        module.addKeyDeserializer(MessageUid.class, new 
MessageUidKeyDeserializer());
+        module.addSerializer(MessageUid.class, new MessageUidSerializer());
+        module.addKeySerializer(MessageUid.class, new 
MessageUidKeySerializer());
+        objectMapper.registerModule(module);
+        return objectMapper;
+    }
+
+    public static class MessageUidDeserializer extends 
JsonDeserializer<MessageUid> {
+
+        @Override
+        public MessageUid deserialize(JsonParser p, DeserializationContext 
ctxt) throws IOException, JsonProcessingException {
+            return MessageUid.of(Long.parseLong(p.getValueAsString()));
+        }
+        
+    }
+
+    public static class MessageUidSerializer extends 
JsonSerializer<MessageUid> {
+
+        @Override
+        public void serialize(MessageUid value, JsonGenerator gen, 
SerializerProvider serializers) throws IOException, JsonProcessingException {
+            gen.writeString(String.valueOf(value.asLong()));
+        }
+        
+    }
+
+    public static class MessageUidKeyDeserializer extends KeyDeserializer {
+
+        @Override
+        public Object deserializeKey(String key, DeserializationContext ctxt) 
throws IOException, JsonProcessingException {
+            return MessageUid.of(Long.parseLong(key));
+        }
+        
+    }
+
+    public static class MessageUidKeySerializer extends 
JsonSerializer<MessageUid> {
+
+        @Override
+        public void serialize(MessageUid value, JsonGenerator gen, 
SerializerProvider serializers) throws IOException, JsonProcessingException {
+            gen.writeFieldName(String.valueOf(value.asLong()));
+        }
+        
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JsonEventSerializer.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JsonEventSerializer.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JsonEventSerializer.java
index 187405c..f932198 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JsonEventSerializer.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/JsonEventSerializer.java
@@ -26,7 +26,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 public class JsonEventSerializer extends JacksonEventSerializer {
 
     public JsonEventSerializer(EventConverter eventConverter) {
-        super(eventConverter, new ObjectMapper());
+        super(eventConverter, configureObjectMapper(new ObjectMapper()));
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MessagePackEventSerializer.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MessagePackEventSerializer.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MessagePackEventSerializer.java
index b4c232d..0c9cf78 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MessagePackEventSerializer.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MessagePackEventSerializer.java
@@ -28,8 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
  * MailboxMessage Pack ( http://msgpack.org/ ) Event Serializer
  */
 public class MessagePackEventSerializer extends JacksonEventSerializer {
-
     public MessagePackEventSerializer(EventConverter eventConverter) {
-        super(eventConverter, new ObjectMapper(new MessagePackFactory()));
+        super(eventConverter, configureObjectMapper(new ObjectMapper(new 
MessagePackFactory())));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
index fe91bd4..866c594 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/EventConverter.java
@@ -29,6 +29,7 @@ import java.util.TreeMap;
 
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -143,7 +144,7 @@ public class EventConverter {
 
     private EventDataTransferObject constructFalgsUpdatedProxy(MailboxSession 
session,
                                                                
MailboxDataTransferObject mailboxIntermediate,
-                                                               List<Long> uids,
+                                                               
List<MessageUid> uids,
                                                                
List<UpdatedFlags> updatedFlagsList) {
         ArrayList<UpdatedFlagsDataTransferObject> 
updatedFlagsDataTransferObjects = new 
ArrayList<UpdatedFlagsDataTransferObject>();
         for(UpdatedFlags updatedFlags : updatedFlagsList) {
@@ -161,10 +162,10 @@ public class EventConverter {
     private EventDataTransferObject 
constructMeteDataHoldingEventProxy(EventType eventType,
                                                                        
MailboxSession mailboxSession,
                                                                        
MailboxDataTransferObject mailboxIntermediate,
-                                                                       
List<Long> uids,
+                                                                       
List<MessageUid> uids,
                                                                        
MailboxListener.MetaDataHoldingEvent event) {
-        HashMap<Long, MessageMetaDataDataTransferObject> metaDataProxyMap = 
new HashMap<Long, MessageMetaDataDataTransferObject>();
-        for(Long uid : uids) {
+        HashMap<MessageUid, MessageMetaDataDataTransferObject> 
metaDataProxyMap = new HashMap<MessageUid, MessageMetaDataDataTransferObject>();
+        for(MessageUid uid : uids) {
             metaDataProxyMap.put(uid, new MessageMetaDataDataTransferObject(
                 event.getMetaData(uid)
             ));
@@ -178,11 +179,11 @@ public class EventConverter {
             .build();
     }
 
-    private SortedMap<Long, MessageMetaData> retrieveMetadata(Map<Long, 
MessageMetaDataDataTransferObject> metaDataProxyMap) {
+    private SortedMap<MessageUid, MessageMetaData> 
retrieveMetadata(Map<MessageUid, MessageMetaDataDataTransferObject> 
metaDataProxyMap) {
         if(metaDataProxyMap != null) {
-            TreeMap<Long, MessageMetaData> result = new TreeMap<Long, 
MessageMetaData>();
-            Set<Map.Entry<Long, MessageMetaDataDataTransferObject>> entrySet = 
metaDataProxyMap.entrySet();
-            for (Map.Entry<Long, MessageMetaDataDataTransferObject> entry : 
entrySet) {
+            TreeMap<MessageUid, MessageMetaData> result = new 
TreeMap<MessageUid, MessageMetaData>();
+            Set<Map.Entry<MessageUid, MessageMetaDataDataTransferObject>> 
entrySet = metaDataProxyMap.entrySet();
+            for (Map.Entry<MessageUid, MessageMetaDataDataTransferObject> 
entry : entrySet) {
                 result.put(entry.getKey(), entry.getValue().getMetadata());
             }
             return result;

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/EventDataTransferObject.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/EventDataTransferObject.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/EventDataTransferObject.java
index c7d02c5..ac2ba0c 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/EventDataTransferObject.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/EventDataTransferObject.java
@@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.mailbox.MessageUid;
+
 public class EventDataTransferObject {
 
     public static class Builder {
@@ -31,8 +33,8 @@ public class EventDataTransferObject {
         private EventType type;
         private MailboxDataTransferObject mailbox;
         private MailboxSessionDataTransferObject session;
-        private List<Long> uids;
-        private Map<Long, MessageMetaDataDataTransferObject> metaData;
+        private List<MessageUid> uids;
+        private Map<MessageUid, MessageMetaDataDataTransferObject> metaData;
         private List<UpdatedFlagsDataTransferObject> updatedFlags;
         private MailboxPathDataTransferObject from;
 
@@ -56,12 +58,12 @@ public class EventDataTransferObject {
             return this;
         }
 
-        public Builder uids(List<Long> uids) {
+        public Builder uids(List<MessageUid> uids) {
             this.uids = uids;
             return this;
         }
 
-        public Builder metaData(Map<Long, MessageMetaDataDataTransferObject> 
metaData) {
+        public Builder metaData(Map<MessageUid, 
MessageMetaDataDataTransferObject> metaData) {
             this.metaData = metaData;
             return this;
         }
@@ -88,9 +90,9 @@ public class EventDataTransferObject {
     @JsonProperty()
     private MailboxSessionDataTransferObject session;
     @JsonProperty()
-    private List<Long> uids;
+    private List<MessageUid> uids;
     @JsonProperty()
-    private Map<Long, MessageMetaDataDataTransferObject> metaData;
+    private Map<MessageUid, MessageMetaDataDataTransferObject> metaData;
     @JsonProperty()
     private List<UpdatedFlagsDataTransferObject> updatedFlags;
     @JsonProperty()
@@ -101,8 +103,8 @@ public class EventDataTransferObject {
     public EventDataTransferObject(EventType type,
                                    MailboxDataTransferObject mailbox,
                                    MailboxSessionDataTransferObject session,
-                                   List<Long> uids,
-                                   Map<Long, 
MessageMetaDataDataTransferObject> metaData,
+                                   List<MessageUid> uids,
+                                   Map<MessageUid, 
MessageMetaDataDataTransferObject> metaData,
                                    List<UpdatedFlagsDataTransferObject> 
updatedFlags,
                                    MailboxPathDataTransferObject from) {
         this.type = type;
@@ -130,12 +132,12 @@ public class EventDataTransferObject {
     }
 
     @JsonIgnore
-    public List<Long> getUids() {
+    public List<MessageUid> getUids() {
         return uids;
     }
 
     @JsonIgnore
-    public Map<Long, MessageMetaDataDataTransferObject> getMetaDataProxyMap() {
+    public Map<MessageUid, MessageMetaDataDataTransferObject> 
getMetaDataProxyMap() {
         return metaData;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/MessageMetaDataDataTransferObject.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/MessageMetaDataDataTransferObject.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/MessageMetaDataDataTransferObject.java
index 2331d4f..01f191f 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/MessageMetaDataDataTransferObject.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/MessageMetaDataDataTransferObject.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.store.json.event.dto;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
+
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.store.SimpleMessageMetaData;
 import org.slf4j.Logger;
@@ -73,7 +75,7 @@ public class MessageMetaDataDataTransferObject {
     }
 
     public MessageMetaDataDataTransferObject(MessageMetaData metadata) {
-        this.uid = metadata.getUid();
+        this.uid = metadata.getUid().asLong();
         this.modseq = metadata.getModSeq();
         this.flags = new FlagsDataTransferObject(metadata.getFlags());
         this.size = metadata.getSize();
@@ -83,10 +85,10 @@ public class MessageMetaDataDataTransferObject {
     @JsonIgnore
     public SimpleMessageMetaData getMetadata() {
         try {
-            return new SimpleMessageMetaData(uid, modseq, flags.getFlags(), 
size, parse(date));
+            return new SimpleMessageMetaData(MessageUid.of(uid), modseq, 
flags.getFlags(), size, parse(date));
         } catch(ParseException parseException) {
             LOG.error("Parse exception while parsing date while deserializing 
metadata upon event serialization. Using nowadays date instead.");
-            return new SimpleMessageMetaData(uid, modseq, flags.getFlags(), 
size, new Date());
+            return new SimpleMessageMetaData(MessageUid.of(uid), modseq, 
flags.getFlags(), size, new Date());
         }
 
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/UpdatedFlagsDataTransferObject.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/UpdatedFlagsDataTransferObject.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/UpdatedFlagsDataTransferObject.java
index 61d6a6c..ada06f6 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/UpdatedFlagsDataTransferObject.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/dto/UpdatedFlagsDataTransferObject.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store.json.event.dto;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.UpdatedFlags;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -37,14 +38,14 @@ public class UpdatedFlagsDataTransferObject {
     }
 
     public UpdatedFlagsDataTransferObject(UpdatedFlags updatedFlags) {
-        this.uid = updatedFlags.getUid();
+        this.uid = updatedFlags.getUid().asLong();
         this.modseq = updatedFlags.getModSeq();
         this.oldFlags = new 
FlagsDataTransferObject(updatedFlags.getOldFlags());
         this.newFlags = new 
FlagsDataTransferObject(updatedFlags.getNewFlags());
     }
 
     public UpdatedFlags retrieveUpdatedFlags() {
-        return new UpdatedFlags(uid, modseq, oldFlags.getFlags(), 
newFlags.getFlags());
+        return new UpdatedFlags(MessageUid.of(uid), modseq, 
oldFlags.getFlags(), newFlags.getFlags());
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
index b0531c6..f83c6a4 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.mail;
 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.store.StoreMailboxPath;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -41,11 +42,11 @@ public abstract class AbstractLockingUidProvider implements 
UidProvider{
     }
     
     @Override
-    public long nextUid(final MailboxSession session, final Mailbox mailbox) 
throws MailboxException {
-        return locker.executeWithLock(session, new StoreMailboxPath(mailbox), 
new LockAwareExecution<Long>() {
+    public MessageUid nextUid(final MailboxSession session, final Mailbox 
mailbox) throws MailboxException {
+        return locker.executeWithLock(session, new StoreMailboxPath(mailbox), 
new LockAwareExecution<MessageUid>() {
 
             @Override
-            public Long execute() throws MailboxException {
+            public MessageUid execute() throws MailboxException {
                 return lockedNextUid(session, mailbox);
             }
         }, true);
@@ -53,12 +54,7 @@ public abstract class AbstractLockingUidProvider implements 
UidProvider{
     
     /**
      * Generate the next uid to use while the {@link Mailbox} is locked
-     * 
-     * @param session
-     * @param mailbox
-     * @return nextUid
-     * @throws MailboxException
      */
-    protected abstract long lockedNextUid(MailboxSession session, Mailbox 
mailbox) throws MailboxException;
+    protected abstract MessageUid lockedNextUid(MailboxSession session, 
Mailbox mailbox) throws MailboxException;
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index 59361b8..006fee5 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -25,6 +25,7 @@ import java.util.List;
 import javax.mail.Flags;
 
 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.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
@@ -34,6 +35,8 @@ import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
 
+import com.google.common.base.Optional;
+
 /**
  * Abstract base class for {@link MessageMapper} implementation
  * which already takes care of most uid / mod-seq handling.
@@ -50,23 +53,17 @@ public abstract class AbstractMessageMapper extends 
TransactionalMapper implemen
         this.modSeqProvider = modSeqProvider;
     }
     
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#getHighestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
+    @Override
     public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
         return modSeqProvider.highestModSeq(mailboxSession, mailbox);
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#getLastUid(org.apache.james.mailbox.store.mail.model.Mailbox)
-     */
-    public long getLastUid(Mailbox mailbox) throws MailboxException {
+    @Override
+    public Optional<MessageUid> getLastUid(Mailbox mailbox) throws 
MailboxException {
         return uidProvider.lastUid(mailboxSession, mailbox);
     }
     
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox,
 javax.mail.Flags, boolean, boolean, 
org.apache.james.mailbox.model.MessageRange)
-     */
+    @Override
     public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, 
FlagsUpdateCalculator flagsUpdateCalculator, MessageRange set) throws 
MailboxException {
         final List<UpdatedFlags> updatedFlags = new ArrayList<UpdatedFlags>();
         Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, 
FetchType.Metadata, -1);
@@ -100,9 +97,7 @@ public abstract class AbstractMessageMapper extends 
TransactionalMapper implemen
 
     }
 
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#add(org.apache.james.mailbox.store.mail.model.Mailbox,
 MailboxMessage)
-     */
+    @Override
     public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws 
MailboxException {
         message.setUid(uidProvider.nextUid(mailboxSession, mailbox));
         
@@ -117,11 +112,9 @@ public abstract class AbstractMessageMapper extends 
TransactionalMapper implemen
     }
 
     
-    /**
-     * @see 
org.apache.james.mailbox.store.mail.MessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox,
 MailboxMessage)
-     */
+    @Override
     public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) 
throws MailboxException {
-        long uid = uidProvider.nextUid(mailboxSession, mailbox);
+        MessageUid uid = uidProvider.nextUid(mailboxSession, mailbox);
         long modSeq = -1;
         if (modSeqProvider != null) {
             modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
@@ -131,30 +124,15 @@ public abstract class AbstractMessageMapper extends 
TransactionalMapper implemen
         return metaData;
     }
 
-   
-    
-    
     /**
      * Save the {@link MailboxMessage} for the given {@link Mailbox} and 
return the {@link MessageMetaData}
-     * 
-     * @param mailbox
-     * @param message
-     * @return metaData
-     * @throws MailboxException
      */
     protected abstract MessageMetaData save(Mailbox mailbox, MailboxMessage 
message) throws MailboxException;
 
     
     /**
      * Copy the MailboxMessage to the Mailbox, using the given uid and modSeq 
for the new MailboxMessage
-     * 
-     * @param mailbox
-     * @param uid
-     * @param modSeq
-     * @param original
-     * @return metaData
-     * @throws MailboxException
      */
-    protected abstract MessageMetaData copy(Mailbox mailbox, long uid, long 
modSeq, MailboxMessage original) throws MailboxException;
+    protected abstract MessageMetaData copy(Mailbox mailbox, MessageUid uid, 
long modSeq, MailboxMessage original) throws MailboxException;
     
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index 94bac52..f4486c5 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -22,6 +22,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
@@ -32,6 +33,8 @@ import 
org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.transaction.Mapper;
 
+import com.google.common.base.Optional;
+
 /**
  * Maps {@link MailboxMessage} in a {@link 
org.apache.james.mailbox.MessageManager}. A {@link MessageMapper} has a 
lifecycle from the start of a request
  * to the end of the request.
@@ -55,12 +58,8 @@ public interface MessageMapper extends Mapper {
     /**
      * Return a {@link Iterator} which holds the uids for all deleted Messages 
for the given {@link MessageRange} which are marked for deletion
      * The list must be ordered
-     * @param mailbox
-     * @param set 
-     * @return uids
-     * @throws MailboxException
      */
-    Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(
+    Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(
             Mailbox mailbox, MessageRange set)
             throws MailboxException;
 
@@ -102,17 +101,13 @@ public interface MessageMapper extends Mapper {
      * @return uid or null
      * @throws StorageException
      */
-    Long findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException;
+    MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws 
MailboxException;
 
     /**
      * Return a List of {@link MailboxMessage} which are recent.
      * The list must be ordered by the {@link MailboxMessage} uid.
-     * 
-     * @param mailbox
-     * @return recentList
-     * @throws StorageException
      */
-    List<Long> findRecentMessageUidsInMailbox(Mailbox mailbox) throws 
MailboxException;
+    List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws 
MailboxException;
 
 
     /**
@@ -161,21 +156,13 @@ public interface MessageMapper extends Mapper {
     
     
     /**
-     * Return the last uid which were used for storing a MailboxMessage in the 
{@link Mailbox}
-     * 
-     * @param mailbox
-     * @return lastUid
-     * @throws MailboxException
+     * Return the last uid which were used for storing a MailboxMessage in the 
{@link Mailbox} or null if no
      */
-    long getLastUid(Mailbox mailbox) throws MailboxException;
+    Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException;
 
 
     /**
      * Return the higest mod-sequence which were used for storing a 
MailboxMessage in the {@link Mailbox}
-     * 
-     * @param mailbox
-     * @return lastUid
-     * @throws MailboxException
      */
     long getHighestModSeq(Mailbox mailbox) throws MailboxException;
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
index 870d1a6..cdff7cf 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
@@ -19,9 +19,12 @@
 package org.apache.james.mailbox.store.mail;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 
+import com.google.common.base.Optional;
+
 /**
  * Take care of provide uids for a given {@link Mailbox}. Be aware that 
implementations
  * need to be thread-safe!
@@ -34,21 +37,11 @@ public interface UidProvider {
      * Return the next uid which can be used while append a MailboxMessage to 
the {@link Mailbox}.
      * Its important that the returned uid is higher then the last used and 
that the next call of this method does return a higher
      * one
-     * 
-     * @param session
-     * @param mailbox
-     * @return nextUid
-     * @throws MailboxException
      */
-    long nextUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException;
+    MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException;
     
     /**
      * Return the last uid which were used for storing a MailboxMessage in the 
{@link Mailbox}
-     * 
-     * @param session
-     * @param mailbox
-     * @return lastUid
-     * @throws MailboxException
      */
-    long lastUid(MailboxSession session, Mailbox mailbox) throws 
MailboxException;
+    Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) 
throws MailboxException;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DefaultMessageId.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DefaultMessageId.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DefaultMessageId.java
index 46b65fc..93be2f9 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DefaultMessageId.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DefaultMessageId.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.mail.model;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxId;
 
 import com.google.common.base.Objects;
@@ -26,9 +27,9 @@ import com.google.common.base.Preconditions;
 public class DefaultMessageId implements MessageId {
 
     private final MailboxId mailboxId;
-    private final long messageUid;
+    private final MessageUid messageUid;
 
-    public DefaultMessageId(MailboxId mailboxId, long messageUid) {
+    public DefaultMessageId(MailboxId mailboxId, MessageUid messageUid) {
         Preconditions.checkNotNull(mailboxId);
         this.mailboxId = mailboxId;
         this.messageUid = messageUid;
@@ -36,7 +37,7 @@ public class DefaultMessageId implements MessageId {
     
     @Override
     public String serialize() {
-        return String.format("%s-%d", mailboxId.serialize(), messageUid);
+        return String.format("%s-%d", mailboxId.serialize(), 
messageUid.asLong());
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
index 101c56b..a0128b1 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
@@ -26,12 +26,9 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.store.mail.model.impl.MessageUidComparator;
 
 public abstract class DelegatingMailboxMessage implements MailboxMessage {
 
-    private static final MessageUidComparator MESSAGE_UID_COMPARATOR = new 
MessageUidComparator();
-    
     private final Message message;
 
     protected DelegatingMailboxMessage(Message message) {
@@ -40,7 +37,7 @@ public abstract class DelegatingMailboxMessage implements 
MailboxMessage {
 
     @Override
     public int compareTo(MailboxMessage other) {
-        return MESSAGE_UID_COMPARATOR.compare(this, other);
+        return this.getUid().compareTo(other.getUid());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
index 647de53..2033917 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.store.mail.model;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxId;
 
 /**
@@ -38,18 +39,14 @@ public interface MailboxMessage extends Message, 
Comparable<MailboxMessage> {
 
     /**
      * Return the uid
-     * 
-     * @return uid
      */
-    long getUid();
+    MessageUid getUid();
     
     /**
      * Set the uid for the message. This must be called before the message is 
added to the store
      * and must be unique / sequential.
-     * 
-     * @param uid
      */
-    void setUid(long uid);
+    void setUid(MessageUid uid);
 
     
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java
deleted file mode 100644
index 1c62ede..0000000
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageUidComparator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.mailbox.store.mail.model.impl;
-
-import java.util.Comparator;
-
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-
-public class MessageUidComparator implements Comparator<MailboxMessage> {
-
-    @Override
-    public int compare(MailboxMessage m1, MailboxMessage m2) {
-        return Long.valueOf(m1.getUid()).compareTo(m2.getUid());
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
index fd465d7..04d660f 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
@@ -28,6 +28,7 @@ import javax.mail.internet.SharedInputStream;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
@@ -35,6 +36,7 @@ import 
org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.Ints;
 
@@ -59,7 +61,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
         }
     }
 
-    private long uid;
+    private MessageUid uid;
     private final MailboxId mailboxId;
     private boolean answered;
     private boolean deleted;
@@ -104,7 +106,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
         return mailboxId;
     }
 
-    public long getUid() {
+    public MessageUid getUid() {
         return uid;
     }
 
@@ -140,7 +142,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
         this.modSeq = modSeq;
     }
 
-    public void setUid(long uid) {
+    public void setUid(MessageUid uid) {
         this.uid = uid;
     }
 
@@ -156,24 +158,16 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
 
     @Override
     public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + (int) (uid ^ (uid >>> 32));
-        return result;
+        return Objects.hashCode(uid);
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        final SimpleMailboxMessage other = (SimpleMailboxMessage) obj;
-        if (uid != other.uid)
-            return false;
-        return true;
+        if (obj instanceof SimpleMailboxMessage) {
+            SimpleMailboxMessage other = (SimpleMailboxMessage) obj;
+            return Objects.equal(this.uid, other.uid);
+        }
+        return false;
     }
 
     public String toString() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
index df3f0cc..9e48071 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.quota;
 import java.util.List;
 
 import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
@@ -69,8 +70,8 @@ public class ListeningCurrentQuotaUpdater implements 
MailboxListener, QuotaUpdat
     private void handleExpungedEvent(Expunged expunged, QuotaRoot quotaRoot) 
throws MailboxException {
         long addedSize = 0;
         long addedCount = 0;
-        List<Long> uids = expunged.getUids();
-        for (Long uid : uids) {
+        List<MessageUid> uids = expunged.getUids();
+        for (MessageUid uid : uids) {
             addedSize += expunged.getMetaData(uid).getSize();
             addedCount++;
         }
@@ -83,8 +84,8 @@ public class ListeningCurrentQuotaUpdater implements 
MailboxListener, QuotaUpdat
     private void handleAddedEvent(Added added, QuotaRoot quotaRoot) throws 
MailboxException {
         long addedSize = 0;
         long addedCount = 0;
-        List<Long> uids = added.getUids();
-        for (Long uid : uids) {
+        List<MessageUid> uids = added.getUids();
+        for (MessageUid uid : uids) {
             addedSize += added.getMetaData(uid).getSize();
             addedCount++;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
index 72b905b..a1c9275 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
@@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
 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.UnsupportedSearchException;
 import org.apache.james.mailbox.model.MailboxId;
@@ -76,7 +77,7 @@ public class LazyMessageSearchIndex extends 
ListeningMessageSearchIndex {
     }
 
     @Override
-    public void delete(MailboxSession session, Mailbox mailbox, List<Long> 
expungedUids) throws MailboxException {
+    public void delete(MailboxSession session, Mailbox mailbox, 
List<MessageUid> expungedUids) throws MailboxException {
         index.delete(session, mailbox, expungedUids);
     }
 
@@ -92,7 +93,7 @@ public class LazyMessageSearchIndex extends 
ListeningMessageSearchIndex {
      * 
      */
     @Override
-    public Iterator<Long> search(MailboxSession session, Mailbox mailbox, 
SearchQuery searchQuery) throws MailboxException {
+    public Iterator<MessageUid> search(MailboxSession session, Mailbox 
mailbox, SearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId id = mailbox.getMailboxId();
         
@@ -127,7 +128,7 @@ public class LazyMessageSearchIndex extends 
ListeningMessageSearchIndex {
     
 
     @Override
-    public Map<MailboxId, Collection<Long>> search(MailboxSession session, 
MultimailboxesSearchQuery searchQuery) throws MailboxException {
+    public Map<MailboxId, Collection<MessageUid>> search(MailboxSession 
session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
         throw new UnsupportedSearchException();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 0495398..6cc40b9 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import org.apache.james.mailbox.MailboxListener;
 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.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -75,7 +76,7 @@ public abstract class ListeningMessageSearchIndex implements 
MessageSearchIndex,
                     EventFactory.AddedImpl added = (EventFactory.AddedImpl) 
event;
                     final Mailbox mailbox = added.getMailbox();
 
-                    for (Long next : (Iterable<Long>) added.getUids()) {
+                    for (MessageUid next : (Iterable<MessageUid>) 
added.getUids()) {
                         Iterator<MailboxMessage> messages = 
factory.getMessageMapper(session).findInMailbox(mailbox, 
MessageRange.one(next), FetchType.Full, -1);
                         while (messages.hasNext()) {
                             MailboxMessage message = messages.next();
@@ -131,7 +132,7 @@ public abstract class ListeningMessageSearchIndex 
implements MessageSearchIndex,
      * @param expungedUids UIDS to be deleted
      * @throws MailboxException
      */
-    public abstract void delete(MailboxSession session, Mailbox mailbox, 
List<Long> expungedUids) throws MailboxException;
+    public abstract void delete(MailboxSession session, Mailbox mailbox, 
List<MessageUid> expungedUids) throws MailboxException;
 
     /**
      * Delete the messages contained in the given {@link Mailbox} from the 
index

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
index b81607d..6324898 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
@@ -26,6 +26,7 @@ import java.util.Map;
 
 import org.apache.james.mailbox.MailboxManager;
 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.MailboxId;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
@@ -44,12 +45,12 @@ public interface MessageSearchIndex {
     /**
      * Return all uids of the previous indexed {@link Mailbox}'s which match 
the {@link SearchQuery}
      */
-    Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery 
searchQuery) throws MailboxException;
+    Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, 
SearchQuery searchQuery) throws MailboxException;
 
     /**
      * Return all uids of all {@link Mailbox}'s the current user has access to 
which match the {@link SearchQuery}
      */
-    Map<MailboxId, Collection<Long>> search(MailboxSession session, 
MultimailboxesSearchQuery searchQuery) throws MailboxException;
+    Map<MailboxId, Collection<MessageUid>> search(MailboxSession session, 
MultimailboxesSearchQuery searchQuery) throws MailboxException;
 
     EnumSet<MailboxManager.SearchCapabilities> getSupportedCapabilities();
 


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

Reply via email to