You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/11/28 09:01:59 UTC

[isis] 02/02: ISIS-2186: general tidy up of integration tests

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

danhaywood pushed a commit to branch ISIS-2186
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 922995d91a0b20065780b9b3a0877c8beb0754c0
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Nov 28 09:01:32 2019 +0000

    ISIS-2186: general tidy up of integration tests
    
    * moves app manifests as static classes of IntegTestAbstract
      - done this for the spring boot app also
    * adds new IsisPresets for log4j2-test.xml
    * adds comments with suggested usage in starter app's application.yml and application.properties
    
    * makes HelloWorldModule into a @Configuration @ComponentScan
    * reorganises simpleapp's BDD classes
    * removes liveReload gradle stuff from simpleapp (we can use devtools eventually for this)
    
    Also:
    * removes lockdown test from helloworld
    * reinstates commented-out code from helloworld
    * adds banner.txt for helloworld and simpleapp
---
 .../java/org/apache/isis/config/IsisPresets.java   |   3 +-
 .../main/resources/presets/Log4j2Test.properties   |  18 ++
 .../FakeDataModuleAppManifestForTesting.java       |  48 -----
 .../FakeDataModuleIntegTestAbstract.java           |  44 ++--
 .../integtests/FakeDataModuleIntegTestModule.java  |  13 --
 .../java/org/apache/isis/applib/AppManifest.java   | 234 ---------------------
 starters/helloworld/pom.xml                        |  38 ----
 .../java/domainapp/application/HelloWorldApp.java  |  36 +++-
 .../application/HelloWorldAppManifest.java         |  59 ------
 .../main/java/domainapp/dom/HelloWorldModule.java  |   7 +-
 .../java/domainapp/dom/impl/HelloWorldObject.java  |  10 +-
 .../helloworld/src/main/resources/application.yml  |  11 +
 starters/helloworld/src/main/resources/banner.txt  |   6 +
 .../main/resources/config/application.properties   |  16 +-
 .../java/domainapp/dom/impl/lockdown/.gitignore    |   1 -
 .../dom/impl/lockdown/LockDownMavenDeps_Test.java  |  50 -----
 .../LockDownMavenDeps_Test.list.approved.txt       | 211 -------------------
 .../LockDownMavenDeps_Test.tree.approved.txt       | 210 ------------------
 starters/simpleapp/application/pom.xml             |   1 +
 .../bdd/{specs => }/RunIntegBddSpecs.java          |   2 +-
 .../bdd/{specs => glue}/SimpleObjectsStepDef.java  |   8 +-
 .../integtests/ApplicationIntegTestAbstract.java}  |  53 ++---
 .../integtests/SpringIntegrationTest.java          |  47 -----
 .../integtests/mml/DomainModel_IntegTest.java      |   4 +-
 .../integtests/mml/MetaModelService_IntegTest.java |   4 +-
 .../integtests/smoke/Smoke_IntegTest.java          |   5 +-
 starters/simpleapp/module-simple/build.gradle      |  72 -------
 starters/simpleapp/module-simple/gradlew           | 164 ---------------
 starters/simpleapp/module-simple/gradlew.bat       |  90 --------
 starters/simpleapp/module-simple/layouts.gradle    |  49 -----
 starters/simpleapp/module-simple/liveReload.gradle |  56 -----
 starters/simpleapp/module-simple/log4j2-test.xml   |  60 ++++++
 .../module-simple/logging-integtest.properties     | 120 -----------
 .../integtests/SimpleModuleIntegTestAbstract.java  |  33 ++-
 .../integtests/SimpleModuleManifestForTesting.java |  53 -----
 .../src/main/java/domainapp/webapp/SimpleApp.java  |  41 +++-
 .../java/domainapp/webapp/SimpleAppManifest.java   |  61 ------
 .../webapp/src/main/resources/application.yml      |   9 +-
 .../simpleapp/webapp/src/main/resources/banner.txt |   6 +
 .../main/resources/config/application.properties   |  12 ++
 40 files changed, 301 insertions(+), 1664 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/IsisPresets.java b/core/config/src/main/java/org/apache/isis/config/IsisPresets.java
index e592896..6612229 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisPresets.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisPresets.java
@@ -28,8 +28,9 @@ public final class IsisPresets  {
 
     public static final String NoTranslations = "classpath:/presets/NoTranslations.properties";
     
+    public static final String Log4j2Test = "classpath:/presets/Log4j2Test.properties";
     public static final String H2InMemory = "classpath:/presets/H2InMemory.properties";
-    
+
     /** randomized (unique) database name, eg. to allow for concurrent testing */
     public static final String H2InMemory_withUniqueSchema = "classpath:/presets/H2InMemory_withUniqueSchema.properties";
     
diff --git a/core/config/src/main/resources/presets/Log4j2Test.properties b/core/config/src/main/resources/presets/Log4j2Test.properties
new file mode 100644
index 0000000..df0c635
--- /dev/null
+++ b/core/config/src/main/resources/presets/Log4j2Test.properties
@@ -0,0 +1,18 @@
+#  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.
+
+logging.config=log4j2-test.xml
\ No newline at end of file
diff --git a/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleAppManifestForTesting.java b/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleAppManifestForTesting.java
deleted file mode 100644
index 02a1584..0000000
--- a/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleAppManifestForTesting.java
+++ /dev/null
@@ -1,48 +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.isisaddons.module.fakedata.integtests;
-
-
-import org.apache.isis.config.IsisPresets;
-import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
-import org.apache.isis.jdo.IsisBootDataNucleus;
-import org.apache.isis.runtime.spring.IsisBoot;
-import org.apache.isis.security.bypass.IsisBootSecurityBypass;
-import org.springframework.context.annotation.*;
-
-/**
- * Makes the integral parts of the 'simple app' web application.
- */
-@Configuration
-@PropertySources({
-        @PropertySource(IsisPresets.H2InMemory),
-        @PropertySource(IsisPresets.NoTranslations),
-        @PropertySource(IsisPresets.DataNucleusAutoCreate),
-})
-@Import({
-        IsisBoot.class,
-        IsisBootSecurityBypass.class,
-        IsisBootDataNucleus.class,
-        IsisExtFixturesModule.class,
-
-        FakeDataModuleIntegTestModule.class
-})
-public class FakeDataModuleAppManifestForTesting {
-
-}
diff --git a/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestAbstract.java b/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestAbstract.java
index aa16bae..4a6b22e 100644
--- a/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestAbstract.java
+++ b/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestAbstract.java
@@ -1,28 +1,42 @@
 package org.isisaddons.module.fakedata.integtests;
 
 
-import javax.inject.Inject;
-
-import org.apache.isis.applib.services.factory.FactoryService;
-import org.apache.isis.applib.services.metamodel.MetaModelService;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.applib.services.sessmgmt.SessionManagementService;
-import org.apache.isis.applib.services.user.UserService;
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.config.IsisPresets;
+import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
 import org.apache.isis.extensions.fixtures.IsisIntegrationTestAbstractWithFixtures;
+import org.apache.isis.jdo.IsisBootDataNucleus;
+import org.apache.isis.runtime.spring.IsisBoot;
+import org.apache.isis.security.bypass.IsisBootSecurityBypass;
+import org.isisaddons.module.fakedata.fixture.FakeDataFixturesModule;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.transaction.annotation.Transactional;
 
-@SpringBootTest(
-        classes = FakeDataModuleAppManifestForTesting.class,
-        properties = {
-                "logging.config=log4j2-test.xml",
-        })
+@SpringBootTest(classes = FakeDataModuleIntegTestAbstract.AppManifest.class)
 @ContextConfiguration
 @Transactional
 public abstract class FakeDataModuleIntegTestAbstract extends IsisIntegrationTestAbstractWithFixtures {
 
+        @Configuration
+        @PropertySources({
+                @PropertySource(IsisPresets.Log4j2Test),
+                @PropertySource(IsisPresets.H2InMemory_withUniqueSchema),
+                @PropertySource(IsisPresets.NoTranslations),
+                @PropertySource(IsisPresets.DataNucleusAutoCreate),
+        })
+        @Import({
+                IsisBoot.class,
+                IsisBootSecurityBypass.class,
+                IsisBootDataNucleus.class,
+                IsisExtFixturesModule.class,
+
+                FakeDataFixturesModule.class
+        })
+        public static class AppManifest {
+        }
+
 }
diff --git a/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestModule.java b/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestModule.java
deleted file mode 100644
index aa5b22c..0000000
--- a/extensions/lib/fakedata/integtests/src/test/java/org/isisaddons/module/fakedata/integtests/FakeDataModuleIntegTestModule.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.isisaddons.module.fakedata.integtests;
-
-import org.isisaddons.module.fakedata.fixture.FakeDataFixturesModule;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-
-@Configuration
-@Import({
-        FakeDataFixturesModule.class
-})
-@ComponentScan
-public class FakeDataModuleIntegTestModule {}
diff --git a/extensions/other/legacy/src/main/java/org/apache/isis/applib/AppManifest.java b/extensions/other/legacy/src/main/java/org/apache/isis/applib/AppManifest.java
deleted file mode 100644
index f93d0c8..0000000
--- a/extensions/other/legacy/src/main/java/org/apache/isis/applib/AppManifest.java
+++ /dev/null
@@ -1,234 +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.applib;
-
-import javax.jdo.annotations.PersistenceCapable;
-
-/**
- * TODO[2112] keep or remove?
- *  
- * Programmatic specification of the constituent parts of an application, most specifically the modules that contain
- * domain services and possibly entities.
- *
- * <p>
- * The modules are specified as classes; the framework uses the packages of these classes as the locations on the
- * classpath to search for domain services (annotated with {@link org.apache.isis.applib.annotation.DomainService})
- * and entities (annotated with {@link PersistenceCapable}).
- * </p>
- *
- * <p>
- * The interface also allows certain other aspects of the runtime to be specified:
- * <ul>
- *     <li>which authentication and/or authorization mechanism to be used (useful to disable security when developing/demoing)</li>
- *     <li>which fixtures to run by default</li>
- *     <li>overriding of arbitrary other configuration properties</li>
- *     <li>which modules to load (useful when developing, to reduce startup times; just load the modules required)</li>
- * </ul>
- * </p>
- *
- * <p>
- * To use, implement this interface and then define as the <tt>isis.appManifest</tt> key within the
- * <tt>isis.properties</tt> configuration file, or specify programmatically when running integration tests.
- * </p>
- *
- * <p>
- * By convention the class implementing this interface reside in a <tt>xxx-home</tt> Maven module.  This
- * can be referenced by both the <tt>xxx-integtests</tt> (Maven) module and the <tt>xxx-webapp</tt> (Maven) module,
- * allowing configuration to be centralized.
- * </p>
- *
- * <p>
- * There are a number of subsidiary goals (not yet implemented):
- * <ul>
- *    <li>
- *        <p>Allow different integration tests to run with different manifests.  Normally the running application is
- *           shared (on a thread-local) between integration tests.  What the framework could do is to be intelligent
- *           enough to keep track of the manifest in use for each integration test and tear down
- *           the shared state if the "next" test uses a different manifest</p>
- *    </li>
- *    <li>
- *        Speed up bootstrapping by only scanning for classes annotated by
- *        {@link org.apache.isis.applib.annotation.DomainService} and {@link javax.jdo.annotations.PersistenceCapable}
- *        once.
- *    </li>
- *    <li>
- *        Provide a programmatic way to contribute elements of `web.xml`.
- *    </li>
- *    <li>
- *        Provide a programmatic way to configure Shiro security.
- *    </li>
- *    <li>
- *        <p>Anticipate the module changes forthcoming in Java 9.  Eventually we see that the AppManifest class acting
- *        as an "aggregator", with the list of modules will become Java 9 modules each advertising the types that they
- *        export.  It might even be possible for AppManifests to be switched on and off dynamically (eg if Java9 is
- *        compatible with OSGi, being one of the design goals).</p>
- *    </li>
- * </ul>
- * </p>
- */
-public interface AppManifest {
-
-//    /**
-//     * A list of classes, each of which representing the root of one of the modules containing services and possibly
-//     * entities, which together makes up the running application.
-//     *
-//     * <p>
-//     *     The package of each such class is used as the basis for searching for domain services and registered
-//     *     entities.  As such it replaces and overrides both the
-//     *     <tt>isis.services.ServicesInstallerFromAnnotation.packagePrefix</tt> key (usually found in the
-//     *     <tt>isis.properties</tt> file) and the
-//     *     <tt>isis.persistor.datanucleus.RegisterEntities.packagePrefix</tt> key (usually found in the
-//     *     <tt>persistor_datanucleus.properties</tt> file).  The value of the <tt>isis.services-installer</tt>
-//     *     configuration property is also ignored.
-//     * </p>
-//     */
-//    public List<Class<?>> getModules();
-//
-//    /**
-//     * If non-null, overrides the value of <tt>isis.services</tt> configuration property to specify a list of
-//     * additional classes to be instantiated as domain services (over and above the {@link DomainService}-annotated
-//     * services defined via {@link #getModules()}.
-//     *
-//     * <p>
-//     *     Normally we recommend services are defined exclusively through {@link #getModules()}, and that this method
-//     *     should therefore return an empty list.  However, this method exists to support those use cases where either the
-//     *     service required does not have a {@link DomainService} annotation, or where it does have the annotation
-//     *     but its containing module cannot (for whatever reason) be listed under {@link #getModules()}.
-//     * </p>
-//     */
-//    public List<Class<?>> getAdditionalServices();
-//
-//    /**
-//     * If non-null, overrides the value of <tt>isis.authentication</tt> configuration property to specify the
-//     * authentication mechanism.
-//     *
-//     * <p>
-//     *     Ignored for integration tests (which always uses the 'bypass' mechanism).
-//     * </p>
-//     */
-//    public String getAuthenticationMechanism();
-//
-//    /**
-//     * If non-null, overrides the value of <tt>isis.authorization</tt> configuration property.
-//     *
-//     * <p>
-//     *     Ignored for integration tests (which always uses the 'bypass' mechanism).
-//     * </p>
-//     */
-//    public String getAuthorizationMechanism();
-//
-//    /**
-//     * If non-null, overrides the value of <tt>isis.fixtures</tt> configuration property.
-//     */
-//    public List<Class<? extends FixtureScript>> getFixtures();
-//
-//    /**
-//     * Overrides for any other configuration properties.
-//     */
-//    public Map<String,String> getConfigurationProperties();
-
-//    /**
-//     * Holds the set of domain services, persistent entities and fixture scripts.services
-//     */
-//    public final static class Registry {
-//
-//        public static Registry current() {
-//            return _Context.computeIfAbsent(Registry.class, Registry::new);
-//        }
-//
-//        @Getter @Setter private Set<Class<?>> persistenceCapableTypes;
-//        @Getter @Setter private Set<Class<?>> mixinTypes;
-//        @Getter @Setter private Set<Class<? extends FixtureScript>> fixtureScriptTypes;
-//        @Getter @Setter private Set<Class<?>> domainServiceTypes;
-//        @Getter @Setter private Set<Class<?>> domainObjectTypes;
-//        @Getter @Setter private Set<Class<?>> viewModelTypes;
-//        @Getter @Setter private Set<Class<?>> xmlElementTypes;
-//    }
-    
-    // -- CONFIG
-
-//    public static class Presets {
-//
-//        public static final String ISIS_PERSISTOR                   = "isis.persistor.";
-//        public static final String ISIS_PERSISTOR_DATANUCLEUS       = ISIS_PERSISTOR + "datanucleus.";
-//        public static final String ISIS_PERSISTOR_DATANUCLEUS_IMPL  = ISIS_PERSISTOR_DATANUCLEUS + "impl.";
-//
-//        public static Map<String,String> withH2InMemoryProperties(final Map<String, String> map) {
-//            //map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionURL", "jdbc:h2:mem:test-" + UUID.randomUUID().toString());
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionURL", "jdbc:h2:mem:test");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionDriverName", "org.h2.Driver");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionUserName", "sa");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionPassword", "");
-//            
-//            return map;
-//        }
-//
-//        public static Map<String,String> withHsqlDbInMemoryProperties(final Map<String, String> map) {
-//            //map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionURL", "jdbc:hsqldb:mem:test-" + UUID.randomUUID().toString());
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionURL", "jdbc:hsqldb:mem:test");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionDriverName", "org.hsqldb.jdbcDriver");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionUserName", "sa");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "javax.jdo.option.ConnectionPassword", "");
-//            
-//            return map;
-//        }
-//
-//        public static Map<String,String> withDataNucleusProperties(final Map<String, String> map) {
-//
-//            // Don't do validations that consume setup time.
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "datanucleus.schema.autoCreateAll", "true");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "datanucleus.schema.validateAll", "false");
-//
-//            // other properties as per WEB-INF/persistor_datanucleus.properties
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "datanucleus.persistenceByReachabilityAtCommit", "false");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "datanucleus.identifier.case", "MixedCase");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "datanucleus.cache.level2.type"  ,"none");
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS_IMPL + "datanucleus.cache.level2.mode", "ENABLE_SELECTIVE");
-//
-//            return map;
-//        }
-//
-//        public static Map<String,String> withIsisIntegTestProperties(final Map<String, String> map) {
-//
-//            // automatically install any fixtures that might have been registered
-//            map.put(ISIS_PERSISTOR_DATANUCLEUS + "install-fixtures", "true");
-//            map.put(ISIS_PERSISTOR + "enforceSafeSemantics", "false");
-//            map.put("isis.services.eventbus.allowLateRegistration", "true");
-//
-//            return map;
-//        }
-//
-//        public enum MemDb {
-//            HSQLDB{
-//                @Override public void withProperties(final Map<String, String> map) {
-//                    withHsqlDbInMemoryProperties(map);
-//                }
-//            },
-//            H2{
-//                @Override public void withProperties(final Map<String, String> map) {
-//                    withH2InMemoryProperties(map);
-//                }
-//            };
-//
-//            public abstract void withProperties(final Map<String, String> map);
-//        }
-//    }
-
-}
diff --git a/starters/helloworld/pom.xml b/starters/helloworld/pom.xml
index f59d15b..fdf33eb 100644
--- a/starters/helloworld/pom.xml
+++ b/starters/helloworld/pom.xml
@@ -101,44 +101,6 @@
 		</profile>
 
 		<profile>
