http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
index 668cfbe..2cc6bae 100644
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
@@ -28,6 +28,8 @@ import java.io.InputStream;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.events.InVMEventBus;
+import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
@@ -40,13 +42,13 @@ import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
 import org.apache.james.mailbox.store.StoreRightManager;
-import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.quota.QuotaComponents;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.Before;
 
 public class InMemoryMailboxManagerAttachmentTest extends 
AbstractMailboxManagerAttachmentTest {
@@ -62,11 +64,11 @@ public class InMemoryMailboxManagerAttachmentTest extends 
AbstractMailboxManager
         mailboxSessionMapperFactory = new 
InMemoryMailboxSessionMapperFactory();
         Authenticator noAuthenticator = null;
         Authorizator noAuthorizator = null;
-        DefaultDelegatingMailboxListener delegatingListener = new 
DefaultDelegatingMailboxListener();
+        InVMEventBus eventBus = new InVMEventBus(new InVmEventDelivery(new 
NoopMetricFactory()));
         MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
         GroupMembershipResolver groupMembershipResolver = null;
         UnionMailboxACLResolver aclResolver = new UnionMailboxACLResolver();
-        StoreRightManager storeRightManager = new 
StoreRightManager(mailboxSessionMapperFactory, aclResolver, 
groupMembershipResolver, delegatingListener);
+        StoreRightManager storeRightManager = new 
StoreRightManager(mailboxSessionMapperFactory, aclResolver, 
groupMembershipResolver, eventBus);
 
         SessionProvider sessionProvider = new SessionProvider(noAuthenticator, 
noAuthorizator);
         QuotaComponents quotaComponents = 
QuotaComponents.disabled(sessionProvider, mailboxSessionMapperFactory);
@@ -74,12 +76,12 @@ public class InMemoryMailboxManagerAttachmentTest extends 
AbstractMailboxManager
 
         StoreMailboxAnnotationManager annotationManager = new 
StoreMailboxAnnotationManager(mailboxSessionMapperFactory, storeRightManager);
         mailboxManager = new 
InMemoryMailboxManager(mailboxSessionMapperFactory, sessionProvider, new 
NoMailboxPathLocker(),
-                new MessageParser(), messageIdFactory, delegatingListener, 
annotationManager, storeRightManager, quotaComponents, index);
+                new MessageParser(), messageIdFactory, eventBus, 
annotationManager, storeRightManager, quotaComponents, index);
         MessageParser failingMessageParser = mock(MessageParser.class);
         when(failingMessageParser.retrieveAttachments(any(InputStream.class)))
             .thenThrow(new RuntimeException("Message parser set to fail"));
         parseFailingMailboxManager = new 
InMemoryMailboxManager(mailboxSessionMapperFactory, sessionProvider, new 
NoMailboxPathLocker(),
-            failingMessageParser, messageIdFactory, delegatingListener, 
annotationManager, storeRightManager, quotaComponents, index);
+            failingMessageParser, messageIdFactory, eventBus, 
annotationManager, storeRightManager, quotaComponents, index);
         super.setUp();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index d2d57b1..2e1a3de 100644
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -23,6 +23,8 @@ import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.events.InVMEventBus;
+import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -45,7 +47,6 @@ import 
org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
 import org.apache.james.mailbox.store.StoreRightManager;
-import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -56,6 +57,7 @@ import org.apache.james.mailbox.store.quota.QuotaComponents;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
+import org.apache.james.metrics.api.NoopMetricFactory;
 
 public class InMemoryIntegrationResources implements 
