You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/15 02:41:16 UTC

[james-project] 07/30: [Refactoring] AbstractMailboxProcessor response methods should accept IMAP request

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f5de467dfa278121c713dd95bf654123993517f3
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 11 12:21:21 2019 +0700

    [Refactoring] AbstractMailboxProcessor response methods should accept IMAP request
    
    This limits the count of arguments
---
 .../imap/processor/AbstractAuthProcessor.java      | 26 ++++++++++------------
 .../imap/processor/AbstractMailboxProcessor.java   | 24 ++++++++++----------
 .../processor/AbstractMessageRangeProcessor.java   |  8 +++----
 .../imap/processor/AbstractSelectionProcessor.java | 19 ++++++++--------
 .../james/imap/processor/AppendProcessor.java      | 24 +++++++++-----------
 .../imap/processor/AuthenticateProcessor.java      | 15 +++++++------
 .../james/imap/processor/CapabilityProcessor.java  |  2 +-
 .../james/imap/processor/CheckProcessor.java       |  2 +-
 .../james/imap/processor/CloseProcessor.java       |  4 ++--
 .../james/imap/processor/CreateProcessor.java      |  8 +++----
 .../james/imap/processor/DeleteACLProcessor.java   | 12 +++++-----
 .../james/imap/processor/DeleteProcessor.java      |  8 +++----
 .../james/imap/processor/EnableProcessor.java      |  4 ++--
 .../james/imap/processor/ExpungeProcessor.java     | 10 ++++-----
 .../james/imap/processor/GetACLProcessor.java      | 14 ++++++------
 .../imap/processor/GetAnnotationProcessor.java     | 17 +++++++-------
 .../james/imap/processor/GetQuotaProcessor.java    |  6 ++---
 .../imap/processor/GetQuotaRootProcessor.java      |  6 ++---
 .../apache/james/imap/processor/IdleProcessor.java |  2 +-
 .../apache/james/imap/processor/LSubProcessor.java |  4 ++--
 .../apache/james/imap/processor/ListProcessor.java |  4 ++--
 .../james/imap/processor/ListRightsProcessor.java  | 10 ++++-----
 .../james/imap/processor/LoginProcessor.java       |  4 ++--
 .../james/imap/processor/LogoutProcessor.java      |  4 ++--
 .../james/imap/processor/MyRightsProcessor.java    |  8 +++----
 .../james/imap/processor/NamespaceProcessor.java   |  2 +-
 .../apache/james/imap/processor/NoopProcessor.java |  2 +-
 .../james/imap/processor/RenameProcessor.java      | 10 ++++-----
 .../james/imap/processor/SearchProcessor.java      |  6 ++---
 .../james/imap/processor/SetACLProcessor.java      | 12 +++++-----
 .../imap/processor/SetAnnotationProcessor.java     |  8 +++----
 .../james/imap/processor/SetQuotaProcessor.java    |  2 +-
 .../james/imap/processor/StatusProcessor.java      |  5 +++--
 .../james/imap/processor/StoreProcessor.java       |  8 +++----
 .../james/imap/processor/SubscribeProcessor.java   |  4 ++--
 .../james/imap/processor/UnselectProcessor.java    |  4 ++--
 .../james/imap/processor/UnsubscribeProcessor.java |  4 ++--
 .../james/imap/processor/fetch/FetchProcessor.java | 10 ++++-----
 38 files changed, 160 insertions(+), 162 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
index 58a430b..94ccf20 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
@@ -20,9 +20,7 @@ package org.apache.james.imap.processor;
 
 import java.util.Optional;
 
-import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
-import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -59,7 +57,7 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         super(acceptableClass, next, mailboxManager, factory, metricFactory);
     }
 
