### Eclipse Workspace Patch 1.0
#P apache-james-imap
Index: store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java	(Revision 983679)
+++ store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java	(Arbeitskopie)
@@ -24,6 +24,7 @@
 import java.util.List;
 
 import org.apache.commons.logging.Log;
+import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.MailboxPath;
 import org.apache.james.imap.mailbox.MailboxConstants;
 import org.apache.james.imap.mailbox.MailboxException;
@@ -176,37 +177,44 @@
 
             public void run() throws MailboxException {
                 // TODO put this into a serilizable transaction
-                final Mailbox<Id> mailbox = mapper.findMailboxByPath(from);
-                if (mailbox == null) {
-                    throw new MailboxNotFoundException(from);
-                }
-                mailbox.setNamespace(to.getNamespace());
-                mailbox.setUser(to.getUser());
-                mailbox.setName(to.getName());
-                mapper.save(mailbox);
-
-                changeMailboxName(from, to, session);
-
-                // rename submailboxes
-                MailboxPath children = new MailboxPath(MailboxConstants.USER_NAMESPACE, from.getUser(), from.getName() + MailboxConstants.DEFAULT_DELIMITER + "%");
+                lock.lock(from);
                 try {
-                    lock.lock(children);
-                    final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithPathLike(children);
-                    for (Mailbox<Id> sub : subMailboxes) {
-                        final String subOriginalName = sub.getName();
-                        final String subNewName = to.getName() + subOriginalName.substring(from.getName().length());
-                        sub.setName(subNewName);
-                        mapper.save(sub);
+                    final Mailbox<Id> mailbox = mapper.findMailboxByPath(from);
+                    if (mailbox == null) {
+                        throw new MailboxNotFoundException(from);
+                    }
+                    mailbox.setNamespace(to.getNamespace());
+                    mailbox.setUser(to.getUser());
+                    mailbox.setName(to.getName());
+                    mapper.save(mailbox);
 
-                        changeMailboxName(new MailboxPath(children, subOriginalName), new MailboxPath(children, subNewName), session);
+                    changeMailboxName(from, to, session);
+                } finally {
+                    lock.unlock(from);
+                }
 
-                        if (log.isDebugEnabled())
-                            log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to " + subNewName);
+                // rename submailboxes if not INBOX
+                if (!from.getName().equals(ImapConstants.INBOX_NAME)) {
+                    MailboxPath children = new MailboxPath(MailboxConstants.USER_NAMESPACE, from.getUser(), from.getName() + MailboxConstants.DEFAULT_DELIMITER + "%");
+                    try {
+                        lock.lock(children);
+                        final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithPathLike(children);
+                        final int oldParentLength = from.getName().length();
+                        for (Mailbox<Id> sub : subMailboxes) {
+                            final String subOriginalName = sub.getName();
+                            final String subNewName = to.getName() + subOriginalName.substring(oldParentLength);
+                            sub.setName(subNewName);
+                            mapper.save(sub);
+    
+                            changeMailboxName(new MailboxPath(children, subOriginalName), new MailboxPath(children, subNewName), session);
+    
+                            if (log.isDebugEnabled())
+                                log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to " + subNewName);
+                        }
+                    } finally {
+                        lock.unlock(children);
                     }
-                } finally {
-                    lock.unlock(children);
                 }
-                
             }
 
         });
Index: store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java
===================================================================
--- store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java	(Revision 983679)
+++ store/src/main/java/org/apache/james/imap/store/mail/MailboxMapper.java	(Arbeitskopie)
@@ -34,7 +34,10 @@
 public interface MailboxMapper<Id> extends TransactionalMapper {
     
     /**
-     * Save the give {@link Mailbox} to the underlying storage
+     * Save the given {@link Mailbox} to the underlying storage.
+     * If by saving the mailbox any INBOX would be renamed, this
+     * must move the contents of that INBOX to the new (renamed)
+     * mailbox, INBOX and its subfolders must still exist.
      * 
      * @param mailbox
      * @throws StorageException
Index: memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java
===================================================================
--- memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java	(Revision 983679)
+++ memory/src/main/java/org/apache/james/imap/inmemory/mail/InMemoryMailboxMapper.java	(Arbeitskopie)
@@ -21,8 +21,10 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.MailboxPath;
 import org.apache.james.imap.inmemory.mail.model.InMemoryMailbox;
 import org.apache.james.imap.mailbox.MailboxException;
@@ -112,7 +114,15 @@
      * @see org.apache.james.imap.store.mail.MailboxMapper#save(org.apache.james.imap.store.mail.model.Mailbox)
      */
     public void save(Mailbox<Long> mailbox) throws StorageException {
-        mailboxesById.put(mailbox.getMailboxId(), (InMemoryMailbox) mailbox);
+        Mailbox<Long> originalMailbox = mailboxesById.put(mailbox.getMailboxId(), (InMemoryMailbox) mailbox);
+        // if it was INBOX than recreate it
+        if (originalMailbox != null && originalMailbox.getName().equals(ImapConstants.INBOX_NAME)) {
+            Random random = new Random();
+            Long newId = random.nextLong();
+            mailboxesById.put(newId, new InMemoryMailbox(newId,
+                    new MailboxPath(originalMailbox.getNamespace(), originalMailbox.getUser(),
+                            originalMailbox.getName()), Math.abs(random.nextInt())));
+        }
     }
 
     /*