IntegrationResources<StoreMailboxManager> {
 
@@ -104,17 +106,17 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
     private SimpleGroupMembershipResolver groupMembershipResolver;
 
     @Override
-    public InMemoryMailboxManager createMailboxManager(GroupMembershipResolver 
groupMembershipResolver) throws MailboxException {
+    public InMemoryMailboxManager createMailboxManager(GroupMembershipResolver 
groupMembershipResolver) {
         return createResources(groupMembershipResolver).mailboxManager;
     }
 
-    public Resources createResources(GroupMembershipResolver 
groupMembershipResolver) throws MailboxException {
+    public Resources createResources(GroupMembershipResolver 
groupMembershipResolver) {
         return createResources(groupMembershipResolver,
             MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX,
             MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
     }
 
-    public Resources createResources(GroupMembershipResolver 
groupMembershipResolver, int limitAnnotationCount, int limitAnnotationSize) 
throws MailboxException {
+    public Resources createResources(GroupMembershipResolver 
groupMembershipResolver, int limitAnnotationCount, int limitAnnotationSize) {
         FakeAuthenticator fakeAuthenticator = new FakeAuthenticator();
         fakeAuthenticator.addUser(ManagerTestResources.USER, 
ManagerTestResources.USER_PASS);
         fakeAuthenticator.addUser(ManagerTestResources.OTHER_USER, 
ManagerTestResources.OTHER_USER_PASS);
@@ -122,22 +124,22 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
         return createResources(groupMembershipResolver, fakeAuthenticator, 
FakeAuthorizator.defaultReject(), limitAnnotationCount, limitAnnotationSize);
     }
 
-    public StoreMailboxManager createMailboxManager(GroupMembershipResolver 
groupMembershipResolver, Authenticator authenticator, Authorizator 
authorizator) throws MailboxException {
+    public StoreMailboxManager createMailboxManager(GroupMembershipResolver 
groupMembershipResolver, Authenticator authenticator, Authorizator 
authorizator) {
         return createResources(groupMembershipResolver, authenticator, 
authorizator).mailboxManager;
     }
 
-    public Resources createResources(GroupMembershipResolver 
groupMembershipResolver, Authenticator authenticator, Authorizator 
authorizator) throws MailboxException {
+    public Resources createResources(GroupMembershipResolver 
groupMembershipResolver, Authenticator authenticator, Authorizator 
authorizator) {
         return createResources(groupMembershipResolver, authenticator, 
authorizator, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, 
MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
     }
 
     private Resources createResources(GroupMembershipResolver 
groupMembershipResolver,
                                       Authenticator authenticator, 
Authorizator authorizator,
-                                      int limitAnnotationCount, int 
limitAnnotationSize) throws MailboxException {
+                                      int limitAnnotationCount, int 
limitAnnotationSize) {
 
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new 
InMemoryMailboxSessionMapperFactory();
-        DefaultDelegatingMailboxListener delegatingListener = new 
DefaultDelegatingMailboxListener();
+        InVMEventBus eventBus = new InVMEventBus(new InVmEventDelivery(new 
NoopMetricFactory()));
         StoreRightManager storeRightManager = new 
StoreRightManager(mailboxSessionMapperFactory, new UnionMailboxACLResolver(),
-            groupMembershipResolver, delegatingListener);
+            groupMembershipResolver, eventBus);
         StoreMailboxAnnotationManager annotationManager = new 
StoreMailboxAnnotationManager(mailboxSessionMapperFactory, storeRightManager, 
limitAnnotationCount, limitAnnotationSize);
 
         SessionProvider sessionProvider = new SessionProvider(authenticator, 
authorizator);
@@ -146,7 +148,7 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
         DefaultUserQuotaRootResolver quotaRootResolver =  new 
DefaultUserQuotaRootResolver(sessionProvider, mailboxSessionMapperFactory);
         InMemoryCurrentQuotaManager currentQuotaManager = new 
InMemoryCurrentQuotaManager(new 
CurrentQuotaCalculator(mailboxSessionMapperFactory, quotaRootResolver), 
sessionProvider);
         StoreQuotaManager quotaManager = new 
StoreQuotaManager(currentQuotaManager, maxQuotaManager);
-        ListeningCurrentQuotaUpdater listeningCurrentQuotaUpdater = new 
ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, 
delegatingListener, quotaManager);
+        ListeningCurrentQuotaUpdater listeningCurrentQuotaUpdater = new 
ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, 
quotaManager);
         QuotaComponents quotaComponents = new QuotaComponents(maxQuotaManager, 
quotaManager, quotaRootResolver, listeningCurrentQuotaUpdater);
 
         MessageSearchIndex index = new 
SimpleMessageSearchIndex(mailboxSessionMapperFactory, 
mailboxSessionMapperFactory, new DefaultTextExtractor());
@@ -157,20 +159,16 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
             new JVMMailboxPathLocker(),
             new MessageParser(),
             new InMemoryMessageId.Factory(),
-            delegatingListener,
+            eventBus,
             annotationManager,
             storeRightManager,
             quotaComponents,
             index);
 
-        delegatingListener.addGlobalListener((ListeningCurrentQuotaUpdater) 
quotaComponents.getQuotaUpdater(), 
sessionProvider.createSystemSession("admin"));
-        delegatingListener.addGlobalListener(new 
MailboxAnnotationListener(mailboxSessionMapperFactory, sessionProvider), 
sessionProvider.createSystemSession("admin"));
+        eventBus.register(listeningCurrentQuotaUpdater);
+        eventBus.register(new 
MailboxAnnotationListener(mailboxSessionMapperFactory, sessionProvider));
 
-        try {
-            return new Resources(manager, storeRightManager, new 
InMemoryMessageId.Factory(), currentQuotaManager, quotaRootResolver, 
maxQuotaManager);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+        return new Resources(manager, storeRightManager, new 
InMemoryMessageId.Factory(), currentQuotaManager, quotaRootResolver, 
maxQuotaManager);
     }
 
     @Override
@@ -183,7 +181,7 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
         return new StoreMessageIdManager(
             mailboxManager,
             mailboxManager.getMapperFactory(),
-            mailboxManager.getDelegationListener(),
+            mailboxManager.getEventBus(),
             factory,
             quotaComponents.getQuotaManager(),
             quotaComponents.getQuotaRootResolver());

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
index 8f32bf8..e270749 100644
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.inmemory.manager;
 
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
@@ -35,7 +36,6 @@ import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
 import org.apache.james.mailbox.store.StoreRightManager;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
@@ -55,7 +55,7 @@ public class InMemoryMessageIdManagerSideEffectTest extends 
AbstractMessageIdMan
     }
 
     @Override
-    protected MessageIdManagerTestSystem createTestSystem(QuotaManager 
quotaManager, DelegatingMailboxListener delegatingMailboxListener) {
+    protected MessageIdManagerTestSystem createTestSystem(QuotaManager 
quotaManager, EventBus eventBus) {
         InMemoryMailboxSessionMapperFactory mapperFactory = new 
InMemoryMailboxSessionMapperFactory();
 
         FakeAuthenticator fakeAuthenticator = new FakeAuthenticator();
@@ -63,7 +63,7 @@ public class InMemoryMessageIdManagerSideEffectTest extends 
AbstractMessageIdMan
         fakeAuthenticator.addUser(ManagerTestResources.OTHER_USER, 
ManagerTestResources.OTHER_USER_PASS);
         FakeAuthorizator fakeAuthorizator = FakeAuthorizator.defaultReject();
 
-        StoreRightManager rightManager = new StoreRightManager(mapperFactory, 
new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), 
delegatingMailboxListener);
+        StoreRightManager rightManager = new StoreRightManager(mapperFactory, 
new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), eventBus);
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
         InMemoryMessageId.Factory messageIdFactory = new 
InMemoryMessageId.Factory();
         SessionProvider sessionProvider = new 
SessionProvider(fakeAuthenticator, fakeAuthorizator);
@@ -76,7 +76,7 @@ public class InMemoryMessageIdManagerSideEffectTest extends 
AbstractMessageIdMan
             locker,
             new MessageParser(),
             messageIdFactory,
-            delegatingMailboxListener,
+            eventBus,
             new StoreMailboxAnnotationManager(mapperFactory, rightManager),
             rightManager,
             quotaComponents,
@@ -84,7 +84,7 @@ public class InMemoryMessageIdManagerSideEffectTest extends 
AbstractMessageIdMan
         StoreMessageIdManager messageIdManager = new StoreMessageIdManager(
             mailboxManager,
             mapperFactory,
-            delegatingMailboxListener,
+            eventBus,
             messageIdFactory,
             quotaManager,
             quotaComponents.getQuotaRootResolver());

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/plugin/quota-mailing/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-mailing/pom.xml 
b/mailbox/plugin/quota-mailing/pom.xml
index b9f5fbd..a0071ae 100644
--- a/mailbox/plugin/quota-mailing/pom.xml
+++ b/mailbox/plugin/quota-mailing/pom.xml
@@ -44,6 +44,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-event-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>apache-james-mailbox-store</artifactId>
             <scope>test</scope>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
----------------------------------------------------------------------
diff --git 
a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
 
b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
index fc5f31c..c399025 100644
--- 
a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
+++ 
b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java
@@ -22,33 +22,37 @@ package org.apache.james.mailbox.quota.mailing.listeners;
 import org.apache.james.eventsourcing.eventstore.EventStore;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailbox.Event;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MailboxSessionUtil;
+import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.InVMEventBus;
+import org.apache.james.mailbox.events.RegistrationKey;
+import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
 import org.apache.james.mailbox.exception.MailboxException;
 import 
org.apache.james.mailbox.quota.mailing.QuotaMailingListenerConfiguration;
-import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.server.core.JamesServerResourceLoader;
 import org.apache.james.server.core.filesystem.FileSystemImpl;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.apache.mailet.MailetContext;
 
-public class QuotaThresholdListenersTestSystem {
+import com.google.common.collect.ImmutableSet;
 
-    private final DefaultDelegatingMailboxListener delegatingListener;
+class QuotaThresholdListenersTestSystem {
+    private static final ImmutableSet<RegistrationKey> NO_KEYS = 
ImmutableSet.of();
 
-    public QuotaThresholdListenersTestSystem(MailetContext mailetContext, 
EventStore eventStore, QuotaMailingListenerConfiguration configuration) throws 
MailboxException {
-        delegatingListener = new DefaultDelegatingMailboxListener();
+    private final EventBus eventBus;
+
+    QuotaThresholdListenersTestSystem(MailetContext mailetContext, EventStore 
eventStore, QuotaMailingListenerConfiguration configuration) throws 
MailboxException {
+        eventBus = new InVMEventBus(new InVmEventDelivery(new 
NoopMetricFactory()));
 
         FileSystem fileSystem = new FileSystemImpl(new 
JamesServerResourceLoader("."));
 
         QuotaThresholdCrossingListener thresholdCrossingListener =
             new QuotaThresholdCrossingListener(mailetContext, 
MemoryUsersRepository.withVirtualHosting(), fileSystem, eventStore, 
configuration);
 
-        MailboxSession mailboxSession = MailboxSessionUtil.create("system");
-        delegatingListener.addGlobalListener(thresholdCrossingListener, 
mailboxSession);
+        eventBus.register(thresholdCrossingListener);
     }
 
-    public void event(Event event) {
-        delegatingListener.event(event);
+    void event(Event event) {
+        eventBus.dispatch(event, NO_KEYS);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
 
b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index 92e6995..38cd886 100644
--- 
a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ 
b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -32,7 +32,7 @@ public class SimpleMessageSearchIndexTest extends 
AbstractMessageSearchIndexTest
     }
 
     @Override
-    protected void initializeMailboxManager() throws Exception {
+    protected void initializeMailboxManager() {
         storeMailboxManager = new InMemoryIntegrationResources()
             .createMailboxManager(new SimpleGroupMembershipResolver());
 
@@ -44,7 +44,7 @@ public class SimpleMessageSearchIndexTest extends 
AbstractMessageSearchIndexTest
         messageIdManager = new StoreMessageIdManager(
             storeMailboxManager,
             storeMailboxManager.getMapperFactory(),
-            storeMailboxManager.getDelegationListener(),
+            storeMailboxManager.getEventBus(),
             storeMailboxManager.getMessageIdFactory(),
             storeMailboxManager.getQuotaComponents().getQuotaManager(),
             storeMailboxManager.getQuotaComponents().getQuotaRootResolver());

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/spring/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/pom.xml b/mailbox/spring/pom.xml
index f4247f1..048fa96 100644
--- a/mailbox/spring/pom.xml
+++ b/mailbox/spring/pom.xml
@@ -44,6 +44,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-event-memory</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>apache-james-mailbox-jpa</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/MailboxInitializer.java
----------------------------------------------------------------------
diff --git 
a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/MailboxInitializer.java
 
b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/MailboxInitializer.java
index 9527a4a..49029e6 100644
--- 
a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/MailboxInitializer.java
+++ 
b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/MailboxInitializer.java
@@ -22,11 +22,9 @@ package org.apache.james.mailbox.spring;
 import javax.inject.Inject;
 
 import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.SessionProvider;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.QuotaUpdater;
@@ -35,37 +33,35 @@ import 
org.apache.james.mailbox.store.search.MessageSearchIndex;
 
 public class MailboxInitializer {
     private final SessionProvider sessionProvider;
-    private final DelegatingMailboxListener delegatingMailboxListener;
+    private final EventBus eventBus;
     private final MessageSearchIndex messageSearchIndex;
     private final QuotaUpdater quotaUpdater;
     private final MailboxManager mailboxManager;
     private final MailboxSessionMapperFactory mapperFactory;
 
     @Inject
-    public MailboxInitializer(SessionProvider sessionProvider, 
DelegatingMailboxListener delegatingMailboxListener, MessageSearchIndex 
messageSearchIndex, QuotaUpdater quotaUpdater, MailboxManager mailboxManager, 
MailboxSessionMapperFactory mapperFactory) {
+    public MailboxInitializer(SessionProvider sessionProvider, EventBus 
eventBus, MessageSearchIndex messageSearchIndex, QuotaUpdater quotaUpdater, 
MailboxManager mailboxManager, MailboxSessionMapperFactory mapperFactory) {
         this.sessionProvider = sessionProvider;
-        this.delegatingMailboxListener = delegatingMailboxListener;
+        this.eventBus = eventBus;
         this.messageSearchIndex = messageSearchIndex;
         this.quotaUpdater = quotaUpdater;
         this.mailboxManager = mailboxManager;
         this.mapperFactory = mapperFactory;
     }
 
-    public void init() throws MailboxException {
-        MailboxSession session = sessionProvider.createSystemSession("admin");
-
+    public void init() {
         if (messageSearchIndex instanceof ListeningMessageSearchIndex) {
             ListeningMessageSearchIndex index = (ListeningMessageSearchIndex) 
messageSearchIndex;
-            delegatingMailboxListener.addGlobalListener(index, session);
+            eventBus.register(index);
         }
 
         if (quotaUpdater instanceof ListeningCurrentQuotaUpdater) {
             ListeningCurrentQuotaUpdater listeningCurrentQuotaUpdater = 
(ListeningCurrentQuotaUpdater) quotaUpdater;
-            
delegatingMailboxListener.addGlobalListener(listeningCurrentQuotaUpdater, 
session);
+            eventBus.register(listeningCurrentQuotaUpdater);
         }
 
         if 
(mailboxManager.getSupportedMailboxCapabilities().contains(MailboxManager.MailboxCapabilities.Annotation))
 {
-            delegatingMailboxListener.addGlobalListener(new 
MailboxAnnotationListener(mapperFactory, sessionProvider), session);
+            eventBus.register(new MailboxAnnotationListener(mapperFactory, 
sessionProvider));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml 
b/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
index f21a0b7..ff0447a 100644
--- a/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
+++ b/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
@@ -23,15 +23,11 @@
        xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd";>
 
-    <bean id="delegating-listener" 
class="org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener" 
lazy-init="true">
+    <bean id="event-bus" class="org.apache.james.mailbox.events.InVMEventBus" 
lazy-init="true">
         <constructor-arg index="0" ref="event-delivery"/>
-        <constructor-arg index="1" ref="event-registry"/>
     </bean>
-
     <bean id="event-delivery" 
class="org.apache.james.mailbox.events.delivery.InVmEventDelivery" 
lazy-init="true">
         <constructor-arg index="0" ref="metricFactory"/>
     </bean>
 
-    <bean id="event-registry" 
class="org.apache.james.mailbox.store.event.MailboxListenerRegistry"/>
-
 </beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/resources/META-INF/spring/quota.xml 
b/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
index 9cb5a2c..c9e1ae7 100644
--- a/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
+++ b/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
@@ -54,7 +54,7 @@
     <bean id="eventQuotaUpdater" 
class="org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater" 
lazy-init="true">
         <constructor-arg index="0" ref="currentQuotaManager"/>
         <constructor-arg index="1" ref="quotaRootResolver"/>
-        <constructor-arg index="2" ref="delegating-listener"/>
+        <constructor-arg index="2" ref="event-bus"/>
         <constructor-arg index="3" ref="storeQuotaManager"/>
     </bean>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/spring/src/main/resources/META-INF/spring/spring-mailbox.xml
----------------------------------------------------------------------
diff --git 
a/mailbox/spring/src/main/resources/META-INF/spring/spring-mailbox.xml 
b/mailbox/spring/src/main/resources/META-INF/spring/spring-mailbox.xml
index bedb91a..e9c5cf7 100644
--- a/mailbox/spring/src/main/resources/META-INF/spring/spring-mailbox.xml
+++ b/mailbox/spring/src/main/resources/META-INF/spring/spring-mailbox.xml
@@ -63,7 +63,7 @@
         <constructor-arg index="0" ref="messageMapperFactory" />
         <constructor-arg index="1" ref="aclResolver" />
         <constructor-arg index="2" ref="groupMembershipResolver" />
-        <constructor-arg index="3" ref="delegating-listener" />
+        <constructor-arg index="3" ref="event-bus" />
     </bean>
 
     <bean id="sessionProvider" 
class="org.apache.james.mailbox.store.SessionProvider" >
@@ -73,7 +73,7 @@
 
     <bean id="mailbox-init" 
class="org.apache.james.mailbox.spring.MailboxInitializer" init-method="init">
         <constructor-arg index="0" ref="sessionProvider" />
-        <constructor-arg index="1" ref="delegating-listener" />
+        <constructor-arg index="1" ref="event-bus" />
         <constructor-arg index="2" ref="indexer" />
         <constructor-arg index="3" ref="quotaUpdater" />
         <constructor-arg index="4" ref="mailboxmanager" />

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/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 2145f1f..fdf2ffb 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
@@ -39,7 +39,8 @@ import 
org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
-import org.apache.james.mailbox.events.Group;
+import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.events.Registration;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
@@ -64,7 +65,6 @@ import 
org.apache.james.mailbox.model.search.MailboxNameExpression;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
@@ -101,7 +101,7 @@ public class StoreMailboxManager implements MailboxManager {
     private static final SecureRandom RANDOM = new SecureRandom();
 
     private final StoreRightManager storeRightManager;
-    private final DelegatingMailboxListener delegatingListener;
+    private final EventBus eventBus;
     private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
     private final MailboxAnnotationManager annotationManager;
     private final MailboxPathLocker locker;
@@ -118,9 +118,9 @@ public class StoreMailboxManager implements MailboxManager {
     public StoreMailboxManager(MailboxSessionMapperFactory 
mailboxSessionMapperFactory, SessionProvider sessionProvider,
                                MailboxPathLocker locker, MessageParser 
messageParser,
                                MessageId.Factory messageIdFactory, 
MailboxAnnotationManager annotationManager,
-                               DelegatingMailboxListener delegatingListener, 
StoreRightManager storeRightManager,
+                               EventBus eventBus, StoreRightManager 
storeRightManager,
                                QuotaComponents quotaComponents, 
MessageSearchIndex searchIndex, MailboxManagerConfiguration configuration) {
-        Preconditions.checkNotNull(delegatingListener);
+        Preconditions.checkNotNull(eventBus);
         Preconditions.checkNotNull(mailboxSessionMapperFactory);
 
         this.annotationManager = annotationManager;
@@ -129,7 +129,7 @@ public class StoreMailboxManager implements MailboxManager {
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
         this.messageParser = messageParser;
         this.messageIdFactory = messageIdFactory;
-        this.delegatingListener = delegatingListener;
+        this.eventBus = eventBus;
         this.storeRightManager = storeRightManager;
         this.quotaRootResolver = quotaComponents.getQuotaRootResolver();
         this.quotaManager = quotaComponents.getQuotaManager();
@@ -166,12 +166,12 @@ public class StoreMailboxManager implements 
MailboxManager {
     }
 
     /**
-     * Return the {@link DelegatingMailboxListener} which is used by this 
{@link MailboxManager}
+     * Return the {@link EventBus} which is used by this {@link MailboxManager}
      *
      * @return delegatingListener
      */
-    public DelegatingMailboxListener getDelegationListener() {
-        return delegatingListener;
+    public EventBus getEventBus() {
+        return eventBus;
     }
 
     /**
@@ -250,7 +250,7 @@ public class StoreMailboxManager implements MailboxManager {
      * @return storeMailbox
      */
     protected StoreMessageManager createMessageManager(Mailbox mailbox, 
MailboxSession session) throws MailboxException {
-        return new StoreMessageManager(DEFAULT_NO_MESSAGE_CAPABILITIES, 
getMapperFactory(), getMessageSearchIndex(), getDelegationListener(),
+        return new StoreMessageManager(DEFAULT_NO_MESSAGE_CAPABILITIES, 
getMapperFactory(), getMessageSearchIndex(), getEventBus(),
                 getLocker(), mailbox, quotaManager,
             getQuotaComponents().getQuotaRootResolver(), getMessageParser(), 
getMessageIdFactory(), configuration.getBatchSizes(),
             getStoreRightManager());
@@ -345,11 +345,12 @@ public class StoreMailboxManager implements 
MailboxManager {
                         try {
                             mapper.execute(Mapper.toTransaction(() -> 
mailboxIds.add(mapper.save(m))));
                             // notify listeners
-                            
delegatingListener.event(EventFactory.mailboxAdded()
+                            eventBus.dispatch(EventFactory.mailboxAdded()
                                 .randomEventId()
                                 .mailboxSession(mailboxSession)
                                 .mailbox(m)
-                                .build());
+                                .build(),
+                                new 
MailboxIdRegistrationKey(m.getMailboxId()));
                         } catch (MailboxExistsException e) {
                             LOGGER.info("{} mailbox was created concurrently", 
m.generateAssociatedPath());
                         }
@@ -393,14 +394,15 @@ public class StoreMailboxManager implements 
MailboxManager {
             // mailbox once we remove it
             SimpleMailbox m = new SimpleMailbox(mailbox);
             mailboxMapper.delete(mailbox);
-            delegatingListener.event(EventFactory.mailboxDeleted()
+            eventBus.dispatch(EventFactory.mailboxDeleted()
                 .randomEventId()
                 .mailboxSession(session)
                 .mailbox(mailbox)
                 .quotaRoot(quotaRoot)
                 .quotaCount(QuotaCount.count(messageCount))
                 .quotaSize(QuotaSize.size(totalSize))
-                .build());
+                .build(),
+                new MailboxIdRegistrationKey(mailbox.getMailboxId()));
             return m;
         });
 
@@ -439,13 +441,14 @@ public class StoreMailboxManager implements 
MailboxManager {
         mailbox.setName(to.getName());
         mapper.save(mailbox);
 
-        delegatingListener.event(EventFactory.mailboxRenamed()
+        eventBus.dispatch(EventFactory.mailboxRenamed()
             .randomEventId()
             .mailboxSession(session)
             .mailboxId(mailbox.getMailboxId())
             .oldPath(from)
             .newPath(to)
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
 
         // rename submailboxes
         MailboxPath children = new MailboxPath(from.getNamespace(), 
from.getUser(), from.getName() + getDelimiter() + "%");
@@ -457,13 +460,14 @@ public class StoreMailboxManager implements 
MailboxManager {
                 MailboxPath fromPath = new MailboxPath(children, 
subOriginalName);
                 sub.setName(subNewName);
                 mapper.save(sub);
-                delegatingListener.event(EventFactory.mailboxRenamed()
+                eventBus.dispatch(EventFactory.mailboxRenamed()
                     .randomEventId()
                     .mailboxSession(session)
                     .mailboxId(sub.getMailboxId())
                     .oldPath(fromPath)
                     .newPath(sub.generateAssociatedPath())
-                    .build());
+                    .build(),
+                    new MailboxIdRegistrationKey(sub.getMailboxId()));
 
                 LOGGER.debug("Rename mailbox sub-mailbox {} to {}", 
subOriginalName, subNewName);
             }
@@ -721,40 +725,6 @@ public class StoreMailboxManager implements MailboxManager 
{
 
     @Override
     public Registration register(MailboxListener listener, MailboxId 
registrationKey) {
-        MailboxSession session = createSystemSession("admin");
-        try {
-            delegatingListener.addListener(registrationKey, listener, session);
-        } catch (MailboxException e) {
-            throw new RuntimeException(e);
-        }
-        return () -> {
-            try {
-                delegatingListener.removeListener(registrationKey, listener, 
session);
-            } catch (MailboxException e) {
-                throw new RuntimeException(e);
-            }
-        };
-    }
-
-    @Override
-    public Registration register(MailboxListener listener, Group group) {
-        MailboxSession session = createSystemSession("admin");
-        try {
-            delegatingListener.addGlobalListener(listener, session);
-        } catch (MailboxException e) {
-            throw new RuntimeException(e);
-        }
-        return () -> {
-            try {
-                delegatingListener.removeGlobalListener(listener, session);
-            } catch (MailboxException e) {
-                throw new RuntimeException(e);
-            }
-        };
-    }
-
-    @Override
-    public Registration register(MailboxListener.GroupMailboxListener 
groupMailboxListener) {
-        return register(groupMailboxListener, groupMailboxListener.getGroup());
+        return eventBus.register(listener, new 
MailboxIdRegistrationKey(registrationKey));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 3efdb14..04478cd 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -37,6 +37,8 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.DeleteResult;
@@ -51,7 +53,6 @@ import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageIdMapper;
@@ -101,18 +102,18 @@ public class StoreMessageIdManager implements 
MessageIdManager {
 
     private final MailboxManager mailboxManager;
     private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
-    private final DelegatingMailboxListener delegatingMailboxListener;
+    private final EventBus eventBus;
     private final MessageId.Factory messageIdFactory;
     private final QuotaManager quotaManager;
     private final QuotaRootResolver quotaRootResolver;
 
     @Inject
     public StoreMessageIdManager(MailboxManager mailboxManager, 
MailboxSessionMapperFactory mailboxSessionMapperFactory,
-                                 DelegatingMailboxListener 
delegatingMailboxListener, MessageId.Factory messageIdFactory,
+                                 EventBus eventBus, MessageId.Factory 
messageIdFactory,
                                  QuotaManager quotaManager, QuotaRootResolver 
quotaRootResolver) {
         this.mailboxManager = mailboxManager;
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
-        this.delegatingMailboxListener = delegatingMailboxListener;
+        this.eventBus = eventBus;
         this.messageIdFactory = messageIdFactory;
         this.quotaManager = quotaManager;
         this.quotaRootResolver = quotaRootResolver;
@@ -218,12 +219,13 @@ public class StoreMessageIdManager implements 
MessageIdManager {
 
         MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
         for (MetadataWithMailboxId metadataWithMailboxId : 
metadataWithMailbox) {
-            delegatingMailboxListener.event(EventFactory.expunged()
+            eventBus.dispatch(EventFactory.expunged()
                 .randomEventId()
                 .mailboxSession(mailboxSession)
                 
.mailbox(mailboxMapper.findMailboxById(metadataWithMailboxId.mailboxId))
                 .addMetaData(metadataWithMailboxId.messageMetaData)
-                .build());
+                .build(),
+                new MailboxIdRegistrationKey(metadataWithMailboxId.mailboxId));
         }
     }
 
@@ -286,11 +288,14 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         addMessageToMailboxes(mailboxMessage, messageMoves.addedMailboxIds(), 
mailboxSession);
         removeMessageFromMailboxes(mailboxMessage, 
messageMoves.removedMailboxIds(), mailboxSession);
 
-        delegatingMailboxListener.event(EventFactory.moved()
+        eventBus.dispatch(EventFactory.moved()
             .session(mailboxSession)
             .messageMoves(messageMoves)
             .messageId(mailboxMessage.getMessageId())
-            .build());
+            .build(),
+            messageMoves.impactedMailboxIds()
+                .map(MailboxIdRegistrationKey::new)
+                .collect(Guavate.toImmutableSet()));
     }
 
     private void removeMessageFromMailboxes(MailboxMessage message, 
Set<MailboxId> mailboxesToRemove, MailboxSession mailboxSession) throws 
MailboxException {
@@ -300,12 +305,13 @@ public class StoreMessageIdManager implements 
MessageIdManager {
 
         for (MailboxId mailboxId: mailboxesToRemove) {
             messageIdMapper.delete(message.getMessageId(), mailboxesToRemove);
-            delegatingMailboxListener.event(EventFactory.expunged()
+            eventBus.dispatch(EventFactory.expunged()
                 .randomEventId()
                 .mailboxSession(mailboxSession)
                 .mailbox(mailboxMapper.findMailboxById(mailboxId))
                 .addMetaData(eventPayload)
-                .build());
+                .build(),
+                new MailboxIdRegistrationKey(mailboxId));
         }
     }
 
@@ -317,12 +323,13 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         if (updatedFlags.flagsChanged()) {
             Mailbox mailbox = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
 
-            delegatingMailboxListener.event(EventFactory.flagsUpdated()
+            eventBus.dispatch(EventFactory.flagsUpdated()
                 .randomEventId()
                 .mailboxSession(mailboxSession)
                 .mailbox(mailbox)
                 .updatedFlag(updatedFlags)
-                .build());
+                .build(),
+                new MailboxIdRegistrationKey(mailboxId));
         }
     }
 
@@ -384,12 +391,13 @@ public class StoreMessageIdManager implements 
MessageIdManager {
                     .build();
             save(mailboxSession, messageIdMapper, copy);
 
-            delegatingMailboxListener.event(EventFactory.added()
+            eventBus.dispatch(EventFactory.added()
                 .randomEventId()
                 .mailboxSession(mailboxSession)
                 .mailbox(mailboxMapper.findMailboxById(mailboxId))
                 .addMessage(copy)
-                .build());
+                .build(),
+                new MailboxIdRegistrationKey(mailboxId));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/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 a92914c..e38a291 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
@@ -46,6 +46,8 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.ReadOnlyException;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -65,7 +67,6 @@ import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
@@ -133,7 +134,7 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
     private static final Logger LOG = 
LoggerFactory.getLogger(StoreMessageManager.class);
 
     private final EnumSet<MailboxManager.MessageCapabilities> 
messageCapabilities;
-    private final DelegatingMailboxListener delegatingMailboxListener;
+    private final EventBus eventBus;
     private final Mailbox mailbox;
     private final MailboxSessionMapperFactory mapperFactory;
     private final MessageSearchIndex index;
@@ -145,12 +146,13 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
     private final Factory messageIdFactory;
     private final BatchSizes batchSizes;
 
-    public StoreMessageManager(EnumSet<MailboxManager.MessageCapabilities> 
messageCapabilities, MailboxSessionMapperFactory mapperFactory, 
MessageSearchIndex index, DelegatingMailboxListener delegatingMailboxListener,
+    public StoreMessageManager(EnumSet<MailboxManager.MessageCapabilities> 
messageCapabilities, MailboxSessionMapperFactory mapperFactory,
+                               MessageSearchIndex index, EventBus eventBus,
                                MailboxPathLocker locker, Mailbox mailbox,
                                QuotaManager quotaManager, QuotaRootResolver 
quotaRootResolver, MessageParser messageParser, MessageId.Factory 
messageIdFactory, BatchSizes batchSizes,
                                StoreRightManager storeRightManager) {
         this.messageCapabilities = messageCapabilities;
-        this.delegatingMailboxListener = delegatingMailboxListener;
+        this.eventBus = eventBus;
         this.mailbox = mailbox;
         this.mapperFactory = mapperFactory;
         this.index = index;
@@ -228,7 +230,7 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
      * 
      * In this implementation, all permanent flags are shared, ergo we simply
      * return {@link #getPermanentFlags(MailboxSession)}
-     * 
+     *
      * @see UnionMailboxACLResolver#isReadWrite(MailboxACLRights, Flags)
      * 
      * @param session
@@ -256,12 +258,13 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
         }
         Map<MessageUid, MessageMetaData> uids = deleteMarkedInMailbox(set, 
mailboxSession);
 
-        delegatingMailboxListener.event(EventFactory.expunged()
+        eventBus.dispatch(EventFactory.expunged()
             .randomEventId()
             .mailboxSession(mailboxSession)
             .mailbox(getMailboxEntity())
             .metaData(ImmutableSortedMap.copyOf(uids))
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
         return uids.keySet().iterator();
     }
 
@@ -403,12 +406,13 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
                         Mailbox mailbox = getMailboxEntity();
                         MailboxMessage copy = copyMessage(message);
-                        delegatingMailboxListener.event(EventFactory.added()
+                        eventBus.dispatch(EventFactory.added()
                             .randomEventId()
                             .mailboxSession(mailboxSession)
                             .mailbox(mailbox)
                             .addMessage(copy)
-                            .build());
+                            .build(),
+                            new 
MailboxIdRegistrationKey(mailbox.getMailboxId()));
                         return new ComposedMessageId(mailbox.getMailboxId(), 
data.getMessageId(), data.getUid());
                     }, true);
                 }
@@ -565,12 +569,13 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
         Iterator<UpdatedFlags> it = messageMapper.execute(() -> 
messageMapper.updateFlags(getMailboxEntity(), new FlagsUpdateCalculator(flags, 
flagsUpdateMode), set));
         List<UpdatedFlags> updatedFlags = 
Iterators.toStream(it).collect(Guavate.toImmutableList());
 
-        delegatingMailboxListener.event(EventFactory.flagsUpdated()
+        eventBus.dispatch(EventFactory.flagsUpdated()
             .randomEventId()
             .mailboxSession(mailboxSession)
             .mailbox(getMailboxEntity())
             .updatedFlags(updatedFlags)
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
 
         return updatedFlags.stream().collect(Guavate.toImmutableMap(
             UpdatedFlags::getUid,
@@ -729,20 +734,22 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
             messageIds.add(message.getMessageId());
         }
 
-        delegatingMailboxListener.event(EventFactory.added()
+        eventBus.dispatch(EventFactory.added()
             .randomEventId()
             .mailboxSession(session)
             .mailbox(to.getMailboxEntity())
             .metaData(copiedUids)
-            .build());
-        delegatingMailboxListener.event(EventFactory.moved()
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
+        eventBus.dispatch(EventFactory.moved()
             .session(session)
             .messageMoves(MessageMoves.builder()
                 .previousMailboxIds(getMailboxEntity().getMailboxId())
                 .targetMailboxIds(to.getMailboxEntity().getMailboxId(), 
getMailboxEntity().getMailboxId())
                 .build())
             .messageId(messageIds.build())
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
 
         return copiedUids;
     }
@@ -758,26 +765,29 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
             messageIds.add(message.getMessageId());
         }
 
-        delegatingMailboxListener.event(EventFactory.added()
+        eventBus.dispatch(EventFactory.added()
             .randomEventId()
             .mailboxSession(session)
             .mailbox(to.getMailboxEntity())
             .metaData(moveUids)
-            .build());
-        delegatingMailboxListener.event(EventFactory.expunged()
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
+        eventBus.dispatch(EventFactory.expunged()
             .randomEventId()
             .mailboxSession(session)
             .mailbox(getMailboxEntity())
             .addMetaData(moveResult.getOriginalMessages())
-            .build());
-        delegatingMailboxListener.event(EventFactory.moved()
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
+        eventBus.dispatch(EventFactory.moved()
             .messageMoves(MessageMoves.builder()
                 .previousMailboxIds(getMailboxEntity().getMailboxId())
                 .targetMailboxIds(to.getMailboxEntity().getMailboxId())
                 .build())
             .messageId(messageIds.build())
             .session(session)
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
 
         return moveUids;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
index 84bc1f0..25a8bdc 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
@@ -32,6 +32,8 @@ import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
+import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.DifferentDomainException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
@@ -43,7 +45,6 @@ import 
org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -55,7 +56,7 @@ import com.google.common.collect.ImmutableMap;
 public class StoreRightManager implements RightManager {
     public static final boolean GROUP_FOLDER = true;
 
-    private final DelegatingMailboxListener delegatingMailboxListener;
+    private final EventBus eventBus;
     private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
     private final MailboxACLResolver aclResolver;
     private final GroupMembershipResolver groupMembershipResolver;
@@ -64,11 +65,11 @@ public class StoreRightManager implements RightManager {
     public StoreRightManager(MailboxSessionMapperFactory 
mailboxSessionMapperFactory,
                              MailboxACLResolver aclResolver,
                              GroupMembershipResolver groupMembershipResolver,
-                             DelegatingMailboxListener 
delegatingMailboxListener) {
+                             EventBus eventBus) {
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
         this.aclResolver = aclResolver;
         this.groupMembershipResolver = groupMembershipResolver;
-        this.delegatingMailboxListener = delegatingMailboxListener;
+        this.eventBus = eventBus;
     }
 
     @Override
@@ -139,12 +140,13 @@ public class StoreRightManager implements RightManager {
         Mailbox mailbox = mapper.findMailboxByPath(mailboxPath);
         ACLDiff aclDiff = mapper.updateACL(mailbox, mailboxACLCommand);
 
-        delegatingMailboxListener.event(EventFactory.aclUpdated()
+        eventBus.dispatch(EventFactory.aclUpdated()
             .randomEventId()
             .mailboxSession(session)
             .mailbox(mailbox)
             .aclDiff(aclDiff)
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
     }
 
     private void assertSharesBelongsToUserDomain(String user, ACLCommand 
mailboxACLCommand) throws DifferentDomainException {
@@ -222,12 +224,13 @@ public class StoreRightManager implements RightManager {
     private void setRights(MailboxACL mailboxACL, MailboxMapper mapper, 
Mailbox mailbox, MailboxSession session) throws MailboxException {
         ACLDiff aclDiff = mapper.setACL(mailbox, mailboxACL);
 
-        delegatingMailboxListener.event(EventFactory.aclUpdated()
+        eventBus.dispatch(EventFactory.aclUpdated()
             .randomEventId()
             .mailboxSession(session)
             .mailbox(mailbox)
             .aclDiff(aclDiff)
-            .build());
+            .build(),
+            new MailboxIdRegistrationKey(mailbox.getMailboxId()));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
deleted file mode 100644
index 1cc0319..0000000
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
+++ /dev/null
@@ -1,126 +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.event;
-
-import java.util.Collection;
-
-import javax.inject.Inject;
-
-import org.apache.james.mailbox.Event;
-import org.apache.james.mailbox.MailboxListener;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.events.delivery.EventDelivery;
-import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MailboxId;
-import org.apache.james.metrics.api.NoopMetricFactory;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-
-import reactor.core.publisher.Mono;
-
-/**
- * Receive a {@link org.apache.james.mailbox.MailboxListener.MailboxEvent} and 
delegate it to an other
- * {@link MailboxListener} depending on the registered mailboxId
- *
- * This is a mono instance Thread safe implementation for 
DelegatingMailboxListener
- */
-public class DefaultDelegatingMailboxListener implements 
DelegatingMailboxListener {
-
-    private final MailboxListenerRegistry registry;
-    private final EventDelivery eventDelivery;
-
-    @Override
-    public ListenerType getType() {
-        return ListenerType.EACH_NODE;
-    }
-
-    @VisibleForTesting
-    public DefaultDelegatingMailboxListener() {
-        this(new InVmEventDelivery(new NoopMetricFactory()),
-            new MailboxListenerRegistry());
-    }
-
-    @Inject
-    public DefaultDelegatingMailboxListener(EventDelivery eventDelivery, 
MailboxListenerRegistry registry) {
-        this.registry = registry;
-        this.eventDelivery = eventDelivery;
-    }
-
-    @Override
-    public void addListener(MailboxId mailboxId, MailboxListener listener, 
MailboxSession session) throws MailboxException {
-        if (listener.getType() != ListenerType.MAILBOX) {
-            throw new MailboxException(listener.getClass().getCanonicalName() 
+ " registred on specific MAILBOX operation while its listener type was " + 
listener.getType());
-        }
-        registry.addListener(mailboxId, listener);
-    }
-
-    @Override
-    public void addGlobalListener(MailboxListener listener, MailboxSession 
session) throws MailboxException {
-        if (listener.getType() != ListenerType.EACH_NODE && listener.getType() 
!= ListenerType.ONCE) {
-            throw new MailboxException(listener.getClass().getCanonicalName() 
+ " registered on global event dispatching while its listener type was " + 
listener.getType());
-        }
-        registry.addGlobalListener(listener);
-    }
-
-    @Override
-    public void removeListener(MailboxId mailboxId, MailboxListener listener, 
MailboxSession session) {
-        registry.removeListener(mailboxId, listener);
-    }
-
-    @Override
-    public void removeGlobalListener(MailboxListener listener, MailboxSession 
session) {
-        registry.removeGlobalListener(listener);
-    }
-
-    @Override
-    public void event(Event event) {
-        if (!event.isNoop()) {
-            ImmutableList<MailboxListener> listeners = 
ImmutableList.<MailboxListener>builder()
-                .addAll(registry.getGlobalListeners())
-                .addAll(registeredMailboxListeners(event))
-                .build();
-
-            eventDelivery.deliver(listeners, event)
-                .synchronousListenerFuture()
-                .onErrorResume(throwable -> Mono.empty()) // suppress 
InVmEventDelivery delivery errors. This class will be removed soon
-                .block();
-
-            if (event instanceof MailboxDeletion) {
-                MailboxDeletion deletion = (MailboxDeletion) event;
-                registry.deleteRegistryFor(deletion.getMailboxId());
-            }
-        }
-    }
-
-    private Collection<MailboxListener> registeredMailboxListeners(Event 
event) {
-        if (event instanceof MailboxEvent) {
-            MailboxEvent mailboxEvent = (MailboxEvent) event;
-
-            return 
registry.getLocalMailboxListeners(mailboxEvent.getMailboxId());
-        }
-        return ImmutableList.of();
-    }
-
-    public MailboxListenerRegistry getRegistry() {
-        return registry;
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java
deleted file mode 100644
index 15b4e84..0000000
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DelegatingMailboxListener.java
+++ /dev/null
@@ -1,27 +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.event;
-
-import org.apache.james.mailbox.MailboxListener;
-import org.apache.james.mailbox.MailboxListenerSupport;
-
-public interface DelegatingMailboxListener extends MailboxListenerSupport, 
MailboxListener{
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
index 2514a40..09e30f8 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 import org.apache.james.mailbox.Event;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxId;
@@ -34,8 +35,12 @@ import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class MailboxAnnotationListener implements MailboxListener {
+public class MailboxAnnotationListener implements 
MailboxListener.GroupMailboxListener {
+    private static final class MailboxAnnotationListenerGroup extends Group {}
+
     private static final Logger logger = 
LoggerFactory.getLogger(MailboxAnnotationListener.class);
+    private static final Group GROUP = new MailboxAnnotationListenerGroup();
+
     private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
     private final SessionProvider sessionProvider;
 
@@ -44,7 +49,12 @@ public class MailboxAnnotationListener implements 
MailboxListener {
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
         this.sessionProvider = sessionProvider;
     }
-    
+
+    @Override
+    public Group getGroup() {
+        return GROUP;
+    }
+
     @Override
     public ListenerType getType() {
         return ListenerType.EACH_NODE;

http://git-wip-us.apache.org/repos/asf/james-project/blob/89f168de/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 c084bcd..97cfdea 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
@@ -26,32 +26,36 @@ import javax.inject.Inject;
 import org.apache.james.mailbox.Event;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.Group;
+import org.apache.james.mailbox.events.RegistrationKey;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableSet;
+
 public class ListeningCurrentQuotaUpdater implements 
MailboxListener.GroupMailboxListener, QuotaUpdater {
     private static class ListeningCurrentQuotaUpdaterGroup extends Group {}
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ListeningCurrentQuotaUpdater.class);
-    private static final Group GROUP = new ListeningCurrentQuotaUpdaterGroup();
+    public static final Group GROUP = new ListeningCurrentQuotaUpdaterGroup();
+    private static final ImmutableSet<RegistrationKey> NO_REGISTRATION_KEYS = 
ImmutableSet.of();
 
     private final StoreCurrentQuotaManager currentQuotaManager;
     private final QuotaRootResolver quotaRootResolver;
-    private final DelegatingMailboxListener delegatingMailboxListener;
+    private final EventBus eventBus;
     private final QuotaManager quotaManager;
 
     @Inject
-    public ListeningCurrentQuotaUpdater(StoreCurrentQuotaManager 
currentQuotaManager, QuotaRootResolver quotaRootResolver, 
DelegatingMailboxListener delegatingMailboxListener, QuotaManager quotaManager) 
{
+    public ListeningCurrentQuotaUpdater(StoreCurrentQuotaManager 
currentQuotaManager, QuotaRootResolver quotaRootResolver, EventBus eventBus, 
QuotaManager quotaManager) {
         this.currentQuotaManager = currentQuotaManager;
         this.quotaRootResolver = quotaRootResolver;
-        this.delegatingMailboxListener = delegatingMailboxListener;
+        this.eventBus = eventBus;
         this.quotaManager = quotaManager;
     }
 
@@ -97,7 +101,7 @@ public class ListeningCurrentQuotaUpdater implements 
MailboxListener.GroupMailbo
         if (addedCount != 0 && addedSize != 0) {
             currentQuotaManager.decrease(quotaRoot, addedCount, addedSize);
         }
-        delegatingMailboxListener.event(
+        eventBus.dispatch(
             EventFactory.quotaUpdated()
                 .randomEventId()
                 .user(expunged.getUser())
@@ -105,7 +109,8 @@ public class ListeningCurrentQuotaUpdater implements 
MailboxListener.GroupMailbo
                 .quotaCount(quotaManager.getMessageQuota(quotaRoot))
                 .quotaSize(quotaManager.getStorageQuota(quotaRoot))
                 .instant(Instant.now())
-                .build());
+                .build(),
+            NO_REGISTRATION_KEYS);
     }
 
     private void handleAddedEvent(Added added, QuotaRoot quotaRoot) throws 
MailboxException {
@@ -119,7 +124,7 @@ public class ListeningCurrentQuotaUpdater implements 
MailboxListener.GroupMailbo
         if (addedCount != 0 && addedSize != 0) {
             currentQuotaManager.increase(quotaRoot, addedCount, addedSize);
         }
-        delegatingMailboxListener.event(
+        eventBus.dispatch(
             EventFactory.quotaUpdated()
                 .randomEventId()
                 .user(added.getUser())
@@ -127,7 +132,8 @@ public class ListeningCurrentQuotaUpdater implements 
MailboxListener.GroupMailbo
                 .quotaCount(quotaManager.getMessageQuota(quotaRoot))
                 .quotaSize(quotaManager.getStorageQuota(quotaRoot))
                 .instant(Instant.now())
-                .build());
+                .build(),
+            NO_REGISTRATION_KEYS);
     }
 
     private void handleMailboxDeletionEvent(MailboxDeletion 
mailboxDeletionEvent) throws MailboxException {


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

Reply via email to