You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/11/23 08:40:23 UTC

[isis] 04/07: ISIS-2039: cleaning up the component-provider mess

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

ahuber pushed a commit to branch 2039-Redesign_of_Config
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 0f5b9855726283faef2826c2686e65ead4db3d33
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 23 00:29:20 2018 +0100

    ISIS-2039: cleaning up the component-provider mess
    
    for web-modules: no longer negotiate by writing attributes to the
    servlet-context, instead use a java class for that
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2039
---
 .../org/apache/isis/config/internal/_Config.java   |   2 +-
 .../configbuilder/IsisConfigurationBuilder.java    | 301 ++-------------------
 ...r.java => IsisConfigurationBuilderDefault.java} |  33 ++-
 ...ConfigurationBuilder_PeekConfigurationTest.java |   2 +-
 ...PrimerForEnvironmentVariableISIS_OPTS_Test.java |   2 +-
 .../services/ServicesInjectorBuilder.java          |  14 -
 .../action/ActionAnnotationFacetFactoryTest.java   |   2 +
 .../DomainObjectAnnotationFacetFactoryTest.java    |   3 +-
 .../PropertyAnnotationFacetFactoryTest.java        |   5 +-
 .../headless/IsisComponentProviderDefault.java     |  35 ---
 .../isis/core/runtime/headless/IsisSystem.java     |  14 +-
 .../runtime/system/session/IsisSessionFactory.java |   6 +-
 .../system/session/IsisSessionFactoryBuilder.java  |   7 +-
 .../IsisComponentProvider.java                     |  64 +++--
 .../IsisComponentProviderBuilder.java              |  78 ++++++
 .../IsisComponentProviderDefault2.java             |  84 ------
 .../IsisComponentProviderUsingInstallers.java      |  10 +-
 .../isis/core/webapp/IsisWebAppBootstrapper.java   |   8 +-
 .../isis/core/webapp/IsisWebAppConfigHelper.java   |  90 ++++++
 .../isis/core/webapp/IsisWebAppConfigProvider.java | 162 -----------
 .../core/webapp/IsisWebAppContextListener.java     |  21 +-
 .../apache/isis/core/webapp/modules/WebModule.java |  99 +------
 .../isis/core/webapp/modules/WebModuleContext.java | 111 ++++++++
 .../modules/WebModule_FallbackBootstrapper.java    |   5 +-
 .../modules/WebModule_LogOnExceptionLogger.java    |  26 +-
 .../core/webapp/modules/WebModule_RestEasy.java    |  15 +-
 .../isis/core/webapp/modules/WebModule_Shiro.java  |  10 +-
 .../webapp/modules/WebModule_StaticResources.java  |   4 +-
 .../isis/core/webapp/modules/WebModule_Wicket.java |  24 +-
 .../wicket/viewer/IsisWicketApplication.java       |  25 +-
 .../org/apache/isis/core/webserver/WebServer.java  |   6 +-
 .../webserver/config/WebServerConfigBuilder.java   |  24 +-
 32 files changed, 484 insertions(+), 808 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/internal/_Config.java b/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
index d496998..f2872c8 100644
--- a/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
+++ b/core/config/src/main/java/org/apache/isis/config/internal/_Config.java
@@ -102,7 +102,7 @@ public class _Config {
     }
     
     private static IsisConfigurationBuilder createBuilder() {
-        final IsisConfigurationBuilder builder = new IsisConfigurationBuilder(); 
+        final IsisConfigurationBuilder builder = IsisConfigurationBuilder.empty(); 
         return builder;
     }
 
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
index 5fe0762..be0f5b1 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
@@ -16,156 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.commons.configbuilder;
 
-import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
 import org.apache.isis.core.commons.config.NotFoundPolicy;