-			<id>lockdown</id>
-			<activation>
-				<property>
-					<name>lockdown</name>
-				</property>
-			</activation>
-			<build>
-				<plugins>
-					<plugin>
-						<artifactId>maven-dependency-plugin</artifactId>
-						<executions>
-							<execution>
-								<id>list</id>
-								<phase>generate-test-resources</phase>
-								<goals>
-									<goal>list</goal>
-								</goals>
-								<configuration>
-									<outputFile>${project.build.directory}/test-classes/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.list.actual.txt</outputFile>
-								</configuration>
-							</execution>
-							<execution>
-								<id>tree</id>
-								<phase>generate-test-resources</phase>
-								<goals>
-									<goal>tree</goal>
-								</goals>
-								<configuration>
-									<outputFile>${project.build.directory}/test-classes/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.tree.actual.txt</outputFile>
-								</configuration>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-
-		<profile>
 			<id>docker</id>
 			<activation>
 				<property>
diff --git a/starters/helloworld/src/main/java/domainapp/application/HelloWorldApp.java b/starters/helloworld/src/main/java/domainapp/application/HelloWorldApp.java
index c04a181..5b0d1fe 100644
--- a/starters/helloworld/src/main/java/domainapp/application/HelloWorldApp.java
+++ b/starters/helloworld/src/main/java/domainapp/application/HelloWorldApp.java
@@ -18,26 +18,44 @@
  */
 package domainapp.application;
 
+import domainapp.dom.HelloWorldModule;
+
+import org.apache.isis.config.IsisPresets;
+import org.apache.isis.jdo.IsisBootDataNucleus;
+import org.apache.isis.runtime.spring.IsisBoot;
+import org.apache.isis.security.shiro.IsisBootSecurityShiro;
+import org.apache.isis.viewer.restfulobjects.IsisBootViewerRestfulObjects;
+import org.apache.isis.viewer.wicket.viewer.IsisBootViewerWicket;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.*;
 
-/**
- * Bootstrap the application.
- */
 @SpringBootApplication
 @Import({
-    HelloWorldAppManifest.class,
+    HelloWorldApp.AppManifest.class,
 })