-    protected void doAuth(AuthenticationAttempt authenticationAttempt, ImapSession session, Tag tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void doAuth(AuthenticationAttempt authenticationAttempt, ImapSession session, ImapRequest request, Responder responder, HumanReadableText failed) {
         Preconditions.checkArgument(!authenticationAttempt.isDelegation());
         try {
             boolean authFailure = false;
@@ -74,21 +72,21 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
                     session.authenticated();
                     session.setAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY, mailboxSession);
                     provisionInbox(session, mailboxManager, mailboxSession);
-                    okComplete(command, tag, responder);
+                    okComplete(request, responder);
                 } catch (BadCredentialsException e) {
                     authFailure = true;
                 }
             }
             if (authFailure) {
-                manageFailureCount(session, tag, command, responder, failed);
+                manageFailureCount(session, request, responder, failed);
             }
         } catch (MailboxException e) {
             LOGGER.error("Error encountered while login", e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
-    protected void doAuthWithDelegation(AuthenticationAttempt authenticationAttempt, ImapSession session, Tag tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void doAuthWithDelegation(AuthenticationAttempt authenticationAttempt, ImapSession session, ImapRequest request, Responder responder, HumanReadableText failed) {
         Preconditions.checkArgument(authenticationAttempt.isDelegation());
         try {
             boolean authFailure = false;
@@ -104,23 +102,23 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
                     session.authenticated();
                     session.setAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY, mailboxSession);
                     provisionInbox(session, mailboxManager, mailboxSession);
-                    okComplete(command, tag, responder);
+                    okComplete(request, responder);
                 } catch (BadCredentialsException e) {
                     authFailure = true;
                 }
             }
             if (authFailure) {
-                manageFailureCount(session, tag, command, responder, failed);
+                manageFailureCount(session, request, responder, failed);
             }
         } catch (UserDoesNotExistException e) {
             LOGGER.info("User {} does not exist", authenticationAttempt.getAuthenticationId(), e);
-            no(command, tag, responder, HumanReadableText.USER_DOES_NOT_EXIST);
+            no(request, responder, HumanReadableText.USER_DOES_NOT_EXIST);
         } catch (NotAdminException e) {
             LOGGER.info("User {} is not an admin", authenticationAttempt.getDelegateUserName(), e);
-            no(command, tag, responder, HumanReadableText.NOT_AN_ADMIN);
+            no(request, responder, HumanReadableText.NOT_AN_ADMIN);
         } catch (MailboxException e) {
             LOGGER.info("Login failed", e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
@@ -139,7 +137,7 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         }
     }
 
-    protected void manageFailureCount(ImapSession session, Tag tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void manageFailureCount(ImapSession session, ImapRequest request, Responder responder, HumanReadableText failed) {
         final Integer currentNumberOfFailures = (Integer) session.getAttribute(ATTRIBUTE_NUMBER_OF_FAILURES);
         final int failures;
         if (currentNumberOfFailures == null) {
@@ -149,7 +147,7 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         }
         if (failures < MAX_FAILURES) {
             session.setAttribute(ATTRIBUTE_NUMBER_OF_FAILURES, failures);
-            no(command, tag, responder, failed);
+            no(request, responder, failed);
         } else {
             LOGGER.info("Too many authentication failures. Closing connection.");
             bye(responder, HumanReadableText.TOO_MANY_FAILURES);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 9134494..ffd20e6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -115,10 +115,10 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
 
             }
         } catch (DeniedAccessOnSharedMailboxException e) {
-            no(command, tag, responder, HumanReadableText.DENIED_SHARED_MAILBOX);
+            no(message, responder, HumanReadableText.DENIED_SHARED_MAILBOX);
         } catch (Exception unexpectedException) {
             LOGGER.error("Unexpected error during IMAP processing", unexpectedException);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
@@ -334,28 +334,28 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
         responder.respond(response);
     }
 
-    protected void okComplete(ImapCommand command, Tag tag, ImapProcessor.Responder responder) {
-        final StatusResponse response = factory.taggedOk(tag, command, HumanReadableText.COMPLETED);
+    protected void okComplete(ImapRequest request, ImapProcessor.Responder responder) {
+        final StatusResponse response = factory.taggedOk(request.getTag(), request.getCommand(), HumanReadableText.COMPLETED);
         responder.respond(response);
     }
 
-    protected void okComplete(ImapCommand command, Tag tag, ResponseCode code, ImapProcessor.Responder responder) {
-        final StatusResponse response = factory.taggedOk(tag, command, HumanReadableText.COMPLETED, code);
+    protected void okComplete(ImapRequest request,  ResponseCode code, ImapProcessor.Responder responder) {
+        final StatusResponse response = factory.taggedOk(request.getTag(), request.getCommand(), HumanReadableText.COMPLETED, code);
         responder.respond(response);
     }
 
-    protected void no(ImapCommand command, Tag tag, ImapProcessor.Responder responder, HumanReadableText displayTextKey) {
-        final StatusResponse response = factory.taggedNo(tag, command, displayTextKey);
+    protected void no(ImapRequest request, ImapProcessor.Responder responder, HumanReadableText displayTextKey) {
+        StatusResponse response = factory.taggedNo(request.getTag(), request.getCommand(), displayTextKey);
         responder.respond(response);
     }
 
-    protected void no(ImapCommand command, Tag tag, ImapProcessor.Responder responder, HumanReadableText displayTextKey, StatusResponse.ResponseCode responseCode) {
-        final StatusResponse response = factory.taggedNo(tag, command, displayTextKey, responseCode);
+    protected void no(ImapRequest request, ImapProcessor.Responder responder, HumanReadableText displayTextKey, StatusResponse.ResponseCode responseCode) {
+        StatusResponse response = factory.taggedNo(request.getTag(), request.getCommand(), displayTextKey, responseCode);
         responder.respond(response);
     }
 
-    protected void taggedBad(ImapCommand command, Tag tag, ImapProcessor.Responder responder, HumanReadableText e) {
-        StatusResponse response = factory.taggedBad(tag, command, e);
+    protected void taggedBad(ImapRequest request, ImapProcessor.Responder responder, HumanReadableText e) {
+        StatusResponse response = factory.taggedBad(request.getTag(), request.getCommand(), e);
 
         responder.respond(response);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 919999e..c95afcf 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -73,7 +73,7 @@ public abstract class AbstractMessageRangeProcessor<M extends AbstractMessageRan
             final boolean mailboxExists = mailboxManager.mailboxExists(targetMailbox, mailboxSession);
 
             if (!mailboxExists) {
-                no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
+                no(request, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
             } else {
 
                 final MessageManager mailbox = mailboxManager.getMailbox(targetMailbox, mailboxSession);
@@ -104,16 +104,16 @@ public abstract class AbstractMessageRangeProcessor<M extends AbstractMessageRan
                 Long uidValidity = mailbox.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN).getUidValidity();
 
                 unsolicitedResponses(session, responder, useUids);
-                okComplete(command, tag, StatusResponse.ResponseCode.copyUid(uidValidity, idSet, resultUids), responder);
+                okComplete(request, StatusResponse.ResponseCode.copyUid(uidValidity, idSet, resultUids), responder);
             }
         } catch (MessageRangeException e) {
             LOGGER.debug("{} failed from mailbox {} to {} for invalid sequence-set {}",
                     getOperationName(), currentMailbox.getMailboxId(), targetMailbox, idSet, e);
-            taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET);
+            taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             LOGGER.error("{} failed from mailbox {} to {} for sequence-set {}",
                     getOperationName(), currentMailbox.getMailboxId(), targetMailbox, idSet, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
index af7d916..7f23302 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
@@ -30,6 +30,7 @@ import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
+import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -83,7 +84,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
         try {
             final MailboxPath fullMailboxPath = PathConverter.forSession(session).buildFullPath(mailboxName);
 
-            respond(tag, command, session, fullMailboxPath, request, responder);
+            respond(session, fullMailboxPath, request, responder);
            
             
         } catch (MailboxNotFoundException e) {
@@ -91,11 +92,11 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
             responder.respond(statusResponseFactory.taggedNo(tag, command, HumanReadableText.FAILURE_NO_SUCH_MAILBOX));
         } catch (MailboxException e) {
             LOGGER.error("Select failed for mailbox {}", mailboxName, e);
-            no(command, tag, responder, HumanReadableText.SELECT);
+            no(request, responder, HumanReadableText.SELECT);
         } 
     }
 
-    private void respond(Tag tag, ImapCommand command, ImapSession session, MailboxPath fullMailboxPath, AbstractMailboxSelectionRequest request, Responder responder) throws MailboxException, MessageRangeException {
+    private void respond(ImapSession session, MailboxPath fullMailboxPath, AbstractMailboxSelectionRequest request, Responder responder) throws MailboxException, MessageRangeException {
         
         Long lastKnownUidValidity = request.getLastKnownUidValidity();
         Long modSeq = request.getKnownModSeq();
@@ -112,7 +113,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
         //    and the client hasn't issued "ENABLE QRESYNC" in the current
         //    connection.
         if (lastKnownUidValidity != null && !EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
-            taggedBad(command, tag, responder, HumanReadableText.QRESYNC_NOT_ENABLED);
+            taggedBad(request, responder, HumanReadableText.QRESYNC_NOT_ENABLED);
             return;
         }
 
@@ -299,13 +300,13 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
                     //
                     respondVanished(mailboxSession, mailbox, ranges, modSeq, metaData, responder);
                 }
-                taggedOk(responder, tag, command, metaData, HumanReadableText.SELECT);
+                taggedOk(responder, request, metaData, HumanReadableText.SELECT);
             } else {
                 
-                taggedOk(responder, tag, command, metaData, HumanReadableText.QRESYNC_UIDVALIDITY_MISMATCH);
+                taggedOk(responder, request, metaData, HumanReadableText.QRESYNC_UIDVALIDITY_MISMATCH);
             }
         } else {
-            taggedOk(responder, tag, command, metaData, HumanReadableText.SELECT);
+            taggedOk(responder, request, metaData, HumanReadableText.SELECT);
         }
 
         // Reset the saved sequence-set after successful SELECT / EXAMINE
@@ -332,7 +333,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
         responder.respond(untaggedOk);
     }
 
-    private void taggedOk(Responder responder, Tag tag, ImapCommand command, MetaData metaData, HumanReadableText text) {
+    private void taggedOk(Responder responder, ImapRequest request, MetaData metaData, HumanReadableText text) {
         final boolean writeable = metaData.isWriteable() && !openReadOnly;
         final ResponseCode code;
         if (writeable) {
@@ -340,7 +341,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
         } else {
             code = ResponseCode.readOnly();
         }
-        final StatusResponse taggedOk = statusResponseFactory.taggedOk(tag, command, text, code);
+        final StatusResponse taggedOk = statusResponseFactory.taggedOk(request.getTag(), request.getCommand(), text, code);
         responder.respond(taggedOk);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
index ccd6047..316ca10 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
@@ -75,7 +75,7 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
 
             final MailboxManager mailboxManager = getMailboxManager();
             final MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
-            appendToMailbox(messageIn, datetime, flags, session, tag, command, mailbox, responder, mailboxPath);
+            appendToMailbox(messageIn, datetime, flags, session, request, mailbox, responder, mailboxPath);
         } catch (MailboxNotFoundException e) {
             // consume message on exception
             consume(messageIn);
@@ -84,7 +84,7 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
             
             // Indicates that the mailbox does not exist
             // So TRY CREATE
-            tryCreate(session, tag, command, responder, e);
+            tryCreate(request, responder, e);
 
         } catch (MailboxException e) {
             // consume message on exception
@@ -93,7 +93,7 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
             LOGGER.error("Append failed for mailbox {}", mailboxPath, e);
             
             // Some other issue
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
 
         }
 
@@ -112,24 +112,20 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
     /**
      * Issues a TRY CREATE response.
      * 
-     * @param session
-     *            not null
-     * @param tag
-     *            not null
-     * @param command
+     * @param request
      *            not null
      * @param responder
      *            not null
      * @param e
      *            not null
      */
-    private void tryCreate(ImapSession session, Tag tag, ImapCommand command, Responder responder, MailboxNotFoundException e) {
+    private void tryCreate(AppendRequest request, Responder responder, MailboxNotFoundException e) {
         LOGGER.debug("Cannot open mailbox: ", e);
 
-        no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
+        no(request, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
     }
 
-    private void appendToMailbox(InputStream message, Date datetime, Flags flagsToBeSet, ImapSession session, Tag tag, ImapCommand command, MessageManager mailbox, Responder responder, MailboxPath mailboxPath) {
+    private void appendToMailbox(InputStream message, Date datetime, Flags flagsToBeSet, ImapSession session, AppendRequest request, MessageManager mailbox, Responder responder, MailboxPath mailboxPath) {
         try {
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
             final SelectedMailbox selectedMailbox = session.getSelected();
@@ -146,15 +142,15 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
             unsolicitedResponses(session, responder, false);
 
             // in case of MULTIAPPEND support we will push more then one UID here
-            okComplete(command, tag, ResponseCode.appendUid(uidValidity, new UidRange[] { new UidRange(messageId.getUid()) }), responder);
+            okComplete(request, ResponseCode.appendUid(uidValidity, new UidRange[] { new UidRange(messageId.getUid()) }), responder);
         } catch (MailboxNotFoundException e) {
             // Indicates that the mailbox does not exist
             // So TRY CREATE
-            tryCreate(session, tag, command, responder, e);
+            tryCreate(request, responder, e);
         } catch (MailboxException e) {
             LOGGER.error("Unable to append message to mailbox {}", mailboxPath, e);
             // Some other issue
-            no(command, tag, responder, HumanReadableText.SAVE_FAILED);
+            no(request, responder, HumanReadableText.SAVE_FAILED);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
index 2752674..b56fc44 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
@@ -29,6 +29,7 @@ import java.util.StringTokenizer;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
@@ -61,18 +62,18 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
         if (authType.equalsIgnoreCase(PLAIN)) {
             // See if AUTH=PLAIN is allowed. See IMAP-304
             if (session.isPlainAuthDisallowed() && session.isTLSActive() == false) {
-                no(command, tag, responder, HumanReadableText.DISABLED_LOGIN);
+                no(request, responder, HumanReadableText.DISABLED_LOGIN);
             } else {
                 if (request instanceof IRAuthenticateRequest) {
                     IRAuthenticateRequest irRequest = (IRAuthenticateRequest) request;
-                    doPlainAuth(irRequest.getInitialClientResponse(), session, tag, command, responder);
+                    doPlainAuth(irRequest.getInitialClientResponse(), session, request, responder);
                 } else {
                     responder.respond(new AuthenticateResponse());
                     session.pushLineHandler((requestSession, data) -> {
                         // cut of the CRLF
                         String initialClientResponse = new String(data, 0, data.length - 2, Charset.forName("US-ASCII"));
 
-                        doPlainAuth(initialClientResponse, requestSession, tag, command, responder);
+                        doPlainAuth(initialClientResponse, requestSession, request, responder);
 
                         // remove the handler now
                         requestSession.popLineHandler();
@@ -81,19 +82,19 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
             }
         } else {
             LOGGER.debug("Unsupported authentication mechanism '{}'", authType);
-            no(command, tag, responder, HumanReadableText.UNSUPPORTED_AUTHENTICATION_MECHANISM);
+            no(request, responder, HumanReadableText.UNSUPPORTED_AUTHENTICATION_MECHANISM);
         }
     }
 
     /**
      * Parse the initialClientResponse and do a PLAIN AUTH with it
      */
-    protected void doPlainAuth(String initialClientResponse, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
+    protected void doPlainAuth(String initialClientResponse, ImapSession session, ImapRequest request, Responder responder) {
         AuthenticationAttempt authenticationAttempt = parseDelegationAttempt(initialClientResponse);
         if (authenticationAttempt.isDelegation()) {
-            doAuthWithDelegation(authenticationAttempt, session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
+            doAuthWithDelegation(authenticationAttempt, session, request, responder, HumanReadableText.AUTHENTICATION_FAILED);
         } else {
-            doAuth(authenticationAttempt, session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
+            doAuth(authenticationAttempt, session, request, responder, HumanReadableText.AUTHENTICATION_FAILED);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java
index 5054009..3642f35 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java
@@ -84,7 +84,7 @@ public class CapabilityProcessor extends AbstractMailboxProcessor<CapabilityRequ
         final CapabilityResponse result = new CapabilityResponse(getSupportedCapabilities(session));        
         responder.respond(result);
         unsolicitedResponses(session, responder, false);
-        okComplete(command, tag, responder);
+        okComplete(request, responder);
     }
 
     /**
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java
index 12089b6..da80013 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java
@@ -41,7 +41,7 @@ public class CheckProcessor extends AbstractMailboxProcessor<CheckRequest> {
     @Override
     protected void doProcess(CheckRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         unsolicitedResponses(session, responder, false);
-        okComplete(command, tag, responder);
+        okComplete(message, responder);
     }
 
     @Override
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
index 07cb7d7..110daf5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
@@ -60,13 +60,13 @@ public class CloseProcessor extends AbstractMailboxProcessor<CloseRequest> {
                 // Don't send HIGHESTMODSEQ when close. Like correct in the ERRATA of RFC5162
                 //
                 // See http://www.rfc-editor.org/errata_search.php?rfc=5162
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
                
             }
 
         } catch (MailboxException e) {
             LOGGER.error("Close failed for mailbox {}", session.getSelected().getMailboxId(), e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java
index 6d77247..c243440 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java
@@ -55,16 +55,16 @@ public class CreateProcessor extends AbstractMailboxProcessor<CreateRequest> {
             final MailboxManager mailboxManager = getMailboxManager();
             mailboxManager.createMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
             unsolicitedResponses(session, responder, false);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MailboxExistsException e) {
             LOGGER.debug("Create failed for mailbox {} as it already exists", mailboxPath, e);
-            no(command, tag, responder, HumanReadableText.MAILBOX_EXISTS);
+            no(request, responder, HumanReadableText.MAILBOX_EXISTS);
         } catch (TooLongMailboxNameException e) {
             LOGGER.debug("The mailbox name length is over limit: {}", mailboxPath.getName(), e);
-            taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME);
+            taggedBad(request, responder, HumanReadableText.FAILURE_MAILBOX_NAME);
         } catch (MailboxException e) {
             LOGGER.error("Create failed for mailbox {}", mailboxPath, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java
index 04ff93e..8a631c2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java
@@ -83,7 +83,7 @@ public class DeleteACLProcessor extends AbstractMailboxProcessor<DeleteACLReques
              * existence information, much less the mailbox’s ACL.
              */
             if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Lookup, mailboxSession)) {
-                no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+                no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
             } else if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Administer, mailboxSession)) {
                 /* RFC 4314 section 4. */
                 Object[] params = new Object[] {
@@ -92,7 +92,7 @@ public class DeleteACLProcessor extends AbstractMailboxProcessor<DeleteACLReques
                         mailboxName
                 };
                 HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-                no(command, tag, responder, text);
+                no(message, responder, text);
             } else {
                 
                 EntryKey key = EntryKey.deserialize(identifier);
@@ -113,7 +113,7 @@ public class DeleteACLProcessor extends AbstractMailboxProcessor<DeleteACLReques
                     mailboxSession
                 );
 
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
                 // FIXME should we send unsolicited responses here?
                 // unsolicitedResponses(session, responder, false);
             }
@@ -126,12 +126,12 @@ public class DeleteACLProcessor extends AbstractMailboxProcessor<DeleteACLReques
              * */
             Object[] params = new Object[] {e.getUnsupportedRight()};
             HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUPPORTED_RIGHT_KEY, HumanReadableText.UNSUPPORTED_RIGHT_DEFAULT_VALUE, params);
-            taggedBad(command, tag, responder, text);
+            taggedBad(message, responder, text);
         } catch (MailboxNotFoundException e) {
-            no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+            no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
         } catch (MailboxException e) {
             LOGGER.error("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java
index a80c1ff..d15eb6a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java
@@ -61,16 +61,16 @@ public class DeleteProcessor extends AbstractMailboxProcessor<DeleteRequest> {
             final MailboxManager mailboxManager = getMailboxManager();
             mailboxManager.deleteMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
             unsolicitedResponses(session, responder, false);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MailboxNotFoundException e) {
             LOGGER.debug("Delete failed for mailbox {} as it doesn't exist", mailboxPath, e);
-            no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
+            no(request, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
         } catch (TooLongMailboxNameException e) {
             LOGGER.debug("The mailbox name length is over limit: {}", mailboxPath.getName(), e);
-            taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME);
+            taggedBad(request, responder, HumanReadableText.FAILURE_MAILBOX_NAME);
         } catch (MailboxException e) {
             LOGGER.error("Delete failed for mailbox {}", mailboxPath, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java
index 98c283c..f653a05 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java
@@ -77,10 +77,10 @@ public class EnableProcessor extends AbstractMailboxProcessor<EnableRequest> imp
             responder.respond(new EnableResponse(enabledCaps));
 
             unsolicitedResponses(session, responder, false);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (EnableException e) {
             LOGGER.info("Unable to enable extension", e);
-            taggedBad(command, tag, responder, HumanReadableText.FAILED);
+            taggedBad(request, responder, HumanReadableText.FAILED);
         }
     }
    
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
index 1f1e6b7..7d50868 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
@@ -71,7 +71,7 @@ public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> i
             MetaData mdata = mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
 
             if (!mdata.isWriteable()) {
-                no(command, tag, responder, HumanReadableText.MAILBOX_IS_READ_ONLY);
+                no(request, responder, HumanReadableText.MAILBOX_IS_READ_ONLY);
             } else {
                 IdRange[] ranges = request.getUidSet();
                 if (ranges == null) {
@@ -95,17 +95,17 @@ public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> i
                 //
                 // See RFC5162 3.3 EXPUNGE Command 3.5. UID EXPUNGE Command
                 if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)  && expunged > 0) {
-                    okComplete(command, tag, ResponseCode.highestModSeq(mdata.getHighestModSeq()), responder);
+                    okComplete(request, ResponseCode.highestModSeq(mdata.getHighestModSeq()), responder);
                 } else {
-                    okComplete(command, tag, responder);
+                    okComplete(request, responder);
                 }
             }
         } catch (MessageRangeException e) {
             LOGGER.debug("Expunge failed", e);
-            taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET);
+            taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             LOGGER.error("Expunge failed for mailbox {}", session.getSelected().getMailboxId(), e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
index abdfeb7..ce61b5c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
@@ -84,29 +84,29 @@ public class GetACLProcessor extends AbstractMailboxProcessor<GetACLRequest> imp
              * existence information, much less the mailbox’s ACL.
              */
             if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Lookup, mailboxSession)) {
-                no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+                no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
             } else if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Administer, mailboxSession)) {
                 /* RFC 4314 section 4. */
                 Object[] params = new Object[] {
                         MailboxACL.Right.Administer.toString(),
-                        command.getName(),
+                        message.getCommand().getName(),
                         mailboxName
                 };
                 HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-                no(command, tag, responder, text);
+                no(message, responder, text);
             } else {
                 MetaData metaData = messageManager.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
                 ACLResponse aclResponse = new ACLResponse(mailboxName, metaData.getACL());
                 responder.respond(aclResponse);
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
                 // FIXME should we send unsolicited responses here?
                 // unsolicitedResponses(session, responder, false);
             }
         } catch (MailboxNotFoundException e) {
-            no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+            no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
         } catch (MailboxException e) {
-            LOGGER.error("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            LOGGER.error("{} failed for mailbox {}", message.getCommand().getName(), mailboxName, e);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java
index dcd843d..0cce69e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java
@@ -32,6 +32,7 @@ import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -72,17 +73,17 @@ public class GetAnnotationProcessor extends AbstractMailboxProcessor<GetAnnotati
     protected void doProcess(GetAnnotationRequest message, ImapSession session, Tag tag, ImapCommand command,
                              Responder responder) {
         try {
-            proceed(message, session, tag, command, responder);
+            proceed(message, session, responder);
         } catch (MailboxNotFoundException e) {
             LOGGER.info("The command: {} is failed because not found mailbox {}", command.getName(), message.getMailboxName());
-            no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, ResponseCode.tryCreate());
+            no(message, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, ResponseCode.tryCreate());
         } catch (MailboxException e) {
             LOGGER.error("GetAnnotation on mailbox {} failed for user {}", message.getMailboxName(), ImapSessionUtils.getUserName(session), e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
-    private void proceed(GetAnnotationRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) throws MailboxException {
+    private void proceed(GetAnnotationRequest message, ImapSession session, Responder responder) throws MailboxException {
         String mailboxName = message.getMailboxName();
         Optional<Integer> maxsize = message.getMaxsize();
         MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(mailboxName);
@@ -90,17 +91,17 @@ public class GetAnnotationProcessor extends AbstractMailboxProcessor<GetAnnotati
         List<MailboxAnnotation> mailboxAnnotations = getMailboxAnnotations(session, message.getKeys(), message.getDepth(), mailboxPath);
         Optional<Integer> maximumOversizedSize = getMaxSizeValue(mailboxAnnotations, maxsize);
 
-        respond(tag, command, responder, mailboxName, mailboxAnnotations, maxsize, maximumOversizedSize);
+        respond(message, responder, mailboxName, mailboxAnnotations, maxsize, maximumOversizedSize);
     }
 
-    private void respond(Tag tag, ImapCommand command, Responder responder, String mailboxName,
+    private void respond(ImapRequest request, Responder responder, String mailboxName,
                          List<MailboxAnnotation> mailboxAnnotations, Optional<Integer> maxsize, Optional<Integer> maximumOversizedSize) {
         if (maximumOversizedSize.isPresent()) {
             responder.respond(new AnnotationResponse(mailboxName, filterItemsBySize(mailboxAnnotations, maxsize)));
-            okComplete(command, tag, ResponseCode.longestMetadataEntry(maximumOversizedSize.get()), responder);
+            okComplete(request, ResponseCode.longestMetadataEntry(maximumOversizedSize.get()), responder);
         } else {
             responder.respond(new AnnotationResponse(mailboxName, mailboxAnnotations));
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
index 7ee3113..174cdbe 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
@@ -83,7 +83,7 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
                 if (storageQuota.getLimit().isLimited()) {
                     responder.respond(new QuotaResponse(ImapConstants.STORAGE_QUOTA_RESOURCE, quotaRoot.getValue(), storageQuota));
                 }
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
             } else {
                 Object[] params = new Object[]{
                         MailboxACL.Right.Read.toString(),
@@ -91,10 +91,10 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
                         "Any mailbox of this user USER"
                 };
                 HumanReadableText humanReadableText = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-                no(command, tag, responder, humanReadableText);
+                no(message, responder, humanReadableText);
             }
         } catch (MailboxException me) {
-            taggedBad(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
+            taggedBad(message, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java
index c7a2db2..f38832d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java
@@ -91,7 +91,7 @@ public class GetQuotaRootProcessor extends AbstractMailboxProcessor<GetQuotaRoot
                 if (storageQuota.getLimit().isLimited()) {
                     responder.respond(new QuotaResponse(ImapConstants.STORAGE_QUOTA_RESOURCE, quotaRoot.getValue(), storageQuota));
                 }
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
             } else {
                 Object[] params = new Object[]{
                         MailboxACL.Right.Read.toString(),
@@ -99,10 +99,10 @@ public class GetQuotaRootProcessor extends AbstractMailboxProcessor<GetQuotaRoot
                         message.getMailboxName()
                 };
                 HumanReadableText humanReadableText = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-                no(command, tag, responder, humanReadableText);
+                no(message, responder, humanReadableText);
             }
         } catch (MailboxException me) {
-            taggedBad(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
+            taggedBad(message, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
index a26dde5..1c0843f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
@@ -115,7 +115,7 @@ public class IdleProcessor extends AbstractMailboxProcessor<IdleRequest> impleme
                     StatusResponse response = getStatusResponseFactory().taggedBad(tag, command, HumanReadableText.INVALID_COMMAND);
                     responder.respond(response);
                 } else {
-                    okComplete(command, tag, responder);
+                    okComplete(message, responder);
 
                 }
                 idleActive.set(false);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
index 6a138c7..ef7f299 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
@@ -61,10 +61,10 @@ public class LSubProcessor extends AbstractSubscriptionProcessor<LsubRequest> {
         try {
             listSubscriptions(session, responder, referenceName, mailboxPattern);
 
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MailboxException e) {
             LOGGER.error("LSub failed for reference {} and pattern {}", referenceName, mailboxPattern, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_LSUB_FAILURE);
+            no(request, responder, HumanReadableText.GENERIC_LSUB_FAILURE);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
index eb6ad4d..7f05af7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
@@ -81,10 +81,10 @@ public class ListProcessor extends AbstractMailboxProcessor<ListRequest> {
             } else {
                 respondMailboxList(baseReferenceName, mailboxPatternString, session, responder, mailboxSession);
             }
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MailboxException e) {
             LOGGER.error("List failed for mailboxName {}", mailboxPatternString, e);
-            no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
+            no(request, responder, HumanReadableText.SEARCH_FAILED);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java
index f889fc9..8a6a5cf 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java
@@ -85,7 +85,7 @@ public class ListRightsProcessor extends AbstractMailboxProcessor<ListRightsRequ
              * existence information, much less the mailbox’s ACL.
              */
             if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Lookup, mailboxSession)) {
-                no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+                no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
             } else if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Administer, mailboxSession)) {
                 /* RFC 4314 section 4. */
                 Object[] params = new Object[] {
@@ -94,7 +94,7 @@ public class ListRightsProcessor extends AbstractMailboxProcessor<ListRightsRequ
                         mailboxName
                 };
                 HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-                no(command, tag, responder, text);
+                no(message, responder, text);
             } else {
                 
                 EntryKey key = EntryKey.deserialize(identifier);
@@ -112,15 +112,15 @@ public class ListRightsProcessor extends AbstractMailboxProcessor<ListRightsRequ
                 Rfc4314Rights[] rights = mailboxManager.listRights(mailboxPath, key, mailboxSession);
                 ListRightsResponse aclResponse = new ListRightsResponse(mailboxName, identifier, rights);
                 responder.respond(aclResponse);
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
                 // FIXME should we send unsolicited responses here?
                 // unsolicitedResponses(session, responder, false);
             }
         } catch (MailboxNotFoundException e) {
-            no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+            no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
         } catch (MailboxException e) {
             LOGGER.error("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
index e7f960b..959fc15 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
@@ -52,10 +52,10 @@ public class LoginProcessor extends AbstractAuthProcessor<LoginRequest> implemen
     protected void doProcess(LoginRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
             // check if the login is allowed with LOGIN command. See IMAP-304
             if (session.isPlainAuthDisallowed() && session.isTLSActive() == false) {
-                no(command, tag, responder, HumanReadableText.DISABLED_LOGIN);
+                no(request, responder, HumanReadableText.DISABLED_LOGIN);
             } else {
                 doAuth(noDelegation(request.getUserid(), request.getPassword()),
-                    session, tag, command, responder, HumanReadableText.INVALID_LOGIN);
+                    session, request, responder, HumanReadableText.INVALID_LOGIN);
             }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java
index 8fcc486..b0bd7ce 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java
@@ -52,10 +52,10 @@ public class LogoutProcessor extends AbstractMailboxProcessor<LogoutRequest> {
             getMailboxManager().logout(mailboxSession, false);
             session.logout();
             bye(responder);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MailboxException e) {
             LOGGER.error("Logout failed for user {}", mailboxSession.getUser().asString(), e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
index 3eedf3b..01ecf51 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
@@ -91,19 +91,19 @@ public class MyRightsProcessor extends AbstractMailboxProcessor<MyRightsRequest>
                     && !myRights.contains(MailboxACL.Right.CreateMailbox)
                     && !myRights.contains(MailboxACL.Right.DeleteMailbox)
                     && !myRights.contains(MailboxACL.Right.Administer)) {
-                no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+                no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
             } else {
                 MyRightsResponse myRightsResponse = new MyRightsResponse(mailboxName, myRights);
                 responder.respond(myRightsResponse);
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
                 // FIXME should we send unsolicited responses here?
                 // unsolicitedResponses(session, responder, false);
             }
         } catch (MailboxNotFoundException e) {
-            no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+            no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
         } catch (MailboxException e) {
             LOGGER.error("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
index 30cac09..6c6457a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
@@ -61,7 +61,7 @@ public class NamespaceProcessor extends AbstractMailboxProcessor<NamespaceReques
         final NamespaceResponse response = new NamespaceResponse(personalNamespaces, otherUsersNamespaces, sharedNamespaces);
         responder.respond(response);
         unsolicitedResponses(session, responder, false);
-        okComplete(command, tag, responder);
+        okComplete(request, responder);
     }
 
     /**
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java
index ff8b404..b5e4ad4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java
@@ -42,7 +42,7 @@ public class NoopProcessor extends AbstractMailboxProcessor<NoopRequest> {
     protected void doProcess(NoopRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         // So, unsolicated responses are returned to check for new mail
         unsolicitedResponses(session, responder, false);
-        okComplete(command, tag, responder);
+        okComplete(message, responder);
     }
 
     @Override
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
index 62c932c..7b41df6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
@@ -64,20 +64,20 @@ public class RenameProcessor extends AbstractMailboxProcessor<RenameRequest> {
             if (existingPath.getName().equalsIgnoreCase(ImapConstants.INBOX_NAME) && !mailboxManager.mailboxExists(existingPath, mailboxsession)) {
                 mailboxManager.createMailbox(existingPath, mailboxsession);
             }
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
             unsolicitedResponses(session, responder, false);
         } catch (MailboxExistsException e) {
             LOGGER.debug("Rename from {} to {} failed because the target mailbox exists", existingPath, newPath, e);
-            no(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_EXISTS);
+            no(request, responder, HumanReadableText.FAILURE_MAILBOX_EXISTS);
         } catch (MailboxNotFoundException e) {
             LOGGER.debug("Rename from {} to {} failed because the source mailbox doesn't exist", existingPath, newPath, e);
-            no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+            no(request, responder, HumanReadableText.MAILBOX_NOT_FOUND);
         } catch (TooLongMailboxNameException e) {
             LOGGER.debug("The mailbox name length is over limit: {}", newPath.getName(), e);
-            taggedBad(command, tag, responder, HumanReadableText.FAILURE_MAILBOX_NAME);
+            taggedBad(request, responder, HumanReadableText.FAILURE_MAILBOX_NAME);
         } catch (MailboxException e) {
             LOGGER.error("Rename from {} to {} failed", existingPath, newPath, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index 77a71ad..134218e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -186,13 +186,13 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
 
             boolean omitExpunged = (!useUids);
             unsolicitedResponses(session, responder, omitExpunged, useUids);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MessageRangeException e) {
             LOGGER.debug("Search failed in mailbox {} because of an invalid sequence-set ", session.getSelected().getMailboxId(), e);
-            taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET);
+            taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             LOGGER.error("Search failed in mailbox {}", session.getSelected().getMailboxId(), e);
-            no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
+            no(request, responder, HumanReadableText.SEARCH_FAILED);
             
             if (resultOptions.contains(SearchResultOption.SAVE)) {
                 // Reset the saved sequence-set on a BAD response if the SAVE option was used.
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
index ec4bdd7..b135f7f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
@@ -102,7 +102,7 @@ public class SetACLProcessor extends AbstractMailboxProcessor<SetACLRequest> imp
              * existence information, much less the mailbox’s ACL.
              */
             if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Lookup, mailboxSession)) {
-                no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+                no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
             } else if (!mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Administer, mailboxSession)) {
                 /* RFC 4314 section 4. */
                 Object[] params = new Object[] {
@@ -111,7 +111,7 @@ public class SetACLProcessor extends AbstractMailboxProcessor<SetACLRequest> imp
                         mailboxName
                 };
                 HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-                no(command, tag, responder, text);
+                no(message, responder, text);
             } else {
                 
                 EntryKey key = EntryKey.deserialize(identifier);
@@ -130,7 +130,7 @@ public class SetACLProcessor extends AbstractMailboxProcessor<SetACLRequest> imp
                     MailboxACL.command().key(key).mode(editMode).rights(mailboxAclRights).build(),
                     mailboxSession);
 
-                okComplete(command, tag, responder);
+                okComplete(message, responder);
                 // FIXME should we send unsolicited responses here?
                 // unsolicitedResponses(session, responder, false);
             }
@@ -143,12 +143,12 @@ public class SetACLProcessor extends AbstractMailboxProcessor<SetACLRequest> imp
              * */
             Object[] params = new Object[] {e.getUnsupportedRight()};
             HumanReadableText text = new HumanReadableText(HumanReadableText.UNSUPPORTED_RIGHT_KEY, HumanReadableText.UNSUPPORTED_RIGHT_DEFAULT_VALUE, params);
-            taggedBad(command, tag, responder, text);
+            taggedBad(message, responder, text);
         } catch (MailboxNotFoundException e) {
-            no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+            no(message, responder, HumanReadableText.MAILBOX_NOT_FOUND);
         } catch (MailboxException e) {
             LOGGER.error("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java
index 1665e98..6c64145 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java
@@ -70,16 +70,16 @@ public class SetAnnotationProcessor extends AbstractMailboxProcessor<SetAnnotati
 
             mailboxManager.updateAnnotations(mailboxPath, mailboxSession, message.getMailboxAnnotations());
 
-            okComplete(command, tag, responder);
+            okComplete(message, responder);
         } catch (MailboxNotFoundException e) {
             LOGGER.info("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
+            no(message, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
         } catch (AnnotationException e) {
             LOGGER.info("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, new HumanReadableText(HumanReadableText.MAILBOX_ANNOTATION_KEY, e.getMessage()));
+            no(message, responder, new HumanReadableText(HumanReadableText.MAILBOX_ANNOTATION_KEY, e.getMessage()));
         } catch (MailboxException e) {
             LOGGER.error("{} failed for mailbox {}", command.getName(), mailboxName, e);
-            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+            no(message, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java
index a871919..f8beffb 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java
@@ -59,7 +59,7 @@ public class SetQuotaProcessor extends AbstractMailboxProcessor<SetQuotaRequest>
             "Can not perform SETQUOTA commands"
         };
         HumanReadableText humanReadableText = new HumanReadableText(HumanReadableText.UNSUFFICIENT_RIGHTS_KEY, HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE, params);
-        no(command, tag, responder, humanReadableText);
+        no(message, responder, humanReadableText);
     }
 
     @Override
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 0486f36..6191d2c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -69,10 +69,11 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
             }
             responder.respond(response);
             unsolicitedResponses(session, responder, false);
-            okComplete(command, tag, responder);
+
+            okComplete(request, responder);
         } catch (MailboxException e) {
             LOGGER.error("Status failed for mailbox {}", mailboxPath, e);
-            no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
+            no(request, responder, HumanReadableText.SEARCH_FAILED);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
index 1e09e48..86c9af3 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
@@ -92,7 +92,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
                 if (metaData.isModSeqPermanent() == false) {
                     // Check if the mailbox did not support modsequences. If so return a tagged bad response.
                     // See RFC4551 3.1.2. NOMODSEQ Response Code 
-                    taggedBad(command, tag, responder, HumanReadableText.NO_MOD_SEQ);
+                    taggedBad(request, responder, HumanReadableText.NO_MOD_SEQ);
                     return;
                 } else if (unchangedSince == 0) {
                     Flags.Flag[] systemFlags = flags.getSystemFlags();
@@ -179,7 +179,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
             
             // check if we had some failed uids which didn't pass the UNCHANGEDSINCE filter
             if (failed.isEmpty() && failedMsns.isEmpty()) {
-                okComplete(imapCommand, tag, responder);
+                okComplete(request, responder);
             } else {
                 if (useUids) {
                     List<MessageRange> ranges = MessageRange.toRanges(failed);
@@ -211,10 +211,10 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
             }
         } catch (MessageRangeException e) {
             LOGGER.debug("Store failed for mailbox {} because of an invalid sequence-set {}", session.getSelected().getMailboxId(), idSet, e);
-            taggedBad(imapCommand, tag, responder, HumanReadableText.INVALID_MESSAGESET);
+            taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             LOGGER.error("Store failed for mailbox {} and sequence-set {}", session.getSelected().getMailboxId(), idSet, e);
-            no(imapCommand, tag, responder, HumanReadableText.SAVE_FAILED);
+            no(request, responder, HumanReadableText.SAVE_FAILED);
         }
     }
     
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java
index 7c53735..b4a2797 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java
@@ -54,12 +54,12 @@ public class SubscribeProcessor extends AbstractSubscriptionProcessor<SubscribeR
             getSubscriptionManager().subscribe(mailboxSession, mailboxName);
 
             unsolicitedResponses(session, responder, false);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
 
         } catch (SubscriptionException e) {
             LOGGER.info("Subscribe failed for mailbox {}", mailboxName, e);
             unsolicitedResponses(session, responder, false);
-            no(command, tag, responder, HumanReadableText.GENERIC_SUBSCRIPTION_FAILURE);
+            no(request, responder, HumanReadableText.GENERIC_SUBSCRIPTION_FAILURE);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java
index 19dd80e..0edf0e7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java
@@ -52,9 +52,9 @@ public class UnselectProcessor extends AbstractMailboxProcessor<UnselectRequest>
     protected void doProcess(UnselectRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         if (session.getSelected() != null) {
             session.deselect();
-            okComplete(command, tag, responder);
+            okComplete(message, responder);
         } else {
-            taggedBad(command, tag, responder, HumanReadableText.UNSELECT);
+            taggedBad(message, responder, HumanReadableText.UNSELECT);
         }
 
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java
index 853ff7f..17fdcb4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java
@@ -54,13 +54,13 @@ public class UnsubscribeProcessor extends AbstractSubscriptionProcessor<Unsubscr
             getSubscriptionManager().unsubscribe(mailboxSession, mailboxName);
 
             unsolicitedResponses(session, responder, false);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
 
         } catch (SubscriptionException e) {
             LOGGER.info("Unsubscribe failed for mailbox {}", mailboxName, e);
             unsolicitedResponses(session, responder, false);
 
-            no(command, tag, responder, HumanReadableText.GENERIC_SUBSCRIPTION_FAILURE);
+            no(request, responder, HumanReadableText.GENERIC_SUBSCRIPTION_FAILURE);
         }
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index fa26006..7aeb44d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -81,12 +81,12 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
 
             final boolean vanished = fetch.getVanished();
             if (vanished && !EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
-                taggedBad(command, tag, responder, HumanReadableText.QRESYNC_NOT_ENABLED);
+                taggedBad(request, responder, HumanReadableText.QRESYNC_NOT_ENABLED);
                 return;
             }
            
             if (vanished && changedSince == -1) {
-                taggedBad(command, tag, responder, HumanReadableText.QRESYNC_VANISHED_WITHOUT_CHANGEDSINCE);
+                taggedBad(request, responder, HumanReadableText.QRESYNC_VANISHED_WITHOUT_CHANGEDSINCE);
                 return;
             }
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
@@ -124,13 +124,13 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             // processor. See IMAP-284
             final boolean omitExpunged = (!useUids);
             unsolicitedResponses(session, responder, omitExpunged, useUids);
-            okComplete(command, tag, responder);
+            okComplete(request, responder);
         } catch (MessageRangeException e) {
             LOGGER.debug("Fetch failed for mailbox {} because of invalid sequence-set {}", session.getSelected().getMailboxId(), idSet, e);
-            taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET);
+            taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             LOGGER.error("Fetch failed for mailbox {} and sequence-set {}", session.getSelected().getMailboxId(), idSet, e);
-            no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
+            no(request, responder, HumanReadableText.SEARCH_FAILED);
         }
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org