You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/06/25 14:41:33 UTC

[2/2] zest-qi4j git commit: Introduced a layered EntityStoreUnitOfWork, just like the ordinary UnitOfWork, that has a wrapper which contains the current Module. To make this work, quite a lot of SPI level interfaces needed to be changed, and SPI compatib

Introduced a layered EntityStoreUnitOfWork, just like the ordinary UnitOfWork, that has a wrapper which contains the current Module. To make this work, quite a lot of SPI level interfaces needed to be changed, and SPI compatibiilty breaks.


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/c8c3286c
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/c8c3286c
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/c8c3286c

Branch: refs/heads/develop
Commit: c8c3286cb7d27f3c9e1a8764a05da95e06c55808
Parents: 0189ec7
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 25 14:41:23 2015 +0200
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 25 14:41:23 2015 +0200

----------------------------------------------------------------------
 .../org/qi4j/runtime/entity/EntityModel.java    |   4 +-
 .../unitofwork/EntityBuilderInstance.java       |   2 +-
 .../runtime/unitofwork/UnitOfWorkInstance.java  |   6 +-
 .../ConcurrentModificationCheckConcern.java     | 111 ++++---
 .../DefaultEntityStoreUnitOfWork.java           |  18 +-
 .../EntityAlreadyExistsException.java           |   2 +-
 .../spi/entitystore/EntityStateVersions.java    |  12 +-
 .../org/qi4j/spi/entitystore/EntityStore.java   |   5 +-
 .../qi4j/spi/entitystore/EntityStoreSPI.java    |   4 +-
 .../spi/entitystore/EntityStoreUnitOfWork.java  |   9 +-
 .../ModuleEntityStoreUnitOfWork.java            |  69 +++++
 .../StateChangeNotificationConcern.java         |   1 +
 .../entitystore/helpers/DefaultEntityState.java |  13 +-
 .../entitystore/helpers/JSONEntityState.java    |  30 +-
 .../helpers/JSONMapEntityStoreMixin.java        |  73 ++---
 .../helpers/MapEntityStoreMixin.java            |  45 ++-
 .../helpers/JSONManyAssociationStateTest.java   |   2 -
 .../java/org/qi4j/test/AbstractQi4jTest.java    |   6 +-
 .../hazelcast/HazelcastEntityStoreMixin.java    |   4 +-
 .../prefs/PreferencesEntityStoreMixin.java      |  35 +--
 .../entitystore/sql/SQLEntityStoreMixin.java    |  60 ++--
 .../elasticsearch/ElasticSearchIndexer.java     |  64 ++--
 .../index/rdf/indexing/RdfIndexingService.java  |   2 +-
 .../reindexer/internal/ReindexerMixin.java      | 180 +++++------
 .../org/qi4j/index/reindexer/ReindexerTest.java |  11 +-
 .../rdf/repository/NativeRepositoryService.java | 301 ++++++++++---------
 .../rdf/entity/EntitySerializerTest.java        |  30 +-
 .../qi4j/library/rest/admin/EntityResource.java |  16 +-
 libraries/scheduler/src/docs/scheduler.txt      |   5 +
 29 files changed, 603 insertions(+), 517 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
index 3563115..ff0b633 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
@@ -116,13 +116,13 @@ public final class EntityModel
         return ( (EntityMixinsModel) mixinsModel ).newMixin( entityInstance, entityState, mixins, method );
     }
 