-@ServletComponentScan()
 public class HelloWorldApp extends SpringBootServletInitializer {
 
+    @Configuration
+    @PropertySources({
+            @PropertySource(IsisPresets.NoTranslations),
+            @PropertySource(IsisPresets.DataNucleusAutoCreate),
+    })
+    @Import({
+            IsisBoot.class,
+            IsisBootSecurityShiro.class,
+            IsisBootDataNucleus.class,
+            IsisBootViewerRestfulObjects.class,
+            IsisBootViewerWicket.class,
+            HelloWorldModule.class
+    })
+    public static class AppManifest {
+    }
+
     /**
-     * 
-     * @param args
-     * @implNote this is to support the <em>Spring Boot Maven Plugin</em>, which auto-detects an 
+     * @implNote this is to support the <em>Spring Boot Maven Plugin</em>, which auto-detects an
      * entry point by searching for classes having a {@code main(...)}
      */
     public static void main(String[] args) {
diff --git a/starters/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java b/starters/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
deleted file mode 100644
index 168fe1b..0000000
--- a/starters/helloworld/src/main/java/domainapp/application/HelloWorldAppManifest.java
+++ /dev/null
@@ -1,59 +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 domainapp.application;
-
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.annotation.PropertySources;
-
-import org.apache.isis.config.IsisPresets;
-import org.apache.isis.jdo.IsisBootDataNucleus;
-import org.apache.isis.runtime.spring.IsisBoot;
-import org.apache.isis.security.shiro.IsisBootSecurityShiro;
-import org.apache.isis.viewer.restfulobjects.IsisBootViewerRestfulObjects;
-import org.apache.isis.viewer.wicket.viewer.IsisBootViewerWicket;
-
-import domainapp.dom.HelloWorldModule;
-
-/**
- * Makes the integral parts of the 'hello world' web application.
- */
-@Configuration
-@PropertySources({
-    @PropertySource(IsisPresets.H2InMemory),
-    @PropertySource(IsisPresets.NoTranslations),
-    @PropertySource(IsisPresets.DataNucleusAutoCreate),
-})
-@Import({
-    IsisBoot.class,
-    IsisBootSecurityShiro.class,
-//    IsisBootSecurityKeycloak.class,
-    IsisBootDataNucleus.class,
-    IsisBootViewerRestfulObjects.class,
-    IsisBootViewerWicket.class
-})
-@ComponentScan(
-        basePackageClasses= {
-                HelloWorldModule.class
-        })
-public class HelloWorldAppManifest {
-
-}
diff --git a/starters/helloworld/src/main/java/domainapp/dom/HelloWorldModule.java b/starters/helloworld/src/main/java/domainapp/dom/HelloWorldModule.java
index fcf95bd..1443506 100644
--- a/starters/helloworld/src/main/java/domainapp/dom/HelloWorldModule.java
+++ b/starters/helloworld/src/main/java/domainapp/dom/HelloWorldModule.java
@@ -18,6 +18,11 @@
  */
 package domainapp.dom;
 
-public final class HelloWorldModule {
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan
+public class HelloWorldModule {
 
 }
diff --git a/starters/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java b/starters/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java
index 29a6dd5..786041d 100644
--- a/starters/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java
+++ b/starters/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java
@@ -79,11 +79,11 @@ public class HelloWorldObject implements Comparable<HelloWorldObject> {
         this.notes = notes;
     }
 
-//    @Action(
-//            semantics = SemanticsOf.IDEMPOTENT,
-//            command = CommandReification.ENABLED, publishing = Publishing.ENABLED,
-//            associateWith = "name"
-//            )
+    @Action(
+            semantics = SemanticsOf.IDEMPOTENT,
+            command = CommandReification.ENABLED, publishing = Publishing.ENABLED,
+            associateWith = "name"
+    )
     public HelloWorldObject updateName(
             @Name final String name) {
         setName(name);
diff --git a/starters/helloworld/src/main/resources/application.yml b/starters/helloworld/src/main/resources/application.yml
index 62315ff..de91a4d 100644
--- a/starters/helloworld/src/main/resources/application.yml
+++ b/starters/helloworld/src/main/resources/application.yml
@@ -1,10 +1,18 @@
+#
+# Recommend use for static configuration that does not change between environments.
+#
+# See also config/application.properties
+#
 isis:
   reflector:
+    explicit-annotations:
+      action: true
     validator:
       allowDeprecated: false
       noParamsOnly: true
       explicitObjectType: true
       serviceActionsOnly: true
+
       mixinsOnly: true
 
     facet:
@@ -67,3 +75,6 @@ isis:
             level2:
               type: none
               mode: ENABLE_SELECTIVE
+spring:
+  banner:
+    location: banner.txt
diff --git a/starters/helloworld/src/main/resources/banner.txt b/starters/helloworld/src/main/resources/banner.txt
new file mode 100644
index 0000000..3f593d9
--- /dev/null
+++ b/starters/helloworld/src/main/resources/banner.txt
@@ -0,0 +1,6 @@
+  ,---.                           ,--.                ,--.         ,--.
+ /  O  \   ,---.   ,--,--.  ,---. |  ,---.   ,---.    |  |  ,---.  `--'  ,---.
+|  .-.  | | .-. | ' ,-.  | | .--' |  .-.  | | .-. :   |  | (  .-'  ,--. (  .-'
+|  | |  | | '-' ' \ '-'  | \ `--. |  | |  | \   --.   |  | .-'  `) |  | .-'  `)
+`--' `--' |  |-'   `--`--'  `---' `--' `--'  `----'   `--' `----'  `--' `----'
+          `--'
diff --git a/starters/helloworld/src/main/resources/config/application.properties b/starters/helloworld/src/main/resources/config/application.properties
index f39e40e..cb0aeef 100644
--- a/starters/helloworld/src/main/resources/config/application.properties
+++ b/starters/helloworld/src/main/resources/config/application.properties
@@ -1,10 +1,12 @@
-
 #
-# moved from application.properties for demo purposes only
-# renamed to kebab-case, but the old camelCase is also recognised and supported.
+# Recommend use for configuration that changes between environments.
 #
-# to test, try commenting out the @Action annotation on HelloWorld#updateName(...)
-# with this property set to either false or true.
+# To override externally, see Spring Boot docs
+# https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
 #
-
-isis.reflector.explicit-annotations.action=true
+# See also /application.yml
+#
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL = jdbc:h2:mem:test
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName = org.h2.Driver
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName = sa
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword =
diff --git a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/.gitignore b/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/.gitignore
deleted file mode 100644
index e66bc56..0000000
--- a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.received.txt
\ No newline at end of file
diff --git a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.java b/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.java
deleted file mode 100644
index 3ae0318..0000000
--- a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package domainapp.dom.impl.lockdown;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Arrays;
-
-import org.approvaltests.Approvals;
-import org.approvaltests.reporters.DiffReporter;
-import org.approvaltests.reporters.UseReporter;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Resources;
-
-import static org.hamcrest.CoreMatchers.*;
-import static org.junit.Assume.assumeThat;
-
-public class LockDownMavenDeps_Test {
-
-    @Before
-    public void setUp() throws Exception {
-        assumeThat(System.getProperty("lockdown"), is(not(nullValue())));
-    }
-
-    @UseReporter(DiffReporter.class)
-    @Test
-    public void list() throws Exception {
-        Approvals.verify(sort(read("list")));
-    }
-
-    @UseReporter(DiffReporter.class)
-    @Test
-    public void tree() throws Exception {
-        Approvals.verify(read("tree"));
-    }
-
-    private String read(final String goal) throws IOException {
-        final URL resource = Resources.getResource(getClass(),
-                String.format("%s.%s.actual.txt", getClass().getSimpleName(), goal));
-        return Resources.toString(resource, Charsets.UTF_8);
-    }
-
-    private static String sort(final String unsorted) {
-        final String[] lines = unsorted.split("[\r\n]+");
-        Arrays.sort(lines);
-        return String.join("\n", lines);
-    }
-
-}
diff --git a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.list.approved.txt b/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.list.approved.txt
deleted file mode 100644
index 3e25f09..0000000
--- a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.list.approved.txt
+++ /dev/null
@@ -1,211 +0,0 @@
-
-   args4j:args4j:jar:2.0.26:compile
-   cglib:cglib-nodep:jar:3.2.12:compile
-   cglib:cglib:jar:3.2.8:test
-   com.approvaltests:approvaltests-util:jar:4.0.2:test
-   com.approvaltests:approvaltests:jar:4.0.2:test
-   com.fasterxml.jackson.core:jackson-annotations:jar:2.10.0:compile
-   com.fasterxml.jackson.core:jackson-core:jar:2.10.0:compile
-   com.fasterxml.jackson.core:jackson-databind:jar:2.10.0:compile
-   com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.10.0:compile
-   com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.10.0:compile
-   com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.10.0:compile
-   com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.10.0:compile
-   com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.10.0:compile
-   com.fasterxml:classmate:jar:1.5.0:compile
-   com.github.openjson:openjson:jar:1.0.10:compile
-   com.google.code.findbugs:annotations:jar:2.0.1:compile
-   com.google.code.findbugs:jsr305:jar:3.0.2:compile
-   com.google.code.gson:gson:jar:2.8.6:compile
-   com.google.errorprone:error_prone_annotations:jar:2.3.2:compile
-   com.google.guava:failureaccess:jar:1.0.1:compile
-   com.google.guava:guava:jar:28.1-jre:compile
-   com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava:compile
-   com.google.j2objc:j2objc-annotations:jar:1.3:compile
-   com.google.javascript:closure-compiler-externs:jar:v20190325:compile
-   com.google.javascript:closure-compiler-unshaded:jar:v20190325:compile
-   com.google.jsinterop:jsinterop-annotations:jar:1.0.0:compile
-   com.h2database:h2:jar:1.4.199:compile
-   com.jayway.jsonpath:json-path:jar:2.4.0:test
-   com.sun.mail:javax.mail:jar:1.6.0:compile
-   com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
-   commons-beanutils:commons-beanutils:jar:1.9.3:compile
-   commons-codec:commons-codec:jar:1.13:compile
-   commons-collections:commons-collections:jar:3.2.2:compile
-   commons-fileupload:commons-fileupload:jar:1.4:compile
-   commons-io:commons-io:jar:2.6:compile
-   commons-logging:commons-logging:jar:1.2:compile
-   de.agilecoders.wicket.webjars:wicket-webjars:jar:2.0.15:compile
-   de.agilecoders.wicket:jquery-selectors:jar:2.0.7:compile
-   de.agilecoders.wicket:wicket-bootstrap-core:jar:2.0.11:compile
-   de.agilecoders.wicket:wicket-bootstrap-extensions:jar:2.0.11:compile
-   de.agilecoders.wicket:wicket-bootstrap-themes:jar:2.0.11:compile
-   io.swagger:swagger-annotations:jar:1.5.21:compile
-   io.swagger:swagger-core:jar:1.5.21:compile
-   io.swagger:swagger-models:jar:1.5.21:compile
-   jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
-   jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
-   jakarta.validation:jakarta.validation-api:jar:2.0.1:compile
-   jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
-   javax.activation:activation:jar:1.1:compile
-   javax.inject:javax.inject:jar:1:compile
-   javax.json.bind:javax.json.bind-api:jar:1.0:compile
-   javax.transaction:transaction-api:jar:1.1:compile
-   javax:javaee-api:jar:8.0:compile
-   joda-time:joda-time:jar:2.10.4:compile
-   junit:junit:jar:4.12:test
-   net.bytebuddy:byte-buddy:jar:1.10.1:compile
-   net.ftlines.wicket-source:wicket-source:jar:7.0.0:compile
-   net.jcip:jcip-annotations:jar:1.0:compile
-   net.minidev:accessors-smart:jar:1.2:test
-   net.minidev:json-smart:jar:2.3:test
-   org.apache-extras.beanshell:bsh:jar:2.0b6:test
-   org.apache.commons:commons-collections4:jar:4.3:compile
-   org.apache.commons:commons-email:jar:1.4:compile
-   org.apache.commons:commons-lang3:jar:3.9:compile
-   org.apache.httpcomponents:httpclient:jar:4.5.10:compile
-   org.apache.httpcomponents:httpcore:jar:4.4.12:compile
-   org.apache.isis.core:isis-applib:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-codegen-bytebuddy:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-commons:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-config:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-integtestsupport:jar:2.0.0-M3-SNAPSHOT:test
-   org.apache.isis.core:isis-metamodel:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-persistence-jdo-common:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-persistence-jdo-datanucleus5:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-runtime-extensions:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-runtime-services:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-runtime-web:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-runtime:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-schema:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-security-bypass:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-security-keycloak:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-security-shiro:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-security:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-unittestsupport:jar:2.0.0-M3-SNAPSHOT:test
-   org.apache.isis.core:isis-viewer-restfulobjects-applib:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-viewer-restfulobjects-jaxrsresteasy4:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-viewer-restfulobjects-rendering:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-viewer-restfulobjects-server:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-viewer-wicket-impl:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-viewer-wicket-model:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.core:isis-viewer-wicket-ui:jar:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.mavendeps:isis-mavendeps-jdk11:pom:2.0.0-M3-SNAPSHOT:compile
-   org.apache.isis.mavendeps:isis-mavendeps-testing:pom:2.0.0-M3-SNAPSHOT:test
-   org.apache.isis.mavendeps:isis-mavendeps-webapp:pom:2.0.0-M3-SNAPSHOT:compile
-   org.apache.logging.log4j:log4j-api:jar:2.12.1:compile
-   org.apache.logging.log4j:log4j-core:jar:2.12.1:compile
-   org.apache.logging.log4j:log4j-jul:jar:2.12.1:compile
-   org.apache.logging.log4j:log4j-slf4j-impl:jar:2.12.1:compile
-   org.apache.shiro:shiro-cache:jar:1.4.1:compile
-   org.apache.shiro:shiro-config-core:jar:1.4.1:compile
-   org.apache.shiro:shiro-config-ogdl:jar:1.4.1:compile
-   org.apache.shiro:shiro-core:jar:1.4.1:compile
-   org.apache.shiro:shiro-crypto-cipher:jar:1.4.1:compile
-   org.apache.shiro:shiro-crypto-core:jar:1.4.1:compile
-   org.apache.shiro:shiro-crypto-hash:jar:1.4.1:compile
-   org.apache.shiro:shiro-event:jar:1.4.1:compile
-   org.apache.shiro:shiro-lang:jar:1.4.1:compile
-   org.apache.shiro:shiro-web:jar:1.4.1:compile
-   org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.27:compile
-   org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.27:compile
-   org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.27:compile
-   org.apache.wicket:wicket-auth-roles:jar:8.6.1:compile
-   org.apache.wicket:wicket-core:jar:8.6.1:compile
-   org.apache.wicket:wicket-devutils:jar:8.6.1:compile
-   org.apache.wicket:wicket-extensions:jar:8.6.1:compile
-   org.apache.wicket:wicket-ioc:jar:8.6.1:compile
-   org.apache.wicket:wicket-request:jar:8.6.1:compile
-   org.apache.wicket:wicket-spring:jar:8.6.1:compile
-   org.apache.wicket:wicket-util:jar:8.6.1:compile
-   org.apache.wicket:wicket:pom:8.6.1:compile
-   org.apiguardian:apiguardian-api:jar:1.1.0:test
-   org.assertj:assertj-core:jar:3.13.2:test
-   org.checkerframework:checker-qual:jar:2.8.1:compile
-   org.codehaus.jackson:jackson-core-asl:jar:1.9.13:compile
-   org.codehaus.jackson:jackson-jaxrs:jar:1.9.13:compile
-   org.codehaus.jackson:jackson-mapper-asl:jar:1.9.13:compile
-   org.codehaus.jackson:jackson-xc:jar:1.9.13:compile
-   org.codehaus.mojo:animal-sniffer-annotations:jar:1.18:compile
-   org.danekja:jdk-serializable-functional:jar:1.8.5:compile
-   org.datanucleus:datanucleus-api-jdo:jar:5.2.2:compile
-   org.datanucleus:datanucleus-core:jar:5.2.2:compile
-   org.datanucleus:datanucleus-jdo-query:jar:5.0.9:compile
-   org.datanucleus:datanucleus-jodatime:jar:5.2.0-release:compile
-   org.datanucleus:datanucleus-rdbms:jar:5.2.1:compile
-   org.datanucleus:javax.jdo:jar:3.2.0-m12:compile
-   org.hamcrest:hamcrest-core:jar:2.1:test
-   org.hamcrest:hamcrest-library:jar:2.1:test
-   org.hamcrest:hamcrest:jar:2.1:compile
-   org.hibernate.validator:hibernate-validator:jar:6.0.17.Final:compile
-   org.hsqldb:hsqldb:jar:2.5.0:test
-   org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile
-   org.jboss.resteasy:resteasy-jackson-provider:jar:4.0.0.Beta5:compile
-   org.jboss.resteasy:resteasy-jaxb-provider:jar:4.0.0.Beta5:compile
-   org.jboss.resteasy:resteasy-jaxrs-services:jar:4.0.0.Beta5:compile
-   org.jboss.resteasy:resteasy-jaxrs:jar:4.0.0.Beta5:compile
-   org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final:compile
-   org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:jar:1.0.1.Final:compile
-   org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec:jar:1.0.0.Final:compile
-   org.jmock:jmock-imposters:jar:2.11.0:test
-   org.jmock:jmock-junit4:jar:2.11.0:test
-   org.jmock:jmock-legacy:jar:2.11.0:test
-   org.jmock:jmock-testjar:jar:2.11.0:test
-   org.jmock:jmock:jar:2.11.0:test
-   org.junit.jupiter:junit-jupiter-api:jar:5.5.2:test
-   org.junit.jupiter:junit-jupiter-engine:jar:5.5.2:test
-   org.junit.jupiter:junit-jupiter-params:jar:5.5.2:test
-   org.junit.jupiter:junit-jupiter:jar:5.5.2:test
-   org.junit.platform:junit-platform-commons:jar:1.5.2:test
-   org.junit.platform:junit-platform-engine:jar:1.5.2:test
-   org.junit.vintage:junit-vintage-engine:jar:5.5.2:test
-   org.mockito:mockito-core:jar:3.1.0:test
-   org.mockito:mockito-junit-jupiter:jar:3.1.0:test
-   org.objenesis:objenesis:jar:2.2:compile
-   org.opentest4j:opentest4j:jar:1.2.0:test
-   org.ow2.asm:asm-analysis:jar:7.1:compile
-   org.ow2.asm:asm-tree:jar:7.1:compile
-   org.ow2.asm:asm-util:jar:7.1:compile
-   org.picocontainer:picocontainer:jar:2.15:test
-   org.projectlombok:lombok:jar:1.18.10:compile
-   org.reactivestreams:reactive-streams:jar:1.0.3:compile
-   org.skyscreamer:jsonassert:jar:1.5.0:test
-   org.slf4j:jul-to-slf4j:jar:1.7.28:compile
-   org.slf4j:slf4j-api:jar:1.7.28:compile
-   org.springframework.boot:spring-boot-actuator-autoconfigure:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-actuator:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-autoconfigure:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-starter-json:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-starter-log4j2:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-starter-test:jar:2.2.0.RELEASE:test
-   org.springframework.boot:spring-boot-starter-tomcat:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-starter-validation:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-starter-web:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-starter:jar:2.2.0.RELEASE:compile
-   org.springframework.boot:spring-boot-test-autoconfigure:jar:2.2.0.RELEASE:test
-   org.springframework.boot:spring-boot-test:jar:2.2.0.RELEASE:test
-   org.springframework.boot:spring-boot:jar:2.2.0.RELEASE:compile
-   org.springframework:spring-aop:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-beans:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-context:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-core:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-expression:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-jcl:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-test:jar:5.2.1.RELEASE:test
-   org.springframework:spring-tx:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-web:jar:5.2.1.RELEASE:compile
-   org.springframework:spring-webmvc:jar:5.2.1.RELEASE:compile
-   org.webjars.bower:momentjs:jar:2.24.0:compile
-   org.webjars.bower:summernote:jar:0.8.11:compile
-   org.webjars:Eonasdan-bootstrap-datetimepicker:jar:4.17.37-1:compile
-   org.webjars:animate.css:jar:3.5.2:compile
-   org.webjars:bootstrap:jar:3.4.0:compile
-   org.webjars:font-awesome:jar:4.7.0:compile
-   org.webjars:jquery-ui:jar:1.12.1:compile
-   org.webjars:jquery:jar:1.11.1:compile
-   org.webjars:modernizr:jar:2.8.3-1:compile
-   org.webjars:select2:jar:4.0.10:compile
-   org.wicketstuff:wicketstuff-select2:jar:8.6.0:compile
-   org.xmlunit:xmlunit-core:jar:2.6.3:test
-   org.yaml:snakeyaml:jar:1.25:runtime
-The following files have been resolved:
diff --git a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.tree.approved.txt b/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.tree.approved.txt
deleted file mode 100644
index f6fac71..0000000
--- a/starters/helloworld/src/test/java/domainapp/dom/impl/lockdown/LockDownMavenDeps_Test.tree.approved.txt
+++ /dev/null
@@ -1,210 +0,0 @@
-org.apache.isis.examples.apps:helloworld:jar:2.0.0-M3-SNAPSHOT
-+- org.apache.isis.mavendeps:isis-mavendeps-webapp:pom:2.0.0-M3-SNAPSHOT:compile
-|  +- org.springframework.boot:spring-boot-starter-web:jar:2.2.0.RELEASE:compile
-|  |  +- org.springframework.boot:spring-boot-starter:jar:2.2.0.RELEASE:compile
-|  |  |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
-|  |  |  \- org.yaml:snakeyaml:jar:1.25:runtime
-|  |  +- org.springframework.boot:spring-boot-starter-json:jar:2.2.0.RELEASE:compile
-|  |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.10.0:compile
-|  |  |  \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.10.0:compile
-|  |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.2.0.RELEASE:compile
-|  |  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.27:compile
-|  |  |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.27:compile
-|  |  |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.27:compile
-|  |  +- org.springframework.boot:spring-boot-starter-validation:jar:2.2.0.RELEASE:compile
-|  |  |  +- jakarta.validation:jakarta.validation-api:jar:2.0.1:compile
-|  |  |  \- org.hibernate.validator:hibernate-validator:jar:6.0.17.Final:compile
-|  |  |     +- org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile
-|  |  |     \- com.fasterxml:classmate:jar:1.5.0:compile
-|  |  +- org.springframework:spring-web:jar:5.2.1.RELEASE:compile
-|  |  \- org.springframework:spring-webmvc:jar:5.2.1.RELEASE:compile
-|  +- org.apache.isis.core:isis-applib:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  \- org.apache.isis.core:isis-commons:jar:2.0.0-M3-SNAPSHOT:compile
-|  |     +- javax:javaee-api:jar:8.0:compile
-|  |     |  \- com.sun.mail:javax.mail:jar:1.6.0:compile
-|  |     |     \- javax.activation:activation:jar:1.1:compile
-|  |     +- com.google.code.findbugs:annotations:jar:2.0.1:compile
-|  |     +- org.projectlombok:lombok:jar:1.18.10:compile
-|  |     +- org.springframework:spring-tx:jar:5.2.1.RELEASE:compile
-|  |     \- org.springframework.boot:spring-boot-starter-log4j2:jar:2.2.0.RELEASE:compile
-|  |        +- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.12.1:compile
-|  |        |  \- org.apache.logging.log4j:log4j-api:jar:2.12.1:compile
-|  |        +- org.apache.logging.log4j:log4j-core:jar:2.12.1:compile
-|  |        +- org.apache.logging.log4j:log4j-jul:jar:2.12.1:compile
-|  |        \- org.slf4j:jul-to-slf4j:jar:1.7.28:compile
-|  +- org.apache.isis.core:isis-schema:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  \- joda-time:joda-time:jar:2.10.4:compile
-|  +- org.apache.isis.core:isis-codegen-bytebuddy:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- net.bytebuddy:byte-buddy:jar:1.10.1:compile
-|  |  \- org.objenesis:objenesis:jar:2.2:compile
-|  +- org.apache.isis.core:isis-viewer-wicket-impl:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- org.apache.isis.core:isis-viewer-wicket-ui:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  |  +- org.apache.isis.core:isis-viewer-wicket-model:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  |  +- org.apache.wicket:wicket-core:jar:8.6.1:compile
-|  |  |  |  +- com.github.openjson:openjson:jar:1.0.10:compile
-|  |  |  |  +- org.apache.wicket:wicket-request:jar:8.6.1:compile
-|  |  |  |  +- org.apache.wicket:wicket-util:jar:8.6.1:compile
-|  |  |  |  |  +- commons-fileupload:commons-fileupload:jar:1.4:compile
-|  |  |  |  |  \- org.apache.commons:commons-collections4:jar:4.3:compile
-|  |  |  |  \- org.danekja:jdk-serializable-functional:jar:1.8.5:compile
-|  |  |  +- org.apache.wicket:wicket-devutils:jar:8.6.1:compile
-|  |  |  +- org.apache.wicket:wicket-extensions:jar:8.6.1:compile
-|  |  |  +- org.wicketstuff:wicketstuff-select2:jar:8.6.0:compile
-|  |  |  +- org.webjars:select2:jar:4.0.10:compile
-|  |  |  |  \- org.webjars:jquery:jar:1.11.1:compile
-|  |  |  +- org.webjars:jquery-ui:jar:1.12.1:compile
-|  |  |  +- de.agilecoders.wicket.webjars:wicket-webjars:jar:2.0.15:compile
-|  |  |  +- de.agilecoders.wicket:wicket-bootstrap-extensions:jar:2.0.11:compile
-|  |  |  |  +- org.webjars:Eonasdan-bootstrap-datetimepicker:jar:4.17.37-1:compile
-|  |  |  |  +- org.webjars.bower:momentjs:jar:2.24.0:compile
-|  |  |  |  +- org.webjars:font-awesome:jar:4.7.0:compile
-|  |  |  |  +- com.google.javascript:closure-compiler-unshaded:jar:v20190325:compile
-|  |  |  |  |  +- com.google.javascript:closure-compiler-externs:jar:v20190325:compile
-|  |  |  |  |  +- args4j:args4j:jar:2.0.26:compile
-|  |  |  |  |  +- com.google.code.gson:gson:jar:2.8.6:compile
-|  |  |  |  |  \- com.google.jsinterop:jsinterop-annotations:jar:1.0.0:compile
-|  |  |  |  \- org.webjars:animate.css:jar:3.5.2:compile
-|  |  |  +- org.webjars.bower:summernote:jar:0.8.11:compile
-|  |  |  \- de.agilecoders.wicket:wicket-bootstrap-themes:jar:2.0.11:compile
-|  |  +- org.apache.wicket:wicket-spring:jar:8.6.1:compile
-|  |  |  \- org.apache.wicket:wicket-ioc:jar:8.6.1:compile
-|  |  |     +- cglib:cglib-nodep:jar:3.2.12:compile
-|  |  |     +- javax.inject:javax.inject:jar:1:compile
-|  |  |     \- org.ow2.asm:asm-util:jar:7.1:compile
-|  |  |        +- org.ow2.asm:asm-tree:jar:7.1:compile
-|  |  |        \- org.ow2.asm:asm-analysis:jar:7.1:compile
-|  |  +- org.apache.wicket:wicket-auth-roles:jar:8.6.1:compile
-|  |  +- de.agilecoders.wicket:wicket-bootstrap-core:jar:2.0.11:compile
-|  |  |  +- de.agilecoders.wicket:jquery-selectors:jar:2.0.7:compile
-|  |  |  +- org.webjars:bootstrap:jar:3.4.0:compile
-|  |  |  +- org.webjars:modernizr:jar:2.8.3-1:compile
-|  |  |  \- org.apache.commons:commons-lang3:jar:3.9:compile
-|  |  +- net.ftlines.wicket-source:wicket-source:jar:7.0.0:compile
-|  |  |  \- org.apache.wicket:wicket:pom:8.6.1:compile
-|  |  \- commons-io:commons-io:jar:2.6:compile
-|  +- org.apache.isis.core:isis-viewer-restfulobjects-server:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- org.apache.isis.core:isis-runtime-web:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- org.apache.isis.core:isis-viewer-restfulobjects-rendering:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  |  +- org.apache.isis.core:isis-metamodel:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  |  |  \- io.swagger:swagger-core:jar:1.5.21:compile
-|  |  |  |     +- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.10.0:compile
-|  |  |  |     \- io.swagger:swagger-models:jar:1.5.21:compile
-|  |  |  |        \- io.swagger:swagger-annotations:jar:1.5.21:compile
-|  |  |  \- org.apache.isis.core:isis-viewer-restfulobjects-applib:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  \- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.10.0:compile
-|  |     +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
-|  |     \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
-|  +- org.apache.isis.core:isis-viewer-restfulobjects-jaxrsresteasy4:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- org.jboss.resteasy:resteasy-jackson-provider:jar:4.0.0.Beta5:compile
-|  |  |  +- org.codehaus.jackson:jackson-core-asl:jar:1.9.13:compile
-|  |  |  +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.13:compile
-|  |  |  +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.13:compile
-|  |  |  \- org.codehaus.jackson:jackson-xc:jar:1.9.13:compile
-|  |  +- org.jboss.resteasy:resteasy-jaxb-provider:jar:4.0.0.Beta5:compile
-|  |  |  \- org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec:jar:1.0.0.Final:compile
-|  |  +- org.jboss.resteasy:resteasy-jaxrs:jar:4.0.0.Beta5:compile
-|  |  |  +- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:jar:1.0.1.Final:compile
-|  |  |  +- org.jboss.resteasy:resteasy-jaxrs-services:jar:4.0.0.Beta5:compile
-|  |  |  +- org.reactivestreams:reactive-streams:jar:1.0.3:compile
-|  |  |  +- org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final:compile
-|  |  |  +- org.apache.httpcomponents:httpclient:jar:4.5.10:compile
-|  |  |  |  +- org.apache.httpcomponents:httpcore:jar:4.4.12:compile
-|  |  |  |  \- commons-codec:commons-codec:jar:1.13:compile
-|  |  |  +- net.jcip:jcip-annotations:jar:1.0:compile
-|  |  |  \- javax.json.bind:javax.json.bind-api:jar:1.0:compile
-|  |  +- commons-logging:commons-logging:jar:1.2:compile
-|  |  +- com.fasterxml.jackson.core:jackson-core:jar:2.10.0:compile
-|  |  \- com.fasterxml.jackson.core:jackson-annotations:jar:2.10.0:compile
-|  +- org.apache.isis.core:isis-security:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  \- org.apache.isis.core:isis-config:jar:2.0.0-M3-SNAPSHOT:compile
-|  +- org.apache.isis.core:isis-security-bypass:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  \- org.apache.isis.core:isis-runtime-services:jar:2.0.0-M3-SNAPSHOT:compile
-|  +- org.apache.isis.core:isis-security-shiro:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- org.apache.shiro:shiro-core:jar:1.4.1:compile
-|  |  |  +- org.apache.shiro:shiro-lang:jar:1.4.1:compile
-|  |  |  +- org.apache.shiro:shiro-cache:jar:1.4.1:compile
-|  |  |  +- org.apache.shiro:shiro-crypto-hash:jar:1.4.1:compile
-|  |  |  |  \- org.apache.shiro:shiro-crypto-core:jar:1.4.1:compile
-|  |  |  +- org.apache.shiro:shiro-crypto-cipher:jar:1.4.1:compile
-|  |  |  +- org.apache.shiro:shiro-config-core:jar:1.4.1:compile
-|  |  |  +- org.apache.shiro:shiro-config-ogdl:jar:1.4.1:compile
-|  |  |  |  \- commons-beanutils:commons-beanutils:jar:1.9.3:compile
-|  |  |  |     \- commons-collections:commons-collections:jar:3.2.2:compile
-|  |  |  \- org.apache.shiro:shiro-event:jar:1.4.1:compile
-|  |  \- org.apache.shiro:shiro-web:jar:1.4.1:compile
-|  +- org.apache.isis.core:isis-security-keycloak:jar:2.0.0-M3-SNAPSHOT:compile
-|  +- org.apache.isis.core:isis-persistence-jdo-datanucleus5:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  +- org.datanucleus:javax.jdo:jar:3.2.0-m12:compile
-|  |  |  \- javax.transaction:transaction-api:jar:1.1:compile
-|  |  +- org.datanucleus:datanucleus-core:jar:5.2.2:compile
-|  |  +- org.datanucleus:datanucleus-api-jdo:jar:5.2.2:compile
-|  |  +- org.datanucleus:datanucleus-jdo-query:jar:5.0.9:compile
-|  |  +- org.datanucleus:datanucleus-rdbms:jar:5.2.1:compile
-|  |  +- org.datanucleus:datanucleus-jodatime:jar:5.2.0-release:compile
-|  |  +- org.apache.isis.core:isis-runtime:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  |  \- org.apache.commons:commons-email:jar:1.4:compile
-|  |  +- org.apache.isis.core:isis-runtime-extensions:jar:2.0.0-M3-SNAPSHOT:compile
-|  |  \- org.apache.isis.core:isis-persistence-jdo-common:jar:2.0.0-M3-SNAPSHOT:compile
-|  \- com.google.guava:guava:jar:28.1-jre:compile
-|     +- com.google.guava:failureaccess:jar:1.0.1:compile
-|     +- com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava:compile
-|     +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
-|     +- org.checkerframework:checker-qual:jar:2.8.1:compile
-|     +- com.google.errorprone:error_prone_annotations:jar:2.3.2:compile
-|     +- com.google.j2objc:j2objc-annotations:jar:1.3:compile
-|     \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.18:compile
-+- org.apache.isis.mavendeps:isis-mavendeps-jdk11:pom:2.0.0-M3-SNAPSHOT:compile
-+- com.h2database:h2:jar:1.4.199:compile
-+- org.apache.isis.mavendeps:isis-mavendeps-testing:pom:2.0.0-M3-SNAPSHOT:test
-|  +- org.apache.isis.core:isis-unittestsupport:jar:2.0.0-M3-SNAPSHOT:test
-|  |  +- org.junit.jupiter:junit-jupiter-api:jar:5.5.2:test
-|  |  |  +- org.apiguardian:apiguardian-api:jar:1.1.0:test
-|  |  |  +- org.opentest4j:opentest4j:jar:1.2.0:test
-|  |  |  \- org.junit.platform:junit-platform-commons:jar:1.5.2:test
-|  |  +- org.junit.jupiter:junit-jupiter-engine:jar:5.5.2:test
-|  |  |  \- org.junit.platform:junit-platform-engine:jar:1.5.2:test
-|  |  +- org.junit.vintage:junit-vintage-engine:jar:5.5.2:test
-|  |  |  \- junit:junit:jar:4.12:test
-|  |  +- org.mockito:mockito-core:jar:3.1.0:test
-|  |  +- org.slf4j:slf4j-api:jar:1.7.28:compile
-|  |  +- org.springframework.boot:spring-boot-starter-test:jar:2.2.0.RELEASE:test
-|  |  |  +- org.springframework.boot:spring-boot-test:jar:2.2.0.RELEASE:test
-|  |  |  +- org.springframework.boot:spring-boot-test-autoconfigure:jar:2.2.0.RELEASE:test
-|  |  |  +- com.jayway.jsonpath:json-path:jar:2.4.0:test
-|  |  |  |  \- net.minidev:json-smart:jar:2.3:test
-|  |  |  |     \- net.minidev:accessors-smart:jar:1.2:test
-|  |  |  +- org.junit.jupiter:junit-jupiter:jar:5.5.2:test
-|  |  |  |  \- org.junit.jupiter:junit-jupiter-params:jar:5.5.2:test
-|  |  |  +- org.mockito:mockito-junit-jupiter:jar:3.1.0:test
-|  |  |  +- org.hamcrest:hamcrest:jar:2.1:compile
-|  |  |  +- org.skyscreamer:jsonassert:jar:1.5.0:test
-|  |  |  |  \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
-|  |  |  \- org.xmlunit:xmlunit-core:jar:2.6.3:test
-|  |  +- org.springframework:spring-test:jar:5.2.1.RELEASE:test
-|  |  +- org.jmock:jmock:jar:2.11.0:test
-|  |  |  +- org.jmock:jmock-testjar:jar:2.11.0:test
-|  |  |  \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
-|  |  \- org.jmock:jmock-junit4:jar:2.11.0:test
-|  |     +- org.jmock:jmock-legacy:jar:2.11.0:test
-|  |     |  \- cglib:cglib:jar:3.2.8:test
-|  |     \- org.jmock:jmock-imposters:jar:2.11.0:test
-|  +- org.apache.isis.core:isis-integtestsupport:jar:2.0.0-M3-SNAPSHOT:test
-|  +- org.hamcrest:hamcrest-library:jar:2.1:test
-|  |  \- org.hamcrest:hamcrest-core:jar:2.1:test
-|  +- org.assertj:assertj-core:jar:3.13.2:test
-|  +- com.approvaltests:approvaltests:jar:4.0.2:test
-|  |  \- com.approvaltests:approvaltests-util:jar:4.0.2:test
-|  +- org.picocontainer:picocontainer:jar:2.15:test
-|  \- org.hsqldb:hsqldb:jar:2.5.0:test
-\- org.springframework.boot:spring-boot-actuator-autoconfigure:jar:2.2.0.RELEASE:compile
-   +- org.springframework.boot:spring-boot-actuator:jar:2.2.0.RELEASE:compile
-   |  \- org.springframework.boot:spring-boot:jar:2.2.0.RELEASE:compile
-   +- org.springframework.boot:spring-boot-autoconfigure:jar:2.2.0.RELEASE:compile
-   +- com.fasterxml.jackson.core:jackson-databind:jar:2.10.0:compile
-   +- org.springframework:spring-core:jar:5.2.1.RELEASE:compile
-   |  \- org.springframework:spring-jcl:jar:5.2.1.RELEASE:compile
-   +- org.springframework:spring-context:jar:5.2.1.RELEASE:compile
-   |  +- org.springframework:spring-aop:jar:5.2.1.RELEASE:compile
-   |  +- org.springframework:spring-beans:jar:5.2.1.RELEASE:compile
-   |  \- org.springframework:spring-expression:jar:5.2.1.RELEASE:compile
-   \- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.10.0:compile
diff --git a/starters/simpleapp/application/pom.xml b/starters/simpleapp/application/pom.xml
index 5795d00..0cf979c 100644
--- a/starters/simpleapp/application/pom.xml
+++ b/starters/simpleapp/application/pom.xml
@@ -40,6 +40,7 @@
     <build>
         <testResources>
             <testResource>
+                <filtering>false</filtering>
                 <directory>src/test/java</directory>
             </testResource>
         </testResources>
diff --git a/starters/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java b/starters/simpleapp/application/src/test/java/domainapp/application/bdd/RunIntegBddSpecs.java
similarity index 97%
rename from starters/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java
rename to starters/simpleapp/application/src/test/java/domainapp/application/bdd/RunIntegBddSpecs.java
index e575f7d..a50b050 100644
--- a/starters/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java
+++ b/starters/simpleapp/application/src/test/java/domainapp/application/bdd/RunIntegBddSpecs.java
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package domainapp.application.bdd.specs;
+package domainapp.application.bdd;
 
 import io.cucumber.junit.Cucumber;
 import io.cucumber.junit.CucumberOptions;
diff --git a/starters/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectsStepDef.java b/starters/simpleapp/application/src/test/java/domainapp/application/bdd/glue/SimpleObjectsStepDef.java
similarity index 94%
rename from starters/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectsStepDef.java
rename to starters/simpleapp/application/src/test/java/domainapp/application/bdd/glue/SimpleObjectsStepDef.java
index 0d9147b..70efd86 100644
--- a/starters/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectsStepDef.java
+++ b/starters/simpleapp/application/src/test/java/domainapp/application/bdd/glue/SimpleObjectsStepDef.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package domainapp.application.bdd.specs;
+package domainapp.application.bdd.glue;
 
 import java.util.List;
 import java.util.UUID;
@@ -33,7 +33,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import domainapp.application.fixture.scenarios.DomainAppDemo;
-import domainapp.application.integtests.SpringIntegrationTest;
+import domainapp.application.integtests.ApplicationIntegTestAbstract;
 import domainapp.modules.simple.dom.impl.SimpleObject;
 import domainapp.modules.simple.dom.impl.SimpleObjects;
 import domainapp.modules.simple.fixture.SimpleObject_persona;
@@ -43,9 +43,7 @@ import io.cucumber.java.en.Given;
 import io.cucumber.java.en.When;
 import lombok.val;
 
-@Ignore("not a JUnit test")
-public class SimpleObjectsStepDef extends SpringIntegrationTest {
-
+public class SimpleObjectsStepDef extends ApplicationIntegTestAbstract {
 
     @Given("^there are.* (\\d+) simple objects$")
     public void there_are_N_simple_objects(int n) throws Throwable {
diff --git a/starters/simpleapp/application/src/test/java/domainapp/conf/SimpleAppManifestForTesting.java b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/ApplicationIntegTestAbstract.java
similarity index 59%
rename from starters/simpleapp/application/src/test/java/domainapp/conf/SimpleAppManifestForTesting.java
rename to starters/simpleapp/application/src/test/java/domainapp/application/integtests/ApplicationIntegTestAbstract.java
index ee57a1a..b059ff0 100644
--- a/starters/simpleapp/application/src/test/java/domainapp/conf/SimpleAppManifestForTesting.java
+++ b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/ApplicationIntegTestAbstract.java
@@ -16,37 +16,42 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package domainapp.conf;
+package domainapp.application.integtests;
 
-import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.annotation.PropertySources;
+import domainapp.application.ApplicationModule;
 
 import org.apache.isis.config.IsisPresets;
+import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
+import org.apache.isis.integtestsupport.IsisIntegrationTestAbstract;
 import org.apache.isis.jdo.IsisBootDataNucleus;
 import org.apache.isis.runtime.spring.IsisBoot;
 import org.apache.isis.security.bypass.IsisBootSecurityBypass;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+import org.springframework.test.context.ContextConfiguration;
 
-import domainapp.application.ApplicationModule;
+@SpringBootTest(classes = ApplicationIntegTestAbstract.AppManifest.class)
+@ContextConfiguration
+public abstract class ApplicationIntegTestAbstract extends IsisIntegrationTestAbstract {
 
-/**
- * Makes the integral parts of the 'simple app' web application.
- */
-@Configuration
-@PropertySources({
-    @PropertySource(IsisPresets.H2InMemory),
-    @PropertySource(IsisPresets.NoTranslations),
-    @PropertySource(IsisPresets.DataNucleusAutoCreate),
-})
-@Import({
-    IsisBoot.class,
-    IsisBootDataNucleus.class,
-    IsisBootSecurityBypass.class,
-    IsisExtFixturesModule.class,
-    ApplicationModule.class
-})
-public class SimpleAppManifestForTesting {
+    @Configuration
+    @PropertySources({
+            @PropertySource(IsisPresets.Log4j2Test),
+            @PropertySource(IsisPresets.H2InMemory_withUniqueSchema),
+            @PropertySource(IsisPresets.NoTranslations),
+            @PropertySource(IsisPresets.DataNucleusAutoCreate),
+    })
+    @Import({
+            IsisBoot.class,
+            IsisBootDataNucleus.class,
+            IsisBootSecurityBypass.class,
+            IsisExtFixturesModule.class,
+            ApplicationModule.class
+    })
+    public static class AppManifest {
+    }
 
 }
diff --git a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/SpringIntegrationTest.java b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/SpringIntegrationTest.java
deleted file mode 100644
index 8aad1bf..0000000
--- a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/SpringIntegrationTest.java
+++ /dev/null
@@ -1,47 +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 domainapp.application.integtests;
-
-import javax.inject.Inject;
-
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ContextConfiguration;
-
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-
-import domainapp.conf.SimpleAppManifestForTesting;
-
-@SpringBootTest(
-        classes = SimpleAppManifestForTesting.class,
-        properties = {
-                "logging.config=log4j2-test.xml",
-        })
-@ContextConfiguration
-public abstract class SpringIntegrationTest {
-
-    @Inject protected WrapperFactory wrapperFactory;
-
-    /**
-     * Convenience method, simply delegates to {@link WrapperFactory#wrap(Object)}
-     */
-    protected <T> T wrap(final T obj) {
-        return wrapperFactory.wrap(obj);
-    }
-
-}
diff --git a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/DomainModel_IntegTest.java b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/DomainModel_IntegTest.java
index de35332..04c1dfa 100644
--- a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/DomainModel_IntegTest.java
+++ b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/DomainModel_IntegTest.java
@@ -26,9 +26,9 @@ import org.junit.jupiter.api.Test;
 import org.apache.isis.integtestsupport.validate.ValidateDomainModel;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
-import domainapp.application.integtests.SpringIntegrationTest;
+import domainapp.application.integtests.ApplicationIntegTestAbstract;
 
-class DomainModel_IntegTest extends SpringIntegrationTest {
+class DomainModel_IntegTest extends ApplicationIntegTestAbstract {
     
     @Inject protected SpecificationLoader specificationLoader;
 
diff --git a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/MetaModelService_IntegTest.java b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/MetaModelService_IntegTest.java
index bf607ef..4fc7d4d 100644
--- a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/MetaModelService_IntegTest.java
+++ b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/mml/MetaModelService_IntegTest.java
@@ -41,9 +41,9 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assume.assumeThat;
 
-import domainapp.application.integtests.SpringIntegrationTest;
+import domainapp.application.integtests.ApplicationIntegTestAbstract;
 
-class MetaModelService_IntegTest extends SpringIntegrationTest {
+class MetaModelService_IntegTest extends ApplicationIntegTestAbstract {
 
     @Inject MetaModelService metaModelService;
     @Inject JaxbService jaxbService;
diff --git a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/smoke/Smoke_IntegTest.java b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/smoke/Smoke_IntegTest.java
index 91e8b51..559c36c 100644
--- a/starters/simpleapp/application/src/test/java/domainapp/application/integtests/smoke/Smoke_IntegTest.java
+++ b/starters/simpleapp/application/src/test/java/domainapp/application/integtests/smoke/Smoke_IntegTest.java
@@ -25,17 +25,16 @@ import javax.inject.Inject;
 import org.junit.jupiter.api.Test;
 import org.springframework.transaction.annotation.Transactional;
 
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.TransactionService;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import domainapp.application.integtests.SpringIntegrationTest;
+import domainapp.application.integtests.ApplicationIntegTestAbstract;
 import domainapp.modules.simple.dom.impl.SimpleObject;
 import domainapp.modules.simple.dom.impl.SimpleObjects;
 
 @Transactional
-class Smoke_IntegTest extends SpringIntegrationTest {
+class Smoke_IntegTest extends ApplicationIntegTestAbstract {
 
     @Inject SimpleObjects menu;
     @Inject TransactionService transactionService;
diff --git a/starters/simpleapp/module-simple/build.gradle b/starters/simpleapp/module-simple/build.gradle
deleted file mode 100644
index 6bfc911..0000000
--- a/starters/simpleapp/module-simple/build.gradle
+++ /dev/null
@@ -1,72 +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.
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// this gradle script compiles and enhances the dom classes.
-//
-// The script is intended to be used in conjunction with IntelliJ IDEA, to remove the necessity to run the DataNucleus
-// enhancer immediately before running the app, and therefore reduce the turn-around time.  The script is run as
-// in the background as a daemon while editing/developing; whenever a change is made to any source code, gradle will
-// automatically compile *and* enhance the code.
-//
-// To use, just type:
-//
-//      gradle -t --offline &
-//
-// It is also necessary to disable the IntelliJ's automatic building of the 'dom' project.  This is done using:
-//
-//      File > Settings > Build, Execution, Deployment > Compiler > Excludes
-//
-// and then exclude the .../dom/src/main/java directory
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-defaultTasks 'compileJava', 'copyClasses'
-
-apply plugin: 'java'
-apply plugin: 'tangram.tools'
-
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
-version = (new XmlParser()).parse('pom.xml').parent.version.text()
-
-buildscript {
-  repositories {
-    maven { url "http://oss.jfrog.org/artifactory/oss-snapshot-local" }
-    jcenter()
-  }
-  dependencies {
-    classpath 'tangram:gradle-plugin:1.1.2'
-  }
-}
-repositories {
-    mavenLocal()
-    maven { url "http://oss.jfrog.org/artifactory/oss-snapshot-local" }
-    jcenter()
-}
-dependencies {
-    compile group: 'org.apache.isis.core', name: 'isis-core-applib', version: '1.14.0-SNAPSHOT'
-}
-task copyClasses << {
-    copy {
-        from 'build/classes/main'
-        into 'target/classes'
-    }
-}
diff --git a/starters/simpleapp/module-simple/gradlew b/starters/simpleapp/module-simple/gradlew
deleted file mode 100644
index 27309d9..0000000
--- a/starters/simpleapp/module-simple/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
-    echo "$*"
-}
-
-die ( ) {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/starters/simpleapp/module-simple/gradlew.bat b/starters/simpleapp/module-simple/gradlew.bat
deleted file mode 100644
index 832fdb6..0000000
--- a/starters/simpleapp/module-simple/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/starters/simpleapp/module-simple/layouts.gradle b/starters/simpleapp/module-simple/layouts.gradle
deleted file mode 100644
index f5fa30d..0000000
--- a/starters/simpleapp/module-simple/layouts.gradle
+++ /dev/null
@@ -1,49 +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.
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// This gradle script copies over .layout.xml files from src to target directory.
-//
-// This script is intended to be used while the app is running (in prototype mode), reducing the turn-around time
-// when updating the layout.
-//
-// The framework will automatically notice any changes to .layout.xml files, but these are read from the classpath
-// (under target/classes), not the source path.  Using IntelliJ (say) these can be copied over manually by invoking
-// Run > Reload Changed Classes, and then refreshing the browser.
-//
-// This script instead is intended to be run in the background as a daemon; whenever a change
-// is made to any .layout.xml file, gradle will automatically copy over the file to the target directory.
-//
-// The script is run using:
-//
-//      gradle -t -b layouts.gradle --offline &
-//
-// To reduce turn-around time further, also use the liveReload.gradle script (to automatically refresh the browser).
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-defaultTasks 'copyLayouts'
-
-task copyLayouts(type:Copy) {
-    from 'src/main/java'
-    into 'target/classes'
-    include '**/*.layout.xml'
-}
-
diff --git a/starters/simpleapp/module-simple/liveReload.gradle b/starters/simpleapp/module-simple/liveReload.gradle
deleted file mode 100644
index adb0ab1..0000000
--- a/starters/simpleapp/module-simple/liveReload.gradle
+++ /dev/null
@@ -1,56 +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.
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// This gradle script sets up livereload, configured so that any updates to the dom module's classpath will
-// trigger the browser to reload the page.  In particular, this relates to the .layout.xml files which define the
-// grid layout of domain objects.
-//
-// As a prerequisite, the app needs to configured to load the livereload.js script.  This can be done by adding the
-// following configuration property (to viewer_wicket.properties, isis.properties or the AppManifest, as you prefer):
-//
-//    isis.viewer.wicket.liveReloadUrl=http://localhost:35729/livereload.js?snipver=1
-//
-// This gradle script is run using:
-//
-//      gradle -t -b livereload.gradle --offline &
-//
-// To reduce turn-around time further, also use the layouts.gradle script (to automatically copy over the layout.xml
-// files to the classpath).
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-defaultTasks 'liveReload'
-
-buildscript {
-    repositories {
-        jcenter()
-    }
-    dependencies {
-        classpath 'org.kordamp.gradle:livereload-gradle-plugin:0.2.1'
-    }
-}
-
-apply plugin: 'org.kordamp.gradle.livereload'
-
-liveReload {
-    docRoot new File('target/classes').canonicalPath
-}
-
diff --git a/starters/simpleapp/module-simple/log4j2-test.xml b/starters/simpleapp/module-simple/log4j2-test.xml
new file mode 100644
index 0000000..56e8ad6
--- /dev/null
+++ b/starters/simpleapp/module-simple/log4j2-test.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+	<Properties>
+		<Property name="PID">????</Property>
+		<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
+		<Property name="LOG_LEVEL_PATTERN">%5p</Property>
+		<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
+		<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
+		<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
+	</Properties>
+	<Appenders>
+		<Console name="Console" target="SYSTEM_OUT" follow="true">
+			<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
+		</Console>
+	</Appenders>
+	<Loggers>
+		<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
+		<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
+		<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
+		<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
+		<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
+		<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
+		<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
+		<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
+		
+		<logger name="org.apache.directory" level="warn"/>
+		<logger name="org.apache.directory.api.ldap.model.entry.Value" level="off"/>
+		
+		<logger name="DataNucleus.Persistence" level="info"/>
+		<logger name="DataNucleus.Transaction" level="info"/>
+		<logger name="DataNucleus.Datastore.Schema" level="info"/>
+		<logger name="DataNucleus.Datastore.Native" level="info"/>
+		
+		<Root level="info">
+			<AppenderRef ref="Console" />
+		</Root>
+	</Loggers>
+</Configuration>
+
+<!-- # DataNucleus Logging Categories -->
+<!-- DataNucleus.Persistence - All messages relating to the persistence process -->
+<!-- DataNucleus.Transaction - All messages relating to transactions -->
+<!-- DataNucleus.Connection - All messages relating to Connections. -->
+<!-- DataNucleus.Query - All messages relating to queries -->
+<!-- DataNucleus.Cache - All messages relating to the DataNucleus Cache -->
+<!-- DataNucleus.MetaData - All messages relating to MetaData -->
+<!-- DataNucleus.Datastore - All general datastore messages -->
+<!-- DataNucleus.Datastore.Schema - All schema related datastore log messages -->
+<!-- DataNucleus.Datastore.Persist - All datastore persistence messages -->
+<!-- DataNucleus.Datastore.Retrieve - All datastore retrieval messages -->
+<!-- DataNucleus.Datastore.Native - Log of all 'native' statements sent to the datastore -->
+<!-- DataNucleus.General - All general operational messages -->
+<!-- DataNucleus.Lifecycle - All messages relating to object lifecycle changes -->
+<!-- DataNucleus.ValueGeneration - All messages relating to value generation -->
+<!-- DataNucleus.Enhancer - All messages from the DataNucleus Enhancer. -->
+<!-- DataNucleus.SchemaTool - All messages from DataNucleus SchemaTool -->
+<!-- DataNucleus.JDO - All messages general to JDO -->
+<!-- DataNucleus.JPA - All messages general to JPA -->
+<!-- DataNucleus.JCA - All messages relating to Connector JCA. -->
+<!-- DataNucleus.IDE - Messages from the DataNucleus IDE. -->
\ No newline at end of file
diff --git a/starters/simpleapp/module-simple/logging-integtest.properties b/starters/simpleapp/module-simple/logging-integtest.properties
deleted file mode 100644
index a3a512b..0000000
--- a/starters/simpleapp/module-simple/logging-integtest.properties
+++ /dev/null
@@ -1,120 +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.
-
-
-#
-# Isis uses log4j is used to provide system logging
-#
-log4j.rootCategory=INFO, Console
-
-# The console appender
-log4j.appender.Console=org.apache.log4j.ConsoleAppender
-log4j.appender.Console.target=System.out
-log4j.appender.Console.layout=org.apache.log4j.PatternLayout
-log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE}  [%-20c{1} %-10t %-5p]  %m%n
-
-log4j.appender.File=org.apache.log4j.RollingFileAppender
-log4j.appender.File.file=isis.log
-log4j.appender.File.append=false
-log4j.appender.File.layout=org.apache.log4j.PatternLayout
-log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p]  %m%n
-
-log4j.appender.translations-po=org.apache.log4j.FileAppender
-log4j.appender.translations-po.File=./translations.pot
-log4j.appender.translations-po.Append=false
-log4j.appender.translations-po.layout=org.apache.log4j.PatternLayout
-log4j.appender.translations-po.layout.ConversionPattern=%m%n
-
-! turn on the internal log4j debugging flag so we can see what it is doing
-#log4j.debug=true
-
-
-# DataNucleus
-# the first two log the DML and DDL (if set to DEBUG)
-log4j.logger.DataNucleus.Datastore.Native=WARN, Console
-log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console
-# the remainder can probably be left to WARN
-log4j.logger.DataNucleus.Persistence=WARN, Console
-log4j.logger.DataNucleus.Transaction=WARN, Console
-log4j.logger.DataNucleus.Connection=WARN, Console
-log4j.logger.DataNucleus.Query=WARN, Console
-log4j.logger.DataNucleus.Cache=WARN, Console
-log4j.logger.DataNucleus.MetaData=WARN, Console
-log4j.logger.DataNucleus.Datastore=WARN, Console
-log4j.logger.DataNucleus.Datastore.Persist=WARN, Console
-log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console
-log4j.logger.DataNucleus.General=WARN, Console
-log4j.logger.DataNucleus.Lifecycle=WARN, Console
-log4j.logger.DataNucleus.ValueGeneration=WARN, Console
-log4j.logger.DataNucleus.Enhancer=WARN, Console
-log4j.logger.DataNucleus.SchemaTool=ERROR, Console
-log4j.logger.DataNucleus.JDO=WARN, Console
-log4j.logger.DataNucleus.JPA=ERROR, Console
-log4j.logger.DataNucleus.JCA=WARN, Console
-log4j.logger.DataNucleus.IDE=ERROR, Console
-
-log4j.additivity.DataNucleus.Datastore.Native=false
-log4j.additivity.DataNucleus.Datastore.Schema=false
-log4j.additivity.DataNucleus.Datastore.Persistence=false
-log4j.additivity.DataNucleus.Datastore.Transaction=false
-log4j.additivity.DataNucleus.Datastore.Connection=false
-log4j.additivity.DataNucleus.Datastore.Query=false
-log4j.additivity.DataNucleus.Datastore.Cache=false
-log4j.additivity.DataNucleus.Datastore.MetaData=false
-log4j.additivity.DataNucleus.Datastore.Datastore=false
-log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false
-log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false
-log4j.additivity.DataNucleus.Datastore.General=false
-log4j.additivity.DataNucleus.Datastore.Lifecycle=false
-log4j.additivity.DataNucleus.Datastore.ValueGeneration=false
-log4j.additivity.DataNucleus.Datastore.Enhancer=false
-log4j.additivity.DataNucleus.Datastore.SchemaTool=false
-log4j.additivity.DataNucleus.Datastore.JDO=false
-log4j.additivity.DataNucleus.Datastore.JPA=false
-log4j.additivity.DataNucleus.Datastore.JCA=false
-log4j.additivity.DataNucleus.Datastore.IDE=false
-
-
-
-
-# if using log4jdbc-remix as JDBC driver
-#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
-#log4j.additivity.jdbc.sqlonly=false
-#log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
-#log4j.additivity.jdbc.resultsettable=false
-
-#log4j.logger.jdbc.audit=WARN,jdbc, Console
-#log4j.additivity.jdbc.audit=false
-#log4j.logger.jdbc.resultset=WARN,jdbc
-#log4j.additivity.jdbc.resultset=false
-#log4j.logger.jdbc.sqltiming=WARN,sqltiming
-#log4j.additivity.jdbc.sqltiming=false
-#log4j.logger.jdbc.connection=FATAL,connection
-#log4j.additivity.jdbc.connection=false
-
-
-log4j.logger.org.apache.isis.core.runtime.services.i18n.po.PoWriter=INFO,translations-po
-log4j.additivity.org.apache.isis.core.runtime.services.i18n.po.PoWriter=false
-
-log4j.logger.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=WARN,Console
-log4j.additivity.org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder=false
-
-log4j.logger.org.apache.isis.core.integtestsupport.IntegrationBootstrapAbstract=DEBUG,Console
-log4j.additivity.org.apache.isis.core.integtestsupport.IntegrationBootstrapAbstract=false
-
-log4j.logger.com.mchange.v2.c3p0.SQLWarnings=WARN,Console
-log4j.additivity.com.mchange.v2.c3p0.SQLWarnings=false
diff --git a/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java b/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
index 64aeb4c..65334a1 100644
--- a/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
+++ b/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
@@ -18,16 +18,39 @@
  */
 package domainapp.modules.simple.integtests;
 
+import domainapp.modules.simple.SimpleModule;
+
+import org.apache.isis.config.IsisPresets;
+import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
 import org.apache.isis.extensions.fixtures.IsisIntegrationTestAbstractWithFixtures;
+import org.apache.isis.jdo.IsisBootDataNucleus;
+import org.apache.isis.runtime.spring.IsisBoot;
+import org.apache.isis.security.bypass.IsisBootSecurityBypass;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
 
 
-@SpringBootTest(
-        classes = SimpleModuleManifestForTesting.class,
-        properties = {
-                "isis.objects.editing=false"
-        })
+@SpringBootTest(classes = SimpleModuleIntegTestAbstract.AppManifest.class)
 public abstract class SimpleModuleIntegTestAbstract extends IsisIntegrationTestAbstractWithFixtures {
 
+    @Configuration
+    @PropertySources({
+        @PropertySource(IsisPresets.H2InMemory_withUniqueSchema),
+        @PropertySource(IsisPresets.Log4j2Test),
+        @PropertySource(IsisPresets.DataNucleusAutoCreate),
+    })
+    @Import({
+        IsisBoot.class,
+        IsisBootSecurityBypass.class,
+        IsisBootDataNucleus.class,
+        IsisExtFixturesModule.class,
+        SimpleModule.class
+    })
+    public static class AppManifest {
+    }
+
 }
 
diff --git a/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleManifestForTesting.java b/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleManifestForTesting.java
deleted file mode 100644
index fdeaf93..0000000
--- a/starters/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleManifestForTesting.java
+++ /dev/null
@@ -1,53 +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 domainapp.modules.simple.integtests;
-
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.annotation.PropertySources;
-
-import org.apache.isis.config.IsisPresets;
-import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
-import org.apache.isis.jdo.IsisBootDataNucleus;
-import org.apache.isis.runtime.spring.IsisBoot;
-import org.apache.isis.security.bypass.IsisBootSecurityBypass;
-
-import domainapp.modules.simple.SimpleModule;
-
-
-/**
- * Makes the integral parts of the 'module-simple' integration tests.
- */
-@Configuration
-@PropertySources({
-    @PropertySource(IsisPresets.H2InMemory),
-    @PropertySource(IsisPresets.DataNucleusAutoCreate),
-})
-@Import({
-    IsisBoot.class,
-    IsisBootSecurityBypass.class,
-    IsisBootDataNucleus.class,
-    IsisExtFixturesModule.class,
-    SimpleModule.class
-})
-public class SimpleModuleManifestForTesting {
-
-}
diff --git a/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleApp.java b/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleApp.java
index f58ca67..e4396e0 100644
--- a/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleApp.java
+++ b/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleApp.java
@@ -18,26 +18,53 @@
  */
 package domainapp.webapp;
 
+import domainapp.application.ApplicationModule;
+import domainapp.application.fixture.scenarios.DomainAppDemo;
+
+import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
+import org.apache.isis.jdo.IsisBootDataNucleus;
+import org.apache.isis.runtime.spring.IsisBoot;
+import org.apache.isis.security.shiro.IsisBootSecurityShiro;
+import org.apache.isis.viewer.restfulobjects.IsisBootViewerRestfulObjects;
+import org.apache.isis.viewer.wicket.viewer.IsisBootViewerWicket;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 import org.apache.isis.config.IsisPresets;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
 
-/**
- * Bootstrap the application.
- */
 @SpringBootApplication
 @Import({
-    SimpleAppManifest.class,
+    SimpleApp.AppManifest.class,
 })
 public class SimpleApp extends SpringBootServletInitializer {
 
+    @Configuration
+    @PropertySources({
+            @PropertySource(IsisPresets.NoTranslations),
+            @PropertySource(IsisPresets.DataNucleusAutoCreate),
+    })
+    @Import({
+            IsisBoot.class,
+            IsisBootSecurityShiro.class,
+            IsisBootDataNucleus.class,
+            IsisBootViewerRestfulObjects.class,
+            IsisBootViewerWicket.class,
+
+            IsisExtFixturesModule.class,
+
+            ApplicationModule.class,
+            DomainAppDemo.class // register this fixture
+    })
+    public static class AppManifest {
+    }
+
     /**
-     * 
-     * @param args
-     * @implNote this is to support the <em>Spring Boot Maven Plugin</em>, which auto-detects an 
+     * @implNote this is to support the <em>Spring Boot Maven Plugin</em>, which auto-detects an
      * entry point by searching for classes having a {@code main(...)}
      */
     public static void main(String[] args) {
diff --git a/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleAppManifest.java b/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleAppManifest.java
deleted file mode 100644
index 5c05c68..0000000
--- a/starters/simpleapp/webapp/src/main/java/domainapp/webapp/SimpleAppManifest.java
+++ /dev/null
@@ -1,61 +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 domainapp.webapp;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.annotation.PropertySources;
-
-import org.apache.isis.config.IsisPresets;
-import org.apache.isis.extensions.fixtures.IsisExtFixturesModule;
-import org.apache.isis.jdo.IsisBootDataNucleus;
-import org.apache.isis.runtime.spring.IsisBoot;
-import org.apache.isis.security.shiro.IsisBootSecurityShiro;
-import org.apache.isis.viewer.restfulobjects.IsisBootViewerRestfulObjects;
-import org.apache.isis.viewer.wicket.viewer.IsisBootViewerWicket;
-
-import domainapp.application.ApplicationModule;
-import domainapp.application.fixture.scenarios.DomainAppDemo;
-
-/**
- * Makes the integral parts of the 'simple app' web application.
- */
-@Configuration
-@PropertySources({
-    @PropertySource(IsisPresets.H2InMemory),
-    @PropertySource(IsisPresets.NoTranslations),
-    @PropertySource(IsisPresets.DataNucleusAutoCreate),
-})
-@Import({
-    IsisBoot.class,
-    IsisBootSecurityShiro.class,
-    IsisBootDataNucleus.class,
-    IsisBootViewerRestfulObjects.class,
-    IsisBootViewerWicket.class,
-    IsisExtFixturesModule.class,
-
-    ApplicationModule.class,
-
-    DomainAppDemo.class // register this fixture
-})
-public class SimpleAppManifest {
-
-
-}
diff --git a/starters/simpleapp/webapp/src/main/resources/application.yml b/starters/simpleapp/webapp/src/main/resources/application.yml
index e39f4f7..b2936ed 100644
--- a/starters/simpleapp/webapp/src/main/resources/application.yml
+++ b/starters/simpleapp/webapp/src/main/resources/application.yml
@@ -1,3 +1,8 @@
+#
+# Recommend use for static configuration that does not change between environments.
+#
+# See also config/application.properties
+#
 isis:
   reflector:
     validator:
@@ -135,4 +140,6 @@ isis:
 
       standaloneCollection:
         bulkLoad: false
-
+spring:
+  banner:
+    location: banner.txt
diff --git a/starters/simpleapp/webapp/src/main/resources/banner.txt b/starters/simpleapp/webapp/src/main/resources/banner.txt
new file mode 100644
index 0000000..3f593d9
--- /dev/null
+++ b/starters/simpleapp/webapp/src/main/resources/banner.txt
@@ -0,0 +1,6 @@
+  ,---.                           ,--.                ,--.         ,--.
+ /  O  \   ,---.   ,--,--.  ,---. |  ,---.   ,---.    |  |  ,---.  `--'  ,---.
+|  .-.  | | .-. | ' ,-.  | | .--' |  .-.  | | .-. :   |  | (  .-'  ,--. (  .-'
+|  | |  | | '-' ' \ '-'  | \ `--. |  | |  | \   --.   |  | .-'  `) |  | .-'  `)
+`--' `--' |  |-'   `--`--'  `---' `--' `--'  `----'   `--' `----'  `--' `----'
+          `--'
diff --git a/starters/simpleapp/webapp/src/main/resources/config/application.properties b/starters/simpleapp/webapp/src/main/resources/config/application.properties
index e69de29..13ec292 100644
--- a/starters/simpleapp/webapp/src/main/resources/config/application.properties
+++ b/starters/simpleapp/webapp/src/main/resources/config/application.properties
@@ -0,0 +1,12 @@
+#
+# Recommend use for configuration that changes between environments.
+#
+# To override externally, see Spring Boot docs
+# https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
+#
+# See also /application.yml
+#
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionURL = jdbc:h2:mem:test
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionDriverName = org.h2.Driver
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionUserName = sa
+isis.persistor.datanucleus.impl.javax.jdo.option.ConnectionPassword =
\ No newline at end of file