-import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-
-/**
- * Holds a mutable set of properties representing the configuration.
- *
- * This implementation loads the specified
- * configuration resource (file) from the given {@link ResourceStreamSource}(s).
- *
- * <p>
- * If a property is in multiple configuration resources then the latter
- * resources will overwrite the former.
- *
- * <p>
- * Mutable/immutable pair with the {@link IsisConfiguration}. To obtain the
- * configuration, use {@link #getConfiguration()}.
- *
- * @see {@link IsisConfiguration} for more details on the mutable/immutable pair pattern.
- *
- */
-public final class IsisConfigurationBuilder {
-
-    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilder.class);
-
-    // -- constructor, fields
-
-    private final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain;
-
-    private IsisConfigurationDefault configuration;
-
-    private final Set<String> configurationResourcesFound = _Sets.newLinkedHashSet();
-    private final Set<String> configurationResourcesNotFound = _Sets.newLinkedHashSet();
-
-    public IsisConfigurationBuilder() {
-        this(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
-    }
-
-    public IsisConfigurationBuilder(final ResourceStreamSource... resourceStreamSources) {
-        this(createComposite(Arrays.asList(resourceStreamSources)));
-    }
-
-    public IsisConfigurationBuilder(final List<ResourceStreamSource> resourceStreamSources) {
-        this(createComposite(resourceStreamSources));
-    }
-
-    public IsisConfigurationBuilder(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
-        this.resourceStreamSourceChain = resourceStreamSourceChain;
-        configuration = new IsisConfigurationDefault(resourceStreamSourceChain);
-    }
-
-    private static ResourceStreamSourceChainOfResponsibility createComposite(
-            final List<ResourceStreamSource> resourceStreamSources) {
-        final ResourceStreamSourceChainOfResponsibility composite = new ResourceStreamSourceChainOfResponsibility();
-        for (final ResourceStreamSource rss : resourceStreamSources) {
-            if (rss == null) {
-                continue;
-            }
-            composite.addResourceStreamSource(rss);
-        }
-        return composite;
-    }
 
-    public void addDefaultConfigurationResourcesAndPrimers() {
-        addDefaultConfigurationResources();
-        addDefaultPrimers();
-    }
-
-    private void addDefaultConfigurationResources() {
-        IsisConfigurationDefault.ContainsPolicy ignorePolicy = IsisConfigurationDefault.ContainsPolicy.IGNORE;
-        NotFoundPolicy continuePolicy = NotFoundPolicy.CONTINUE;
-
-        addConfigurationResource(ConfigurationConstants.DEFAULT_CONFIG_FILE, NotFoundPolicy.FAIL_FAST, ignorePolicy);
-
-        addConfigurationResource(ConfigurationConstants.WEB_CONFIG_FILE, continuePolicy, ignorePolicy);
-        addConfigurationResource("war.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("viewer_wicket.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("viewer_restful.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("viewer_restfulobjects.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("persistor_datanucleus.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("persistor.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("authentication_shiro.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("authentication_bypass.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("authentication.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("authorization_shiro.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("authorization_bypass.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("authorization.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("reflector_java.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("reflector.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("fixtures-installer_configuration.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("fixtures-installer.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("services-installer_annotation.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("services-installer_configuration.properties", continuePolicy, ignorePolicy);
-
-        addConfigurationResource("services-installer_configuration-and-annotation.properties", continuePolicy, ignorePolicy);
-        addConfigurationResource("services-installer.properties", continuePolicy, ignorePolicy);
-
-        // both override and overrides are accepted (because I keep forgetting which)
-        addConfigurationResource("override.properties", NotFoundPolicy.CONTINUE, IsisConfigurationDefault.ContainsPolicy.OVERWRITE);
-        addConfigurationResource("overrides.properties", NotFoundPolicy.CONTINUE, IsisConfigurationDefault.ContainsPolicy.OVERWRITE);
-    }
-
-    private void addDefaultPrimers() {
-        primeWith(new PrimerForSystemProperties());
-        primeWith(new PrimerForEnvironmentVariablesIsisPrefix());
-        primeWith(new PrimerForEnvironmentVariableISIS_OPTS());
-    }
-
-    // -- addResourceStreamSource, addResourceStreamSources
-
-    public void addResourceStreamSource(final ResourceStreamSource resourceStreamSource) {
-        addResourceStreamSources(resourceStreamSource);
-    }
-
-    public void addResourceStreamSources(final ResourceStreamSource... resourceStreamSources) {
-        addResourceStreamSources(Arrays.asList(resourceStreamSources));
-    }
-
-    public void addResourceStreamSources(final List<ResourceStreamSource> resourceStreamSources) {
-        for (ResourceStreamSource resourceStreamSource : resourceStreamSources) {
-            this.resourceStreamSourceChain.addResourceStreamSource(resourceStreamSource);
-        }
-    }
+public interface IsisConfigurationBuilder {
+    
+    void addDefaultConfigurationResourcesAndPrimers();
 
-    // -- addConfigurationResource
+    void addResourceStreamSource(ResourceStreamSource resourceStreamSource);
+    void addResourceStreamSources(ResourceStreamSource... resourceStreamSources);
+    void addResourceStreamSources(List<ResourceStreamSource> resourceStreamSources);
 
     /**
      * Registers the configuration resource (usually, a file) with the specified
@@ -174,157 +39,47 @@ public final class IsisConfigurationBuilder {
      * <p>
      * If the configuration resource cannot be found then the provided
      * {@link NotFoundPolicy} determines whether an exception is thrown or not.
-     *
-     * <p>
-     * Must be called before {@link IsisConfigurationBuilder#getConfiguration()}.
-     */
-    public void addConfigurationResource(
-            final String configurationResource,
-            final NotFoundPolicy notFoundPolicy,
-            final IsisConfigurationDefault.ContainsPolicy containsPolicy) {
-
-        if(LOG.isDebugEnabled()) {
-            LOG.debug(String.format(
-                    "checking availability of configuration resource: %s, notFoundPolicy: %s",
-                    configurationResource, notFoundPolicy));
-        }
-        loadConfigurationResource(configurationResource, notFoundPolicy, containsPolicy);
-    }
-
-    /**
-     * Loads the configuration resource (usually, a file) with the specified
-     * name from the first {@link ResourceStreamSource} available.
-     *
-     * <p>
-     * If the configuration resource cannot be found then the provided
-     * {@link NotFoundPolicy} determines whether an exception is thrown or not.
      */
-    private void loadConfigurationResource(
-            final String configurationResource,
-            final NotFoundPolicy notFoundPolicy,
-            final IsisConfigurationDefault.ContainsPolicy containsPolicy) {
-
-        try {
-            final PropertiesReader propertiesReader =
-                    loadConfigurationResource(resourceStreamSourceChain, configurationResource);
-            LOG.info("loading properties from {}", configurationResource);
-            configuration.add(propertiesReader.getProperties(), containsPolicy);
-            configurationResourcesFound.add(configurationResource);
-            return;
-        } catch (final IOException ignore) {
-            // ignore
-        }
-        if (notFoundPolicy == NotFoundPolicy.FAIL_FAST) {
-            throw new IsisException(String.format(
-                    "failed to load '%s'; tried using: %s",
-                    configurationResource, resourceStreamSourceChain.getName()));
-        }
-        configurationResourcesNotFound.add(configurationResource);
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("'{}' not found, but not needed", configurationResource);
-
-        }
-    }
-
-    private PropertiesReader loadConfigurationResource(final ResourceStreamSource resourceStreamSource, final String configurationResource) throws IOException {
-        return new PropertiesReader(resourceStreamSource, configurationResource);
-    }
-
-    // -- add, put
+    void addConfigurationResource(String configurationResource, NotFoundPolicy notFoundPolicy,
+            IsisConfigurationDefault.ContainsPolicy containsPolicy);
 
     /**
      * Adds additional property; if already present then will _not_ be replaced.
      */
-    public void add(final String key, final String value) {
-        configuration.add(key, value);
-    }
+    void add(String key, String value);
 
     /**
      * Adds/updates property; if already present then _will_ be replaced.
      */
-    public void put(final String key, final String value) {
-        configuration.put(key, value);
-    }
-
-    // -- PRIMING
-
-    public interface Primer {
-        void prime(IsisConfigurationBuilder isisConfigurationBuilder);
-    }
-
-    public void primeWith(final Primer primer) {
-        LOG.debug("priming configurations for '{}'", primer);
-        primer.prime(this);
-    }
-
-    // -- PEEKING
-    
-    public String peekAtString(String key) {
-        return configuration.getString(key);
-    }
-
-    public String peekAtString(String key, String defaultValue) {
-        return configuration.getString(key, defaultValue);
-    }
-
-    public boolean peekAtBoolean(String key) {
-        return configuration.getBoolean(key);
-    }
-
-    public boolean peekAtBoolean(String key, boolean defaultValue) {
-        return configuration.getBoolean(key, defaultValue);
-    }
-    
-    public String[] peekAtList(String key) {
-        return configuration.getList(key);
-    }
-    
-    // -- BUILD
+    void put(String key, String value);
 
-    public IsisConfiguration build() {
+    void primeWith(Primer primer);
 
-        dumpResourcesToLog();
+    String peekAtString(String key);
+    String peekAtString(String key, String defaultValue);
 
-        final IsisConfigurationDefault copy = new IsisConfigurationDefault(resourceStreamSourceChain);
-        final Properties props = new Properties();
-        props.putAll(configuration.asMap());
-        copy.add(props, ContainsPolicy.OVERWRITE);
+    boolean peekAtBoolean(String key);
+    boolean peekAtBoolean(String key, boolean defaultValue);
 
-        configuration = null; // once built this builder is no longer usable
-        
-        return copy;
-    }
+    String[] peekAtList(String key);
 
-    // -- dumpResourcesToLog, toString
+    IsisConfiguration build();
 
     /**
      * Log a summary of resources found or not found.
      */
-    public void dumpResourcesToLog() {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Configuration resources FOUND:");
-            for (String resource : configurationResourcesFound) {
-                LOG.debug("*  {}", resource);
-            }
-            LOG.debug("Configuration resources NOT FOUND (but not needed):");
-            for (String resource : configurationResourcesNotFound) {
-                LOG.debug("*  {}", resource);
-            }
-        }
+    void dumpResourcesToLog();
+    
+    // -- PRIMING
+    
+    public interface Primer {
+        void prime(IsisConfigurationBuilder isisConfigurationBuilder);
     }
 
+    // -- FACTORIES
     
+    static IsisConfigurationBuilder empty() {
+        return new IsisConfigurationBuilderDefault();
+    }
 
-    //TODO[2039]
-    //    private final static ToString<IsisConfigurationBuilder> toString =
-    //            ToString.<IsisConfigurationBuilder>
-    //    toString("resourceStream", x->x.resourceStreamSourceChain)
-    //    .thenToString("configResources", x->x.configurationResourcesFound)
-    //    ;
-    //
-    //    @Override
-    //    public String toString() {
-    //        return toString.toString(this);
-    //    }
-
-}
+}
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
similarity index 94%
copy from core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
copy to core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
index 5fe0762..5374960 100644
--- a/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
+++ b/core/config/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilderDefault.java
@@ -55,9 +55,9 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
  * @see {@link IsisConfiguration} for more details on the mutable/immutable pair pattern.
  *
  */
-public final class IsisConfigurationBuilder {
+final class IsisConfigurationBuilderDefault implements IsisConfigurationBuilder {
 
-    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilder.class);
+    private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationBuilderDefault.class);
 
     // -- constructor, fields
 
@@ -68,19 +68,19 @@ public final class IsisConfigurationBuilder {
     private final Set<String> configurationResourcesFound = _Sets.newLinkedHashSet();
     private final Set<String> configurationResourcesNotFound = _Sets.newLinkedHashSet();
 
-    public IsisConfigurationBuilder() {
+    public IsisConfigurationBuilderDefault() {
         this(ResourceStreamSourceFileSystem.create(ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY));
     }
 
-    public IsisConfigurationBuilder(final ResourceStreamSource... resourceStreamSources) {
+    public IsisConfigurationBuilderDefault(final ResourceStreamSource... resourceStreamSources) {
         this(createComposite(Arrays.asList(resourceStreamSources)));
     }
 
-    public IsisConfigurationBuilder(final List<ResourceStreamSource> resourceStreamSources) {
+    public IsisConfigurationBuilderDefault(final List<ResourceStreamSource> resourceStreamSources) {
         this(createComposite(resourceStreamSources));
     }
 
-    public IsisConfigurationBuilder(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
+    public IsisConfigurationBuilderDefault(final ResourceStreamSourceChainOfResponsibility resourceStreamSourceChain) {
         this.resourceStreamSourceChain = resourceStreamSourceChain;
         configuration = new IsisConfigurationDefault(resourceStreamSourceChain);
     }
@@ -97,6 +97,7 @@ public final class IsisConfigurationBuilder {
         return composite;
     }
 
+    @Override
     public void addDefaultConfigurationResourcesAndPrimers() {
         addDefaultConfigurationResources();
         addDefaultPrimers();
@@ -151,14 +152,17 @@ public final class IsisConfigurationBuilder {
 
     // -- addResourceStreamSource, addResourceStreamSources
 
+    @Override
     public void addResourceStreamSource(final ResourceStreamSource resourceStreamSource) {
         addResourceStreamSources(resourceStreamSource);
     }
 
+    @Override
     public void addResourceStreamSources(final ResourceStreamSource... resourceStreamSources) {
         addResourceStreamSources(Arrays.asList(resourceStreamSources));
     }
 
+    @Override
     public void addResourceStreamSources(final List<ResourceStreamSource> resourceStreamSources) {
         for (ResourceStreamSource resourceStreamSource : resourceStreamSources) {
             this.resourceStreamSourceChain.addResourceStreamSource(resourceStreamSource);
@@ -176,8 +180,9 @@ public final class IsisConfigurationBuilder {
      * {@link NotFoundPolicy} determines whether an exception is thrown or not.
      *
      * <p>
-     * Must be called before {@link IsisConfigurationBuilder#getConfiguration()}.
+     * Must be called before {@link IsisConfigurationBuilderDefault#getConfiguration()}.
      */
+    @Override
     public void addConfigurationResource(
             final String configurationResource,
             final NotFoundPolicy notFoundPolicy,
@@ -235,6 +240,7 @@ public final class IsisConfigurationBuilder {
     /**
      * Adds additional property; if already present then will _not_ be replaced.
      */
+    @Override
     public void add(final String key, final String value) {
         configuration.add(key, value);
     }
@@ -242,16 +248,14 @@ public final class IsisConfigurationBuilder {
     /**
      * Adds/updates property; if already present then _will_ be replaced.
      */
+    @Override
     public void put(final String key, final String value) {
         configuration.put(key, value);
     }
 
     // -- PRIMING
 
-    public interface Primer {
-        void prime(IsisConfigurationBuilder isisConfigurationBuilder);
-    }
-
+    @Override
     public void primeWith(final Primer primer) {
         LOG.debug("priming configurations for '{}'", primer);
         primer.prime(this);
@@ -259,28 +263,34 @@ public final class IsisConfigurationBuilder {
 
     // -- PEEKING
     
+    @Override
     public String peekAtString(String key) {
         return configuration.getString(key);
     }
 
+    @Override
     public String peekAtString(String key, String defaultValue) {
         return configuration.getString(key, defaultValue);
     }
 
+    @Override
     public boolean peekAtBoolean(String key) {
         return configuration.getBoolean(key);
     }
 
+    @Override
     public boolean peekAtBoolean(String key, boolean defaultValue) {
         return configuration.getBoolean(key, defaultValue);
     }
     
+    @Override
     public String[] peekAtList(String key) {
         return configuration.getList(key);
     }
     
     // -- BUILD
 
+    @Override
     public IsisConfiguration build() {
 
         dumpResourcesToLog();
@@ -300,6 +310,7 @@ public final class IsisConfigurationBuilder {
     /**
      * Log a summary of resources found or not found.
      */
+    @Override
     public void dumpResourcesToLog() {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Configuration resources FOUND:");
diff --git a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java
index 6fafc22..f198f23 100644
--- a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java
+++ b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder_PeekConfigurationTest.java
@@ -33,7 +33,7 @@ public class IsisConfigurationBuilder_PeekConfigurationTest extends TestCase {
 
     @Override
     protected void setUp() throws Exception {
-    	configurationBuilder = new IsisConfigurationBuilder();
+    	configurationBuilder = IsisConfigurationBuilder.empty();
     	configurationBuilder.add("isis.test", "val");
     }
 
diff --git a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java
index e22321a..3a07d5d 100644
--- a/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java
+++ b/core/config/src/test/java/org/apache/isis/core/commons/configbuilder/PrimerForEnvironmentVariableISIS_OPTS_Test.java
@@ -34,7 +34,7 @@ public class PrimerForEnvironmentVariableISIS_OPTS_Test {
 
     @Before
     public void setUp() throws Exception {
-        builder = new IsisConfigurationBuilder();
+        builder = IsisConfigurationBuilder.empty();
     }
 
     @Test
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java
index 1990caa..2275da5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorBuilder.java
@@ -19,7 +19,6 @@ package org.apache.isis.core.metamodel.services;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
 import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
 
@@ -28,7 +27,6 @@ import static org.apache.isis.commons.internal.base._With.computeIfAbsent;
 public class ServicesInjectorBuilder {
 
     private final List<Object> services = new ArrayList<>();
-    private IsisConfigurationBuilder configBuilder;
     private InjectorMethodEvaluator injectorMethodEvaluator;
     private boolean autowireSetters = false; 
     private boolean autowireInject = false;
@@ -43,11 +41,6 @@ public class ServicesInjectorBuilder {
         return this;
     }
     
-    public ServicesInjectorBuilder configBuilder(IsisConfigurationBuilder configBuilder) {
-        this.configBuilder = configBuilder;
-        return this;
-    }
-    
     public ServicesInjectorBuilder injectorMethodEvaluator(InjectorMethodEvaluator injectorMethodEvaluator) {
         this.injectorMethodEvaluator = injectorMethodEvaluator;
         return this;
@@ -68,7 +61,6 @@ public class ServicesInjectorBuilder {
     public ServicesInjector build() {
         return new ServicesInjector(
                 new ArrayList<>(services), 
-//              computeIfAbsent(configBuilder, this::defaultConfigBuilder), 
                 computeIfAbsent(injectorMethodEvaluator, this::defaultInjectorMethodEvaluatorDefault),
                 autowireSetters,
                 autowireInject
@@ -77,14 +69,8 @@ public class ServicesInjectorBuilder {
     
     // -- HELPER
     
-    private IsisConfigurationBuilder defaultConfigBuilder() {
-        return new IsisConfigurationBuilder();
-    }
-    
     private InjectorMethodEvaluator defaultInjectorMethodEvaluatorDefault() {
         return new InjectorMethodEvaluatorDefault();
     }
-
-
     
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index e532ebd..f9b477f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -107,6 +107,8 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         
         // PRODUCTION
         
+        _Config.clear();
+        
         facetFactory = new ActionAnnotationFacetFactory();
 
         context.checking(new Expectations() {{
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 0fa77f5..5fa2c67 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -65,10 +65,9 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
     @Before
     public void setUp() throws Exception {
+        _Config.clear();
         facetFactory = new DomainObjectAnnotationFacetFactory();
-
         facetFactory.setServicesInjector(mockServicesInjector);
-
     }
 
     @After
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index c6aea89..3f72391 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -106,6 +106,7 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
 
     @Before
     public void setUp() throws Exception {
+        _Config.clear();
         facetFactory = new PropertyAnnotationFacetFactory();
         facetFactory.setServicesInjector(mockServicesInjector);
     }
@@ -328,6 +329,8 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
             }
 
             // given
+            _Config.put("isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault", true);
+            
             final Class<?> cls = Customer.class;
             propertyMethod = findMethod(Customer.class, "getName");
 
@@ -337,8 +340,6 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
 
             // expect
             allowingLoadSpecificationRequestsFor(cls, propertyMethod.getReturnType());
-            
-            _Config.put("isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault", true);
 
             // when
             final FacetFactory.ProcessMethodContext processMethodContext = new FacetFactory.ProcessMethodContext(cls, null,
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisComponentProviderDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisComponentProviderDefault.java
deleted file mode 100644
index d62f00b..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisComponentProviderDefault.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.headless;
-
-import org.apache.isis.applib.AppManifest;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
-
-public class IsisComponentProviderDefault extends IsisComponentProviderDefault2 {
-
-    public IsisComponentProviderDefault(
-            final AppManifest appManifestIfAny,
-            final IsisConfigurationBuilder configurationBuilder) {
-        super(appManifestIfAny, configurationBuilder);
-
-    }
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
index adcba64..450a4e1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystem.java
@@ -25,8 +25,8 @@ import java.util.stream.Collectors;
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -77,7 +77,7 @@ public class IsisSystem {
 
         protected AuthenticationRequest authenticationRequest = new AuthenticationRequestNameOnly("tester");
 
-        protected IsisConfigurationBuilder configurationBuilder = new IsisConfigurationBuilder();
+        protected IsisConfigurationBuilder configurationBuilder = IsisConfigurationBuilder.empty();
 
         protected AppManifest appManifestIfAny;
 
@@ -180,12 +180,12 @@ public class IsisSystem {
 
         boolean firstTime = isisSessionFactory == null;
         if(firstTime) {
-            componentProvider = new IsisComponentProviderDefault(
-                    appManifestIfAny,
-                    configurationBuilder
-                    );
+
+            componentProvider = IsisComponentProvider.builder()
+                    .appManifest(appManifestIfAny)
+                    .build();
             
-            IsisContext.EnvironmentPrimer.primeEnvironment(configurationBuilder);
+            _Config.acceptBuilder(IsisContext.EnvironmentPrimer::primeEnvironment);
 
             final IsisSessionFactoryBuilder isisSessionFactoryBuilder = 
                     new IsisSessionFactoryBuilder(componentProvider, appManifestIfAny);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
index c7fc3e8..8fc1eb7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
@@ -25,9 +25,6 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixtures.LogonFixture;
@@ -72,8 +69,7 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManagerExc
 public class IsisSessionFactory
 implements ApplicationScopedComponent, AppManifestProvider {
 
-    @SuppressWarnings("unused")
-    private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactory.class);
+    //private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactory.class);
 
     // -- constructor, fields, accessors
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
index 0145f47..57442fd 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
@@ -51,7 +51,6 @@ import org.apache.isis.core.runtime.system.internal.IsisTimeZoneInitializer;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactoryMetamodelRefiner;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.schema.utils.ChangesDtoUtils;
 import org.apache.isis.schema.utils.CommandDtoUtils;
@@ -73,7 +72,11 @@ public class IsisSessionFactoryBuilder {
     private final IsisTimeZoneInitializer timeZoneInitializer;
 
     public IsisSessionFactoryBuilder(final AppManifest appManifest) {
-        this(new IsisComponentProviderDefault2(appManifest, null), appManifest);
+        this(IsisComponentProvider.builder()
+                .appManifest(appManifest)
+                .addConfigPackageAsResourceStreamSource()
+                .build(),
+                appManifest);
     }
 
     public IsisSessionFactoryBuilder(
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 20d525b..06d2a28 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -45,6 +45,7 @@ import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.commons.lang.ClassFunctions;
@@ -71,27 +72,32 @@ import org.apache.isis.progmodels.dflt.JavaReflectorHelper;
 import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
 
 import static org.apache.isis.commons.internal.base._With.requires;
+import static org.apache.isis.config.internal._Config.acceptBuilder;
+import static org.apache.isis.config.internal._Config.applyBuilder;
 
 /**
- *
+ * 
  */
-public abstract class IsisComponentProvider {
+public final class IsisComponentProvider {
+    
+    // -- BUILDER
+    
+    public static IsisComponentProviderBuilder builder() {
+        return new IsisComponentProviderBuilder();
+    }
 
     // -- constructor, fields
 
     private final AppManifest appManifest;
-    private final IsisConfigurationBuilder configurationBuilder;
     protected final List<Object> services;
     protected final AuthenticationManager authenticationManager;
     protected final AuthorizationManager authorizationManager;
 
-    public IsisComponentProvider(
-            final IsisConfigurationBuilder configurationBuilder,
+    IsisComponentProvider(
             final AppManifest appManifest,
             final AuthenticationManager authenticationManager,
-            final AuthorizationManager authorizationManager){
+            final AuthorizationManager authorizationManager) {
 
-        this.configurationBuilder = requires(configurationBuilder, "configurationBuilder");
         this.appManifest = requires(appManifest, "appManifest");
         
         putAppManifestKey(appManifest);
@@ -104,7 +110,7 @@ public abstract class IsisComponentProvider {
 
         final String fixtureClassNamesCsv = classNamesFrom(getAppManifest().getFixtures());
         
-        configurationBuilder.add(FixturesInstallerFromConfiguration.FIXTURES, fixtureClassNamesCsv);
+        _Config.put(FixturesInstallerFromConfiguration.FIXTURES, fixtureClassNamesCsv);
 
         this.authenticationManager = authenticationManager;
         this.authorizationManager = authorizationManager;
@@ -120,8 +126,7 @@ public abstract class IsisComponentProvider {
         // required to prevent RegisterEntities validation from complaining
         // if it can't find any @PersistenceCapable entities in a module
         // that contains only services.
-        configurationBuilder.add(
-                SystemConstants.APP_MANIFEST_KEY, appManifest.getClass().getName() );
+        _Config.put(SystemConstants.APP_MANIFEST_KEY, appManifest.getClass().getName() );
     }
 
     private void findAndRegisterTypes(final AppManifest appManifest) {
@@ -232,8 +237,10 @@ public abstract class IsisComponentProvider {
         final Stream<String> packageNames = modulePackageNamesFrom(appManifest);
         final String packageNamesCsv = packageNames.collect(Collectors.joining(","));
 
-        configurationBuilder.add(ServicesInstallerFromAnnotation.PACKAGE_PREFIX_KEY, packageNamesCsv);
-        configurationBuilder.add(RegisterEntities.PACKAGE_PREFIX_KEY, packageNamesCsv);
+        acceptBuilder(builder->{
+            builder.add(ServicesInstallerFromAnnotation.PACKAGE_PREFIX_KEY, packageNamesCsv);
+            builder.add(RegisterEntities.PACKAGE_PREFIX_KEY, packageNamesCsv);    
+        });
 
         final List<Class<?>> additionalServices = appManifest.getAdditionalServices();
         if(additionalServices != null) {
@@ -243,9 +250,9 @@ public abstract class IsisComponentProvider {
     }
 
     private void appendToPropertyCsvValue(final String servicesKey, final String additionalServicesCsv) {
-        final String existingServicesCsv = configurationBuilder.peekAtString(servicesKey);
+        final String existingServicesCsv = _Config.peekAtString(servicesKey);
         final String servicesCsv = join(existingServicesCsv, additionalServicesCsv);
-        configurationBuilder.add(servicesKey, servicesCsv);
+        _Config.put(servicesKey, servicesCsv);
     }
 
     private static String join(final String csv1, final String csv2) {
@@ -292,11 +299,17 @@ public abstract class IsisComponentProvider {
 
     private void addToConfigurationUsing(final AppManifest appManifest) {
         final Map<String, String> configurationProperties = appManifest.getConfigurationProperties();
-        if (configurationProperties != null) {
-            for (Map.Entry<String, String> configProp : configurationProperties.entrySet()) {
-                configurationBuilder.add(configProp.getKey(), configProp.getValue());
+        
+        acceptBuilder(builder->{
+        
+            if (configurationProperties != null) {
+                for (Map.Entry<String, String> configProp : configurationProperties.entrySet()) {
+                    builder.add(configProp.getKey(), configProp.getValue());
+                }
             }
-        }
+            
+        });
+        
     }
 
     // -- provideAuth*
@@ -312,7 +325,7 @@ public abstract class IsisComponentProvider {
     // -- provideServiceInjector
 
     public ServicesInjector provideServiceInjector() {
-        return ServicesInjector.builderOf(configurationBuilder)
+        return applyBuilder(ServicesInjector::builderOf)
                 .addServices(services)
                 .build();
     }
@@ -323,7 +336,7 @@ public abstract class IsisComponentProvider {
             final ServicesInjector servicesInjector,
             final Collection<MetaModelRefiner> metaModelRefiners)  throws IsisSystemException {
 
-        final ProgrammingModel programmingModel = createProgrammingModel();
+        final ProgrammingModel programmingModel = applyBuilder(this::createProgrammingModel);
 
         final MetaModelValidator mmv = createMetaModelValidator();
 
@@ -336,19 +349,18 @@ public abstract class IsisComponentProvider {
     protected MetaModelValidator createMetaModelValidator() {
         
         final String metaModelValidatorClassName =
-                configurationBuilder.peekAtString(
+                _Config.peekAtString(
                         ReflectorConstants.META_MODEL_VALIDATOR_CLASS_NAME,
                         ReflectorConstants.META_MODEL_VALIDATOR_CLASS_NAME_DEFAULT);
         return InstanceUtil.createInstance(metaModelValidatorClassName, MetaModelValidator.class);
     }
 
-    protected ProgrammingModel createProgrammingModel() {
-        
-        final DeprecatedPolicy deprecatedPolicy = DeprecatedPolicy.parse(configurationBuilder);
+    protected ProgrammingModel createProgrammingModel(IsisConfigurationBuilder builder) {
+        final DeprecatedPolicy deprecatedPolicy = DeprecatedPolicy.parse(builder);
 
         final ProgrammingModel programmingModel = new ProgrammingModelFacetsJava5(deprecatedPolicy);
-        ProgrammingModel.Util.includeFacetFactories(configurationBuilder, programmingModel);
-        ProgrammingModel.Util.excludeFacetFactories(configurationBuilder, programmingModel);
+        ProgrammingModel.Util.includeFacetFactories(builder, programmingModel);
+        ProgrammingModel.Util.excludeFacetFactories(builder, programmingModel);
         return programmingModel;
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
new file mode 100644
index 0000000..128de8a
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
@@ -0,0 +1,78 @@
+package org.apache.isis.core.runtime.systemusinginstallers;
+
+import java.util.List;
+
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.resource.ResourceStreamSource;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
+import org.apache.isis.core.runtime.authentication.AuthenticationManager;
+import org.apache.isis.core.runtime.authentication.standard.AuthenticationManagerStandard;
+import org.apache.isis.core.runtime.authorization.AuthorizationManager;
+import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
+
+import static org.apache.isis.commons.internal.base._With.computeIfAbsent;
+import static org.apache.isis.config.internal._Config.acceptBuilder;
+
+public class IsisComponentProviderBuilder {
+    
+    private AppManifest appManifest;
+    private AuthenticationManager authenticationManager;
+    private AuthorizationManager authorizationManager;
+    private final List<ResourceStreamSource> resourceStreamSources = _Lists.newArrayList();
+    
+    public IsisComponentProviderBuilder appManifest(AppManifest appManifest) {
+        this.appManifest = appManifest;
+        return this;
+    }
+    
+    public IsisComponentProviderBuilder addResourceStreamSource(ResourceStreamSource source) {
+        resourceStreamSources.add(source);
+        return this;
+    }
+    
+    // -- SHORTCUTS
+    
+    /**
+     * Default will read <tt>isis.properties</tt> (and other optional property files) from the 'config'
+     * package on the current classpath.
+     */
+    public IsisComponentProviderBuilder addConfigPackageAsResourceStreamSource() {
+        addResourceStreamSource(ResourceStreamSourceContextLoaderClassPath.create("config"));
+        return this;
+    }
+    
+    // -- BUILD
+    
+    public IsisComponentProvider build() {
+        
+        authenticationManager = computeIfAbsent(authenticationManager, 
+                IsisComponentProviderBuilder::authenticationManagerWithBypass);
+        
+        authorizationManager = computeIfAbsent(authorizationManager, 
+                AuthorizationManagerStandard::new);
+        
+        acceptBuilder(builder->{
+            resourceStreamSources.forEach(builder::addResourceStreamSource);
+        });
+        
+        return new IsisComponentProvider(appManifest, authenticationManager, authorizationManager);
+    }
+    
+    // -- HELPER
+    
+    
+    /**
+     * The standard authentication manager, configured with the 'bypass' authenticator 
+     * (allows all requests through).
+     * <p>
+     * integration tests ignore appManifest for authentication and authorization.
+     */
+    private static AuthenticationManager authenticationManagerWithBypass() {
+        final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
+        authenticationManager.addAuthenticator(new AuthenticatorBypass());
+        return authenticationManager;
+    }
+    
+    
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
deleted file mode 100644
index e161dfb..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.systemusinginstallers;
-
-import org.apache.isis.applib.AppManifest;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
-import org.apache.isis.core.runtime.authentication.AuthenticationManager;
-import org.apache.isis.core.runtime.authentication.standard.AuthenticationManagerStandard;
-import org.apache.isis.core.runtime.authorization.AuthorizationManager;
-import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
-
-public class IsisComponentProviderDefault2 extends IsisComponentProvider  {
-
-    public IsisComponentProviderDefault2(
-            final AppManifest appManifest,
-            final IsisConfigurationBuilder configurationBuilder) {
-        this(elseDefault(configurationBuilder), appManifest);
-
-    }
-    
-    // -- HELPER
-
-    private IsisComponentProviderDefault2(
-            final IsisConfigurationBuilder configurationBuilder,
-            final AppManifest appManifest
-            ) {
-        this(configurationBuilder, appManifest,
-                // integration tests ignore appManifest for authentication and authorization.
-                authenticationManagerWithBypass(configurationBuilder),
-                new AuthorizationManagerStandard());
-    }
-
-    private IsisComponentProviderDefault2(
-            final IsisConfigurationBuilder configurationBuilder,
-            final AppManifest appManifest,
-            final AuthenticationManager authenticationManager,
-            final AuthorizationManager authorizationManager
-            ) {
-        super(configurationBuilder, appManifest, authenticationManager, authorizationManager);
-    }
-
-
-
-    // -- constructor helpers (factories)
-    /**
-     * Default will read <tt>isis.properties</tt> (and other optional property files) from the &quot;config&quot;
-     * package on the current classpath.
-     */
-    private static IsisConfigurationBuilder elseDefault(final IsisConfigurationBuilder configurationBuilder) {
-        return configurationBuilder != null
-                ? configurationBuilder
-                        : new IsisConfigurationBuilder(ResourceStreamSourceContextLoaderClassPath.create("config"));
-    }
-
-    /**
-     * The standard authentication manager, configured with the 'bypass' authenticator (allows all requests through).
-     */
-    private static AuthenticationManager authenticationManagerWithBypass(final IsisConfigurationBuilder configuration ) {
-        final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard();
-        authenticationManager.addAuthenticator(new AuthenticatorBypass());
-        return authenticationManager;
-    }
-
-
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
index d5b36a5..560de47 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
@@ -42,8 +42,8 @@ import org.apache.isis.core.runtime.authorization.AuthorizationManagerInstaller;
 import org.apache.isis.core.runtime.system.SystemConstants;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 
-public class IsisComponentProviderUsingInstallers extends IsisComponentProvider {
-
+class IsisComponentProviderUsingInstallers  {
+/*
     // -- constructors
 
     public IsisComponentProviderUsingInstallers(
@@ -104,7 +104,7 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProvider
         return authorizationInstaller.createAuthorizationManager();
     }
 
-
+*/
 
 
     /**
@@ -122,6 +122,7 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProvider
      *
      * @deprecated - intention is to replace in future using CDI
      */
+    /*
     @Deprecated
     static class InstallerLookup implements ApplicationScopedComponent {
 
@@ -229,7 +230,6 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProvider
             return installer;
         }
 
-
-
     }
+    */
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
index 53bfd04..478fb52 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppBootstrapper.java
@@ -27,6 +27,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
 import org.apache.isis.core.commons.config.NotFoundPolicy;
 import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
@@ -64,11 +65,8 @@ public final class IsisWebAppBootstrapper implements ServletContextListener {
             final String webInfDir = servletContext.getRealPath("/WEB-INF");
             loggingConfigurer.configureLogging(webInfDir, emptyStringArray);
 
-            final IsisConfigurationBuilder isisConfigurationBuilder = 
-                    IsisWebAppConfigProvider.getInstance().getConfigurationBuilder(servletContext);
-            isisConfigurationBuilder.addDefaultConfigurationResourcesAndPrimers();
-
-            addConfigurationResourcesForDeploymentType(isisConfigurationBuilder);
+            IsisWebAppConfigHelper.initConfigurationFrom(servletContext);
+            _Config.acceptBuilder(this::addConfigurationResourcesForDeploymentType);
 
         } catch (final RuntimeException e) {
             LOG.error("startup failed", e);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java
new file mode 100644
index 0000000..844ce08
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigHelper.java
@@ -0,0 +1,90 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.webapp;
+
+import javax.servlet.ServletContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceCurrentClassClassPath;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
+import org.apache.isis.core.commons.resource.ResourceStreamSourceForWebInf;
+import org.apache.isis.core.runtime.runner.opts.OptionHandlerInitParameters;
+
+/**
+ *  
+ * @since 2.0.0-M2
+ */
+public final class IsisWebAppConfigHelper {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppConfigHelper.class);
+    private IsisWebAppConfigHelper() {}
+    
+    //private final Map<String, String> additionalConfig = _Maps.newHashMap();
+    
+    /**
+     * Initializes the IsisConfiguration subsystem with all currently available configuration values. 
+     * @param servletContext
+     * @return
+     */
+    public static void initConfigurationFrom(final ServletContext servletContext) {
+        _Config.acceptBuilder(builder->{
+            builder.primeWith(new OptionHandlerInitParameters(servletContext));
+//            additionalConfig.forEach((k, v)->builder.put(k, v));
+            addServletContextConstants(servletContext, builder);
+            addResourceStreamSources(servletContext, builder);
+            builder.addDefaultConfigurationResourcesAndPrimers();
+        });
+    }
+    
+  
+    // -- HELPER
+
+    private static void addServletContextConstants(
+            final ServletContext servletContext,
+            final IsisConfigurationBuilder isisConfigurationBuilder) {
+        
+        final String webappDir = servletContext.getRealPath("/");
+        isisConfigurationBuilder.add(WebAppConstants.WEB_APP_DIR, webappDir);
+    }
+    
+    private static void addResourceStreamSources(
+            final ServletContext servletContext,
+            final IsisConfigurationBuilder builder) {
+
+        // will load either from WEB-INF, from the class-path or from config directory.
+        final String configLocation = servletContext.getInitParameter(WebAppConstants.CONFIG_DIR_PARAM);
+        if ( configLocation != null ) {
+            LOG.info("Config override location: {}", configLocation );
+            builder.addResourceStreamSource(ResourceStreamSourceFileSystem.create(configLocation));
+        } else {
+            LOG.info("Config override location: No override location configured" );
+
+            builder.addResourceStreamSource(ResourceStreamSourceContextLoaderClassPath.create());
+            builder.addResourceStreamSource(new ResourceStreamSourceCurrentClassClassPath());
+            builder.addResourceStreamSource(new ResourceStreamSourceForWebInf(servletContext));
+        }
+    }
+
+    
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigProvider.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigProvider.java
deleted file mode 100644
index c445486..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppConfigProvider.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.webapp;
-
-import static org.apache.isis.commons.internal.base._With.ifPresentElse;
-import static org.apache.isis.commons.internal.base._With.requires;
-import static org.apache.isis.commons.internal.context._Context.computeIfAbsent;
-import static org.apache.isis.commons.internal.context._Context.getOrThrow;
-
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceCurrentClassClassPath;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
-import org.apache.isis.core.commons.resource.ResourceStreamSourceForWebInf;
-import org.apache.isis.core.runtime.runner.opts.OptionHandlerInitParameters;
-
-/**
- * Provides IsisConfigurationBuilder instances.
- *  
- * @since 2.0.0
- */
-public class IsisWebAppConfigProvider {
-    
-    private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppConfigProvider.class);
-    
-    private IsisConfigurationBuilder cfgBuilder;
-    private final Map<String, String> additionalConfig = _Maps.newHashMap();
-    
-    private IsisWebAppConfigProvider() {
-        // private constructor
-    }
-    
-    /**
-     * Removes any cached IsisConfigurationBuilder instance from this provider.
-     */
-    public void invalidate() {
-        cfgBuilder = null;
-    }
-    
-    /**
-     * If available reuses the IsisConfigurationBuilder instance that is already on the ServletContext or
-     * creates a new one and puts it on the ServletContext.
-     * 
-     * @param servletContext
-     * @return
-     */
-    public synchronized IsisConfigurationBuilder getConfigurationBuilder(final ServletContext servletContext) {
-        if(cfgBuilder == null) {
-            cfgBuilder = newIsisConfigurationBuilder(servletContext);
-        }
-        return cfgBuilder;
-    }
-
-    /**
-     * Returns a new IsisConfigurationBuilder populated with all currently available configuration values. 
-     * @param servletContext
-     * @return
-     */
-    protected IsisConfigurationBuilder newIsisConfigurationBuilder(final ServletContext servletContext) {
-        IsisConfigurationBuilder isisConfigurationBuilder = new IsisConfigurationBuilder();
-        isisConfigurationBuilder.primeWith(new OptionHandlerInitParameters(servletContext));
-        additionalConfig.forEach((k, v)->isisConfigurationBuilder.put(k, v));
-        addServletContextConstants(servletContext, isisConfigurationBuilder);
-        addResourceStreamSources(servletContext, isisConfigurationBuilder);
-        return isisConfigurationBuilder;
-    }
-    
-    // -- CONFIG OVERRIDING
-    
-    public void addConfig(Map<String, String> map) {
-        this.additionalConfig.putAll(map);
-    }
-    
-    // -- PEEKING
-    
-    /**
-     * Try to fetch the value from config stored under {@code key} else fallback to {@code defaultValue}
-     * @param servletContext
-     * @param key
-     * @param defaultValue
-     * @return non-null
-     */
-    public String peekAtOrDefault(ServletContext servletContext, String key, String defaultValue) {
-        requires(servletContext, "servletContext");
-        requires(key, "key");
-        requires(defaultValue, "defaultValue");
-        
-        final String configValue = getConfigurationBuilder(servletContext).peekAtString(key);
-        return ifPresentElse(configValue, defaultValue);
-    }
-    
-    // -- LOOKUP
-    
-    /**
-     * @return the application-scoped singleton instance of IsisWebAppConfigProvider
-     * @throws IllegalStateException if no such singleton was registered
-     */
-    public static IsisWebAppConfigProvider getInstance() {
-        return getOrThrow(IsisWebAppConfigProvider.class, 
-                ()->new IllegalStateException("No config provider registered on current context."));
-    }
-    
-    public static IsisWebAppConfigProvider registerInstanceIfAbsent() {
-        final IsisWebAppConfigProvider configProvider =  
-                computeIfAbsent(IsisWebAppConfigProvider.class, __->new IsisWebAppConfigProvider());
-        return configProvider;
-    }
-    
-    // -- HELPER
-
-    private static void addServletContextConstants(
-            final ServletContext servletContext,
-            final IsisConfigurationBuilder isisConfigurationBuilder) {
-        
-        final String webappDir = servletContext.getRealPath("/");
-        isisConfigurationBuilder.add(WebAppConstants.WEB_APP_DIR, webappDir);
-    }
-    
-    private static void addResourceStreamSources(
-            final ServletContext servletContext,
-            final IsisConfigurationBuilder isisConfigurationBuilder) {
-
-        // will load either from WEB-INF, from the class-path or from config directory.
-        final String configLocation = servletContext.getInitParameter(WebAppConstants.CONFIG_DIR_PARAM);
-        if ( configLocation != null ) {
-            LOG.info("Config override location: {}", configLocation );
-            isisConfigurationBuilder.addResourceStreamSource(ResourceStreamSourceFileSystem.create(configLocation));
-        } else {
-            LOG.info("Config override location: No override location configured" );
-
-            isisConfigurationBuilder.addResourceStreamSource(ResourceStreamSourceContextLoaderClassPath.create());
-            isisConfigurationBuilder.addResourceStreamSource(new ResourceStreamSourceCurrentClassClassPath());
-            isisConfigurationBuilder.addResourceStreamSource(new ResourceStreamSourceForWebInf(servletContext));
-        }
-    }
-
-    
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
index eae2ab3..0b2f222 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
@@ -31,11 +31,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.config.IsisConfiguration.ContainsPolicy;
 import org.apache.isis.core.commons.config.NotFoundPolicy;
 import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.webapp.modules.WebModule;
+import org.apache.isis.core.webapp.modules.WebModuleContext;
 
 import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
 import static org.apache.isis.commons.internal.resources._Resources.putContextPathIfPresent;
@@ -76,28 +78,23 @@ public class IsisWebAppContextListener implements ServletContextListener {
         
         putContextPathIfPresent(servletContext.getContextPath());
         
-        final IsisWebAppConfigProvider configProvider = IsisWebAppConfigProvider.registerInstanceIfAbsent();
+        IsisWebAppConfigHelper.initConfigurationFrom(servletContext);
+        _Config.acceptBuilder(IsisContext.EnvironmentPrimer::primeEnvironment);
 
-        final IsisConfigurationBuilder isisConfigurationBuilder =
-                IsisWebAppConfigProvider.getInstance().getConfigurationBuilder(servletContext);
-        isisConfigurationBuilder.addDefaultConfigurationResourcesAndPrimers();
+        final WebModuleContext webModuleContext = new WebModuleContext(servletContext);
         
-        IsisContext.EnvironmentPrimer.primeEnvironment(isisConfigurationBuilder);
-
         final List<WebModule> webModules =
                  WebModule.discoverWebModules()
-                 .peek(module->module.prepare(servletContext)) // prepare context
+                 .peek(module->module.prepare(webModuleContext)) // prepare context
                  .collect(Collectors.toList());
 
-        // put the list of viewer names "isis.viewers" into a context parameter
-        WebModule.ContextUtil.commitViewers(servletContext);
-        // invalidate config such that next IsisConfigurationBuilder that gets obtained is reinitialized
-        configProvider.invalidate();  
+        // commit negotiated properties to configuration subsystem 
+        webModuleContext.commit();
         
         LOG.info("=== PHASE 2 === Initializing the ServletContext");
         
         webModules.stream()
-        .filter(module->module.isApplicable(servletContext)) // filter those WebModules that are applicable
+        .filter(module->module.isApplicable(webModuleContext)) // filter those WebModules that are applicable
         .forEach(module->addListener(servletContext, module));
         
         activeListeners.forEach(listener->listener.contextInitialized(event));
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
index eb7dcfd..231930e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.core.webapp.modules;
 
-import static org.apache.isis.commons.internal.base._Strings.isEmpty;
-
 import java.util.stream.Stream;
 
 import javax.servlet.Filter;
@@ -29,7 +27,6 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebListener;
 
-import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.webapp.IsisWebAppContextListener;
 
 /**
@@ -53,26 +50,26 @@ public interface WebModule {
     /**
      * Before initializing any WebModule we call each WebModule's prepare method 
      * to allow for a WebModule to leave information useful for other modules on 
-     * the shared ServletContext.
+     * the shared WebModuleContext.
      * 
-     * @param ctx ServletContext
+     * @param ctx WebModuleContext
      */
-    default public void prepare(ServletContext ctx) {}
+    default public void prepare(WebModuleContext ctx) {}
     
     /**
-     * Expected to be called after all WebModules had a chance to prepare the ServletContext.
+     * Expected to be called after all WebModules had a chance to prepare the WebModuleContext.
      * Sets this WebModule's {@link Filter}s, {@link Servlet}s or {@link WebListener}s 
-     * up and registers them with the given {@link ServletContext} {@code ctx}.
+     * up and registers them with the {@link ServletContext} as provided via {@code ctx}.
      * @param ctx ServletContext
      */
     public ServletContextListener init(ServletContext ctx) throws ServletException;
     
     /**
-     * Expected to be called after all WebModules had a chance to prepare the ServletContext.
-     * @param ctx ServletContext
+     * Expected to be called after all WebModules had a chance to prepare the WebModuleContext.
+     * @param ctx WebModuleContext
      * @return whether this module is applicable/usable
      */
-    public boolean isApplicable(ServletContext ctx);
+    public boolean isApplicable(WebModuleContext ctx);
     
     // -- DISCOVERY 
     
@@ -96,85 +93,5 @@ public interface WebModule {
                 );
     }
     
-    // -- UTILITY
-    
-    static final class ContextUtil {
-        
-        /**
-         * This key was deprecated from config, but we still use it for reference. It is auto-populated 
-         * such that it can be looked up, to see what viewers have been discovered by the framework.
-         */
-        private final static String ISIS_VIEWERS = "isis.viewers";
-        
-        /**
-         * Tell other modules that a bootstrapper is present.
-         * @param ctx
-         * @param bootstrapper
-         */
-        public static void registerBootstrapper(ServletContext ctx, WebModule bootstrapper) {
-            ctx.setAttribute("isis.bootstrapper", bootstrapper);    
-        }
-        
-        /**
-         * @param ctx
-         * @return whether this context has a bootstrapper registered
-         */
-        public static boolean hasBootstrapper(ServletContext ctx) {
-            return ctx.getAttribute("isis.bootstrapper")!=null;    
-        }
-        
-        /**
-         *  Adds to the list of viewer names "isis.viewers"
-         * @param ctx
-         * @param viewerName
-         */
-        public static void registerViewer(ServletContext ctx, String viewerName) {
-            String viewers = (String) ctx.getAttribute(ISIS_VIEWERS);
-            if(isEmpty(viewers)) {
-                viewers = viewerName;
-            } else {
-                viewers = viewers + "," + viewerName;
-            }
-            ctx.setAttribute(ISIS_VIEWERS, viewers);
-        }
-        
-        /**
-         * Puts the list of viewer names "isis.viewers" into a context parameter.
-         * @param ctx
-         */
-        public static void commitViewers(ServletContext ctx) {
-            String viewers = (String) ctx.getAttribute(ISIS_VIEWERS);
-            if(!isEmpty(viewers)) {
-                ctx.setInitParameter(ISIS_VIEWERS, viewers);    
-            }
-        }
-        
-        /**
-         *  Adds to the list of protected path names "isis.protected"
-         * @param ctx
-         * @param path
-         */
-        public static void registerProtectedPath(ServletContext ctx, String path) {
-            String list = (String) ctx.getAttribute("isis.protected");
-            if(isEmpty(list)) {
-                list = path;
-            } else {
-                list = list + "," + path;
-            }
-            ctx.setAttribute("isis.protected", list);
-        }
-        
-        /**
-         * Streams the protected path names "isis.protected".
-         * @param ctx
-         */
-        public static Stream<String> streamProtectedPaths(ServletContext ctx) {
-            final String list = (String) ctx.getAttribute("isis.protected");
-            return _Strings.splitThenStream(list, ",");
-        }
-        
-        
-    }
-    
     
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
new file mode 100644
index 0000000..b41d116
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModuleContext.java
@@ -0,0 +1,111 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.webapp.modules;
+
+import java.util.stream.Stream;
+
+import javax.servlet.ServletContext;
+
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.config.internal._Config;
+
+/**
+ * 
+ * @since 2.0.0-M2
+ *
+ */
+public class WebModuleContext {
+
+    /**
+     * This key was deprecated from config, but we still use it for reference. It is auto-populated 
+     * such that it can be looked up, to see what viewers have been discovered by the framework.
+     */
+    private final static String ISIS_VIEWERS = "isis.viewers";
+    private final static String ISIS_PROTECTED = "isis.protected";
+    
+    private boolean hasBootstrapper = false;
+    private final StringBuilder viewers = new StringBuilder();
+    private final StringBuilder protectedPath = new StringBuilder();
+    
+    private final ServletContext servletContext;
+    
+    public WebModuleContext(ServletContext servletContext) {
+        this.servletContext = servletContext;
+    }
+    
+    public ServletContext getServletContext() {
+        return servletContext;
+    }
+
+    /**
+     * Tell other modules that a bootstrapper is present.
+     */
+    public void setHasBootstrapper() {
+        hasBootstrapper = true;
+    }
+    
+    /**
+     * @return whether this context has a bootstrapper
+     */
+    public boolean hasBootstrapper() {
+        return hasBootstrapper;    
+    }
+    
+    /**
+     *  Adds to the list of viewer names "isis.viewers"
+     * @param viewerName
+     */
+    public void addViewer(String viewerName) {
+        if(viewers.length()>0) {
+            viewers.append(",");
+        } 
+        viewers.append(viewerName);
+    }
+    
+    /**
+     *  Adds to the list of protected path names "isis.protected"
+     * @param path
+     */
+    public void addProtectedPath(String path) {
+        if(protectedPath.length()>0) {
+            protectedPath.append(",");
+        } 
+        protectedPath.append(path);
+    }
+    
+    /**
+     * Streams the protected path names "isis.protected".
+     * @param ctx
+     */
+    public Stream<String> streamProtectedPaths() {
+        final String list = protectedPath.toString();
+        return _Strings.splitThenStream(list, ",");
+    }
+    
+    /**
+     * Commits all properties to current life-cycle's config.
+     */
+    public void commit() {
+        _Config.acceptBuilder(builder->{
+            builder.add(ISIS_VIEWERS, viewers.toString());
+            builder.add(ISIS_PROTECTED, protectedPath.toString());
+        });
+    }
+    
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
index 9f9f132..dc925b7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_FallbackBootstrapper.java
@@ -37,15 +37,14 @@ final class WebModule_FallbackBootstrapper implements WebModule  {
 
     @Override
     public ServletContextListener init(ServletContext ctx) throws ServletException {
-        ctx.setInitParameter("deploymentType", "SERVER_PROTOTYPE");
         return ctx.createListener(IsisWebAppBootstrapper.class);
     }
 
     @Override
-    public boolean isApplicable(ServletContext ctx) {
+    public boolean isApplicable(WebModuleContext ctx) {
         // not required if another bootstrapper module is on the context 
         // e.g. the Wicket module
-        return !ContextUtil.hasBootstrapper(ctx);
+        return !ctx.hasBootstrapper();
     }
     
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java
index e92cc70..5217a0d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_LogOnExceptionLogger.java
@@ -18,10 +18,6 @@
  */
 package org.apache.isis.core.webapp.modules;
 
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
-import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
-
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
@@ -30,6 +26,10 @@ import javax.servlet.ServletException;
 
 import org.apache.isis.commons.internal.collections._Arrays;
 
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
+import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
+
 /**
  * Package private mixin for WebModule implementing WebModule.
  * @since 2.0.0
@@ -38,8 +38,9 @@ final class WebModule_LogOnExceptionLogger implements WebModule  {
 
     private final static String LOGONLOGGER_FILTER_CLASS_NAME = 
             "org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter";
-
-    private final static String LOGONLOGGER_FILTER_NAME = "IsisLogOnExceptionFilter";
+    private final static String LOGONLOGGER_FILTER_NAME = 
+            "IsisLogOnExceptionFilter";
+    private WebModuleContext webModuleContext;
 
 
     @Override
@@ -48,6 +49,11 @@ final class WebModule_LogOnExceptionLogger implements WebModule  {
     }
 
     @Override
+    public void prepare(WebModuleContext ctx) {
+        this.webModuleContext = ctx;
+    }
+    
+    @Override
     public ServletContextListener init(ServletContext ctx) throws ServletException {
 
         final Filter filter;
@@ -64,13 +70,13 @@ final class WebModule_LogOnExceptionLogger implements WebModule  {
             return null; // filter was already registered somewhere else (eg web.xml)
         }
 
-        reg.addMappingForUrlPatterns(null, true, getProtectedUrlPatterns(ctx) ); // filter is forced last
+        reg.addMappingForUrlPatterns(null, true, getProtectedUrlPatterns() ); // filter is forced last
 
         return null; // does not provide a listener
     }
 
     @Override
-    public boolean isApplicable(ServletContext ctx) {
+    public boolean isApplicable(WebModuleContext ctx) {
         try {
             getDefaultClassLoader().loadClass(LOGONLOGGER_FILTER_CLASS_NAME);
             return true;
@@ -81,8 +87,8 @@ final class WebModule_LogOnExceptionLogger implements WebModule  {
 
     // -- HELPER
     
-    private String[] getProtectedUrlPatterns(ServletContext ctx) {
-        return ContextUtil.streamProtectedPaths(ctx)
+    private String[] getProtectedUrlPatterns() {
+        return webModuleContext.streamProtectedPaths()
         .collect(_Arrays.toArray(String.class));
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
index c9465e4..4926ca1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_RestEasy.java
@@ -23,8 +23,8 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.webapp.IsisSessionFilter;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
 
 import static java.util.Objects.requireNonNull;
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
@@ -57,24 +57,23 @@ final class WebModule_RestEasy implements WebModule  {
     }
     
     @Override
-    public void prepare(ServletContext ctx) {
+    public void prepare(WebModuleContext ctx) {
         
         if(!isApplicable(ctx)) {
             return;
         }
         
         // try to fetch restfulPath from config else fallback to default
-        final String restfulPath = 
-                IsisWebAppConfigProvider.getInstance()
-                .peekAtOrDefault(ctx, KEY_RESTFUL_BASE_PATH, KEY_RESTFUL_BASE_PATH_DEFAULT);
+        final String restfulPath = _Config
+                .peekAtString(KEY_RESTFUL_BASE_PATH, KEY_RESTFUL_BASE_PATH_DEFAULT);
                 
         putRestfulPath(restfulPath);
         
         this.restfulPathConfigValue = restfulPath; // store locally for reuse
         
         // register this module as a viewer
-        ContextUtil.registerViewer(ctx, "restfulobjects");
-        ContextUtil.registerProtectedPath(ctx, suffix(prefix(restfulPath, "/"), "/") + "*" );
+        ctx.addViewer("restfulobjects");
+        ctx.addProtectedPath(suffix(prefix(restfulPath, "/"), "/") + "*" );
     }
 
     @Override
@@ -136,7 +135,7 @@ final class WebModule_RestEasy implements WebModule  {
     }
 
     @Override
-    public boolean isApplicable(ServletContext ctx) {
+    public boolean isApplicable(WebModuleContext ctx) {
         try {
             getDefaultClassLoader().loadClass(RESTEASY_BOOTSTRAPPER);
             return true;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java
index 87aa79a..b97ea43 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Shiro.java
@@ -18,16 +18,16 @@
  */
 package org.apache.isis.core.webapp.modules;
 
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
-import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
-
 import javax.servlet.Filter;
 import javax.servlet.FilterRegistration.Dynamic;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
+import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
+import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
+import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
+
 /**
  * Package private mixin for WebModule implementing WebModule.
  * @since 2.0.0
@@ -79,7 +79,7 @@ final class WebModule_Shiro implements WebModule  {
     }
 
     @Override
-    public boolean isApplicable(ServletContext ctx) {
+    public boolean isApplicable(WebModuleContext ctx) {
         try {
             getDefaultClassLoader().loadClass(SHIRO_LISTENER_CLASS_NAME);
             return true;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java
index e280cf2..37f3704 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_StaticResources.java
@@ -46,7 +46,7 @@ final class WebModule_StaticResources implements WebModule  {
     }
     
     @Override
-    public void prepare(ServletContext ctx) {
+    public void prepare(WebModuleContext ctx) {
         // nothing special required
     }
 
@@ -71,7 +71,7 @@ final class WebModule_StaticResources implements WebModule  {
     }
 
     @Override
-    public boolean isApplicable(ServletContext ctx) {
+    public boolean isApplicable(WebModuleContext ctx) {
         return true;
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
index 3462e40..8bcf82f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/webapp/modules/WebModule_Wicket.java
@@ -25,7 +25,7 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
+import org.apache.isis.config.internal._Config;
 
 import static java.util.Objects.requireNonNull;
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
@@ -55,28 +55,26 @@ final class WebModule_Wicket implements WebModule  {
     }
     
     @Override
-    public void prepare(ServletContext ctx) {
+    public void prepare(WebModuleContext ctx) {
         
         if(!isAvailable()) {
             return;
         }
 
-        final IsisWebAppConfigProvider configProvider = IsisWebAppConfigProvider.getInstance();
         pathConfigValue = 
-                configProvider.peekAtOrDefault(ctx, "isis.viewer.wicket.basePath", "/wicket");
+                _Config.peekAtString("isis.viewer.wicket.basePath", "/wicket");
         
-        {
-            deploymentMode = _Context.isPrototyping()
-                    ? "development" : "deployment";
-        }
+        deploymentMode = _Context.isPrototyping()
+                    ? "development" 
+                            : "deployment";
         
         appConfigValue = 
-                configProvider.peekAtOrDefault(ctx, "isis.viewer.wicket.app",
+                _Config.peekAtString("isis.viewer.wicket.app",
                         "org.apache.isis.viewer.wicket.viewer.IsisWicketApplication");
         
-        ContextUtil.registerBootstrapper(ctx, this);
-        ContextUtil.registerViewer(ctx, "wicket");
-        ContextUtil.registerProtectedPath(ctx, suffix(prefix(pathConfigValue, "/"), "/") + "*" );
+        ctx.setHasBootstrapper();
+        ctx.addViewer("wicket");
+        ctx.addProtectedPath(suffix(prefix(pathConfigValue, "/"), "/") + "*");
     }
 
     @Override
@@ -107,7 +105,7 @@ final class WebModule_Wicket implements WebModule  {
     }
 
     @Override
-    public boolean isApplicable(ServletContext ctx) {
+    public boolean isApplicable(WebModuleContext ctx) {
         return isAvailable();
     }
 
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 8b0af81..a5d4e37 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -29,6 +29,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.function.Function;
 
+import javax.servlet.ServletContext;
+
 import com.google.common.base.Charsets;
 import com.google.common.io.Resources;
 import com.google.inject.Guice;
@@ -74,14 +76,13 @@ import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
+import org.apache.isis.core.webapp.IsisWebAppConfigHelper;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettingsAccessor;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -216,7 +217,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
     @com.google.inject.Inject
     private WicketViewerSettings settings;
 
-    private IsisConfigurationBuilder isisConfigurationBuilder;
     private final IsisWicketApplication_Experimental experimental;
 
 
@@ -246,22 +246,16 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
 
         // --- prepare the configuration prior to init()
         
-        isisConfigurationBuilder = prepareConfigurationBuilder();
+        prepareConfigurationBuilder(getServletContext());
         
         super.internalInit();
 
     }
     
-    private IsisConfigurationBuilder prepareConfigurationBuilder() {
-        
-        final String isisConfigDir = getServletContext().getInitParameter("isis.config.dir");
+    private void prepareConfigurationBuilder(ServletContext ctx) {
+        final String isisConfigDir = ctx.getInitParameter("isis.config.dir");
         configureLogging(isisConfigDir);
-        
-        final IsisConfigurationBuilder isisConfigurationBuilder = IsisWebAppConfigProvider.getInstance()
-                .getConfigurationBuilder(getServletContext());
-        isisConfigurationBuilder.addDefaultConfigurationResourcesAndPrimers();
-        
-        return isisConfigurationBuilder;
+        IsisWebAppConfigHelper.initConfigurationFrom(ctx);
     }
 
     private static AjaxRequestTarget decorate(final AjaxRequestTarget ajaxRequestTarget) {
@@ -289,8 +283,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
         // that's suitable for the entire web-application to use as default.
         _Context.setDefaultClassLoader(this.getClass().getClassLoader(), true);
         
-        requireNonNull(isisConfigurationBuilder, "ConfigurationBuilder must be prepared prior to init().");
-        final IsisConfiguration configuration = isisConfigurationBuilder.build();
+        final IsisConfiguration configuration;
         
         List<Future<Object>> futures = null;
         try {
@@ -306,6 +299,8 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
             requestCycleListeners.add(requestCycleListenerForIsis);
             requestCycleListeners.add(new PageRequestHandlerTracker());
 
+            configuration = _Config.getConfiguration(); 
+            
             //
             // create IsisSessionFactory
             //
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
index 75fe684..57c8b49 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/WebServer.java
@@ -46,7 +46,6 @@ import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixture;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureFromEnvironmentVariable;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerHelp;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerSystemProperties;
-import org.apache.isis.core.webapp.IsisWebAppConfigProvider;
 import org.apache.isis.core.webserver.config.WebServerConfigBuilder;
 import org.apache.isis.core.webserver.internal.OptionHandlerPort;
 import org.apache.isis.core.webserver.internal.OptionHandlerStartupMode;
@@ -144,7 +143,7 @@ public class WebServer {
                     ConfigurationConstants.DEFAULT_CONFIG_DIRECTORY;
     }
 
-    private Server createJettyServerAndBindConfig(final IsisConfiguration configuration) {
+    private Server createJettyServerAndBindConfig(IsisConfiguration configuration) {
 
         final int port = configuration.getInteger(
                 EMBEDDED_WEB_SERVER_PORT_KEY, EMBEDDED_WEB_SERVER_PORT_DEFAULT);
@@ -157,9 +156,6 @@ public class WebServer {
         final WebAppContext context = new WebAppContext(SRC_MAIN_WEBAPP, webappContextPath);
         jettyServer.setHandler(context);
 
-        final IsisWebAppConfigProvider configProvider = IsisWebAppConfigProvider.registerInstanceIfAbsent();
-        configProvider.addConfig(configuration.asMap());
-
         return jettyServer;
     }
 
diff --git a/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java b/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java
index 3ef8107..78db66d 100644
--- a/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java
+++ b/core/webserver/src/main/java/org/apache/isis/core/webserver/config/WebServerConfigBuilder.java
@@ -10,21 +10,23 @@ import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
 import org.apache.isis.core.runtime.optionhandler.BootPrinter;
 import org.apache.isis.core.runtime.optionhandler.OptionHandler;
 
+import static org.apache.isis.config.internal._Config.acceptBuilder;
+
 public class WebServerConfigBuilder {
     
-    private final IsisConfigurationBuilder isisConfigurationBuilder = new IsisConfigurationBuilder();
-    
     public WebServerConfigBuilder() {
-        isisConfigurationBuilder.addResourceStreamSources(resourceStreamSources());
+        acceptBuilder(builder->{
+            builder.addResourceStreamSources(resourceStreamSources());    
+        });
     }
 
     public boolean parseAndPrimeWith(final List<OptionHandler> optionHandlers, final String[] args) {
@@ -39,9 +41,15 @@ public class WebServerConfigBuilder {
         final boolean parsedOk = parseAndPrimeWith(options, optionHandlers, args);
 
         if(parsedOk) {
-            for (final OptionHandler optionHandler : optionHandlers) {
-                isisConfigurationBuilder.primeWith(optionHandler);
-            }
+            
+            acceptBuilder(builder->{
+                
+                for (final OptionHandler optionHandler : optionHandlers) {
+                    builder.primeWith(optionHandler);
+                }
+                
+            });
+            
         }
 
         return parsedOk;
@@ -79,7 +87,7 @@ public class WebServerConfigBuilder {
     }
 
     public IsisConfiguration build() {
-        return isisConfigurationBuilder.build();
+        return _Config.getConfiguration();
     }
     
 }