-    public EntityState newEntityState( EntityStoreUnitOfWork store, EntityReference identity )
+    public EntityState newEntityState( EntityStoreUnitOfWork store, ModuleSpi module, EntityReference identity )
         throws ConstraintViolationException, EntityStoreException
     {
         try
         {
             // New EntityState
-            EntityState entityState = store.newEntityState( identity, this );
+            EntityState entityState = store.newEntityState( module, identity, this );
 
             // Set identity property
             PropertyDescriptor persistentPropertyDescriptor = state().propertyModelFor( IDENTITY_METHOD );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
index ff17a07..4ca81d9 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
@@ -117,7 +117,7 @@ public final class EntityBuilderInstance<T>
 
         // Figure out whether to use given or generated identity
         identity = (String) entityState.propertyValueOf( IDENTITY_STATE_NAME );
-        EntityState newEntityState = model.model().newEntityState( store,
+        EntityState newEntityState = model.model().newEntityState( store, uow.module(),
                                                                    EntityReference.parseEntityReference( identity ) );
 
         prototypeInstance.invokeCreate();

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
index 886fb97..ec33e08 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java
@@ -31,7 +31,6 @@ import org.qi4j.api.metrics.MetricsCounterFactory;
 import org.qi4j.api.metrics.MetricsProvider;
 import org.qi4j.api.metrics.MetricsTimer;
 import org.qi4j.api.metrics.MetricsTimerFactory;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.ConcurrentEntityModificationException;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.unitofwork.NoSuchEntityException;
@@ -42,7 +41,6 @@ import org.qi4j.api.unitofwork.UnitOfWorkOptions;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.runtime.entity.EntityInstance;
 import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
@@ -111,7 +109,7 @@ public final class UnitOfWorkInstance
         return currentTime;
     }
 
-    public EntityStoreUnitOfWork getEntityStoreUnitOfWork( EntityStore store, Module module )
+    public EntityStoreUnitOfWork getEntityStoreUnitOfWork( EntityStore store, ModuleSpi module )
     {
         EntityStoreUnitOfWork uow = storeUnitOfWork.get( store );
         if( uow == null )
@@ -146,7 +144,7 @@ public final class UnitOfWorkInstance
                 EntityStoreUnitOfWork storeUow = getEntityStoreUnitOfWork( store, potentialModel.module() );
                 try
                 {
-                    entityState = storeUow.entityStateOf( identity );
+                    entityState = storeUow.entityStateOf( potentialModel.module(), identity );
                 }
                 catch( EntityNotFoundException e )
                 {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
index cfeead6..118389c 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java
@@ -14,19 +14,18 @@
 
 package org.qi4j.spi.entitystore;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.qi4j.api.Qi4j;
 import org.qi4j.api.concern.ConcernOf;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.injection.scope.This;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Concern that helps EntityStores do concurrent modification checks.
@@ -44,11 +43,12 @@ public abstract class ConcurrentModificationCheckConcern
 {
     @This
     private EntityStateVersions versions;
+
     @Structure
     private Qi4j api;
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime )
     {
         final EntityStoreUnitOfWork uow = next.newUnitOfWork( usecase, module, currentTime );
         return new ConcurrentCheckingEntityStoreUnitOfWork( uow, api.dereference( versions ), module, currentTime );
@@ -59,16 +59,16 @@ public abstract class ConcurrentModificationCheckConcern
     {
         private final EntityStoreUnitOfWork uow;
         private EntityStateVersions versions;
-        private Module module;
+        private ModuleSpi module;
         private long currentTime;
 
-        private List<EntityState> loaded = new ArrayList<EntityState>();
+        private List<EntityState> loaded = new ArrayList<>();
 
-        private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(  );
+        private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 
         public ConcurrentCheckingEntityStoreUnitOfWork( EntityStoreUnitOfWork uow,
                                                         EntityStateVersions versions,
-                                                        Module module,
+                                                        ModuleSpi module,
                                                         long currentTime
         )
         {
@@ -91,10 +91,13 @@ public abstract class ConcurrentModificationCheckConcern
         }
 
         @Override
-        public EntityState newEntityState( EntityReference anIdentity, EntityDescriptor entityDescriptor )
+        public EntityState newEntityState( ModuleSpi module,
+                                           EntityReference anIdentity,
+                                           EntityDescriptor entityDescriptor
+        )
             throws EntityStoreException
         {
-            return uow.newEntityState( anIdentity, entityDescriptor );
+            return uow.newEntityState( module, anIdentity, entityDescriptor );
         }
 
         @Override
@@ -105,34 +108,35 @@ public abstract class ConcurrentModificationCheckConcern
 
             try
             {
-               versions.checkForConcurrentModification( loaded, module, currentTime );
-
-               final StateCommitter committer = uow.applyChanges();
-
-               return new StateCommitter()
-               {
-                   @Override
-                   public void commit()
-                   {
-                       committer.commit();
-                       versions.forgetVersions( loaded );
-
-                       lock.writeLock().unlock();
-                   }
-
-                   @Override
-                   public void cancel()
-                   {
-                       committer.cancel();
-                       versions.forgetVersions( loaded );
-
-                       lock.writeLock().unlock();
-                   }
-               };
-            } catch( EntityStoreException e )
+                versions.checkForConcurrentModification( loaded, module, currentTime );
+
+                final StateCommitter committer = uow.applyChanges();
+
+                return new StateCommitter()
+                {
+                    @Override
+                    public void commit()
+                    {
+                        committer.commit();
+                        versions.forgetVersions( loaded );
+
+                        lock.writeLock().unlock();
+                    }
+
+                    @Override
+                    public void cancel()
+                    {
+                        committer.cancel();
+                        versions.forgetVersions( loaded );
+
+                        lock.writeLock().unlock();
+                    }
+                };
+            }
+            catch( EntityStoreException e )
             {
-               lock.writeLock().unlock();
-               throw e;
+                lock.writeLock().unlock();
+                throw e;
             }
         }
 
@@ -149,29 +153,38 @@ public abstract class ConcurrentModificationCheckConcern
 
                 try
                 {
-                   versions.forgetVersions( loaded );
-                } finally
+                    versions.forgetVersions( loaded );
+                }
+                finally
                 {
-                   lock.writeLock().unlock();
+                    lock.writeLock().unlock();
                 }
             }
         }
 
         @Override
-        public EntityState entityStateOf( EntityReference anIdentity )
+        public Usecase usecase()
+        {
+            return uow.usecase();
+        }
+
+        @SuppressWarnings( "DuplicateThrows" )
+        @Override
+        public EntityState entityStateOf( ModuleSpi module, EntityReference anIdentity )
             throws EntityStoreException, EntityNotFoundException
         {
             lock.readLock().lock();
 
             try
             {
-               EntityState entityState = uow.entityStateOf( anIdentity );
-               versions.rememberVersion( entityState.identity(), entityState.version() );
-               loaded.add( entityState );
-               return entityState;
-            } finally
+                EntityState entityState = uow.entityStateOf( module, anIdentity );
+                versions.rememberVersion( entityState.identity(), entityState.version() );
+                loaded.add( entityState );
+                return entityState;
+            }
+            finally
             {
-               lock.readLock().unlock();
+                lock.readLock().unlock();
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
index cc93430..1c1d794 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java
@@ -17,9 +17,9 @@ package org.qi4j.spi.entitystore;
 import java.util.HashMap;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Default EntityStore UnitOfWork.
@@ -29,21 +29,18 @@ public final class DefaultEntityStoreUnitOfWork
 {
     private EntityStoreSPI entityStoreSPI;
     private String identity;
-    private Module module;
     private HashMap<EntityReference, EntityState> states = new HashMap<>();
     private Usecase usecase;
     private long currentTime;
 
     public DefaultEntityStoreUnitOfWork( EntityStoreSPI entityStoreSPI,
                                          String identity,
-                                         Module module,
                                          Usecase usecase,
                                          long currentTime
     )
     {
         this.entityStoreSPI = entityStoreSPI;
         this.identity = identity;
-        this.module = module;
         this.usecase = usecase;
         this.currentTime = currentTime;
     }
@@ -54,11 +51,6 @@ public final class DefaultEntityStoreUnitOfWork
         return identity;
     }
 
-    public Module module()
-    {
-        return module;
-    }
-
     @Override
     public long currentTime()
     {
@@ -73,7 +65,7 @@ public final class DefaultEntityStoreUnitOfWork
     // EntityStore
 
     @Override
-    public EntityState newEntityState( EntityReference anIdentity, EntityDescriptor descriptor )
+    public EntityState newEntityState( ModuleSpi module, EntityReference anIdentity, EntityDescriptor descriptor )
         throws EntityStoreException
     {
         EntityState entityState = states.get( anIdentity );
@@ -81,13 +73,13 @@ public final class DefaultEntityStoreUnitOfWork
         {
             throw new EntityAlreadyExistsException( anIdentity );
         }
-        EntityState state = entityStoreSPI.newEntityState( this, anIdentity, descriptor );
+        EntityState state = entityStoreSPI.newEntityState( this, module, anIdentity, descriptor );
         states.put( anIdentity, state );
         return state;
     }
 
     @Override
-    public EntityState entityStateOf( EntityReference anIdentity )
+    public EntityState entityStateOf( ModuleSpi module, EntityReference anIdentity )
         throws EntityNotFoundException
     {
 
@@ -96,7 +88,7 @@ public final class DefaultEntityStoreUnitOfWork
         {
             return entityState;
         }
-        entityState = entityStoreSPI.entityStateOf( this, anIdentity );
+        entityState = entityStoreSPI.entityStateOf( this, module, anIdentity );
         states.put( anIdentity, entityState );
         return entityState;
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
index 116e9bf..6054dcd 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityAlreadyExistsException.java
@@ -28,7 +28,7 @@ public class EntityAlreadyExistsException
 
     public EntityAlreadyExistsException( EntityReference identity )
     {
-        super("Entity " + identity + " already existed");
+        super("Entity " + identity + " already exists.");
         this.identity = identity;
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
index ddf1758..08e268d 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java
@@ -21,10 +21,10 @@ import java.util.WeakHashMap;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.mixin.Mixins;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Entity versions state.
@@ -36,7 +36,7 @@ public interface EntityStateVersions
 
     void rememberVersion( EntityReference identity, String version );
 
-    void checkForConcurrentModification( Iterable<EntityState> loaded, Module module, long currentTime )
+    void checkForConcurrentModification( Iterable<EntityState> loaded, ModuleSpi module, long currentTime )
         throws ConcurrentEntityStateModificationException;
 
     /**
@@ -48,7 +48,7 @@ public interface EntityStateVersions
         @This
         private EntityStore store;
 
-        private final Map<EntityReference, String> versions = new WeakHashMap<EntityReference, String>();
+        private final Map<EntityReference, String> versions = new WeakHashMap<>();
 
         @Override
         public synchronized void forgetVersions( Iterable<EntityState> states )
@@ -67,7 +67,7 @@ public interface EntityStateVersions
 
         @Override
         public synchronized void checkForConcurrentModification( Iterable<EntityState> loaded,
-                                                                 Module module,
+                                                                 ModuleSpi module,
                                                                  long currentTime
         )
             throws ConcurrentEntityStateModificationException
@@ -84,7 +84,7 @@ public interface EntityStateVersions
                 if( storeVersion == null )
                 {
                     EntityStoreUnitOfWork unitOfWork = store.newUnitOfWork( Usecase.DEFAULT, module, currentTime );
-                    EntityState state = unitOfWork.entityStateOf( entityState.identity() );
+                    EntityState state = unitOfWork.entityStateOf( module, entityState.identity() );
                     storeVersion = state.version();
                     unitOfWork.discard();
                 }
@@ -93,7 +93,7 @@ public interface EntityStateVersions
                 {
                     if( changed == null )
                     {
-                        changed = new ArrayList<EntityReference>();
+                        changed = new ArrayList<>();
                     }
                     changed.add( entityState.identity() );
                 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
index fa5ac1b..b8de305 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java
@@ -20,13 +20,14 @@ import org.qi4j.api.structure.Module;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.io.Input;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Interface that must be implemented by store for persistent state of EntityComposites.
  */
 public interface EntityStore
 {
-    EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime );
+    EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime );
 
-    Input<EntityState, EntityStoreException> entityStates( Module module );
+    Input<EntityState, EntityStoreException> entityStates( ModuleSpi module );
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
index 536ceb9..521d2ce 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreSPI.java
@@ -17,6 +17,7 @@ package org.qi4j.spi.entitystore;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * EntityStore SPI.
@@ -24,10 +25,11 @@ import org.qi4j.spi.entity.EntityState;
 public interface EntityStoreSPI
 {
     EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                ModuleSpi module,
                                 EntityReference identity, EntityDescriptor entityDescriptor
     );
 
-    EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference identity );
+    EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, ModuleSpi module, EntityReference identity );
 
     StateCommitter applyChanges( EntityStoreUnitOfWork unitOfWork, Iterable<EntityState> state
     );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
index 21655cd..0b055bf 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java
@@ -14,9 +14,12 @@
 
 package org.qi4j.spi.entitystore;
 
+import org.qi4j.api.common.MetaInfo;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.usecase.Usecase;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * EntityStore UnitOfWork.
@@ -40,7 +43,7 @@ public interface EntityStoreUnitOfWork
      *
      * @throws EntityStoreException Thrown if creational fails.
      */
-    EntityState newEntityState( EntityReference anIdentity, EntityDescriptor entityDescriptor )
+    EntityState newEntityState( ModuleSpi module, EntityReference anIdentity, EntityDescriptor entityDescriptor )
         throws EntityStoreException;
 
     /**
@@ -54,11 +57,13 @@ public interface EntityStoreUnitOfWork
      * @throws EntityStoreException    thrown if retrieval failed.
      * @throws EntityNotFoundException if requested entity does not exist
      */
-    EntityState entityStateOf( EntityReference anIdentity )
+    EntityState entityStateOf( ModuleSpi module, EntityReference anIdentity )
         throws EntityStoreException, EntityNotFoundException;
 
     StateCommitter applyChanges()
         throws EntityStoreException;
 
     void discard();
+
+    Usecase usecase();
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java
new file mode 100644
index 0000000..8e43144
--- /dev/null
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/ModuleEntityStoreUnitOfWork.java
@@ -0,0 +1,69 @@
+package org.qi4j.spi.entitystore;
+
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.usecase.Usecase;
+import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
+
+public class ModuleEntityStoreUnitOfWork
+    implements EntityStoreUnitOfWork
+{
+    private final ModuleSpi module;
+    private final EntityStoreUnitOfWork underlying;
+
+    public ModuleEntityStoreUnitOfWork( ModuleSpi module, EntityStoreUnitOfWork underlying )
+    {
+        this.module = module;
+        this.underlying = underlying;
+    }
+
+    public ModuleSpi module()
+    {
+        return module;
+    }
+
+    @Override
+    public String identity()
+    {
+        return underlying.identity();
+    }
+
+    @Override
+    public long currentTime()
+    {
+        return underlying.currentTime();
+    }
+
+    @Override
+    public EntityState newEntityState( ModuleSpi module, EntityReference reference, EntityDescriptor descriptor )
+        throws EntityStoreException
+    {
+        return underlying.newEntityState( module, reference, descriptor );
+    }
+
+    @Override
+    public EntityState entityStateOf( ModuleSpi module, EntityReference reference )
+        throws EntityStoreException, EntityNotFoundException
+    {
+        return underlying.entityStateOf( module, reference );
+    }
+
+    @Override
+    public StateCommitter applyChanges()
+        throws EntityStoreException
+    {
+        return underlying.applyChanges();
+    }
+
+    @Override
+    public void discard()
+    {
+        underlying.discard();
+    }
+
+    public Usecase usecase()
+    {
+        return underlying.usecase();
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
index d49e5eb..1365881 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/StateChangeNotificationConcern.java
@@ -17,6 +17,7 @@ package org.qi4j.spi.entitystore;
 import org.qi4j.api.concern.ConcernOf;
 import org.qi4j.api.injection.scope.Service;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * State change notification Concern.

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
index e7938c3..4d66073 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java
@@ -32,7 +32,6 @@ import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entity.ManyAssociationState;
 import org.qi4j.spi.entity.NamedAssociationState;
-import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
 
 /**
  * Standard implementation of EntityState.
@@ -40,8 +39,6 @@ import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
 public final class DefaultEntityState
     implements EntityState
 {
-    private DefaultEntityStoreUnitOfWork unitOfWork;
-
     private EntityStatus status;
 
     private String version;
@@ -54,13 +51,13 @@ public final class DefaultEntityState
     private final Map<QualifiedName, List<EntityReference>> manyAssociations;
     private final Map<QualifiedName, Map<String, EntityReference>> namedAssociations;
 
-    public DefaultEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
+    public DefaultEntityState( long currentTime,
                                EntityReference identity,
                                EntityDescriptor entityDescriptor
     )
     {
-        this( unitOfWork, "",
-              unitOfWork.currentTime(),
+        this( "",
+              currentTime,
               identity,
               EntityStatus.NEW,
               entityDescriptor,
@@ -70,8 +67,7 @@ public final class DefaultEntityState
               new HashMap<QualifiedName, Map<String, EntityReference>>() );
     }
 
-    public DefaultEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
-                               String version,
+    public DefaultEntityState( String version,
                                long lastModified,
                                EntityReference identity,
                                EntityStatus status,
@@ -82,7 +78,6 @@ public final class DefaultEntityState
                                Map<QualifiedName, Map<String, EntityReference>> namedAssociations
     )
     {
-        this.unitOfWork = unitOfWork;
         this.version = version;
         this.lastModified = lastModified;
         this.identity = identity;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
index bef6229..435acde 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java
@@ -33,7 +33,6 @@ import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entity.ManyAssociationState;
 import org.qi4j.spi.entity.NamedAssociationState;
-import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.EntityStoreException;
 
 /**
@@ -44,15 +43,14 @@ public final class JSONEntityState
 {
     private static final String[] EMPTY_NAMES = new String[ 0 ];
     private static final String[] CLONE_NAMES =
-    {
-        JSONKeys.IDENTITY,
-        JSONKeys.APPLICATION_VERSION,
-        JSONKeys.TYPE,
-        JSONKeys.VERSION,
-        JSONKeys.MODIFIED
-    };
+        {
+            JSONKeys.IDENTITY,
+            JSONKeys.APPLICATION_VERSION,
+            JSONKeys.TYPE,
+            JSONKeys.VERSION,
+            JSONKeys.MODIFIED
+        };
 
-    private final DefaultEntityStoreUnitOfWork unitOfWork;
     private final ValueSerialization valueSerialization;
     private final String version;
     private final EntityReference identity;
@@ -62,24 +60,23 @@ public final class JSONEntityState
     private long lastModified;
     private JSONObject state;
 
-    /* package */ JSONEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
+    /* package */ JSONEntityState( long time,
                                    ValueSerialization valueSerialization,
                                    EntityReference identity,
                                    EntityDescriptor entityDescriptor,
-                                   JSONObject initialState )
+                                   JSONObject initialState
+    )
     {
-        this( unitOfWork,
-              valueSerialization,
+        this( valueSerialization,
               "",
-              unitOfWork.currentTime(),
+              time,
               identity,
               EntityStatus.NEW,
               entityDescriptor,
               initialState );
     }
 
-    /* package */ JSONEntityState( DefaultEntityStoreUnitOfWork unitOfWork,
-                                   ValueSerialization valueSerialization,
+    /* package */ JSONEntityState( ValueSerialization valueSerialization,
                                    String version,
                                    long lastModified,
                                    EntityReference identity,
@@ -88,7 +85,6 @@ public final class JSONEntityState
                                    JSONObject state
     )
     {
-        this.unitOfWork = unitOfWork;
         this.valueSerialization = valueSerialization;
         this.version = version;
         this.lastModified = lastModified;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
index 7cbb88b..47bf17f 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java
@@ -42,10 +42,8 @@ import org.qi4j.api.injection.scope.Uses;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.usecase.Usecase;
-import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.value.ValueSerialization;
 import org.qi4j.io.Input;
 import org.qi4j.io.Output;
@@ -62,6 +60,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.module.ModelModule;
 import org.qi4j.spi.module.ModuleSpi;
@@ -144,15 +143,18 @@ public class JSONMapEntityStoreMixin
     // EntityStore
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecaseMetaInfo, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork = new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), usecaseMetaInfo, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     // EntityStoreSPI
 
     @Override
     public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
                                        EntityReference identity,
                                        EntityDescriptor entityDescriptor
     )
@@ -169,7 +171,7 @@ public class JSONMapEntityStoreMixin
             state.put( JSONKeys.ASSOCIATIONS, new JSONObject() );
             state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() );
             state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() );
-            return new JSONEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, valueSerialization,
+            return new JSONEntityState( unitOfWork.currentTime(), valueSerialization,
                                         identity, entityDescriptor, state );
         }
         catch( JSONException e )
@@ -179,17 +181,20 @@ public class JSONMapEntityStoreMixin
     }
 
     @Override
