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 10:13:49 UTC

[1/6] zest-qi4j git commit: Introduced ModuleSpi interface as an injectable entry point for primarily extensions. Reduced ModuleInstance use to ModuleSpi as much as possible. Provided a lot more information in EntityTypeNotFoundException, about which en

Repository: zest-qi4j
Updated Branches:
  refs/heads/develop 4f2a0b0bc -> 0189ec78f


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 4919860..886fb97 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
@@ -42,7 +42,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.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
@@ -53,9 +52,12 @@ import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.metrics.DefaultMetric;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.COMPLETED;
 import static org.qi4j.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.DISCARDED;
+import static org.qi4j.functional.Iterables.map;
 
 public final class UnitOfWorkInstance
 {
@@ -136,7 +138,7 @@ public final class UnitOfWorkInstance
             // Check if this is a root UoW, or if no parent UoW knows about this entity
             EntityState entityState = null;
             EntityModel model = null;
-            ModuleInstance module = null;
+            ModuleSpi module = null;
             // Figure out what EntityStore to use
             for( ModelModule<EntityModel> potentialModel : potentialModels )
             {
@@ -166,7 +168,11 @@ public final class UnitOfWorkInstance
                 }
                 else
                 {
-                    throw new EntityTypeNotFoundException( mixinType.getName() );
+                    throw new EntityTypeNotFoundException( mixinType.getName(),
+                                                           module.name(),
+                                                           map( ModelModule.toStringFunction,
+                                                                module.findVisibleEntityTypes()
+                                                           ) );
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
index 0d70463..6bd6eeb 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderInstance.java
@@ -19,7 +19,7 @@ import org.qi4j.api.composite.Composite;
 import org.qi4j.api.value.NoSuchValueException;
 import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.runtime.composite.StateResolver;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 import static org.qi4j.functional.Iterables.first;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
index 5b6352a..b6f3e98 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
@@ -37,7 +37,7 @@ import org.qi4j.runtime.composite.MixinsModel;
 import org.qi4j.runtime.composite.StateResolver;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.injection.InjectionContext;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 /**

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
index ec1f7b3..b76ea26 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithState.java
@@ -17,7 +17,7 @@ import org.qi4j.api.association.AssociationStateHolder;
 import org.qi4j.api.common.ConstructionException;
 import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.runtime.composite.StateResolver;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 public class ValueBuilderWithState<T> implements ValueBuilder<T>

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
index ae8a4ab..fc7c95e 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
@@ -25,7 +25,7 @@ import org.qi4j.runtime.composite.MixinsInstance;
 import org.qi4j.runtime.composite.TransientInstance;
 import org.qi4j.runtime.property.PropertyInstance;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * ValueComposite instance
@@ -40,9 +40,10 @@ public final class ValueInstance
     }
 
     public ValueInstance( ValueModel compositeModel,
-                          ModuleInstance moduleInstance,
+                          ModuleSpi moduleInstance,
                           Object[] mixins,
-                          ValueStateInstance state )
+                          ValueStateInstance state
+    )
     {
         super( compositeModel, moduleInstance, mixins, state );
     }
@@ -50,11 +51,12 @@ public final class ValueInstance
     /**
      * Perform equals with {@code o} argument.
      * <p>
-     *     The definition of equals() for the Value is that if both the state and descriptor are equal,
-     *     then the values are equal.
+     * The definition of equals() for the Value is that if both the state and descriptor are equal,
+     * then the values are equal.
      * </p>
      *
      * @param o The other object to compare.
+     *
      * @return Returns a {@code boolean} indicator whether this object is equals the other.
      */
     @Override
@@ -106,7 +108,7 @@ public final class ValueInstance
         for( PropertyModel propertyDescriptor : descriptor().state().properties() )
         {
             PropertyInstance<Object> propertyInstance =
-                                     (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() );
+                (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() );
 
             propertyInstance.prepareToBuild( propertyDescriptor );
         }
@@ -133,7 +135,7 @@ public final class ValueInstance
         for( PropertyModel propertyDescriptor : descriptor().state().properties() )
         {
             PropertyInstance<Object> propertyInstance =
-                                     (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() );
+                (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() );
             propertyInstance.prepareBuilderState( propertyDescriptor );
         }
 
@@ -163,6 +165,6 @@ public final class ValueInstance
     @Override
     public String toString()
     {
-        return module().valueSerialization().serialize( this.<ValueComposite>proxy() );
+        return ( (ModuleSpi) module() ).valueSerialization().serialize( this.<ValueComposite>proxy() );
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
index 4904aae..0efe6f5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
@@ -28,8 +28,8 @@ import org.qi4j.runtime.composite.MixinsModel;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.injection.InjectionContext;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Model for ValueComposites
@@ -90,7 +90,7 @@ public final class ValueModel
         }
     }
 
-    public ValueInstance newValueInstance( ModuleInstance moduleInstance,
+    public ValueInstance newValueInstance( ModuleSpi moduleInstance,
                                            ValueStateInstance state
     )
     {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
index 68dd5c7..ad5b5f2 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
@@ -39,7 +39,7 @@ import org.qi4j.runtime.composite.StateResolver;
 import org.qi4j.runtime.property.PropertyInfo;
 import org.qi4j.runtime.property.PropertyInstance;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleInstance;
 
 /**

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java b/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
index cff2507..cfd82b2 100644
--- a/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
+++ b/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
@@ -21,11 +21,18 @@ import org.qi4j.api.association.AssociationStateHolder;
 import org.qi4j.api.association.ManyAssociation;
 import org.qi4j.api.association.NamedAssociation;
 import org.qi4j.api.composite.TransientComposite;
+import org.qi4j.api.composite.TransientDescriptor;
 import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.object.ObjectDescriptor;
 import org.qi4j.api.property.StateHolder;
+import org.qi4j.api.service.ServiceDescriptor;
+import org.qi4j.api.structure.Module;
 import org.qi4j.api.value.ValueComposite;
+import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.module.ModelModule;
 
 /**
  * Encapsulation of the Qi4j SPI. This is implemented by the runtime.

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 21d641a..7cbb88b 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
@@ -51,6 +51,7 @@ import org.qi4j.io.Input;
 import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.cache.Cache;
 import org.qi4j.spi.cache.CachePool;
 import org.qi4j.spi.cache.NullCache;
@@ -62,8 +63,11 @@ import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * Implementation of EntityStore that works with an implementation of MapEntityStore.
@@ -83,6 +87,9 @@ public class JSONMapEntityStoreMixin
     private EntityStoreSPI entityStoreSpi;
 
     @Structure
+    private Qi4jSPI spi;
+
+    @Structure
     private Application application;
 
     @Service
@@ -399,7 +406,7 @@ public class JSONMapEntityStoreMixin
     {
         try
         {
-            Module module = unitOfWork.module();
+            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -435,7 +442,11 @@ public class JSONMapEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type );
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( ModelModule.toStringFunction,
+                                                            module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             return new JSONEntityState( unitOfWork,

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 0e91b0a..a41b308 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
@@ -57,6 +57,7 @@ import org.qi4j.io.Input;
 import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
@@ -65,8 +66,11 @@ import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * Implementation of EntityStore that works with an implementation of MapEntityStore.
@@ -86,6 +90,9 @@ public class MapEntityStoreMixin
     private EntityStoreSPI entityStoreSpi;
 
     @Structure
+    private Qi4jSPI spi;
+
+    @Structure
     private Application application;
 
     @Service
@@ -157,14 +164,14 @@ public class MapEntityStoreMixin
                                 DefaultEntityState state = (DefaultEntityState) 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() );
                                     }
                                 }
                                 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() );
                                     }
@@ -292,7 +299,7 @@ public class MapEntityStoreMixin
                 for( EntityState migratedEntity : migratedEntities )
                 {
                     DefaultEntityState state = (DefaultEntityState) 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() );
                     }
@@ -348,7 +355,8 @@ public class MapEntityStoreMixin
             }
 
             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() ).
@@ -356,7 +364,8 @@ public class MapEntityStoreMixin
             }
 
             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() )
@@ -367,7 +376,8 @@ public class MapEntityStoreMixin
             }
 
             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> namedRef : stateNameMapEntry.getValue().entrySet() )
@@ -389,7 +399,7 @@ public class MapEntityStoreMixin
     {
         try
         {
-            Module module = unitOfWork.module();
+            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -419,7 +429,11 @@ public class MapEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type );
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( ModelModule.toStringFunction,
+                                                            module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             Map<QualifiedName, Object> properties = new HashMap<>();
@@ -548,7 +562,7 @@ public class MapEntityStoreMixin
         throws IOException
     {
         JSONObject jsonObject;
-        try( Reader reader = mapEntityStore.get( EntityReference.parseEntityReference( id ) ) )
+        try (Reader reader = mapEntityStore.get( EntityReference.parseEntityReference( id ) ))
         {
             jsonObject = new JSONObject( new JSONTokener( reader ) );
         }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java b/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java
new file mode 100644
index 0000000..4d7d37e
--- /dev/null
+++ b/core/spi/src/main/java/org/qi4j/spi/module/ModelModule.java
@@ -0,0 +1,124 @@
+/*
+ * 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.qi4j.spi.module;
+
+import org.qi4j.api.composite.ModelDescriptor;
+import org.qi4j.functional.Function;
+import org.qi4j.spi.Qi4jSPI;
+
+import static org.qi4j.functional.Iterables.map;
+
+/**
+ * TODO
+ */
+public class ModelModule<T extends ModelDescriptor>
+{
+
+    public static Function<?, String> toStringFunction = new Function<ModelModule<?>, String>()
+    {
+        @Override
+        public String map( ModelModule item )
+        {
+            return item.model()
+                       .types()
+                       .iterator()
+                       .next()
+                       .getName() + "[" + item.module().name() + "]";
+        }
+    };
+
+    public static <T extends ModelDescriptor> Function<T, ModelModule<T>> modelModuleFunction( final ModuleSpi module )
+    {
+        return new Function<T, ModelModule<T>>()
+        {
+            @Override
+            public ModelModule<T> map( T model )
+            {
+                return new ModelModule<>( module, model );
+            }
+        };
+    }
+
+    public static <T extends ModelDescriptor> Function<ModelModule<T>, T> modelFunction()
+    {
+        return new Function<ModelModule<T>, T>()
+        {
+            @Override
+            public T map( ModelModule<T> modelModule )
+            {
+                return modelModule.model();
+            }
+        };
+    }
+
+    private final ModuleSpi module;
+    private final T model;
+
+    public ModelModule( ModuleSpi module, T model )
+    {
+        this.module = module;
+        this.model = model;
+    }
+
+    public ModuleSpi module()
+    {
+        return module;
+    }
+
+    public T model()
+    {
+        return model;
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if( this == o )
+        {
+            return true;
+        }
+        if( o == null || getClass() != o.getClass() )
+        {
+            return false;
+        }
+
+        ModelModule that = (ModelModule) o;
+
+        if( model != null ? !model.equals( that.model ) : that.model != null )
+        {
+            return false;
+        }
+
+        return !( module != null ? !module.equals( that.module ) : that.module != null );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int result = module != null ? module.hashCode() : 0;
+        result = 31 * result + ( model != null ? model.hashCode() : 0 );
+        return result;
+    }
+
+    @Override
+    public String toString()
+    {
+        return module.name() + ":" + model;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java b/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java
new file mode 100644
index 0000000..6555cdf
--- /dev/null
+++ b/core/spi/src/main/java/org/qi4j/spi/module/ModuleSpi.java
@@ -0,0 +1,30 @@
+package org.qi4j.spi.module;
+
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.IdentityGenerator;
+import org.qi4j.api.object.ObjectDescriptor;
+import org.qi4j.api.service.ServiceDescriptor;
+import org.qi4j.api.structure.Module;
+import org.qi4j.api.value.ValueDescriptor;
+import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.spi.entitystore.EntityStore;
+
+public interface ModuleSpi extends Module
+{
+    EntityStore entityStore();
+
+    IdentityGenerator identityGenerator();
+
+    ValueSerialization valueSerialization();
+
+    Iterable<ModelModule<EntityDescriptor>> findVisibleEntityTypes();
+
+    Iterable<ModelModule<ValueDescriptor>> findVisibleValueTypes();
+
+    Iterable<ModelModule<TransientDescriptor>> findVisibleTransientTypes();
+
+    Iterable<ModelModule<ObjectDescriptor>> findVisibleObjectTypes();
+
+    Iterable<ModelModule<ServiceDescriptor>> findVisibleServiceTypes();
+}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 ed48871..6017b80 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
@@ -59,6 +59,7 @@ import org.qi4j.io.Input;
 import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
@@ -68,10 +69,13 @@ import org.qi4j.spi.entitystore.EntityStoreSPI;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.entitystore.StateCommitter;
 import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * Implementation of EntityStore that is backed by the Preferences API.
@@ -87,6 +91,9 @@ import static org.qi4j.functional.Iterables.first;
 public class PreferencesEntityStoreMixin
     implements ServiceActivation, EntityStore, EntityStoreSPI
 {
+    @Structure
+    private Qi4jSPI spi;
+
     @This
     private EntityStoreSPI entityStoreSpi;
 
@@ -230,7 +237,7 @@ public class PreferencesEntityStoreMixin
         {
             DefaultEntityStoreUnitOfWork desuw = (DefaultEntityStoreUnitOfWork) unitOfWork;
 
-            Module module = desuw.module();
+            ModuleSpi module = (ModuleSpi) desuw.module();
 
             if( !root.nodeExists( identity.identity() ) )
             {
@@ -245,7 +252,11 @@ public class PreferencesEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type );
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( ModelModule.toStringFunction,
+                                                            module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             Map<QualifiedName, Object> properties = new HashMap<>();
@@ -424,8 +435,8 @@ public class PreferencesEntityStoreMixin
                     }
                     for( int idx = 0; idx < namedRefs.length; idx += 2 )
                     {
-                        String name = namedRefs[idx];
-                        String ref = namedRefs[idx + 1];
+                        String name = namedRefs[ idx ];
+                        String ref = namedRefs[ idx + 1 ];
                         references.put( name, EntityReference.parseEntityReference( ref ) );
                     }
                     namedAssociations.put( namedAssociationType.qualifiedName(), references );
@@ -595,7 +606,8 @@ public class PreferencesEntityStoreMixin
             if( !state.manyAssociations().isEmpty() )
             {
                 Preferences manyAssocsPrefs = entityPrefs.node( "manyassociations" );
-                for( Map.Entry<QualifiedName, List<EntityReference>> manyAssociation : state.manyAssociations().entrySet() )
+                for( Map.Entry<QualifiedName, List<EntityReference>> manyAssociation : state.manyAssociations()
+                    .entrySet() )
                 {
                     StringBuilder manyAssocs = new StringBuilder();
                     for( EntityReference entityReference : manyAssociation.getValue() )
@@ -617,7 +629,8 @@ public class PreferencesEntityStoreMixin
             if( !state.namedAssociations().isEmpty() )
             {
                 Preferences namedAssocsPrefs = entityPrefs.node( "namedassociations" );
-                for( Map.Entry<QualifiedName, Map<String, EntityReference>> namedAssociation : state.namedAssociations().entrySet() )
+                for( Map.Entry<QualifiedName, Map<String, EntityReference>> namedAssociation : state.namedAssociations()
+                    .entrySet() )
                 {
                     StringBuilder namedAssocs = new StringBuilder();
                     for( Map.Entry<String, EntityReference> namedRef : namedAssociation.getValue().entrySet() )
@@ -702,5 +715,4 @@ public class PreferencesEntityStoreMixin
     private static class UnknownType
     {
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 8ba2aac..ddeca7b 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
@@ -64,6 +64,7 @@ import org.qi4j.io.Output;
 import org.qi4j.io.Receiver;
 import org.qi4j.io.Sender;
 import org.qi4j.library.sql.common.SQLUtil;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entitystore.DefaultEntityStoreUnitOfWork;
@@ -77,10 +78,13 @@ import org.qi4j.spi.entitystore.helpers.DefaultEntityState;
 import org.qi4j.spi.entitystore.helpers.JSONKeys;
 import org.qi4j.spi.entitystore.helpers.Migration;
 import org.qi4j.spi.entitystore.helpers.StateStore;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * SQL EntityStore core Mixin.
@@ -103,6 +107,9 @@ public class SQLEntityStoreMixin
     private EntityStoreSPI entityStoreSPI;
 
     @Structure
+    private Qi4jSPI spi;
+
+    @Structure
     private Application application;
 
     @Service
@@ -343,7 +350,7 @@ public class SQLEntityStoreMixin
     {
         try
         {
-            Module module = unitOfWork.module();
+            ModuleSpi module = (ModuleSpi) unitOfWork.module();
             JSONObject jsonObject = new JSONObject( new JSONTokener( entityState ) );
             EntityStatus status = EntityStatus.LOADED;
 
@@ -377,7 +384,11 @@ public class SQLEntityStoreMixin
             EntityDescriptor entityDescriptor = module.entityDescriptor( type );
             if( entityDescriptor == null )
             {
-                throw new EntityTypeNotFoundException( type );
+                throw new EntityTypeNotFoundException( type,
+                                                       module.name(),
+                                                       map( ModelModule.toStringFunction,
+                                                            module.findVisibleEntityTypes()
+                                                       ) );
             }
 
             Map<QualifiedName, Object> properties = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
----------------------------------------------------------------------
diff --git a/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java b/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
index b5d91bb..7bfc17d 100644
--- a/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
+++ b/libraries/conversion/src/main/java/org/qi4j/library/conversion/values/ValueToEntityMixin.java
@@ -35,7 +35,6 @@ import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.entity.Identity;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.property.PropertyDescriptor;
-import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.unitofwork.NoSuchEntityException;
 import org.qi4j.api.value.ValueComposite;
@@ -43,7 +42,10 @@ import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Iterables;
 import org.qi4j.spi.Qi4jSPI;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 
+import static org.qi4j.functional.Iterables.map;
 import static org.qi4j.library.conversion.values.Shared.STRING_COLLECTION_TYPE_SPEC;
 import static org.qi4j.library.conversion.values.Shared.STRING_MAP_TYPE_SPEC;
 import static org.qi4j.library.conversion.values.Shared.STRING_TYPE_SPEC;
@@ -144,7 +146,7 @@ public class ValueToEntityMixin
     private Qi4jSPI spi;
 
     @Structure
-    private Module module;
+    private ModuleSpi module;
 
     @Override
     public <T> T create( Class<T> entityType, Object value )
@@ -193,7 +195,8 @@ public class ValueToEntityMixin
     @Override
     public <T> Iterable<T> create( final Class<T> entityType,
                                    final Iterable<Object> values,
-                                   final Function<T, T> prototypeOpportunity )
+                                   final Function<T, T> prototypeOpportunity
+    )
     {
         return Iterables.map(
             new Function<Object, T>()
@@ -213,7 +216,11 @@ public class ValueToEntityMixin
         EntityDescriptor eDesc = module.entityDescriptor( entityType.getName() );
         if( eDesc == null )
         {
-            throw new EntityTypeNotFoundException( entityType.getName() );
+            throw new EntityTypeNotFoundException( entityType.getName(),
+                                                   module.name(),
+                                                   map( ModelModule.toStringFunction,
+                                                        module.findVisibleEntityTypes()
+                                                   ) );
         }
 
         ValueComposite vComposite = (ValueComposite) value;
@@ -237,118 +244,118 @@ public class ValueToEntityMixin
     {
         Function<PropertyDescriptor, Object> props
             = new Function<PropertyDescriptor, Object>()
+        {
+            @Override
+            public Object map( PropertyDescriptor ePropDesc )
             {
-                @Override
-                public Object map( PropertyDescriptor ePropDesc )
+                try
                 {
-                    try
-                    {
-                        return vState.propertyFor( ePropDesc.accessor() ).get();
-                    }
-                    catch( IllegalArgumentException propNotFoundOnValue )
-                    {
-                        // Property not found
-                        return null;
-                    }
+                    return vState.propertyFor( ePropDesc.accessor() ).get();
                 }
-            };
+                catch( IllegalArgumentException propNotFoundOnValue )
+                {
+                    // Property not found
+                    return null;
+                }
+            }
+        };
         Function<AssociationDescriptor, EntityReference> assocs
             = new Function<AssociationDescriptor, EntityReference>()
+        {
+            @Override
+            public EntityReference map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public EntityReference map( AssociationDescriptor eAssocDesc )
+                try
+                {
+                    return EntityReference.entityReferenceFor( vState.associationFor( eAssocDesc.accessor() ) );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
                 {
+                    // Find String Property and convert to Association
+                    String propName = eAssocDesc.qualifiedName().name();
                     try
                     {
-                        return EntityReference.entityReferenceFor( vState.associationFor( eAssocDesc.accessor() ) );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find String Property and convert to Association
-                        String propName = eAssocDesc.qualifiedName().name();
-                        try
-                        {
-                            PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
-                            if( STRING_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
-                            {
-                                String assocState = (String) vState.propertyFor( vPropDesc.accessor() ).get();
-                                return EntityReference.parseEntityReference( assocState );
-                            }
-                            return null;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
+                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
+                        if( STRING_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
                         {
-                            return null;
+                            String assocState = (String) vState.propertyFor( vPropDesc.accessor() ).get();
+                            return EntityReference.parseEntityReference( assocState );
                         }
+                        return null;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return null;
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocs
             = new Function<AssociationDescriptor, Iterable<EntityReference>>()
+        {
+            @Override
+            public Iterable<EntityReference> map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public Iterable<EntityReference> map( AssociationDescriptor eAssocDesc )
+                try
                 {
+                    ManyAssociation<Object> vAssocState = vState.manyAssociationFor( eAssocDesc.accessor() );
+                    return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Find Collection<String> Property and convert to ManyAssociation
+                    String propName = eAssocDesc.qualifiedName().name();
                     try
                     {
-                        ManyAssociation<Object> vAssocState = vState.manyAssociationFor( eAssocDesc.accessor() );
-                        return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find Collection<String> Property and convert to ManyAssociation
-                        String propName = eAssocDesc.qualifiedName().name();
-                        try
+                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
+                        if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
-                            if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
-                            {
-                                Collection<String> vAssocState = (Collection) vState
+                            Collection<String> vAssocState = (Collection) vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
-                            }
-                            return Iterables.empty();
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Iterables.empty();
+                            return STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
                         }
+                        return Iterables.empty();
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Iterables.empty();
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocs
             = new Function<AssociationDescriptor, Map<String, EntityReference>>()
+        {
+            @Override
+            public Map<String, EntityReference> map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public Map<String, EntityReference> map( AssociationDescriptor eAssocDesc )
+                try
                 {
+                    NamedAssociation<?> vAssocState = vState.namedAssociationFor( eAssocDesc.accessor() );
+                    return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Find Map<String,String> Property and convert to NamedAssociation
+                    String propName = eAssocDesc.qualifiedName().name();
                     try
                     {
-                        NamedAssociation<?> vAssocState = vState.namedAssociationFor( eAssocDesc.accessor() );
-                        return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find Map<String,String> Property and convert to NamedAssociation
-                        String propName = eAssocDesc.qualifiedName().name();
-                        try
+                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
+                        if( STRING_MAP_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
-                            if( STRING_MAP_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
-                            {
-                                Map<String, String> vAssocState = (Map) vState
+                            Map<String, String> vAssocState = (Map) vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return STRING_MAP_TO_ENTITY_REF_MAP.map( vAssocState );
-                            }
-                            return Collections.EMPTY_MAP;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Collections.EMPTY_MAP;
+                            return STRING_MAP_TO_ENTITY_REF_MAP.map( vAssocState );
                         }
+                        return Collections.EMPTY_MAP;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Collections.EMPTY_MAP;
                     }
                 }
-            };
+            }
+        };
         return module.currentUnitOfWork().newEntityBuilderWithState(
             entityType, identity, props, assocs, manyAssocs, namedAssocs
         );
@@ -361,124 +368,124 @@ public class ValueToEntityMixin
     {
         Function<PropertyDescriptor, Object> props
             = new Function<PropertyDescriptor, Object>()
+        {
+            @Override
+            public Object map( PropertyDescriptor ePropDesc )
             {
-                @Override
-                public Object map( PropertyDescriptor ePropDesc )
+                String propName = ePropDesc.qualifiedName().name();
+                try
                 {
-                    String propName = ePropDesc.qualifiedName().name();
-                    try
-                    {
-                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
-                        return vState.propertyFor( vPropDesc.accessor() ).get();
-                    }
-                    catch( IllegalArgumentException propNotFoundOnValue )
-                    {
-                        // Property not found on Value
-                        return null;
-                    }
+                    PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( propName );
+                    return vState.propertyFor( vPropDesc.accessor() ).get();
                 }
-            };
+                catch( IllegalArgumentException propNotFoundOnValue )
+                {
+                    // Property not found on Value
+                    return null;
+                }
+            }
+        };
         Function<AssociationDescriptor, EntityReference> assocs
             = new Function<AssociationDescriptor, EntityReference>()
+        {
+            @Override
+            public EntityReference map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public EntityReference map( AssociationDescriptor eAssocDesc )
+                String assocName = eAssocDesc.qualifiedName().name();
+                try
                 {
-                    String assocName = eAssocDesc.qualifiedName().name();
+                    AssociationDescriptor vAssocDesc = vStateDesc.getAssociationByName( assocName );
+                    Object assocEntity = vState.associationFor( vAssocDesc.accessor() ).get();
+                    return assocEntity == null ? null : EntityReference.entityReferenceFor( assocEntity );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Association not found on Value, find Property<String> and convert to Association
                     try
                     {
-                        AssociationDescriptor vAssocDesc = vStateDesc.getAssociationByName( assocName );
-                        Object assocEntity = vState.associationFor( vAssocDesc.accessor() ).get();
-                        return assocEntity == null ? null : EntityReference.entityReferenceFor( assocEntity );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Association not found on Value, find Property<String> and convert to Association
-                        try
-                        {
-                            PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( assocName );
-                            if( STRING_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
-                            {
-                                String assocId = (String) vState.propertyFor( vPropDesc.accessor() ).get();
-                                return assocId == null ? null : EntityReference.parseEntityReference( assocId );
-                            }
-                            return null;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
+                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( assocName );
+                        if( STRING_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
                         {
-                            return null;
+                            String assocId = (String) vState.propertyFor( vPropDesc.accessor() ).get();
+                            return assocId == null ? null : EntityReference.parseEntityReference( assocId );
                         }
+                        return null;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return null;
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocs
             = new Function<AssociationDescriptor, Iterable<EntityReference>>()
+        {
+            @Override
+            public Iterable<EntityReference> map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public Iterable<EntityReference> map( AssociationDescriptor eAssocDesc )
+                String assocName = eAssocDesc.qualifiedName().name();
+                try
                 {
-                    String assocName = eAssocDesc.qualifiedName().name();
+                    AssociationDescriptor vAssocDesc = vStateDesc.getManyAssociationByName( assocName );
+                    ManyAssociation<Object> vManyAssoc = vState.manyAssociationFor( vAssocDesc.accessor() );
+                    return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( vManyAssoc );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // ManyAssociation not found on Value, find List<String> and convert to ManyAssociation
                     try
                     {
-                        AssociationDescriptor vAssocDesc = vStateDesc.getManyAssociationByName( assocName );
-                        ManyAssociation<Object> vManyAssoc = vState.manyAssociationFor( vAssocDesc.accessor() );
-                        return MANY_ASSOC_TO_ENTITY_REF_ITERABLE.map( vManyAssoc );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // ManyAssociation not found on Value, find List<String> and convert to ManyAssociation
-                        try
+                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( assocName );
+                        if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( assocName );
-                            if( STRING_COLLECTION_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
-                            {
-                                Collection<String> vAssocState = (Collection) vState
+                            Collection<String> vAssocState = (Collection) vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
-                            }
-                            return Iterables.empty();
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Iterables.empty();
+                            return STRING_COLLEC_TO_ENTITY_REF_ITERABLE.map( vAssocState );
                         }
+                        return Iterables.empty();
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Iterables.empty();
                     }
                 }
-            };
+            }
+        };
         Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocs
             = new Function<AssociationDescriptor, Map<String, EntityReference>>()
+        {
+            @Override
+            public Map<String, EntityReference> map( AssociationDescriptor eAssocDesc )
             {
-                @Override
-                public Map<String, EntityReference> map( AssociationDescriptor eAssocDesc )
+                String assocName = eAssocDesc.qualifiedName().name();
+                try
                 {
-                    String assocName = eAssocDesc.qualifiedName().name();
+                    AssociationDescriptor vAssocDesc = vStateDesc.getNamedAssociationByName( assocName );
+                    NamedAssociation<Object> vAssocState = vState.namedAssociationFor( vAssocDesc.accessor() );
+                    return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState );
+                }
+                catch( IllegalArgumentException assocNotFoundOnValue )
+                {
+                    // Find Map<String,String> Property and convert to NamedAssociation
                     try
                     {
-                        AssociationDescriptor vAssocDesc = vStateDesc.getNamedAssociationByName( assocName );
-                        NamedAssociation<Object> vAssocState = vState.namedAssociationFor( vAssocDesc.accessor() );
-                        return NAMED_ASSOC_TO_ENTITY_REF_MAP.map( vAssocState );
-                    }
-                    catch( IllegalArgumentException assocNotFoundOnValue )
-                    {
-                        // Find Map<String,String> Property and convert to NamedAssociation
-                        try
+                        PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( assocName );
+                        if( STRING_MAP_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
                         {
-                            PropertyDescriptor vPropDesc = vStateDesc.findPropertyModelByName( assocName );
-                            if( STRING_MAP_TYPE_SPEC.satisfiedBy( vPropDesc.valueType() ) )
-                            {
-                                Map<String, String> vAssocState = (Map) vState
+                            Map<String, String> vAssocState = (Map) vState
                                 .propertyFor( vPropDesc.accessor() ).get();
-                                return STRING_MAP_TO_ENTITY_REF_MAP.map( vAssocState );
-                            }
-                            return Collections.EMPTY_MAP;
-                        }
-                        catch( IllegalArgumentException propNotFoundOnValue )
-                        {
-                            return Collections.EMPTY_MAP;
+                            return STRING_MAP_TO_ENTITY_REF_MAP.map( vAssocState );
                         }
+                        return Collections.EMPTY_MAP;
+                    }
+                    catch( IllegalArgumentException propNotFoundOnValue )
+                    {
+                        return Collections.EMPTY_MAP;
                     }
                 }
-            };
+            }
+        };
         return module.currentUnitOfWork().newEntityBuilderWithState(
             entityType, identity, props, assocs, manyAssocs, namedAssocs
         );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
index 5052055..14df2ee 100644
--- a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
+++ b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/Scheduler.java
@@ -32,15 +32,24 @@ import static org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation.Propagation.
 
 /**
  * Scheduler.
- *
+ * <p>
  * This is the only interface you should use in your application for scheduling tasks.
- *
+ * </p>
+ * <p>
  * See {@link SchedulerConfiguration} for configuration properties.
+ * </p>
+ * <p>
  * See in {@link SchedulerAssembler} how to assemble a {@link Scheduler} and optional {@link Timeline}.
- *
+ * </p>
+ * <p>
  * By default, a {@link Schedule} is not durable. In other words, it do not survive an {@link Application} restart.
+ * </p>
+ * <p>
  * To make a {@link Schedule} durable, set it's durable property to true once its scheduled.
+ * </p>
+ * <p>
  * Durable {@link Schedule}s that have no future run are removed by {@code SchedulerGarbageCollector} (not implemented?).
+ * </p>
  */
 @Concerns( UnitOfWorkConcern.class )
 public interface Scheduler


[4/6] zest-qi4j git commit: Merge remote-tracking branch 'origin/develop' into develop

Posted by ni...@apache.org.
Merge remote-tracking branch 'origin/develop' into develop


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

Branch: refs/heads/develop
Commit: 8630305f0c3af818bc8c35a06b1946c21bb77cbc
Parents: 205cbe9 ac7d88a
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 24 22:51:55 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 24 22:51:55 2015 +0800

----------------------------------------------------------------------
 README.txt                                      |  40 ++--
 build.gradle                                    | 193 ++++++++++++++-----
 .../qi4j/spi/value/ValueSerializerAdapter.java  |   2 +-
 .../org/qi4j/entitystore/leveldb/package.html   |   2 +-
 .../rest/server/api/ContextResource.java        |   9 +-
 .../java/org/qi4j/library/servlet/package.html  |   4 +-
 .../src/docs/tutorials/howto-build-system.txt   |   2 +-
 src/bin-dist/NOTICE.txt                         |   5 +
 src/bin-dist/README.txt                         |  50 +++++
 9 files changed, 233 insertions(+), 74 deletions(-)
----------------------------------------------------------------------



[5/6] zest-qi4j git commit: Clarifying error message.

Posted by ni...@apache.org.
Clarifying error message.


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

Branch: refs/heads/develop
Commit: 3a089bc79a1ecc59b741388e9f78768d8ec12404
Parents: 8630305
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 25 15:53:04 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 25 15:53:04 2015 +0800

----------------------------------------------------------------------
 .../main/java/org/qi4j/runtime/injection/DependencyModel.java | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3a089bc7/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
index b01f799..a01d061 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
@@ -293,9 +293,14 @@ public final class DependencyModel
         }
         if( injectedValue == null && !optional )
         {
+            String simpleName = injectionAnnotation.annotationType().getSimpleName();
             String message = "[Module " + context.module().name() + "] Non-optional @" +
-                             injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString() +
+                             simpleName + " " + injectionType.toString() +
                              " was null in " + injectedClass.getName();
+            if( simpleName.toLowerCase().contains( "service" ) )
+            {
+                message = message + ". Did you mean the @Service injection scope?";
+            }
             throw new ConstructionException( message );
         }
         return getInjectedValue( injectedValue );


[3/6] zest-qi4j git commit: SchedulerMixin didn't shut down properly.

Posted by ni...@apache.org.
SchedulerMixin didn't shut down properly.


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

Branch: refs/heads/develop
Commit: 205cbe994016555300846f0e8dd042fc82e8c92b
Parents: 0b9b655
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 24 22:21:58 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 24 22:21:58 2015 +0800

----------------------------------------------------------------------
 .../java/org/qi4j/library/scheduler/SchedulerMixin.java     | 9 +++++++++
 1 file changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/205cbe99/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
index 02f3132..6650573 100644
--- a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
+++ b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
@@ -265,6 +265,15 @@ public class SchedulerMixin
     public void passivateService()
         throws Exception
     {
+        managementExecutor.shutdown();
+        taskExecutor.shutdown();
+
+        managementExecutor.awaitTermination( 5, TimeUnit.SECONDS );
+        managementExecutor.shutdownNow();
+
+        taskExecutor.awaitTermination( 5, TimeUnit.SECONDS );
+        taskExecutor.shutdownNow();
+
         LOGGER.debug( "Passivated" );
     }
 


[6/6] zest-qi4j git commit: Merge remote-tracking branch 'origin/develop' into develop

Posted by ni...@apache.org.
Merge remote-tracking branch 'origin/develop' into develop


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

Branch: refs/heads/develop
Commit: 0189ec78ffa27543c04437810400e83a28f5910e
Parents: 3a089bc 4f2a0b0
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 25 10:13:41 2015 +0200
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 25 10:13:41 2015 +0200

----------------------------------------------------------------------
 build.gradle     | 6 +++++-
 libraries.gradle | 7 -------
 2 files changed, 5 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[2/6] zest-qi4j git commit: Introduced ModuleSpi interface as an injectable entry point for primarily extensions. Reduced ModuleInstance use to ModuleSpi as much as possible. Provided a lot more information in EntityTypeNotFoundException, about which en

Posted by ni...@apache.org.
Introduced ModuleSpi interface as an injectable entry point for primarily extensions.
Reduced ModuleInstance use to ModuleSpi as much as possible.
 Provided a lot more information in EntityTypeNotFoundException, about which entities that are visible and from which module it was being accessed.


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

Branch: refs/heads/develop
Commit: 0b9b6555558ff0fc90e221fa44fba0f2bdd3d0c9
Parents: 5e2b139
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 24 21:56:43 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 24 21:56:43 2015 +0800

----------------------------------------------------------------------
 .../java/org/qi4j/api/structure/Module.java     |   4 +
 .../unitofwork/EntityTypeNotFoundException.java |  28 +-
 .../java/org/qi4j/runtime/Qi4jRuntimeImpl.java  |  13 +-
 .../composite/AbstractModifierModel.java        |   6 +-
 .../runtime/composite/CompositeMethodModel.java |  10 +-
 .../composite/CompositeMethodsModel.java        |   4 +-
 .../qi4j/runtime/composite/CompositeModel.java  |   4 +-
 .../qi4j/runtime/composite/ConcernsModel.java   |   4 +-
 .../runtime/composite/SideEffectsModel.java     |   4 +-
 .../composite/TransientBuilderInstance.java     |   2 +-
 .../runtime/composite/TransientInstance.java    |  14 +-
 .../qi4j/runtime/composite/TransientModel.java  |   4 +-
 .../org/qi4j/runtime/entity/EntityInstance.java |   8 +-
 .../org/qi4j/runtime/entity/EntityModel.java    |   6 +-
 .../qi4j/runtime/injection/DependencyModel.java |  11 +-
 .../runtime/injection/InjectedFieldModel.java   |   4 +-
 .../runtime/injection/InjectionContext.java     |  11 +-
 .../StructureInjectionProviderFactory.java      |  12 +-
 .../provider/UsesInjectionProviderFactory.java  |   3 +-
 .../qi4j/runtime/structure/LayerInstance.java   |  42 ++-
 .../org/qi4j/runtime/structure/ModelModule.java | 107 ------
 .../qi4j/runtime/structure/ModuleInstance.java  |  83 ++++-
 .../runtime/structure/ModuleUnitOfWork.java     |  41 ++-
 .../org/qi4j/runtime/structure/TypeLookup.java  | 176 +++++-----
 .../runtime/structure/UsedLayersInstance.java   |  29 +-
 .../unitofwork/EntityBuilderInstance.java       |   2 +-
 .../runtime/unitofwork/UnitOfWorkInstance.java  |  12 +-
 .../runtime/value/ValueBuilderInstance.java     |   2 +-
 .../value/ValueBuilderWithPrototype.java        |   2 +-
 .../runtime/value/ValueBuilderWithState.java    |   2 +-
 .../org/qi4j/runtime/value/ValueInstance.java   |  18 +-
 .../java/org/qi4j/runtime/value/ValueModel.java |   4 +-
 .../qi4j/runtime/value/ValueStateInstance.java  |   2 +-
 .../spi/src/main/java/org/qi4j/spi/Qi4jSPI.java |   7 +
 .../helpers/JSONMapEntityStoreMixin.java        |  15 +-
 .../helpers/MapEntityStoreMixin.java            |  32 +-
 .../java/org/qi4j/spi/module/ModelModule.java   | 124 +++++++
 .../java/org/qi4j/spi/module/ModuleSpi.java     |  30 ++
 .../prefs/PreferencesEntityStoreMixin.java      |  26 +-
 .../entitystore/sql/SQLEntityStoreMixin.java    |  15 +-
 .../conversion/values/ValueToEntityMixin.java   | 335 ++++++++++---------
 .../org/qi4j/library/scheduler/Scheduler.java   |  15 +-
 42 files changed, 764 insertions(+), 509 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/api/src/main/java/org/qi4j/api/structure/Module.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/structure/Module.java b/core/api/src/main/java/org/qi4j/api/structure/Module.java
index 7360f96..47ffab8 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/Module.java
+++ b/core/api/src/main/java/org/qi4j/api/structure/Module.java
@@ -26,6 +26,9 @@ import org.qi4j.api.service.ServiceFinder;
 import org.qi4j.api.unitofwork.UnitOfWorkFactory;
 import org.qi4j.api.value.ValueBuilderFactory;
 import org.qi4j.api.value.ValueDescriptor;
+import org.qi4j.functional.Function;
+import org.qi4j.functional.Visitable;
+import org.qi4j.functional.Visitor;
 
 /**
  * API for interacting with a Module. Instances
@@ -76,4 +79,5 @@ public interface Module
      * @return the descriptor for a value composite or null if the class could not be found or the value composite is not visible
      */
     ValueDescriptor valueDescriptor( String typeName );
+
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java b/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
index 311da62..5f51e65 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
@@ -15,6 +15,10 @@
  */
 package org.qi4j.api.unitofwork;
 
+import org.qi4j.functional.Function;
+
+import static org.qi4j.functional.Iterables.fold;
+
 /**
  * Qi4j exception to be thrown in case that an entity composite
  * was not found during a lookup call.
@@ -24,12 +28,32 @@ public class EntityTypeNotFoundException
 {
     private final String compositeType;
 
-    public EntityTypeNotFoundException( String entityType )
+    public EntityTypeNotFoundException( String entityType, String moduleName, Iterable<String> visibility )
     {
-        super("Could not find an EntityComposite of type " + entityType);
+        super( "Could not find an EntityComposite of type " + entityType + " in module [" + moduleName + "].\n" +
+               "\tThe following entity types are visible:\n" + join(visibility) );
         this.compositeType = entityType;
     }
 
+    private static String join( Iterable<String> visibility )
+    {
+        return fold( new Function<String, String>()
+        {
+            StringBuilder result;
+            {
+                result = new StringBuilder();
+            }
+
+            @Override
+            public String map( String type )
+            {
+                result.append( type );
+                result.append( "\n" );
+                return result.toString();
+            }
+        }, visibility );
+    }
+
     public String compositeType()
     {
         return compositeType;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
index 23ba27b..6869dae 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
@@ -15,7 +15,6 @@ package org.qi4j.runtime;
 
 import java.lang.reflect.InvocationHandler;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.Map;
 import org.qi4j.api.Qi4j;
 import org.qi4j.api.association.AbstractAssociation;
@@ -33,11 +32,10 @@ import org.qi4j.api.composite.CompositeInstance;
 import org.qi4j.api.composite.ModelDescriptor;
 import org.qi4j.api.composite.TransientComposite;
 import org.qi4j.api.composite.TransientDescriptor;
-import org.qi4j.api.entity.EntityBuilder;
 import org.qi4j.api.entity.EntityComposite;
 import org.qi4j.api.entity.EntityDescriptor;
 import org.qi4j.api.entity.EntityReference;
-import org.qi4j.api.entity.Identity;
+import org.qi4j.api.object.ObjectDescriptor;
 import org.qi4j.api.property.Property;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.property.PropertyWrapper;
@@ -46,35 +44,31 @@ import org.qi4j.api.service.ServiceComposite;
 import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.ServiceReference;
 import org.qi4j.api.structure.Module;
-import org.qi4j.api.unitofwork.NoSuchEntityException;
 import org.qi4j.api.unitofwork.UnitOfWork;
-import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.api.value.ValueComposite;
 import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.bootstrap.ApplicationAssemblyFactory;
 import org.qi4j.bootstrap.ApplicationModelFactory;
 import org.qi4j.bootstrap.Qi4jRuntime;
-import org.qi4j.functional.Function;
 import org.qi4j.runtime.association.AbstractAssociationInstance;
 import org.qi4j.runtime.association.AssociationInstance;
 import org.qi4j.runtime.association.ManyAssociationInstance;
 import org.qi4j.runtime.association.NamedAssociationInstance;
 import org.qi4j.runtime.bootstrap.ApplicationAssemblyFactoryImpl;
 import org.qi4j.runtime.bootstrap.ApplicationModelFactoryImpl;
-import org.qi4j.runtime.composite.FunctionStateResolver;
 import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
 import org.qi4j.runtime.composite.TransientInstance;
 import org.qi4j.runtime.entity.EntityInstance;
-import org.qi4j.runtime.entity.EntityModel;
 import org.qi4j.runtime.property.PropertyInstance;
 import org.qi4j.runtime.service.ImportedServiceReferenceInstance;
 import org.qi4j.runtime.service.ServiceInstance;
 import org.qi4j.runtime.service.ServiceReferenceInstance;
+import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.runtime.value.ValueInstance;
 import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
-import org.qi4j.spi.entity.NamedAssociationState;
+import org.qi4j.spi.module.ModelModule;
 
 import static java.lang.reflect.Proxy.getInvocationHandler;
 import static org.qi4j.runtime.composite.TransientInstance.compositeInstanceOf;
@@ -364,5 +358,4 @@ public final class Qi4jRuntimeImpl
     {
         return ( (NamedAssociationInstance) assoc ).getEntityReferences();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
index 09499cb..b457f1d 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
@@ -25,7 +25,7 @@ import org.qi4j.runtime.injection.DependencyModel;
 import org.qi4j.runtime.injection.InjectedFieldsModel;
 import org.qi4j.runtime.injection.InjectedMethodsModel;
 import org.qi4j.runtime.injection.InjectionContext;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.api.util.Classes.RAW_CLASS;
 import static org.qi4j.api.util.Classes.interfacesOf;
@@ -57,7 +57,7 @@ public abstract class AbstractModifierModel
         injectedFieldsModel = new InjectedFieldsModel( declaredModifierClass );
         injectedMethodsModel = new InjectedMethodsModel( declaredModifierClass );
         Class<Class<?>> componentType = (Class<Class<?>>) Class.class.cast( Class.class );
-        nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ));
+        nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ) );
     }
 
     public Class<?> modifierClass()
@@ -96,7 +96,7 @@ public abstract class AbstractModifierModel
     }
 
     // Context
-    public InvocationHandler newInstance( ModuleInstance moduleInstance,
+    public InvocationHandler newInstance( ModuleSpi moduleInstance,
                                           InvocationHandler next,
                                           ProxyReferenceInvocationHandler proxyHandler,
                                           Method method

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
index e925b9d..3162130 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
@@ -29,7 +29,7 @@ import org.qi4j.functional.HierarchicalVisitor;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.filter;
 import static org.qi4j.functional.Iterables.flattenIterables;
@@ -101,7 +101,7 @@ public final class CompositeMethodModel
     }
 
     // Context
-    public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleInstance moduleInstance )
+    public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleSpi moduleInstance )
         throws Throwable
     {
         constraintsInstance.checkValid( composite, method, params );
@@ -117,7 +117,7 @@ public final class CompositeMethodModel
         }
     }
 
-    private CompositeMethodInstance getInstance( ModuleInstance moduleInstance )
+    private CompositeMethodInstance getInstance( ModuleSpi moduleInstance )
     {
         CompositeMethodInstance methodInstance = instancePool.obtainInstance();
         if( methodInstance == null )
@@ -128,7 +128,7 @@ public final class CompositeMethodModel
         return methodInstance;
     }
 
-    private CompositeMethodInstance newCompositeMethodInstance( ModuleInstance moduleInstance )
+    private CompositeMethodInstance newCompositeMethodInstance( ModuleSpi moduleInstance )
         throws ConstructionException
     {
         FragmentInvocationHandler mixinInvocationHandler = mixins.newInvocationHandler( method );
@@ -197,7 +197,7 @@ public final class CompositeMethodModel
 
     public Iterable<Method> invocationsFor( Class<?> mixinClass )
     {
-        return mixins.invocationsFor(mixinClass);
+        return mixins.invocationsFor( mixinClass );
     }
 
     public class CompositeMethodAnnotatedElement

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
index f18d222..bf0c113 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
@@ -22,7 +22,7 @@ import org.qi4j.functional.Iterables;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.map;
 
@@ -51,7 +51,7 @@ public final class CompositeMethodsModel
                           Object proxy,
                           Method method,
                           Object[] args,
-                          ModuleInstance moduleInstance
+                          ModuleSpi moduleInstance
     )
         throws Throwable
     {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
index b7f0e6c..a6ea122 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
@@ -25,12 +25,14 @@ import org.qi4j.api.common.Visibility;
 import org.qi4j.api.composite.Composite;
 import org.qi4j.api.composite.CompositeDescriptor;
 import org.qi4j.api.composite.InvalidCompositeException;
+import org.qi4j.api.structure.Module;
 import org.qi4j.functional.HierarchicalVisitor;
 import org.qi4j.functional.Iterables;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
 import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static java.lang.reflect.Proxy.newProxyInstance;
 import static org.qi4j.functional.Iterables.first;
@@ -204,7 +206,7 @@ public abstract class CompositeModel
                                 Object proxy,
                                 Method method,
                                 Object[] args,
-                                ModuleInstance moduleInstance
+                                ModuleSpi moduleInstance
     )
         throws Throwable
     {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
index 9488c4b..74882f7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
@@ -24,7 +24,7 @@ import org.qi4j.functional.Iterables;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * JAVADOC
@@ -48,7 +48,7 @@ public final class ConcernsModel
     }
 
     // Context
-    public ConcernsInstance newInstance( Method method, ModuleInstance moduleInstance,
+    public ConcernsInstance newInstance( Method method, ModuleSpi moduleInstance,
                                          FragmentInvocationHandler mixinInvocationHandler
     )
     {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
index 11018ff..10ae779 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
@@ -25,7 +25,7 @@ import org.qi4j.functional.Iterables;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * JAVADOC
@@ -49,7 +49,7 @@ public final class SideEffectsModel
     }
 
     // Context
-    public SideEffectsInstance newInstance( Method method, ModuleInstance moduleInstance, InvocationHandler invoker )
+    public SideEffectsInstance newInstance( Method method, ModuleSpi moduleInstance, InvocationHandler invoker )
     {
         ProxyReferenceInvocationHandler proxyHandler = new ProxyReferenceInvocationHandler();
         SideEffectInvocationHandlerResult result = new SideEffectInvocationHandlerResult();

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
index 0bb343f..ffb3fc6 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
@@ -20,7 +20,7 @@ import org.qi4j.api.composite.TransientBuilder;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.runtime.property.PropertyInfo;
 import org.qi4j.runtime.property.PropertyInstance;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 
 /**
  * JAVADOC

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
index 811fce7..78bc5a2 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
@@ -24,7 +24,10 @@ import org.qi4j.api.Qi4j;
 import org.qi4j.api.composite.Composite;
 import org.qi4j.api.composite.CompositeInstance;
 import org.qi4j.api.property.StateHolder;
+import org.qi4j.api.structure.Layer;
+import org.qi4j.api.structure.Module;
 import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * InvocationHandler for proxy objects.
@@ -42,10 +45,10 @@ public class TransientInstance
     protected final Object[] mixins;
     protected StateHolder state;
     protected final CompositeModel compositeModel;
-    private final ModuleInstance moduleInstance;
+    private final ModuleSpi moduleInstance;
 
     public TransientInstance( CompositeModel compositeModel,
-                              ModuleInstance moduleInstance,
+                              ModuleSpi moduleInstance,
                               Object[] mixins,
                               StateHolder state
     )
@@ -105,11 +108,16 @@ public class TransientInstance
     }
 
     @Override
-    public ModuleInstance module()
+    public Module module()
     {
         return moduleInstance;
     }
 
+    public Layer layer()
+    {
+        return ( (ModuleInstance) moduleInstance ).layerInstance();
+    }
+
     @Override
     public StateHolder state()
     {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
index c5ffe79..968fa5e 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
@@ -20,7 +20,7 @@ import org.qi4j.api.composite.TransientDescriptor;
 import org.qi4j.api.constraint.ConstraintViolationException;
 import org.qi4j.runtime.injection.InjectionContext;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Model for Transient Composites
@@ -39,7 +39,7 @@ public class TransientModel
         super( types, visibility, metaInfo, mixinsModel, stateModel, compositeMethodsModel );
     }
 
-    public TransientInstance newInstance( ModuleInstance moduleInstance,
+    public TransientInstance newInstance( ModuleSpi moduleInstance,
                                           UsesInstance uses,
                                           TransientStateInstance state
     )

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
index 6e7e513..86affb7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
@@ -31,6 +31,7 @@ import org.qi4j.api.entity.EntityComposite;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.entity.Identity;
 import org.qi4j.api.entity.LifecycleException;
+import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.NoSuchEntityException;
 import org.qi4j.api.unitofwork.UnitOfWork;
 import org.qi4j.api.unitofwork.UnitOfWorkException;
@@ -40,6 +41,7 @@ import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Entity instance
@@ -54,7 +56,7 @@ public final class EntityInstance
 
     private final EntityComposite proxy;
     private final ModuleUnitOfWork uow;
-    private final ModuleInstance moduleInstance;
+    private final ModuleSpi moduleInstance;
     private final EntityModel entityModel;
     private final EntityReference identity;
     private final EntityState entityState;
@@ -63,7 +65,7 @@ public final class EntityInstance
     private EntityStateInstance state;
 
     public EntityInstance( ModuleUnitOfWork uow,
-                           ModuleInstance moduleInstance,
+                           ModuleSpi moduleInstance,
                            EntityModel entityModel,
                            EntityState entityState
     )
@@ -134,7 +136,7 @@ public final class EntityInstance
     }
 
     @Override
-    public ModuleInstance module()
+    public ModuleSpi module()
     {
         return moduleInstance;
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 77103f9..3563115 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
@@ -33,12 +33,12 @@ import org.qi4j.functional.Iterables;
 import org.qi4j.runtime.composite.CompositeMethodsModel;
 import org.qi4j.runtime.composite.CompositeModel;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entitystore.EntityAlreadyExistsException;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.filter;
 import static org.qi4j.functional.Iterables.first;
@@ -96,7 +96,7 @@ public final class EntityModel
         return (EntityStateModel) super.state();
     }
 
-    public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleInstance moduleInstance, EntityState state )
+    public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleSpi moduleInstance, EntityState state )
     {
         EntityInstance instance = new EntityInstance( uow, moduleInstance, this, state );
         return instance;
@@ -140,7 +140,7 @@ public final class EntityModel
         }
     }
 
-    public void initState( ModuleInstance module, EntityState entityState )
+    public void initState( ModuleSpi module, EntityState entityState )
     {
         // Set new properties to default value
         for( PropertyModel propertyDescriptor : state().properties() )

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
index bfc5317..b01f799 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
@@ -287,16 +287,15 @@ public final class DependencyModel
                 ex = ex.getCause();
             }
 
-            String message = "[Module " + context.module()
-                .name() + "] InjectionProvider unable to resolve @" + injectionAnnotation.annotationType()
-                .getSimpleName() + " " + injectionType.toString();
+            String message = "[Module " + context.module().name() + "] InjectionProvider unable to resolve @" +
+                             injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString();
             throw new ConstructionException( message, ex );
         }
         if( injectedValue == null && !optional )
         {
-            String message = "[Module " + context.module()
-                .name() + "] Non-optional @" + injectionAnnotation.annotationType()
-                .getSimpleName() + " " + injectionType.toString() + " was null in " + injectedClass.getName();
+            String message = "[Module " + context.module().name() + "] Non-optional @" +
+                             injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString() +
+                             " was null in " + injectedClass.getName();
             throw new ConstructionException( message );
         }
         return getInjectedValue( injectedValue );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
index 6b35f2a..bd51924 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
@@ -87,9 +87,7 @@ public final class InjectedFieldModel
                 {
                     TransientInstance handler = (TransientInstance) invocationHandler;
                     valueClassName = Classes.toString( handler.descriptor().types() )
-                                     + " in [" + handler.module().name() + "] of [" + handler.module()
-                        .layerInstance()
-                        .name() + "]";
+                                     + " in [" + handler.module().name() + "] of [" + handler.layer().name() + "]";
                 }
                 else
                 {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
index f9c1deb..b3c4981 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
@@ -19,13 +19,14 @@ import org.qi4j.api.property.StateHolder;
 import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * JAVADOC
  */
 public final class InjectionContext
 {
-    private final ModuleInstance moduleInstance;
+    private final ModuleSpi moduleInstance;
     private CompositeInstance compositeInstance;
     private UsesInstance uses;
     private StateHolder state;
@@ -44,28 +45,28 @@ public final class InjectionContext
     }
 
     // For concerns and side-effects
-    public InjectionContext( ModuleInstance moduleInstance, Object next, ProxyReferenceInvocationHandler proxyHandler )
+    public InjectionContext( ModuleSpi moduleInstance, Object next, ProxyReferenceInvocationHandler proxyHandler )
     {
         this.moduleInstance = moduleInstance;
         this.next = next;
         this.proxyHandler = proxyHandler;
     }
 
-    public InjectionContext( ModuleInstance moduleInstance, UsesInstance uses )
+    public InjectionContext( ModuleSpi moduleInstance, UsesInstance uses )
     {
         this.moduleInstance = moduleInstance;
         this.uses = uses;
     }
 
     // For inner classes
-    public InjectionContext( ModuleInstance moduleInstance, UsesInstance uses, Object instance )
+    public InjectionContext( ModuleSpi moduleInstance, UsesInstance uses, Object instance )
     {
         this.moduleInstance = moduleInstance;
         this.uses = uses;
         this.instance = instance;
     }
 
-    public ModuleInstance module()
+    public ModuleSpi module()
     {
         return moduleInstance;
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
index dd461e6..6ad4e30 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
@@ -34,6 +34,8 @@ import org.qi4j.runtime.injection.InjectionContext;
 import org.qi4j.runtime.injection.InjectionProvider;
 import org.qi4j.runtime.injection.InjectionProviderFactory;
 import org.qi4j.runtime.model.Resolution;
+import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 public final class StructureInjectionProviderFactory
     implements InjectionProviderFactory
@@ -93,17 +95,21 @@ public final class StructureInjectionProviderFactory
             {
                 return context.module();
             }
+            else if( ModuleSpi.class.isAssignableFrom( clazz ) )
+            {
+                return context.module();
+            }
             else if( Layer.class.isAssignableFrom( clazz ) )
             {
-                return context.module().layerInstance();
+                return (( ModuleInstance) context.module()).layerInstance();
             }
             else if( Application.class.isAssignableFrom( clazz ) )
             {
-                return context.module().layerInstance().applicationInstance();
+                return (( ModuleInstance) context.module()).layerInstance().applicationInstance();
             }
             else if( Qi4j.class.isAssignableFrom( clazz ) )
             {
-                return context.module().layerInstance().applicationInstance().runtime();
+                return (( ModuleInstance) context.module()).layerInstance().applicationInstance().runtime();
             }
 
             return null;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
index c0e5f3d..2069d07 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
@@ -21,6 +21,7 @@ package org.qi4j.runtime.injection.provider;
 import java.lang.reflect.Constructor;
 import org.qi4j.api.composite.NoSuchTransientException;
 import org.qi4j.api.object.NoSuchObjectException;
+import org.qi4j.api.structure.Module;
 import org.qi4j.bootstrap.InvalidInjectionException;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.injection.DependencyModel;
@@ -71,7 +72,7 @@ public final class UsesInjectionProviderFactory
             {
                 // No @Uses object provided
                 // Try instantiating a Transient or Object for the given type
-                ModuleInstance moduleInstance = context.module();
+                Module moduleInstance = context.module();
 
                 try
                 {

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
index 9ed77bb..9e678e8 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
@@ -20,14 +20,15 @@ import org.qi4j.api.activation.ActivationEventListener;
 import org.qi4j.api.activation.ActivationException;
 import org.qi4j.api.activation.PassivationException;
 import org.qi4j.api.common.Visibility;
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.object.ObjectDescriptor;
 import org.qi4j.api.service.ServiceReference;
 import org.qi4j.api.structure.Layer;
+import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.functional.Function;
 import org.qi4j.runtime.activation.ActivationDelegate;
-import org.qi4j.runtime.composite.TransientModel;
-import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.object.ObjectModel;
-import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
 
 import static org.qi4j.functional.Iterables.flattenIterables;
 import static org.qi4j.functional.Iterables.map;
@@ -49,7 +50,8 @@ public class LayerInstance
 
     public LayerInstance( LayerModel model,
                           ApplicationInstance applicationInstance,
-                          UsedLayersInstance usedLayersInstance )
+                          UsedLayersInstance usedLayersInstance
+    )
     {
         // Constructor parameters
         this.layerModel = model;
@@ -130,59 +132,55 @@ public class LayerInstance
         return usedLayersInstance;
     }
 
-    /* package */ Iterable<ModelModule<ObjectModel>> visibleObjects( final Visibility visibility )
+    /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ObjectModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ObjectDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<ObjectModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<ObjectDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleObjects( visibility );
             }
-
         }, moduleInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<TransientModel>> visibleTransients( final Visibility visibility )
+    /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<TransientModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<TransientDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<TransientModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<TransientDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleTransients( visibility );
             }
-
         }, moduleInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<EntityModel>> visibleEntities( final Visibility visibility )
+    /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<EntityModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<EntityDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<EntityModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<EntityDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleEntities( visibility );
             }
-
         }, moduleInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<ValueModel>> visibleValues( final Visibility visibility )
+    /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ValueModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ValueDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<ValueModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<ValueDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleValues( visibility );
             }
-
         }, moduleInstances ) );
     }
 
@@ -196,7 +194,6 @@ public class LayerInstance
             {
                 return moduleInstance.visibleServices( visibility );
             }
-
         }, moduleInstances ) );
     }
 
@@ -212,5 +209,4 @@ public class LayerInstance
 
         throw new IllegalArgumentException( "No such module:" + moduleName );
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
deleted file mode 100644
index dae30b9..0000000
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
+++ /dev/null
@@ -1,107 +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.qi4j.runtime.structure;
-
-import org.qi4j.api.composite.ModelDescriptor;
-import org.qi4j.functional.Function;
-
-/**
- * TODO
- */
-public class ModelModule<T extends ModelDescriptor>
-{
-    public static <T extends ModelDescriptor> Function<T, ModelModule<T>> modelModuleFunction( final ModuleInstance module )
-    {
-        return new Function<T, ModelModule<T>>()
-        {
-            @Override
-            public ModelModule<T> map( T model )
-            {
-                return new ModelModule<>( module, model );
-            }
-        };
-    }
-
-    public static <T extends ModelDescriptor> Function<ModelModule<T>, T> modelFunction()
-    {
-        return new Function<ModelModule<T>, T>()
-        {
-            @Override
-            public T map( ModelModule<T> modelModule )
-            {
-                return modelModule.model();
-            }
-        };
-    }
-
-    private final ModuleInstance module;
-    private final T model;
-
-    public ModelModule( ModuleInstance module, T model )
-    {
-        this.module = module;
-        this.model = model;
-    }
-
-    public ModuleInstance module()
-    {
-        return module;
-    }
-
-    public T model()
-    {
-        return model;
-    }
-
-    @Override
-    public boolean equals( Object o )
-    {
-        if( this == o )
-        {
-            return true;
-        }
-        if( o == null || getClass() != o.getClass() )
-        {
-            return false;
-        }
-
-        ModelModule that = (ModelModule) o;
-
-        if( model != null ? !model.equals( that.model ) : that.model != null )
-        {
-            return false;
-        }
-
-        return !( module != null ? !module.equals( that.module ) : that.module != null );
-    }
-
-    @Override
-    public int hashCode()
-    {
-        int result = module != null ? module.hashCode() : 0;
-        result = 31 * result + ( model != null ? model.hashCode() : 0 );
-        return result;
-    }
-
-    @Override
-    public String toString()
-    {
-        return module.name() + ":" + model;
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
index c009c75..97addf3 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
@@ -50,6 +50,7 @@ import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.query.QueryBuilder;
 import org.qi4j.api.query.QueryBuilderFactory;
 import org.qi4j.api.service.NoSuchServiceException;
+import org.qi4j.api.service.ServiceDescriptor;
 import org.qi4j.api.service.ServiceReference;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.UnitOfWork;
@@ -69,6 +70,7 @@ import org.qi4j.functional.Specification;
 import org.qi4j.functional.Specifications;
 import org.qi4j.runtime.activation.ActivationDelegate;
 import org.qi4j.runtime.composite.FunctionStateResolver;
+import org.qi4j.runtime.composite.StateResolver;
 import org.qi4j.runtime.composite.TransientBuilderInstance;
 import org.qi4j.runtime.composite.TransientModel;
 import org.qi4j.runtime.composite.TransientStateInstance;
@@ -88,7 +90,6 @@ import org.qi4j.runtime.service.ImportedServicesModel;
 import org.qi4j.runtime.service.ServicesInstance;
 import org.qi4j.runtime.service.ServicesModel;
 import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
-import org.qi4j.runtime.composite.StateResolver;
 import org.qi4j.runtime.value.ValueBuilderInstance;
 import org.qi4j.runtime.value.ValueBuilderWithPrototype;
 import org.qi4j.runtime.value.ValueBuilderWithState;
@@ -97,8 +98,13 @@ import org.qi4j.runtime.value.ValueModel;
 import org.qi4j.runtime.value.ValuesModel;
 import org.qi4j.spi.entitystore.EntityStore;
 import org.qi4j.spi.metrics.MetricsProviderAdapter;
+import org.qi4j.spi.module.ModelModule;
+import org.qi4j.spi.module.ModuleSpi;
 import org.qi4j.valueserialization.orgjson.OrgJsonValueSerialization;
 
+import static org.qi4j.api.common.Visibility.application;
+import static org.qi4j.api.common.Visibility.layer;
+import static org.qi4j.api.common.Visibility.module;
 import static org.qi4j.api.util.Classes.RAW_CLASS;
 import static org.qi4j.api.util.Classes.modelTypeSpecification;
 import static org.qi4j.functional.Iterables.cast;
@@ -113,7 +119,7 @@ import static org.qi4j.functional.Iterables.toList;
  * Instance of a Qi4j Module. Contains the various composites for this Module.
  */
 public class ModuleInstance
-    implements Module, Activation
+    implements Module, ModuleSpi, Activation
 {
     // Constructor parameters
     private final ModuleModel model;
@@ -139,7 +145,8 @@ public class ModuleInstance
     @SuppressWarnings( "LeakingThisInConstructor" )
     public ModuleInstance( ModuleModel moduleModel, LayerInstance layerInstance, TransientsModel transientsModel,
                            EntitiesModel entitiesModel, ObjectsModel objectsModel, ValuesModel valuesModel,
-                           ServicesModel servicesModel, ImportedServicesModel importedServicesModel )
+                           ServicesModel servicesModel, ImportedServicesModel importedServicesModel
+    )
     {
         // Constructor parameters
         model = moduleModel;
@@ -360,7 +367,8 @@ public class ModuleInstance
                                                          Function<PropertyDescriptor, Object> propertyFunction,
                                                          Function<AssociationDescriptor, EntityReference> associationFunction,
                                                          Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-                                                         Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction )
+                                                         Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+    )
     {
         NullArgumentException.validateNotNull( "propertyFunction", propertyFunction );
         NullArgumentException.validateNotNull( "associationFunction", associationFunction );
@@ -383,9 +391,9 @@ public class ModuleInstance
     private static class InitialStateResolver
         implements StateResolver
     {
-        private final ModuleInstance module;
+        private final Module module;
 
-        private InitialStateResolver( ModuleInstance module )
+        private InitialStateResolver( Module module )
         {
             this.module = module;
         }
@@ -567,7 +575,6 @@ public class ModuleInstance
         activation.deregisterActivationEventListener( listener );
     }
 
-
     // Other methods
     /* package */ ModuleModel model()
     {
@@ -624,7 +631,7 @@ public class ModuleInstance
         return store;
     }
 
-    /* package */ IdentityGenerator identityGenerator()
+    public IdentityGenerator identityGenerator()
     {
         synchronized( this )
         {
@@ -677,31 +684,31 @@ public class ModuleInstance
         return metrics;
     }
 
-    Iterable<ModelModule<ObjectModel>> visibleObjects( Visibility visibility )
+    public Iterable<ModelModule<ObjectDescriptor>> visibleObjects( Visibility visibility )
     {
-        return map( ModelModule.<ObjectModel>modelModuleFunction( this ),
+        return map( ModelModule.<ObjectDescriptor>modelModuleFunction( this ),
                     filter( new VisibilitySpecification( visibility ), objects.models() ) );
     }
 
-    Iterable<ModelModule<TransientModel>> visibleTransients( Visibility visibility )
+    public Iterable<ModelModule<TransientDescriptor>> visibleTransients( Visibility visibility )
     {
-        return map( ModelModule.<TransientModel>modelModuleFunction( this ),
+        return map( ModelModule.<TransientDescriptor>modelModuleFunction( this ),
                     filter( new VisibilitySpecification( visibility ), transients.models() ) );
     }
 
-    Iterable<ModelModule<EntityModel>> visibleEntities( Visibility visibility )
+    public Iterable<ModelModule<EntityDescriptor>> visibleEntities( Visibility visibility )
     {
-        return map( ModelModule.<EntityModel>modelModuleFunction( this ),
+        return map( ModelModule.<EntityDescriptor>modelModuleFunction( this ),
                     filter( new VisibilitySpecification( visibility ), entities.models() ) );
     }
 
-    Iterable<ModelModule<ValueModel>> visibleValues( Visibility visibility )
+    public Iterable<ModelModule<ValueDescriptor>> visibleValues( Visibility visibility )
     {
-        return map( ModelModule.<ValueModel>modelModuleFunction( this ),
+        return map( ModelModule.<ValueDescriptor>modelModuleFunction( this ),
                     filter( new VisibilitySpecification( visibility ), values.models() ) );
     }
 
-    Iterable<ServiceReference<?>> visibleServices( Visibility visibility )
+    public Iterable<ServiceReference<?>> visibleServices( Visibility visibility )
     {
         return flatten( services.visibleServices( visibility ),
                         importedServices.visibleServices( visibility ) );
@@ -824,4 +831,46 @@ public class ModuleInstance
             return clazz;
         }
     }
+
+    public Iterable<ModelModule<ValueDescriptor>> findVisibleValueTypes()
+    {
+        return flatten( visibleValues( Visibility.module ),
+            layerInstance().visibleValues( Visibility.layer ),
+            layerInstance().visibleValues( Visibility.application ),
+            layerInstance().usedLayersInstance().visibleValues()
+        );
+    }
+
+    public Iterable<ModelModule<EntityDescriptor>> findVisibleEntityTypes()
+    {
+        return flatten( visibleEntities( Visibility.module ),
+            layerInstance().visibleEntities( Visibility.layer ),
+            layerInstance().visibleEntities( Visibility.application ),
+            layerInstance().usedLayersInstance().visibleEntities()
+        );
+    }
+    public Iterable<ModelModule<TransientDescriptor>> findVisibleTransientTypes()
+    {
+        return flatten( visibleTransients( Visibility.module ),
+            layerInstance().visibleTransients( Visibility.layer ),
+            layerInstance().visibleTransients( Visibility.application ),
+            layerInstance().usedLayersInstance().visibleTransients()
+        );
+    }
+    public Iterable<ModelModule<ServiceDescriptor>> findVisibleServiceTypes()
+    {
+        return flatten( visibleServices( Visibility.module ),
+            layerInstance().visibleServices( Visibility.layer ),
+            layerInstance().visibleServices( Visibility.application ),
+            layerInstance().usedLayersInstance().visibleServices()
+        );
+    }
+    public Iterable<ModelModule<ObjectDescriptor>> findVisibleObjectTypes()
+    {
+        return flatten( visibleObjects( Visibility.module ),
+            layerInstance().visibleObjects( Visibility.layer ),
+            layerInstance().visibleObjects( Visibility.application ),
+            layerInstance().usedLayersInstance().visibleObjects()
+        );
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
index a4b6b06..77aebc5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
@@ -61,10 +61,12 @@ import org.qi4j.runtime.property.PropertyModel;
 import org.qi4j.runtime.unitofwork.EntityBuilderInstance;
 import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
 import org.qi4j.runtime.value.ValueInstance;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
 import org.qi4j.spi.entity.NamedAssociationState;
 import org.qi4j.spi.entitystore.EntityStore;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.spi.query.EntityFinder;
 import org.qi4j.spi.query.EntityFinderException;
 import org.qi4j.spi.query.QueryBuilderSPI;
@@ -72,6 +74,7 @@ import org.qi4j.spi.query.QuerySource;
 
 import static org.qi4j.api.entity.EntityReference.parseEntityReference;
 import static org.qi4j.functional.Iterables.first;
+import static org.qi4j.functional.Iterables.map;
 
 /**
  * JAVADOC
@@ -94,17 +97,17 @@ public class ModuleUnitOfWork
     }
 
     private final UnitOfWorkInstance uow;
-    private final ModuleInstance moduleInstance;
+    private final ModuleInstance module;
 
-    ModuleUnitOfWork( ModuleInstance moduleInstance, UnitOfWorkInstance uow )
+    ModuleUnitOfWork( ModuleInstance module, UnitOfWorkInstance uow )
     {
-        this.moduleInstance = moduleInstance;
+        this.module = module;
         this.uow = uow;
     }
 
     public ModuleInstance module()
     {
-        return moduleInstance;
+        return module;
     }
 
     public UnitOfWorkInstance instance()
@@ -115,7 +118,7 @@ public class ModuleUnitOfWork
     @Override
     public UnitOfWorkFactory unitOfWorkFactory()
     {
-        return moduleInstance;
+        return module;
     }
 
     @Override
@@ -176,11 +179,15 @@ public class ModuleUnitOfWork
     public <T> EntityBuilder<T> newEntityBuilder( Class<T> type, String identity )
         throws EntityTypeNotFoundException
     {
-        ModelModule<EntityModel> model = moduleInstance.typeLookup().lookupEntityModel( type );
+        ModelModule<EntityModel> model = module.typeLookup().lookupEntityModel( type );
 
         if( model == null )
         {
-            throw new EntityTypeNotFoundException( type.getName() );
+            throw new EntityTypeNotFoundException( type.getName(),
+                                                   module.name(),
+                                                   map( ModelModule.toStringFunction,
+                                                        module.findVisibleEntityTypes()
+                                                   ) );
         }
 
         EntityStore entityStore = model.module().entityStore();
@@ -199,7 +206,7 @@ public class ModuleUnitOfWork
 
         builder = new EntityBuilderInstance<>( model,
                                                this,
-                                               uow.getEntityStoreUnitOfWork( entityStore, moduleInstance ),
+                                               uow.getEntityStoreUnitOfWork( entityStore, module ),
                                                identity );
         return builder;
     }
@@ -236,11 +243,15 @@ public class ModuleUnitOfWork
         NullArgumentException.validateNotNull( "manyAssociationFunction", manyAssociationFunction );
         NullArgumentException.validateNotNull( "namedAssociationFunction", namedAssociationFunction );
 
-        ModelModule<EntityModel> model = moduleInstance.typeLookup().lookupEntityModel( type );
+        ModelModule<EntityModel> model = module.typeLookup().lookupEntityModel( type );
 
         if( model == null )
         {
-            throw new EntityTypeNotFoundException( type.getName() );
+            throw new EntityTypeNotFoundException( type.getName(),
+                                                   module.name(),
+                                                   map( ModelModule.toStringFunction,
+                                                        module.findVisibleEntityTypes()
+                                                   ) );
         }
 
         EntityStore entityStore = model.module().entityStore();
@@ -268,7 +279,7 @@ public class ModuleUnitOfWork
 
         return new EntityBuilderInstance<>( model,
                                             this,
-                                            uow.getEntityStoreUnitOfWork( entityStore, moduleInstance ),
+                                            uow.getEntityStoreUnitOfWork( entityStore, module ),
                                             identity,
                                             stateResolver );
     }
@@ -277,11 +288,15 @@ public class ModuleUnitOfWork
     public <T> T get( Class<T> type, String identity )
         throws EntityTypeNotFoundException, NoSuchEntityException
     {
-        Iterable<ModelModule<EntityModel>> models = moduleInstance.typeLookup().lookupEntityModels( type );
+        Iterable<ModelModule<EntityModel>> models = module.typeLookup().lookupEntityModels( type );
 
         if( !models.iterator().hasNext() )
         {
-            throw new EntityTypeNotFoundException( type.getName() );
+            throw new EntityTypeNotFoundException( type.getName(),
+                                                   module.name(),
+                                                   map( ModelModule.toStringFunction,
+                                                        module.findVisibleEntityTypes()
+                                                   ) );
         }
 
         return uow.get( parseEntityReference( identity ), this, models, type );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
index 1383ce8..91b49ff 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/TypeLookup.java
@@ -27,7 +27,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import org.qi4j.api.common.Visibility;
 import org.qi4j.api.composite.AmbiguousTypeException;
 import org.qi4j.api.composite.ModelDescriptor;
 import org.qi4j.api.service.NoSuchServiceException;
@@ -39,7 +38,11 @@ import org.qi4j.runtime.composite.TransientModel;
 import org.qi4j.runtime.entity.EntityModel;
 import org.qi4j.runtime.object.ObjectModel;
 import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
 
+import static org.qi4j.api.common.Visibility.application;
+import static org.qi4j.api.common.Visibility.layer;
+import static org.qi4j.api.common.Visibility.module;
 import static org.qi4j.api.util.Classes.RAW_CLASS;
 import static org.qi4j.api.util.Classes.interfacesOf;
 import static org.qi4j.functional.Iterables.cast;
@@ -99,8 +102,9 @@ public class TypeLookup
      *
      * <p>Type lookup is done lazily and cached.</p>
      *
-     * @param type  Looked up Type
-     * @return      First matching Object Model
+     * @param type Looked up Type
+     *
+     * @return First matching Object Model
      */
     @SuppressWarnings( { "raw", "unchecked" } )
     /* package */ ModelModule<ObjectModel> lookupObjectModel( final Class type )
@@ -113,16 +117,20 @@ public class TypeLookup
             Iterable<ModelModule<ObjectModel>> flatten = flatten(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
-                                                moduleInstance.visibleObjects( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleObjects( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleObjects( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleObjects() ) ),
+                                                moduleInstance.visibleObjects( module ),
+                                                moduleInstance.layerInstance().visibleObjects( layer ),
+                                                moduleInstance.layerInstance().visibleObjects( application ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleObjects() ) ),
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
-                                                moduleInstance.visibleObjects( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleObjects( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleObjects( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleObjects() ) ) );
+                                                moduleInstance.visibleObjects( module ),
+                                                moduleInstance.layerInstance().visibleObjects( layer ),
+                                                moduleInstance.layerInstance().visibleObjects( application ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleObjects() ) ) );
 
             model = first( flatten );
 
@@ -146,8 +154,9 @@ public class TypeLookup
      *
      * <p>Type lookup is done lazily and cached.</p>
      *
-     * @param type  Looked up Type
-     * @return      First matching Transient Model
+     * @param type Looked up Type
+     *
+     * @return First matching Transient Model
      */
     @SuppressWarnings( { "raw", "unchecked" } )
     /* package */ ModelModule<TransientModel> lookupTransientModel( final Class type )
@@ -160,16 +169,22 @@ public class TypeLookup
             Iterable<ModelModule<TransientModel>> allModels = flatten(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
-                                                moduleInstance.visibleTransients( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleTransients( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleTransients( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleTransients() ) ),
+                                                moduleInstance.visibleTransients( module ),
+                                                moduleInstance.layerInstance().visibleTransients( layer ),
+                                                moduleInstance.layerInstance().visibleTransients( application ),
+                                                moduleInstance.layerInstance().usedLayersInstance().visibleTransients()
+                                    )
+                ),
+
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
-                                                moduleInstance.visibleTransients( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleTransients( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleTransients( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleTransients() ) ) );
+                                                moduleInstance.visibleTransients( module ),
+                                                moduleInstance.layerInstance().visibleTransients( layer ),
+                                                moduleInstance.layerInstance().visibleTransients( application ),
+                                                moduleInstance.layerInstance().usedLayersInstance().visibleTransients()
+                                    )
+                )
+            );
             model = first( allModels );
 
             if( model != null )
@@ -192,8 +207,9 @@ public class TypeLookup
      *
      * <p>Type lookup is done lazily and cached.</p>
      *
-     * @param type  Looked up Type
-     * @return      First matching Value Model
+     * @param type Looked up Type
+     *
+     * @return First matching Value Model
      */
     @SuppressWarnings( { "raw", "unchecked" } )
     public ModelModule<ValueModel> lookupValueModel( final Class type )
@@ -206,16 +222,19 @@ public class TypeLookup
             Iterable<ModelModule<ValueModel>> flatten = flatten(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
-                                                moduleInstance.visibleValues( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleValues( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleValues( Visibility.application ),
+                                                moduleInstance.visibleValues( module ),
+                                                moduleInstance.layerInstance().visibleValues( layer ),
+                                                moduleInstance.layerInstance().visibleValues( application ),
                                                 moduleInstance.layerInstance().usedLayersInstance().visibleValues() ) ),
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
-                                                moduleInstance.visibleValues( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleValues( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleValues( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleValues() ) ) );
+                                                moduleInstance.visibleValues( module ),
+                                                moduleInstance.layerInstance().visibleValues( layer ),
+                                                moduleInstance.layerInstance().visibleValues( application ),
+                                                moduleInstance.layerInstance().usedLayersInstance().visibleValues()
+                                    )
+                )
+            );
 
             model = first( flatten );
 
@@ -242,8 +261,9 @@ public class TypeLookup
      * <p><b>Should be used for creational use cases only.</b> For non-creational use cases see
      * {@link #lookupEntityModels(java.lang.Class)}.</p>
      *
-     * @param type  Looked up Type
-     * @return      First matching Entity Model
+     * @param type Looked up Type
+     *
+     * @return First matching Entity Model
      */
     @SuppressWarnings( { "raw", "unchecked" } )
     /* package */ ModelModule<EntityModel> lookupEntityModel( final Class type )
@@ -256,16 +276,21 @@ public class TypeLookup
             Iterable<ModelModule<EntityModel>> allModels = flatten(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
-                                                moduleInstance.visibleEntities( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleEntities( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ),
+                                                moduleInstance.visibleEntities( module ),
+                                                moduleInstance.layerInstance().visibleEntities( layer ),
+                                                moduleInstance.layerInstance().visibleEntities( application ),
+                                                moduleInstance.layerInstance()
+                                                    .usedLayersInstance()
+                                                    .visibleEntities() ) ),
                 ambiguousTypeCheck( type,
                                     findModels( new AssignableTypeLookupSpecification( type ),
-                                                moduleInstance.visibleEntities( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleEntities( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ) );
+                                                moduleInstance.visibleEntities( module ),
+                                                moduleInstance.layerInstance().visibleEntities( layer ),
+                                                moduleInstance.layerInstance().visibleEntities( application ),
+                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities()
+                                    )
+                )
+            );
 
             model = first( allModels );
 
@@ -284,8 +309,8 @@ public class TypeLookup
      * <p>Returned Iterable contains, in order, Entity Models that: </p>
      *
      * <ul>
-     *  <li>exactly match the given type, in Visibility then Assembly order ;</li>
-     *  <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
+     * <li>exactly match the given type, in Visibility then Assembly order ;</li>
+     * <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
      * </ul>
      *
      * <p>Multiple <b>exact</b> matches with the same Visibility are <b>forbidden</b> and result in an AmbiguousTypeException.</p>
@@ -296,8 +321,9 @@ public class TypeLookup
      * <p><b>Should be used for non-creational use cases only.</b> For creational use cases see
      * {@link #lookupEntityModel(java.lang.Class)}.</p>
      *
-     * @param type  Looked up Type
-     * @return      All matching Entity Models
+     * @param type Looked up Type
+     *
+     * @return All matching Entity Models
      */
     @SuppressWarnings( { "raw", "unchecked" } )
     /* package */ Iterable<ModelModule<EntityModel>> lookupEntityModels( final Class type )
@@ -309,14 +335,16 @@ public class TypeLookup
             Iterable<ModelModule<EntityModel>> matchingEntityModels = flatten(
                 ambiguousTypeCheck( type,
                                     findModels( new ExactTypeLookupSpecification( type ),
-                                                moduleInstance.visibleEntities( Visibility.module ),
-                                                moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
-                                                moduleInstance.layerInstance().visibleEntities( Visibility.application ),
-                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ),
+                                                moduleInstance.visibleEntities( module ),
+                                                moduleInstance.layerInstance().visibleEntities( layer ),
+                                                moduleInstance.layerInstance().visibleEntities( application ),
+                                                moduleInstance.layerInstance().usedLayersInstance().visibleEntities()
+                                    )
+                ),
                 findModels( new AssignableTypeLookupSpecification( type ),
-                            moduleInstance.visibleEntities( Visibility.module ),
-                            moduleInstance.layerInstance().visibleEntities( Visibility.layer ),
-                            moduleInstance.layerInstance().visibleEntities( Visibility.application ),
+                            moduleInstance.visibleEntities( module ),
+                            moduleInstance.layerInstance().visibleEntities( layer ),
+                            moduleInstance.layerInstance().visibleEntities( application ),
                             moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) );
 
             // Don't return the same EntityModel multiple times
@@ -335,9 +363,10 @@ public class TypeLookup
      *
      * <p>See {@link #lookupServiceReferences(java.lang.reflect.Type)}.</p>
      *
-     * @param <T>           Service Type
-     * @param serviceType   Looked up Type
-     * @return              First matching ServiceReference
+     * @param <T>         Service Type
+     * @param serviceType Looked up Type
+     *
+     * @return First matching ServiceReference
      */
     /* package */
     @SuppressWarnings( "unchecked" )
@@ -368,8 +397,8 @@ public class TypeLookup
      * <p>Returned Iterable contains, in order, ServiceReferences that: </p>
      *
      * <ul>
-     *  <li>exactly match the given type, in Visibility then Assembly order ;</li>
-     *  <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
+     * <li>exactly match the given type, in Visibility then Assembly order ;</li>
+     * <li>match a type assignable to the given type, in Visibility then Assembly order.</li>
      * </ul>
      *
      * <p>Multiple <b>exact</b> matches with the same Visibility are <b>allowed</b> to enable polymorphic lookup/injection.</p>
@@ -377,9 +406,10 @@ public class TypeLookup
      *
      * <p>Type lookup is done lazily and cached.</p>
      *
-     * @param <T>           Service Type
-     * @param serviceType   Looked up Type
-     * @return              All matching ServiceReferences
+     * @param <T>         Service Type
+     * @param serviceType Looked up Type
+     *
+     * @return All matching ServiceReferences
      */
     @SuppressWarnings( "unchecked" )
     /* package */ <T> Iterable<ServiceReference<T>> lookupServiceReferences( final Type serviceType )
@@ -390,14 +420,14 @@ public class TypeLookup
             // Lazily resolve ServicesReferences
             Iterable<ServiceReference<?>> matchingServices = flatten(
                 findServiceReferences( new ExactTypeLookupSpecification( serviceType ),
-                                       moduleInstance.visibleServices( Visibility.module ),
-                                       moduleInstance.layerInstance().visibleServices( Visibility.layer ),
-                                       moduleInstance.layerInstance().visibleServices( Visibility.application ),
+                                       moduleInstance.visibleServices( module ),
+                                       moduleInstance.layerInstance().visibleServices( layer ),
+                                       moduleInstance.layerInstance().visibleServices( application ),
                                        moduleInstance.layerInstance().usedLayersInstance().visibleServices() ),
                 findServiceReferences( new AssignableTypeLookupSpecification( serviceType ),
-                                       moduleInstance.visibleServices( Visibility.module ),
-                                       moduleInstance.layerInstance().visibleServices( Visibility.layer ),
-                                       moduleInstance.layerInstance().visibleServices( Visibility.application ),
+                                       moduleInstance.visibleServices( module ),
+                                       moduleInstance.layerInstance().visibleServices( layer ),
+                                       moduleInstance.layerInstance().visibleServices( application ),
                                        moduleInstance.layerInstance().usedLayersInstance().visibleServices() ) );
 
             // Don't return the same ServiceReference multiple times
@@ -412,7 +442,8 @@ public class TypeLookup
 
     @SuppressWarnings( { "raw", "unchecked" } )
     private static <T extends ModelDescriptor> Iterable<ModelModule<T>> findModels( Specification<Iterable<Class<?>>> specification,
-                                                                                    Iterable<ModelModule<T>>... models )
+                                                                                    Iterable<ModelModule<T>>... models
+    )
     {
         Specification<ModelModule<T>> spec = Specifications.translate( new ModelModuleTypesFunction(), specification );
         Iterable<ModelModule<T>> flattened = flattenIterables( iterable( models ) );
@@ -421,7 +452,8 @@ public class TypeLookup
 
     @SuppressWarnings( { "raw", "unchecked" } )
     private static Iterable<ServiceReference<?>> findServiceReferences( Specification<Iterable<Class<?>>> specification,
-                                                                        Iterable<ServiceReference<?>>... references )
+                                                                        Iterable<ServiceReference<?>>... references
+    )
     {
         Specification<ServiceReference<?>> spec = Specifications.translate( new ServiceReferenceTypesFunction(), specification );
         Iterable<ServiceReference<?>> flattened = flattenIterables( iterable( references ) );
@@ -434,7 +466,8 @@ public class TypeLookup
      */
     @SuppressWarnings( "raw" )
     private static <T extends ModelDescriptor> Iterable<ModelModule<T>> ambiguousTypeCheck( final Class type,
-                                                                                            final Iterable<ModelModule<T>> models )
+                                                                                            final Iterable<ModelModule<T>> models
+    )
     {
         return new Iterable<ModelModule<T>>()
         {
@@ -473,7 +506,6 @@ public class TypeLookup
                 // Ambiguity check done, and no ambiguities found. Return results
                 return results.iterator();
             }
-
         };
     }
 
@@ -486,7 +518,6 @@ public class TypeLookup
         {
             return modelModule.model().types();
         }
-
     }
 
     private static class ServiceReferenceTypesFunction
@@ -498,7 +529,6 @@ public class TypeLookup
         {
             return serviceReference.types();
         }
-
     }
 
     private static abstract class AbstractTypeLookupSpecification
@@ -563,7 +593,6 @@ public class TypeLookup
         }
 
         protected abstract boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType );
-
     }
 
     private static final class ExactTypeLookupSpecification
@@ -580,7 +609,6 @@ public class TypeLookup
         {
             return candidate.equals( lookedUpType );
         }
-
     }
 
     private static final class AssignableTypeLookupSpecification
@@ -597,7 +625,5 @@ public class TypeLookup
         {
             return !candidate.equals( lookedUpType ) && lookedUpType.isAssignableFrom( candidate );
         }
-
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
index 1c0f650..7eb57b9 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/UsedLayersInstance.java
@@ -16,12 +16,17 @@ package org.qi4j.runtime.structure;
 
 import java.util.List;
 import org.qi4j.api.common.Visibility;
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.object.ObjectDescriptor;
 import org.qi4j.api.service.ServiceReference;
+import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.functional.Function;
 import org.qi4j.runtime.composite.TransientModel;
 import org.qi4j.runtime.entity.EntityModel;
 import org.qi4j.runtime.object.ObjectModel;
 import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
 
 import static org.qi4j.functional.Iterables.*;
 
@@ -37,48 +42,48 @@ public final class UsedLayersInstance
         this.usedLayerInstances = usedLayerInstances;
     }
 
-    /* package */ Iterable<ModelModule<ObjectModel>> visibleObjects()
+    /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ObjectModel>>>()
+        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ObjectDescriptor>>>()
         {
             @Override
-            public Iterable<ModelModule<ObjectModel>> map( LayerInstance layerInstance )
+            public Iterable<ModelModule<ObjectDescriptor>> map( LayerInstance layerInstance )
             {
                 return layerInstance.visibleObjects( Visibility.application );
             }
         }, usedLayerInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<TransientModel>> visibleTransients()
+    /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<TransientModel>>>()
+        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<TransientDescriptor>>>()
         {
             @Override
-            public Iterable<ModelModule<TransientModel>> map( LayerInstance layerInstance )
+            public Iterable<ModelModule<TransientDescriptor>> map( LayerInstance layerInstance )
             {
                 return layerInstance.visibleTransients( Visibility.application );
             }
         }, usedLayerInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<EntityModel>> visibleEntities()
+    /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<EntityModel>>>()
+        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<EntityDescriptor>>>()
         {
             @Override
-            public Iterable<ModelModule<EntityModel>> map( LayerInstance layerInstance )
+            public Iterable<ModelModule<EntityDescriptor>> map( LayerInstance layerInstance )
             {
                 return layerInstance.visibleEntities( Visibility.application );
             }
         }, usedLayerInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<ValueModel>> visibleValues()
+    /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues()
     {
-        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ValueModel>>>()
+        return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ValueDescriptor>>>()
         {
             @Override
-            public Iterable<ModelModule<ValueModel>> map( LayerInstance layerInstance )
+            public Iterable<ModelModule<ValueDescriptor>> map( LayerInstance layerInstance )
             {
                 return layerInstance.visibleValues( Visibility.application );
             }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/0b9b6555/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 eae69b1..ff17a07 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
@@ -24,7 +24,7 @@ import org.qi4j.api.entity.LifecycleException;
 import org.qi4j.runtime.composite.FunctionStateResolver;
 import org.qi4j.runtime.entity.EntityInstance;
 import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;