-    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference identity )
+    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork,
+                                                   ModuleSpi module,
+                                                   EntityReference identity
+    )
     {
-        EntityState state = fetchCachedState( identity, (DefaultEntityStoreUnitOfWork) unitOfWork );
+        EntityState state = fetchCachedState( identity, module, unitOfWork.currentTime() );
         if( state != null )
         {
             return state;
         }
         // Get state
         Reader in = mapEntityStore.get( identity );
-        JSONEntityState loadedState = readEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, in );
-        if( doCacheOnRead( (DefaultEntityStoreUnitOfWork) unitOfWork ) )
+        JSONEntityState loadedState = readEntityState( module, in );
+        if( doCacheOnRead( unitOfWork ) )
         {
             cache.put( identity.identity(), new CacheState( loadedState.state() ) );
         }
@@ -197,7 +202,8 @@ public class JSONMapEntityStoreMixin
     }
 
     @Override
-    public StateCommitter applyChanges( final EntityStoreUnitOfWork unitOfWork, final Iterable<EntityState> state
+    public StateCommitter applyChanges( final EntityStoreUnitOfWork unitOfWork,
+                                        final Iterable<EntityState> state
     )
         throws EntityStoreException
     {
@@ -214,8 +220,7 @@ public class JSONMapEntityStoreMixin
                         public void visitMap( MapEntityStore.MapChanger changer )
                             throws IOException
                         {
-                            DefaultEntityStoreUnitOfWork uow = (DefaultEntityStoreUnitOfWork) unitOfWork;
-                            CacheOptions options = uow.usecase().metaInfo( CacheOptions.class );
+                            CacheOptions options = unitOfWork.usecase().metaInfo( CacheOptions.class );
                             if( options == null )
                             {
                                 options = CacheOptions.ALWAYS;
@@ -226,7 +231,7 @@ public class JSONMapEntityStoreMixin
                                 JSONEntityState state = (JSONEntityState) entityState;
                                 if( state.status().equals( EntityStatus.NEW ) )
                                 {
-                                    try( Writer writer = changer.newEntity( state.identity(), state.entityDescriptor() ) )
+                                    try (Writer writer = changer.newEntity( state.identity(), state.entityDescriptor() ))
                                     {
                                         writeEntityState( state, writer, unitOfWork.identity(), unitOfWork.currentTime() );
                                     }
@@ -237,7 +242,7 @@ public class JSONMapEntityStoreMixin
                                 }
                                 else if( state.status().equals( EntityStatus.UPDATED ) )
                                 {
-                                    try( Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ) )
+                                    try (Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ))
                                     {
                                         writeEntityState( state, writer, unitOfWork.identity(), unitOfWork.currentTime() );
                                     }
@@ -269,7 +274,7 @@ public class JSONMapEntityStoreMixin
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -283,20 +288,7 @@ public class JSONMapEntityStoreMixin
                     public <ReceiverThrowableType extends Throwable> void sendTo( final Receiver<? super EntityState, ReceiverThrowableType> receiver )
                         throws ReceiverThrowableType, EntityStoreException
                     {
-                        Usecase usecase = UsecaseBuilder
-                            .buildUsecase( "qi4j.entitystore.entitystates" )
-                            .withMetaInfo( CacheOptions.NEVER )
-                            .newUsecase();
-
-                        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork(
-                            entityStoreSpi,
-                            newUnitOfWorkId(),
-                            module,
-                            usecase,
-                            System.currentTimeMillis() );
-
                         final List<EntityState> migrated = new ArrayList<>();
-
                         try
                         {
                             mapEntityStore.entityStates().transferTo( new Output<Reader, ReceiverThrowableType>()
@@ -311,7 +303,7 @@ public class JSONMapEntityStoreMixin
                                         public void receive( Reader item )
                                             throws ReceiverThrowableType
                                         {
-                                            final EntityState entity = readEntityState( uow, item );
+                                            final EntityState entity = readEntityState( module, item );
                                             if( entity.status() == EntityStatus.UPDATED )
                                             {
                                                 migrated.add( entity );
@@ -370,7 +362,7 @@ public class JSONMapEntityStoreMixin
                 for( EntityState migratedEntity : migratedEntities )
                 {
                     JSONEntityState state = (JSONEntityState) migratedEntity;
-                    try( Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ) )
+                    try (Writer writer = changer.updateEntity( state.identity(), state.entityDescriptor() ))
                     {
                         writeEntityState( state, writer, state.version(), state.lastModified() );
                     }
@@ -401,12 +393,11 @@ public class JSONMapEntityStoreMixin
         }
     }
 
-    protected JSONEntityState readEntityState( DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState )
+    protected JSONEntityState readEntityState( ModuleSpi module, Reader entityState )
         throws EntityStoreException
     {
         try
         {
-            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -449,8 +440,7 @@ public class JSONMapEntityStoreMixin
                                                        ) );
             }
 
-            return new JSONEntityState( unitOfWork,
-                                        valueSerialization,
+            return new JSONEntityState( valueSerialization,
                                         version,
                                         modified,
                                         EntityReference.parseEntityReference( identity ),
@@ -469,7 +459,7 @@ public class JSONMapEntityStoreMixin
     public JSONObject jsonStateOf( String id )
         throws IOException
     {
-        try( Reader reader = mapEntityStore.get( EntityReference.parseEntityReference( id ) ) )
+        try (Reader reader = mapEntityStore.get( EntityReference.parseEntityReference( id ) ))
         {
             return new JSONObject( new JSONTokener( reader ) );
         }
@@ -479,7 +469,7 @@ public class JSONMapEntityStoreMixin
         }
     }
 
-    private EntityState fetchCachedState( EntityReference identity, DefaultEntityStoreUnitOfWork unitOfWork )
+    private EntityState fetchCachedState( EntityReference identity, ModuleSpi module, long currentTime )
     {
         CacheState cacheState = cache.get( identity.identity() );
         if( cacheState != null )
@@ -488,8 +478,8 @@ public class JSONMapEntityStoreMixin
             try
             {
                 String type = data.getString( JSONKeys.TYPE );
-                EntityDescriptor entityDescriptor = unitOfWork.module().entityDescriptor( type );
-                return new JSONEntityState( unitOfWork, valueSerialization, identity, entityDescriptor, data );
+                EntityDescriptor entityDescriptor = module.entityDescriptor( type );
+                return new JSONEntityState( currentTime, valueSerialization, identity, entityDescriptor, data );
             }
             catch( JSONException e )
             {
@@ -500,18 +490,18 @@ public class JSONMapEntityStoreMixin
         return null;
     }
 
-    private boolean doCacheOnRead( DefaultEntityStoreUnitOfWork unitOfWork )
+    private boolean doCacheOnRead( EntityStoreUnitOfWork unitOfWork )
     {
         CacheOptions cacheOptions = unitOfWork.usecase().metaInfo( CacheOptions.class );
         return cacheOptions == null || cacheOptions.cacheOnRead();
     }
 
-    private static class CacheState
+    public static class CacheState
         implements Externalizable
     {
         public JSONObject json;
 
-        private CacheState()
+        public CacheState()
         {
         }
 
@@ -541,5 +531,4 @@ public class JSONMapEntityStoreMixin
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
index a41b308..a2d02bc 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java
@@ -34,7 +34,6 @@ import org.json.JSONObject;
 import org.json.JSONTokener;
 import org.json.JSONWriter;
 import org.qi4j.api.association.AssociationDescriptor;
-import org.qi4j.api.cache.CacheOptions;
 import org.qi4j.api.common.Optional;
 import org.qi4j.api.common.QualifiedName;
 import org.qi4j.api.entity.EntityDescriptor;
@@ -47,11 +46,9 @@ import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.usecase.Usecase;
-import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.value.ValueSerialization;
 import org.qi4j.io.Input;
 import org.qi4j.io.Output;
@@ -65,6 +62,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.module.ModelModule;
 import org.qi4j.spi.module.ModuleSpi;
@@ -118,27 +116,33 @@ public class MapEntityStoreMixin
 
     // EntityStore
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecaseMetaInfo, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork =
+            new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), usecaseMetaInfo, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     // EntityStoreSPI
     @Override
     public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
                                        EntityReference identity,
                                        EntityDescriptor entityDescriptor
     )
     {
-        return new DefaultEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, identity, entityDescriptor );
+        return new DefaultEntityState( unitOfWork.currentTime(), identity, entityDescriptor );
     }
 
     @Override
-    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitofwork, EntityReference identity )
+    public synchronized EntityState entityStateOf( EntityStoreUnitOfWork unitofwork,
+                                                   ModuleSpi module,
+                                                   EntityReference identity
+    )
     {
-        DefaultEntityStoreUnitOfWork unitOfWork = (DefaultEntityStoreUnitOfWork) unitofwork;
         Reader in = mapEntityStore.get( identity );
-        return readEntityState( unitOfWork, in );
+        return readEntityState( module, in );
     }
 
     @Override
@@ -198,7 +202,7 @@ public class MapEntityStoreMixin
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -212,20 +216,7 @@ public class MapEntityStoreMixin
                     public <ReceiverThrowableType extends Throwable> void sendTo( final Receiver<? super EntityState, ReceiverThrowableType> receiver )
                         throws ReceiverThrowableType, EntityStoreException
                     {
-                        Usecase usecase = UsecaseBuilder
-                            .buildUsecase( "qi4j.entitystore.entitystates" )
-                            .withMetaInfo( CacheOptions.NEVER )
-                            .newUsecase();
-
-                        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork(
-                            entityStoreSpi,
-                            newUnitOfWorkId(),
-                            module,
-                            usecase,
-                            System.currentTimeMillis() );
-
                         final List<EntityState> migrated = new ArrayList<>();
-
                         try
                         {
                             mapEntityStore.entityStates().transferTo( new Output<Reader, ReceiverThrowableType>()
@@ -240,7 +231,7 @@ public class MapEntityStoreMixin
                                         public void receive( Reader item )
                                             throws ReceiverThrowableType
                                         {
-                                            final EntityState entity = readEntityState( uow, item );
+                                            final EntityState entity = readEntityState( module, item );
                                             if( entity.status() == EntityStatus.UPDATED )
                                             {
                                                 migrated.add( entity );
@@ -394,12 +385,11 @@ public class MapEntityStoreMixin
         }
     }
 
-    protected EntityState readEntityState( DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState )
+    protected EntityState readEntityState( ModuleSpi module, Reader entityState )
         throws EntityStoreException
     {
         try
         {
-            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -539,8 +529,7 @@ public class MapEntityStoreMixin
                 }
             }
 
-            return new DefaultEntityState( unitOfWork,
-                                           version,
+            return new DefaultEntityState( version,
                                            modified,
                                            EntityReference.parseEntityReference( identity ),
                                            status,

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
----------------------------------------------------------------------
diff --git a/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java b/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
index d0c3426..dba4b58 100644
--- a/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
+++ b/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java
@@ -45,7 +45,6 @@ public class JSONManyAssociationStateTest
         state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() );
         state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() );
         JSONEntityState entityState = new JSONEntityState( null,
-                                                           null,
                                                            "0",
                                                            System.currentTimeMillis(),
                                                            EntityReference.parseEntityReference( "123" ),
@@ -71,7 +70,6 @@ public class JSONManyAssociationStateTest
         state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() );
         state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() );
         JSONEntityState entityState = new JSONEntityState( null,
-                                                           null,
                                                            "0",
                                                            System.currentTimeMillis(),
                                                            EntityReference.parseEntityReference( "123" ),

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java b/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
index 7b7adbb..2ef0647 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/AbstractQi4jTest.java
@@ -16,13 +16,13 @@ package org.qi4j.test;
 
 import org.junit.After;
 import org.junit.Before;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.UnitOfWork;
 import org.qi4j.bootstrap.ApplicationAssembly;
 import org.qi4j.bootstrap.Assembler;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.LayerAssembly;
 import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Base class for Composite tests.
@@ -30,7 +30,7 @@ import org.qi4j.bootstrap.ModuleAssembly;
 public abstract class AbstractQi4jTest extends AbstractQi4jBaseTest
     implements Assembler
 {
-    protected Module module;
+    protected ModuleSpi module;
 
     @Before
     @Override
@@ -42,7 +42,7 @@ public abstract class AbstractQi4jTest extends AbstractQi4jBaseTest
         {
             return; // failure in Assembly.
         }
-        module = application.findModule( "Layer 1", "Module 1" );
+        module = (ModuleSpi) application.findModule( "Layer 1", "Module 1" );
         module.injectTo( this );
     }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java b/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
index 501b34b..ebc54a0 100644
--- a/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
+++ b/extensions/entitystore-hazelcast/src/main/java/org/qi4j/entitystore/hazelcast/HazelcastEntityStoreMixin.java
@@ -157,8 +157,8 @@ public class HazelcastEntityStoreMixin
                 output.receiveFrom( new Sender<Reader, IOException>()
                 {
                     @Override
-                    public <ReceiverThrowableType extends Throwable> void sendTo( Receiver<? super Reader, ReceiverThrowableType> receiver )
-                        throws ReceiverThrowableType, IOException
+                    public <RTT extends Throwable> void sendTo( Receiver<? super Reader, RTT> receiver )
+                        throws RTT, IOException
                     {
                         for( Map.Entry<String, String> eachEntry : stringMap.entrySet() )
                         {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java b/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
index 6017b80..b078d8d 100644
--- a/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
+++ b/extensions/entitystore-preferences/src/main/java/org/qi4j/entitystore/prefs/PreferencesEntityStoreMixin.java
@@ -43,7 +43,6 @@ import org.qi4j.api.service.ServiceActivation;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.CollectionType;
 import org.qi4j.api.type.EnumType;
 import org.qi4j.api.type.MapType;
@@ -67,6 +66,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
 import org.qi4j.spi.module.ModelModule;
@@ -174,13 +174,15 @@ public class PreferencesEntityStoreMixin
     }
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecase, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork = new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), usecase, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -196,18 +198,16 @@ public class PreferencesEntityStoreMixin
                     {
                         UsecaseBuilder builder = UsecaseBuilder.buildUsecase( "qi4j.entitystore.preferences.visit" );
                         Usecase visitUsecase = builder.withMetaInfo( CacheOptions.NEVER ).newUsecase();
-                        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork(
-                            entityStoreSpi,
-                            newUnitOfWorkId(),
-                            module,
-                            visitUsecase,
-                            System.currentTimeMillis() );
+                        final EntityStoreUnitOfWork uow =
+                            newUnitOfWork( visitUsecase, module, System.currentTimeMillis() );
+
                         try
                         {
                             String[] identities = root.childrenNames();
                             for( String identity : identities )
                             {
-                                EntityState entityState = uow.entityStateOf( EntityReference.parseEntityReference( identity ) );
+                                EntityReference reference = EntityReference.parseEntityReference( identity );
+                                EntityState entityState = uow.entityStateOf( module, reference );
                                 receiver.receive( entityState );
                             }
                         }
@@ -223,22 +223,19 @@ public class PreferencesEntityStoreMixin
 
     @Override
     public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
                                        EntityReference identity,
                                        EntityDescriptor entityDescriptor
     )
     {
-        return new DefaultEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork, identity, entityDescriptor );
+        return new DefaultEntityState( unitOfWork.currentTime(), identity, entityDescriptor );
     }
 
     @Override
-    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference identity )
+    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, ModuleSpi module, EntityReference identity )
     {
         try
         {
-            DefaultEntityStoreUnitOfWork desuw = (DefaultEntityStoreUnitOfWork) unitOfWork;
-
-            ModuleSpi module = (ModuleSpi) desuw.module();
-
             if( !root.nodeExists( identity.identity() ) )
             {
                 throw new NoSuchEntityException( identity, UnknownType.class );
@@ -443,8 +440,7 @@ public class PreferencesEntityStoreMixin
                 }
             }
 
-            return new DefaultEntityState( desuw,
-                                           entityPrefs.get( "version", "" ),
+            return new DefaultEntityState( entityPrefs.get( "version", "" ),
                                            entityPrefs.getLong( "modified", unitOfWork.currentTime() ),
                                            identity,
                                            status,
@@ -466,6 +462,7 @@ public class PreferencesEntityStoreMixin
     {
         return new StateCommitter()
         {
+            @SuppressWarnings( "SynchronizeOnNonFinalField" )
             @Override
             public void commit()
             {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java b/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
index ddeca7b..b57dcf0 100644
--- a/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
+++ b/extensions/entitystore-sql/src/main/java/org/qi4j/entitystore/sql/SQLEntityStoreMixin.java
@@ -48,7 +48,6 @@ import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.ServiceActivation;
 import org.qi4j.api.service.qualifier.Tagged;
 import org.qi4j.api.structure.Application;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.usecase.Usecase;
@@ -73,6 +72,7 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.entitystore.ModuleEntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
 import org.qi4j.spi.entitystore.helpers.JSONKeys;
@@ -237,31 +237,34 @@ public class SQLEntityStoreMixin
     }
 
     @Override
-    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, EntityReference entityRef )
+    public EntityState entityStateOf( EntityStoreUnitOfWork unitOfWork, ModuleSpi module, EntityReference entityRef )
     {
         EntityValueResult valueResult = getValue( entityRef );
-        return new DefaultSQLEntityState( readEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork,
-                                                           valueResult.getReader() ),
-                                          valueResult.getEntityPK(),
-                                          valueResult.getEntityOptimisticLock() );
+        DefaultEntityState state = readEntityState( module, valueResult.getReader() );
+        return new DefaultSQLEntityState( state, valueResult.getEntityPK(), valueResult.getEntityOptimisticLock() );
     }
 
     @Override
-    public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork, EntityReference entityRef, EntityDescriptor entityDescriptor )
+    public EntityState newEntityState( EntityStoreUnitOfWork unitOfWork,
+                                       ModuleSpi module,
+                                       EntityReference entityRef,
+                                       EntityDescriptor entityDescriptor
+    )
     {
-        return new DefaultSQLEntityState( new DefaultEntityState( (DefaultEntityStoreUnitOfWork) unitOfWork,
-                                                                  entityRef,
-                                                                  entityDescriptor ) );
+        return new DefaultSQLEntityState( new DefaultEntityState( unitOfWork.currentTime(), entityRef, entityDescriptor ) );
     }
 
     @Override
-    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime )
+    public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, ModuleSpi module, long currentTime )
     {
-        return new DefaultEntityStoreUnitOfWork( entityStoreSPI, newUnitOfWorkId(), module, usecase, currentTime );
+        EntityStoreUnitOfWork storeUnitOfWork =
+            new DefaultEntityStoreUnitOfWork( entityStoreSPI, newUnitOfWorkId(), usecase, currentTime );
+        storeUnitOfWork = new ModuleEntityStoreUnitOfWork( module, storeUnitOfWork );
+        return storeUnitOfWork;
     }
 
     @Override
-    public Input<EntityState, EntityStoreException> entityStates( final Module module )
+    public Input<EntityState, EntityStoreException> entityStates( final ModuleSpi module )
     {
         return new Input<EntityState, EntityStoreException>()
         {
@@ -298,16 +301,15 @@ public class SQLEntityStoreMixin
         };
     }
 
-    private void queryAllEntities( Module module, EntityStatesVisitor entityStatesVisitor )
+    private void queryAllEntities( ModuleSpi module, EntityStatesVisitor entityStatesVisitor )
     {
         Connection connection = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         UsecaseBuilder builder = UsecaseBuilder.buildUsecase( "qi4j.entitystore.sql.visit" );
         Usecase usecase = builder.withMetaInfo( CacheOptions.NEVER ).newUsecase();
-        final DefaultEntityStoreUnitOfWork uow = new DefaultEntityStoreUnitOfWork( entityStoreSPI,
-                                                                                   newUnitOfWorkId(), module, usecase,
-                                                                                   System.currentTimeMillis() );
+        final ModuleEntityStoreUnitOfWork uow =
+            (ModuleEntityStoreUnitOfWork) newUnitOfWork( usecase, module, System.currentTimeMillis() );
         try
         {
             connection = database.getConnection();
@@ -316,7 +318,7 @@ public class SQLEntityStoreMixin
             rs = ps.executeQuery();
             while( rs.next() )
             {
-                DefaultEntityState entityState = readEntityState( uow, database.getEntityValue( rs ).getReader() );
+                DefaultEntityState entityState = readEntityState( module, database.getEntityValue( rs ).getReader() );
                 if( !entityStatesVisitor.visit( entityState ) )
                 {
                     return;
@@ -345,12 +347,11 @@ public class SQLEntityStoreMixin
         return uuid + Integer.toHexString( count.incrementAndGet() );
     }
 
-    protected DefaultEntityState readEntityState( DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState )
+    protected DefaultEntityState readEntityState( ModuleSpi module, Reader entityState )
         throws EntityStoreException
     {
         try
         {
-            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -491,7 +492,7 @@ public class SQLEntityStoreMixin
                 }
             }
 
-            return new DefaultEntityState( unitOfWork, version, modified,
+            return new DefaultEntityState( version, modified,
                                            EntityReference.parseEntityReference( identity ), status, entityDescriptor,
                                            properties, associations, manyAssociations, namedAssociations );
         }
@@ -506,7 +507,7 @@ public class SQLEntityStoreMixin
         throws IOException
     {
         JSONObject jsonObject;
-        try( Reader reader = getValue( EntityReference.parseEntityReference( id ) ).getReader() )
+        try (Reader reader = getValue( EntityReference.parseEntityReference( id ) ).getReader())
         {
             jsonObject = new JSONObject( new JSONTokener( reader ) );
         }
@@ -532,10 +533,7 @@ public class SQLEntityStoreMixin
             {
                 throw new EntityNotFoundException( ref );
             }
-
-            EntityValueResult result = database.getEntityValue( rs );
-
-            return result;
+            return database.getEntityValue( rs );
         }
         catch( SQLException sqle )
         {
@@ -590,7 +588,8 @@ public class SQLEntityStoreMixin
             }
 
             JSONWriter associations = properties.endObject().key( JSONKeys.ASSOCIATIONS ).object();
-            for( Map.Entry<QualifiedName, EntityReference> stateNameEntityReferenceEntry : state.associations().entrySet() )
+            for( Map.Entry<QualifiedName, EntityReference> stateNameEntityReferenceEntry : state.associations()
+                .entrySet() )
             {
                 EntityReference value = stateNameEntityReferenceEntry.getValue();
                 associations.key( stateNameEntityReferenceEntry.getKey().name() ).
@@ -598,7 +597,8 @@ public class SQLEntityStoreMixin
             }
 
             JSONWriter manyAssociations = associations.endObject().key( JSONKeys.MANY_ASSOCIATIONS ).object();
-            for( Map.Entry<QualifiedName, List<EntityReference>> stateNameListEntry : state.manyAssociations().entrySet() )
+            for( Map.Entry<QualifiedName, List<EntityReference>> stateNameListEntry : state.manyAssociations()
+                .entrySet() )
             {
                 JSONWriter assocs = manyAssociations.key( stateNameListEntry.getKey().name() ).array();
                 for( EntityReference entityReference : stateNameListEntry.getValue() )
@@ -609,7 +609,8 @@ public class SQLEntityStoreMixin
             }
 
             JSONWriter namedAssociations = manyAssociations.endObject().key( JSONKeys.NAMED_ASSOCIATIONS ).object();
-            for( Map.Entry<QualifiedName, Map<String, EntityReference>> stateNameMapEntry : state.namedAssociations().entrySet() )
+            for( Map.Entry<QualifiedName, Map<String, EntityReference>> stateNameMapEntry : state.namedAssociations()
+                .entrySet() )
             {
                 JSONWriter assocs = namedAssociations.key( stateNameMapEntry.getKey().name() ).object();
                 for( Map.Entry<String, EntityReference> entry : stateNameMapEntry.getValue().entrySet() )
@@ -625,5 +626,4 @@ public class SQLEntityStoreMixin
             throw new EntityStoreException( "Could not store EntityState", e );
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
index 58172d5..329c8e5 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
@@ -34,7 +34,6 @@ import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.mixin.Mixins;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.qualifier.Tagged;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.usecase.UsecaseBuilder;
 import org.qi4j.api.util.Classes;
@@ -49,6 +48,7 @@ import org.qi4j.spi.entity.NamedAssociationState;
 import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateChangeListener;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,13 +67,17 @@ public interface ElasticSearchIndexer
     {
 
         private static final Logger LOGGER = LoggerFactory.getLogger( ElasticSearchIndexer.class );
+
         @Structure
-        private Module module;
+        private ModuleSpi module;
+
         @Service
         private EntityStore entityStore;
+
         @Service
         @Tagged( ValueSerialization.Formats.JSON )
         private ValueSerializer valueSerializer;
+
         @This
         private ElasticSearchSupport support;
 
@@ -111,27 +115,27 @@ public interface ElasticSearchIndexer
                 {
                     switch( changedState.status() )
                     {
-                        case REMOVED:
-                            LOGGER.trace( "Removing Entity State from Index: {}", changedState );
-                            remove( bulkBuilder, changedState.identity().identity() );
-                            break;
-                        case UPDATED:
-                            LOGGER.trace( "Updating Entity State in Index: {}", changedState );
-                            remove( bulkBuilder, changedState.identity().identity() );
-                            String updatedJson = toJSON( changedState, newStates, uow );
-                            LOGGER.trace( "Will index: {}", updatedJson );
-                            index( bulkBuilder, changedState.identity().identity(), updatedJson );
-                            break;
-                        case NEW:
-                            LOGGER.trace( "Creating Entity State in Index: {}", changedState );
-                            String newJson = toJSON( changedState, newStates, uow );
-                            LOGGER.trace( "Will index: {}", newJson );
-                            index( bulkBuilder, changedState.identity().identity(), newJson );
-                            break;
-                        case LOADED:
-                        default:
-                            // Ignored
-                            break;
+                    case REMOVED:
+                        LOGGER.trace( "Removing Entity State from Index: {}", changedState );
+                        remove( bulkBuilder, changedState.identity().identity() );
+                        break;
+                    case UPDATED:
+                        LOGGER.trace( "Updating Entity State in Index: {}", changedState );
+                        remove( bulkBuilder, changedState.identity().identity() );
+                        String updatedJson = toJSON( changedState, newStates, uow );
+                        LOGGER.trace( "Will index: {}", updatedJson );
+                        index( bulkBuilder, changedState.identity().identity(), updatedJson );
+                        break;
+                    case NEW:
+                        LOGGER.trace( "Creating Entity State in Index: {}", changedState );
+                        String newJson = toJSON( changedState, newStates, uow );
+                        LOGGER.trace( "Will index: {}", newJson );
+                        index( bulkBuilder, changedState.identity().identity(), newJson );
+                        break;
+                    case LOADED:
+                    default:
+                        // Ignored
+                        break;
                     }
                 }
             }
@@ -154,7 +158,6 @@ public interface ElasticSearchIndexer
 
                 // Refresh index
                 support.client().admin().indices().prepareRefresh( support.index() ).execute().actionGet();
-
             }
         }
 
@@ -190,7 +193,8 @@ public interface ElasticSearchIndexer
                 JSONObject json = new JSONObject();
 
                 json.put( "_identity", state.identity().identity() );
-                json.put( "_types", Iterables.toList( Iterables.map( Classes.toClassName(), state.entityDescriptor().mixinTypes() ) ) );
+                json.put( "_types", Iterables.toList( Iterables.map( Classes.toClassName(), state.entityDescriptor()
+                    .mixinTypes() ) ) );
 
                 EntityDescriptor entityType = state.entityDescriptor();
 
@@ -247,7 +251,8 @@ public interface ElasticSearchIndexer
                                 }
                                 else
                                 {
-                                    EntityState assocState = uow.entityStateOf( EntityReference.parseEntityReference( associated.identity() ) );
+                                    EntityReference reference = EntityReference.parseEntityReference( associated.identity() );
+                                    EntityState assocState = uow.entityStateOf( module, reference );
                                     value = new JSONObject( toJSON( assocState, newStates, uow ) );
                                 }
                             }
@@ -278,7 +283,8 @@ public interface ElasticSearchIndexer
                                 }
                                 else
                                 {
-                                    EntityState assocState = uow.entityStateOf( EntityReference.parseEntityReference( associated.identity() ) );
+                                    EntityReference reference = EntityReference.parseEntityReference( associated.identity() );
+                                    EntityState assocState = uow.entityStateOf( module, reference );
                                     array.put( new JSONObject( toJSON( assocState, newStates, uow ) ) );
                                 }
                             }
@@ -312,7 +318,8 @@ public interface ElasticSearchIndexer
                                 }
                                 else
                                 {
-                                    EntityState assocState = uow.entityStateOf( EntityReference.parseEntityReference( identity ) );
+                                    EntityReference reference = EntityReference.parseEntityReference( identity );
+                                    EntityState assocState = uow.entityStateOf( module, reference );
                                     JSONObject obj = new JSONObject( toJSON( assocState, newStates, uow ) );
                                     obj.put( "_named", name );
                                     array.put( obj );
@@ -338,5 +345,4 @@ public interface ElasticSearchIndexer
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/c8c3286c/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java b/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
index f2a03ff..444aa17 100644
--- a/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
+++ b/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/indexing/RdfIndexingService.java
@@ -86,7 +86,7 @@ public interface RdfIndexingService
         @Override
         public void initialize()
         {
-            indexedEntityTypes = new HashSet<EntityDescriptor>();
+            indexedEntityTypes = new HashSet<>();
         }
 
         @Override