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 2020/01/31 17:44:37 UTC

[isis-app-simpleapp] branch master updated: updates mavendeps dependencies, now on an interim again

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

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


The following commit(s) were added to refs/heads/master by this push:
     new cd13226  updates mavendeps dependencies, now on an interim again
cd13226 is described below

commit cd132268406ab97b43b680a950d810f451337b37
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Jan 31 17:44:06 2020 +0000

    updates mavendeps dependencies, now on an interim again
---
 README.adoc                                        |  45 ---------
 module-simple/pom.xml                              |   9 +-
 .../domainapp/modules/simple/SimpleModule.java     |  14 ++-
 .../simple/dom/{impl => so}/SimpleObject.java      |  42 +++++----
 .../dom/{impl => so}/SimpleObject.layout.xml       |   0
 .../simple/dom/{impl => so}/SimpleObject.png       | Bin
 .../simple/dom/{impl => so}/SimpleObjects.java     |  14 +--
 .../simple/fixture/SimpleObjectBuilder.java        |   4 +-
 .../simple/fixture/SimpleObject_persona.java       |   6 +-
 .../modules/simple/{dom => }/types/Name.java       |   4 +-
 .../modules/simple/{dom => }/types/Notes.java      |   2 +-
 .../modules/simple/dom/impl/SimpleObject_Test.java |  34 -------
 .../simple/dom/impl/SimpleObjects_Test.java        | 101 ---------------------
 .../modules/simple/dom/so/SimpleObject_Test.java   |  71 +++++++++++++++
 .../modules/simple/dom/so/SimpleObjects_Test.java  |  81 +++++++++++++++++
 .../integtests/SimpleModuleIntegTestAbstract.java  |   4 -
 .../integtests/tests/SimpleObject_IntegTest.java   |  71 +++++++--------
 .../integtests/tests/SimpleObjects_IntegTest.java  |   9 +-
 pom.xml                                            |   2 +-
 webapp/pom.xml                                     |  59 ++----------
 .../main/java/domainapp/webapp/AppManifest.java    |  43 +++++++++
 .../src/main/java/domainapp/webapp/SimpleApp.java  |  42 +--------
 .../webapp/application/ApplicationModule.java      |  10 +-
 .../fixture/scenarios/DomainAppDemo.java           |  15 ++-
 .../services/health/HealthCheckServiceImpl.java    |   4 +-
 .../services/homepage/HomePageService.java         |  30 ------
 .../services/homepage/HomePageViewModel.java       |   6 +-
 .../services/homepage/HomePageViewModel.layout.xml |   7 +-
 webapp/src/main/resources/application.yml          |  29 +++---
 .../config/application-SQLSERVER.properties        |   6 +-
 .../main/resources/config/application.properties   |   2 +-
 webapp/src/main/resources/log4j2-spring.xml        |   2 +
 .../layout => resources}/menubars.layout.xml       |   0
 .../domainapp/webapp/bdd/RunIntegBddSpecs.java     |   9 +-
 .../webapp/bdd/fixtures/DomainAppDemoStepDef.java  |  37 ++++++++
 .../webapp/bdd/glue/SimpleObjectsStepDef.java      |  81 -----------------
 .../bdd/infrastructure/BootstrapStepDef.java       |  23 +++++
 .../bdd/infrastructure/TransactionalStepDef.java   |  55 +++++++++++
 .../SimpleObjectSpec_listAllAndCreate.feature      |  12 ++-
 .../webapp/bdd/stepdefs/SimpleObjectsStepDef.java  |  48 ++++++++++
 .../integtests/ApplicationIntegTestAbstract.java   |  11 ++-
 .../lockdown/LockDownMetaModel_IntegTest.java      |   4 +-
 ...ainapp.modules.simple.dom.impl.SimpleObject.xml |  39 ++++----
 ...inapp.modules.simple.dom.impl.SimpleObjects.xml |  31 ++++---
 ...ication.services.homepage.HomePageViewModel.xml |   4 +-
 .../webapp/integtests/smoke/Smoke_IntegTest.java   |  10 +-
 46 files changed, 573 insertions(+), 559 deletions(-)

diff --git a/README.adoc b/README.adoc
index ca78503..85b982d 100644
--- a/README.adoc
+++ b/README.adoc
@@ -171,51 +171,6 @@ When there are differences, the current state is written to the `current` subdir
 If the current state is approved, it should be copied over to the corresponding `approved` subdirectory.
 
 
-== Docker
-
-To package up the application as a docker image and push to a Docker registry:
-
-* set `$DOCKER_REGISTRY_USERNAME` and `$DOCKER_REGISTRY_PASSWORD` environment variables
-
-* modify the `to/image` configuration property for the link:https://github.com/GoogleContainerTools/jib[jib-maven-plugin] in the `pom.xml`
-+
-The default value is `docker.io/apacheisis/simpleapp:latest`:
-
-** change `docker.io` prefix to push to a registry other than Docker hub
-** change `apacheisis/simpleapp` to the name of your app.
-
-* package up the app with the `docker` profile:
-+
-[source,bash]
-----
-mvn -pl webapp -DskipTests -Ddocker package
-----
-
-Variants:
-
-* to specify Docker registry credentials through some other mechanism, configure the `pom.xml` for `maven-jib-plugin` (it supports a link:https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#authentication-methods[variety of ways] to specify credentials)
-
-* to override the image at the command line, use `-Dimage=...`.
-
-
-
-To run a docker image previously packaged:
-
-[source,bash]
-----
-docker pull apacheisis/simpleapp:latest
-docker container run -d -p 8080:8080 apacheisis/simpleapp:latest
-----
-
-This can then be accessed at link:http://localhost:8080[localhost:8080].
-
-
-=== Externalized Configuration
-
-The Docker image is configured to run in the `/run/secrets` directory.
-Configuration can be therefore be externalized by defining an `application.properties` secret for the Kubernetes or Docker Swarm cluster.
-
-Spring Boot will use these settings in preference to the configuration properties defined in `classpath:config/application.properties`, see link:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config[Spring docs].
 
 
 == Translations
diff --git a/module-simple/pom.xml b/module-simple/pom.xml
index c3a9ec9..20075c0 100644
--- a/module-simple/pom.xml
+++ b/module-simple/pom.xml
@@ -68,7 +68,14 @@
         <!-- TESTS -->
         <dependency>
             <groupId>org.apache.isis.mavendeps</groupId>
-            <artifactId>isis-mavendeps-testing</artifactId>
+            <artifactId>isis-mavendeps-unittests</artifactId>
+            <type>pom</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.isis.mavendeps</groupId>
+            <artifactId>isis-mavendeps-integtests</artifactId>
             <type>pom</type>
             <scope>test</scope>
         </dependency>
diff --git a/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java b/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java
index d22b641..a7ba643 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java
@@ -1,17 +1,23 @@
 package domainapp.modules.simple;
 
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
-import org.apache.isis.testing.fixtures.applib.legacy.teardown.TeardownFixtureAbstract2;
+import org.apache.isis.testing.fixtures.applib.teardown.TeardownFixtureAbstract;
 import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObject;
 
-@org.apache.isis.applib.annotation.Module
+@Configuration
+@Import({})
+@ComponentScan
 public class SimpleModule implements ModuleWithFixtures {
 
     @Override
     public FixtureScript getTeardownFixture() {
-        return new TeardownFixtureAbstract2() {
+        return new TeardownFixtureAbstract() {
             @Override
             protected void execute(ExecutionContext executionContext) {
                 deleteFrom(SimpleObject.class);
diff --git a/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java
similarity index 79%
rename from module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
rename to module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java
index 6319cc7..e0f8c57 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.java
@@ -1,4 +1,4 @@
-package domainapp.modules.simple.dom.impl;
+package domainapp.modules.simple.dom.so;
 
 import java.util.Comparator;
 
@@ -10,6 +10,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Auditing;
+import org.apache.isis.applib.annotation.CommandReification;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Publishing;
@@ -18,24 +19,34 @@ import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.jaxbadapters.PersistentEntityAdapter;
 
-import static org.apache.isis.applib.annotation.CommandReification.ENABLED;
 import static org.apache.isis.applib.annotation.SemanticsOf.IDEMPOTENT;
 import static org.apache.isis.applib.annotation.SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE;
 
-import domainapp.modules.simple.dom.types.Name;
-import domainapp.modules.simple.dom.types.Notes;
+import domainapp.modules.simple.SimpleModule;
+import domainapp.modules.simple.types.Name;
+import domainapp.modules.simple.types.Notes;
 import lombok.val;
 
 @javax.jdo.annotations.PersistenceCapable(identityType=IdentityType.DATASTORE, schema = "simple")
 @javax.jdo.annotations.DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY, column="id")
 @javax.jdo.annotations.Version(strategy= VersionStrategy.DATE_TIME, column="version")
 @javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"})
-@DomainObject(auditing = Auditing.ENABLED)
-@DomainObjectLayout()  // causes UI events to be triggered
+@DomainObject()
+@DomainObjectLayout()
 @XmlJavaTypeAdapter(PersistentEntityAdapter.class)
 public class SimpleObject implements Comparable<SimpleObject> {
 
-    public static class ActionDomainEvent extends org.apache.isis.applib.events.domain.ActionDomainEvent<SimpleObject> {}
+    public static SimpleObject withName(String name) {
+        val simpleObject = new SimpleObject();
+        simpleObject.setName(name);
+        return simpleObject;
+    }
+
+    public static class ActionDomainEvent extends SimpleModule.ActionDomainEvent<SimpleObject> {}
+
+    @Inject RepositoryService repositoryService;
+    @Inject TitleService titleService;
+    @Inject MessageService messageService;
 
     private SimpleObject() {
     }
@@ -44,7 +55,7 @@ public class SimpleObject implements Comparable<SimpleObject> {
         return "Object: " + getName();
     }
 
-    @lombok.Getter @lombok.Setter //@lombok.NonNull XXX lombok+JDOQ issue
+    @lombok.Getter @lombok.Setter
     @Name private String name;
 
     @lombok.Getter @lombok.Setter
@@ -52,7 +63,9 @@ public class SimpleObject implements Comparable<SimpleObject> {
 
 
     public static class UpdateNameActionDomainEvent extends SimpleObject.ActionDomainEvent {}
-    @Action(semantics = IDEMPOTENT, command = ENABLED, publishing = Publishing.ENABLED, associateWith = "name", domainEvent = UpdateNameActionDomainEvent.class)
+    @Action(semantics = IDEMPOTENT,
+            command = CommandReification.ENABLED, publishing = Publishing.ENABLED,
+            associateWith = "name", domainEvent = UpdateNameActionDomainEvent.class)
     public SimpleObject updateName(
             @Name final String name) {
         setName(name);
@@ -85,16 +98,5 @@ public class SimpleObject implements Comparable<SimpleObject> {
     }
 
 
-    @Inject RepositoryService repositoryService;
-    @Inject TitleService titleService;
-    @Inject MessageService messageService;
-
-    // FACTORY
-
-    public static SimpleObject ofName(String name) {
-        val simpleObject = new SimpleObject();
-        simpleObject.setName(name);
-        return simpleObject;
-    }
 
 }
\ No newline at end of file
diff --git a/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.layout.xml b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.layout.xml
similarity index 100%
rename from module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.layout.xml
rename to module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.layout.xml
diff --git a/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.png b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.png
similarity index 100%
rename from module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObject.png
rename to module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.png
diff --git a/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
similarity index 86%
rename from module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
rename to module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
index e61b096..83834ad 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObjects.java
@@ -1,4 +1,4 @@
-package domainapp.modules.simple.dom.impl;
+package domainapp.modules.simple.dom.so;
 
 import java.util.List;
 
@@ -9,7 +9,8 @@ import org.apache.isis.applib.annotation.*;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
 
-import domainapp.modules.simple.dom.types.Name;
+import domainapp.modules.simple.SimpleModule;
+import domainapp.modules.simple.types.Name;
 
 @DomainService(
         nature = NatureOfService.VIEW,
@@ -26,15 +27,14 @@ public class SimpleObjects {
         this.isisJdoSupport = isisJdoSupport;
     }
 
-    public static class ActionDomainEvent extends org.apache.isis.applib.events.domain.ActionDomainEvent<SimpleObjects> {}
+    public static class ActionDomainEvent extends SimpleModule.ActionDomainEvent<SimpleObjects> {}
 
     public static class CreateActionDomainEvent extends ActionDomainEvent {}
     @Action(semantics = SemanticsOf.NON_IDEMPOTENT, domainEvent = CreateActionDomainEvent.class)
-    @ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL)
+    @ActionLayout(promptStyle = PromptStyle.DIALOG_SIDEBAR)
     public SimpleObject create(
-            @Name final String name
-            ) {
-        return repositoryService.persist(SimpleObject.ofName(name));
+            @Name final String name) {
+        return repositoryService.persist(SimpleObject.withName(name));
     }
 
     public static class FindByNameActionDomainEvent extends ActionDomainEvent {}
diff --git a/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java b/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java
index 8635012..c517334 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java
@@ -4,8 +4,8 @@ import javax.inject.Inject;
 
 import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptWithResult;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
-import domainapp.modules.simple.dom.impl.SimpleObjects;
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
diff --git a/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java b/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
index 30501e8..36e0c71 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java
@@ -3,10 +3,10 @@ package domainapp.modules.simple.fixture;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.testing.fixtures.applib.api.PersonaWithBuilderScript;
 import org.apache.isis.testing.fixtures.applib.api.PersonaWithFinder;
-import org.apache.isis.testing.fixtures.applib.legacy.setup.PersonaEnumPersistAll;
+import org.apache.isis.testing.fixtures.applib.setup.PersonaEnumPersistAll;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
-import domainapp.modules.simple.dom.impl.SimpleObjects;
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
 import lombok.AllArgsConstructor;
 
 @AllArgsConstructor
diff --git a/module-simple/src/main/java/domainapp/modules/simple/dom/types/Name.java b/module-simple/src/main/java/domainapp/modules/simple/types/Name.java
similarity index 89%
rename from module-simple/src/main/java/domainapp/modules/simple/dom/types/Name.java
rename to module-simple/src/main/java/domainapp/modules/simple/types/Name.java
index ebf9531..eb5b67d 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/dom/types/Name.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/types/Name.java
@@ -1,4 +1,4 @@
-package domainapp.modules.simple.dom.types;
+package domainapp.modules.simple.types;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -15,7 +15,7 @@ import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.spec.AbstractSpecification2;
 
 @Column(length = Name.MAX_LEN, allowsNull = "false")
-@Property(editing = Editing.DISABLED, mustSatisfy = Name.NoExclamationMarks.class, maxLength = Name.MAX_LEN)
+@Property(mustSatisfy = Name.NoExclamationMarks.class, maxLength = Name.MAX_LEN)
 @Parameter(mustSatisfy = Name.NoExclamationMarks.class, maxLength = Name.MAX_LEN)
 @ParameterLayout(named = "Name")
 @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
diff --git a/module-simple/src/main/java/domainapp/modules/simple/dom/types/Notes.java b/module-simple/src/main/java/domainapp/modules/simple/types/Notes.java
similarity index 94%
rename from module-simple/src/main/java/domainapp/modules/simple/dom/types/Notes.java
rename to module-simple/src/main/java/domainapp/modules/simple/types/Notes.java
index bb35237..1845679 100644
--- a/module-simple/src/main/java/domainapp/modules/simple/dom/types/Notes.java
+++ b/module-simple/src/main/java/domainapp/modules/simple/types/Notes.java
@@ -1,4 +1,4 @@
-package domainapp.modules.simple.dom.types;
+package domainapp.modules.simple.types;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/module-simple/src/test/java/domainapp/modules/simple/dom/impl/SimpleObject_Test.java b/module-simple/src/test/java/domainapp/modules/simple/dom/impl/SimpleObject_Test.java
deleted file mode 100644
index ab6be96..0000000
--- a/module-simple/src/test/java/domainapp/modules/simple/dom/impl/SimpleObject_Test.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package domainapp.modules.simple.dom.impl;
-
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class SimpleObject_Test {
-
-    SimpleObject simpleObject;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        simpleObject = SimpleObject.ofName("Foobar");
-    }
-
-    public static class Name extends SimpleObject_Test {
-
-        @Test
-        public void happyCase() throws Exception {
-            // given
-            assertThat(simpleObject.getName()).isEqualTo("Foobar");
-
-            // when
-            String name = "Foobar - updated";
-            simpleObject.setName(name);
-
-            // then
-            assertThat(simpleObject.getName()).isEqualTo(name);
-        }
-    }
-
-}
diff --git a/module-simple/src/test/java/domainapp/modules/simple/dom/impl/SimpleObjects_Test.java b/module-simple/src/test/java/domainapp/modules/simple/dom/impl/SimpleObjects_Test.java
deleted file mode 100644
index ede59c4..0000000
--- a/module-simple/src/test/java/domainapp/modules/simple/dom/impl/SimpleObjects_Test.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package domainapp.modules.simple.dom.impl;
-
-import java.util.List;
-
-import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.unittestsupport.jmocking.JMockActions;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class SimpleObjects_Test {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    @Mock
-    RepositoryService mockRepositoryService;
-    @Mock
-    IsisJdoSupport_v3_2 mockIsisJdoSupport_v3_2;
-
-    SimpleObjects simpleObjects;
-
-    @Before
-    public void setUp() {
-        simpleObjects = new SimpleObjects(mockRepositoryService, mockIsisJdoSupport_v3_2);
-    }
-
-    public static class Create extends SimpleObjects_Test {
-
-        @Test
-        public void happyCase() {
-
-            final String someName = "Foobar";
-
-            // given
-            context.checking(new Expectations() {
-                {
-                    oneOf(mockRepositoryService).persist(with(nameOf(someName)));
-                    will(JMockActions.returnArgument(0));
-                }
-
-            });
-
-            // when
-            final SimpleObject obj = simpleObjects.create(someName);
-
-            // then
-            assertThat(obj).isNotNull();
-            assertThat(obj.getName()).isEqualTo(someName);
-        }
-
-        private static Matcher<SimpleObject> nameOf(final String name) {
-            return new TypeSafeMatcher<SimpleObject>() {
-                @Override
-                protected boolean matchesSafely(final SimpleObject item) {
-                    return name.equals(item.getName());
-                }
-
-                @Override
-                public void describeTo(final Description description) {
-                    description.appendText("has name of '" + name + "'");
-                }
-            };
-        }
-    }
-
-    public static class ListAll extends SimpleObjects_Test {
-
-        @Test
-        public void happyCase() {
-
-            // given
-            final List<SimpleObject> all = _Lists.newArrayList();
-
-            context.checking(new Expectations() {
-                {
-                    oneOf(mockRepositoryService).allInstances(SimpleObject.class);
-                    will(returnValue(all));
-                }
-            });
-
-            // when
-            final List<SimpleObject> list = simpleObjects.listAll();
-
-            // then
-            assertThat(list).isEqualTo(all);
-        }
-    }
-}
diff --git a/module-simple/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java b/module-simple/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java
new file mode 100644
index 0000000..922b077
--- /dev/null
+++ b/module-simple/src/test/java/domainapp/modules/simple/dom/so/SimpleObject_Test.java
@@ -0,0 +1,71 @@
+package domainapp.modules.simple.dom.so;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.isis.applib.services.message.MessageService;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+
+@ExtendWith(MockitoExtension.class)
+class SimpleObject_Test {
+
+    @Mock TitleService mockTitleService;
+    @Mock MessageService mockMessageService;
+    @Mock RepositoryService mockRepositoryService;
+
+    SimpleObject object;
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        object = SimpleObject.withName("Foo");
+        object.titleService = mockTitleService;
+        object.messageService = mockMessageService;
+        object.repositoryService = mockRepositoryService;
+    }
+
+    @Nested
+    public class updateName {
+
+        @Test
+        void happy_case() {
+            // given
+            assertThat(object.getName()).isEqualTo("Foo");
+
+            // when
+            object.updateName("Bar");
+
+            // then
+            assertThat(object.getName()).isEqualTo("Bar");
+        }
+
+    }
+    @Nested
+    class delete {
+
+        @Test
+        void happy_case() throws Exception {
+
+            // given
+            assertThat(object).isNotNull();
+
+            // expecting
+            when(mockTitleService.titleOf(object)).thenReturn("Foo");
+
+            // when
+            object.delete();
+
+            // then
+            verify(mockMessageService).informUser("'Foo' deleted");
+            verify(mockRepositoryService).removeAndFlush(object);
+        }
+    }
+}
\ No newline at end of file
diff --git a/module-simple/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java b/module-simple/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java
new file mode 100644
index 0000000..579804d
--- /dev/null
+++ b/module-simple/src/test/java/domainapp/modules/simple/dom/so/SimpleObjects_Test.java
@@ -0,0 +1,81 @@
+package domainapp.modules.simple.dom.so;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.stubbing.Answer;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.core.commons.internal.collections._Lists;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class SimpleObjects_Test {
+
+    @Mock RepositoryService mockRepositoryService;
+    @Mock IsisJdoSupport_v3_2 mockIsisJdoSupport_v3_2;
+
+    SimpleObjects objects;
+
+    @BeforeEach
+    public void setUp() {
+        objects = new SimpleObjects(mockRepositoryService, mockIsisJdoSupport_v3_2);
+    }
+
+    @Nested
+    class create {
+
+        @Test
+        void happyCase() {
+
+            // given
+            final String someName = "Foobar";
+
+            // expect
+            when(mockRepositoryService.persist(
+                    argThat((ArgumentMatcher<SimpleObject>) simpleObject -> Objects.equals(simpleObject.getName(), someName)))
+            ).then((Answer<SimpleObject>) invocation -> invocation.getArgument(0));
+
+            // when
+            final SimpleObject obj = objects.create(someName);
+
+            // then
+            assertThat(obj).isNotNull();
+            assertThat(obj.getName()).isEqualTo(someName);
+        }
+    }
+
+    @Nested
+    class ListAll {
+
+        @Test
+        void happyCase() {
+
+            // given
+            final List<SimpleObject> all = new ArrayList<>();
+
+            // expecting
+            when(mockRepositoryService.allInstances(SimpleObject.class))
+                .thenReturn(all);
+
+            // when
+            final List<SimpleObject> list = objects.listAll();
+
+            // then
+            assertThat(list).isEqualTo(all);
+        }
+    }
+}
diff --git a/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java b/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
index 131ac3b..6e038f8 100644
--- a/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
+++ b/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
@@ -33,12 +33,8 @@ public abstract class SimpleModuleIntegTestAbstract extends IsisIntegrationTestA
         IsisModuleJdoDataNucleus5.class,
         IsisModuleTestingFixturesApplib.class,
 
-        IsisIntegrationTestAbstract.CommandSupport.class,
-
         SimpleModule.class
     })
     public static class AppManifest {
     }
-
 }
-
diff --git a/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java b/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
index cc50598..40544da 100644
--- a/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
+++ b/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java
@@ -1,13 +1,18 @@
 package domainapp.modules.simple.integtests.tests;
 
 import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.springframework.context.event.EventListener;
 import org.springframework.transaction.annotation.Transactional;
 
+import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.wrapper.DisabledException;
 import org.apache.isis.applib.services.wrapper.InvalidException;
@@ -19,7 +24,9 @@ import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
+import lombok.Getter;
+
+import domainapp.modules.simple.dom.so.SimpleObject;
 import domainapp.modules.simple.fixture.SimpleObject_persona;
 import domainapp.modules.simple.integtests.SimpleModuleIntegTestAbstract;
 
@@ -34,7 +41,7 @@ public class SimpleObject_IntegTest extends SimpleModuleIntegTestAbstract {
         simpleObject = fixtureScripts.runPersona(SimpleObject_persona.FOO);
     }
 
-    public static class Name extends SimpleObject_IntegTest {
+    public static class name extends SimpleObject_IntegTest {
 
         @Test
         public void accessible() {
@@ -53,23 +60,42 @@ public class SimpleObject_IntegTest extends SimpleModuleIntegTestAbstract {
 
                 // when
                 wrap(simpleObject).setName("new name");
-
             });
         }
 
     }
 
-    public static class UpdateName extends SimpleObject_IntegTest {
+    public static class updateName extends SimpleObject_IntegTest {
+
+        @DomainService
+        public static class UpdateNameListener {
+
+            @Getter
+            List<SimpleObject.UpdateNameActionDomainEvent> events = new ArrayList<>();
+
+            @EventListener(SimpleObject.UpdateNameActionDomainEvent.class)
+            public void on(SimpleObject.UpdateNameActionDomainEvent ev) {
+                events.add(ev);
+            }
+        }
+
+        @Inject
+        UpdateNameListener updateNameListener;
+
 
         @Test
         public void can_be_updated_directly() {
 
+            // given
+            updateNameListener.getEvents().clear();
+
             // when
             wrap(simpleObject).updateName("new name");
             transactionService.flushTransaction();
 
             // then
             assertThat(wrap(simpleObject).getName()).isEqualTo("new name");
+            assertThat(updateNameListener.getEvents()).hasSize(5);
         }
 
         @Test
@@ -80,36 +106,14 @@ public class SimpleObject_IntegTest extends SimpleModuleIntegTestAbstract {
 
                 // when
                 wrap(simpleObject).updateName("new name!");
-
             });
 
-            // also expect
-            assertThat(cause.getMessage(), containsString("Exclamation mark is not allowed."));
-
-        }
-    }
-
-
-    public static class Title extends SimpleObject_IntegTest {
-
-        @Inject
-        TitleService titleService;
-
-        @Test
-        public void interpolatesName() {
-
-            // given
-            final String name = wrap(simpleObject).getName();
-
-            // when
-            final String title = titleService.titleOf(simpleObject);
-
             // then
-            assertThat(title).isEqualTo("Object: " + name);
+            assertThat(cause.getMessage(), containsString("Exclamation mark is not allowed."));
         }
     }
 
-    public static class DataNucleusId extends SimpleObject_IntegTest {
+    public static class dataNucleusId extends SimpleObject_IntegTest {
 
         @Test
         public void should_be_populated() {
@@ -121,15 +125,4 @@ public class SimpleObject_IntegTest extends SimpleModuleIntegTestAbstract {
         }
     }
 
-    public static class DataNucleusVersionTimestamp extends SimpleObject_IntegTest {
-
-        @Test
-        public void should_be_populated() {
-            // when
-            final Timestamp timestamp = mixin(Persistable_datanucleusVersionTimestamp.class, simpleObject).prop();
-            // then
-            assertThat(timestamp).isNotNull();
-        }
-    }
-
 }
\ No newline at end of file
diff --git a/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java b/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
index 94a8a5a..dcd2302 100644
--- a/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
+++ b/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
@@ -1,6 +1,5 @@
 package domainapp.modules.simple.integtests.tests;
 
-import java.sql.SQLIntegrityConstraintViolationException;
 import java.util.List;
 
 import javax.inject.Inject;
@@ -15,8 +14,8 @@ import org.apache.isis.testing.integtestsupport.applib.ThrowableMatchers;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
-import domainapp.modules.simple.dom.impl.SimpleObjects;
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
 import domainapp.modules.simple.fixture.SimpleObject_persona;
 import domainapp.modules.simple.integtests.SimpleModuleIntegTestAbstract;
 
@@ -26,7 +25,7 @@ public class SimpleObjects_IntegTest extends SimpleModuleIntegTestAbstract {
     @Inject
     SimpleObjects menu;
 
-    public static class ListAll extends SimpleObjects_IntegTest {
+    public static class listAll extends SimpleObjects_IntegTest {
 
         @Test
         public void happyCase() {
@@ -53,7 +52,7 @@ public class SimpleObjects_IntegTest extends SimpleModuleIntegTestAbstract {
         }
     }
 
-    public static class Create extends SimpleObjects_IntegTest {
+    public static class create extends SimpleObjects_IntegTest {
 
         @Test
         public void happyCase() {
diff --git a/pom.xml b/pom.xml
index 613fe3f..5a25097 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.isis.app</groupId>
         <artifactId>isis-app-starter-parent</artifactId>
-        <version>2.0.0-M2.20200120-1800-910c8085</version>
+        <version>2.0.0-M2.20200131-1559-7516c085</version>
 <!--
         <version>2.0.0-M3-SNAPSHOT</version>
 -->
diff --git a/webapp/pom.xml b/webapp/pom.xml
index bfa08f9..fecb82d 100644
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -11,7 +11,7 @@
     <artifactId>simpleapp-webapp</artifactId>
     <name>Apache Isis App - SimpleApp Webapp</name>
 
-    <description>Assembles and runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the datanucleus object store.</description>
+    <description>Assembles and runs both the Wicket viewer and the Restfulobjects viewer in a single webapp configured to run using the JDO/DataNucleus object store.</description>
 
     <packaging>jar</packaging>
 
@@ -43,6 +43,9 @@
             <testResource>
                 <filtering>false</filtering>
                 <directory>src/test/java</directory>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
             </testResource>
         </testResources>
         <plugins>
@@ -123,14 +126,15 @@
         <!-- TESTING -->
         <dependency>
             <groupId>org.apache.isis.mavendeps</groupId>
-            <artifactId>isis-mavendeps-testing</artifactId>
+            <artifactId>isis-mavendeps-integtests</artifactId>
             <type>pom</type>
             <scope>test</scope>
         </dependency>
 
         <dependency>
-            <groupId>org.apache.isis.testing</groupId>
-            <artifactId>isis-testing-specsupport-applib</artifactId>
+            <groupId>org.apache.isis.mavendeps</groupId>
+            <artifactId>isis-mavendeps-integspecs</artifactId>
+            <type>pom</type>
             <scope>test</scope>
         </dependency>
 
@@ -177,53 +181,6 @@
         </profile>
 
         <profile>
-            <id>docker</id>
-            <activation>
-                <property>
-                    <name>docker</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>com.google.cloud.tools</groupId>
-                        <artifactId>jib-maven-plugin</artifactId>
-                        <configuration>
-                            <from>
-                                <image>openjdk:8-alpine</image>
-                            </from>
-                            <container>
-                                <jvmFlags>
-                                    <jvmFlag>-Xmx512m</jvmFlag>
-                                </jvmFlags>
-                                <mainClass>domainapp.webapp.SimpleApp</mainClass>
-                                <ports>
-                                    <port>8080</port>
-                                </ports>
-                                <workingDirectory>/run/secrets</workingDirectory>
-                            </container>
-                            <to>
-                                <image>docker.io/apacheisis/simpleapp:latest</image>
-                                <auth>
-                                    <username>${env.DOCKER_REGISTRY_USERNAME}</username>
-                                    <password>${env.DOCKER_REGISTRY_PASSWORD}</password>
-                                </auth>
-                            </to>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>build</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
-        <profile>
             <id>jdbc-sqlserver</id>
             <activation>
                 <property>
diff --git a/webapp/src/main/java/domainapp/webapp/AppManifest.java b/webapp/src/main/java/domainapp/webapp/AppManifest.java
new file mode 100644
index 0000000..43bf0d4
--- /dev/null
+++ b/webapp/src/main/java/domainapp/webapp/AppManifest.java
@@ -0,0 +1,43 @@
+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.core.config.presets.IsisPresets;
+import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
+import org.apache.isis.extensions.flyway.impl.IsisModuleExtFlywayImpl;
+import org.apache.isis.persistence.jdo.datanucleus5.IsisModuleJdoDataNucleus5;
+import org.apache.isis.security.shiro.IsisModuleSecurityShiro;
+import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
+import org.apache.isis.testing.h2console.ui.IsisModuleTestingH2ConsoleUi;
+import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4;
+import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
+
+import domainapp.webapp.application.ApplicationModule;
+import domainapp.webapp.application.fixture.scenarios.DomainAppDemo;
+
+@Configuration
+@Import({
+        IsisModuleCoreRuntimeServices.class,
+        IsisModuleSecurityShiro.class,
+        IsisModuleJdoDataNucleus5.class,
+        IsisModuleViewerRestfulObjectsJaxrsResteasy4.class,
+        IsisModuleViewerWicketViewer.class,
+
+        IsisModuleTestingFixturesApplib.class,
+        IsisModuleTestingH2ConsoleUi.class,
+
+        IsisModuleExtFlywayImpl.class,
+
+        ApplicationModule.class,
+
+        // discoverable fixtures
+        DomainAppDemo.class
+})
+@PropertySources({
+        @PropertySource(IsisPresets.DebugDiscovery),
+})
+public class AppManifest {
+}
diff --git a/webapp/src/main/java/domainapp/webapp/SimpleApp.java b/webapp/src/main/java/domainapp/webapp/SimpleApp.java
index 39c1e56..dcce3c6 100644
--- a/webapp/src/main/java/domainapp/webapp/SimpleApp.java
+++ b/webapp/src/main/java/domainapp/webapp/SimpleApp.java
@@ -3,56 +3,16 @@ package domainapp.webapp;
 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.springframework.context.annotation.PropertySource;
-import org.springframework.context.annotation.PropertySources;
 
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
-import org.apache.isis.extensions.flyway.impl.IsisModuleExtFlywayImpl;
-import org.apache.isis.persistence.jdo.datanucleus5.IsisModuleJdoDataNucleus5;
-import org.apache.isis.security.shiro.IsisModuleSecurityShiro;
-import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
-import org.apache.isis.testing.h2console.ui.IsisModuleTestingH2ConsoleUi;
-import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4;
-import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
-
-import domainapp.webapp.application.ApplicationModule;
-import domainapp.webapp.application.fixture.scenarios.DomainAppDemo;
 
 @SpringBootApplication
 @Import({
-    SimpleApp.AppManifest.class,
+    AppManifest.class,
 })
 public class SimpleApp extends SpringBootServletInitializer {
 
-    @Configuration
-    @PropertySources({
-            @PropertySource(IsisPresets.NoTranslations),
-            @PropertySource(IsisPresets.DataNucleusAutoCreate),
-            @PropertySource(IsisPresets.DebugDiscovery),
-    })
-    @Import({
-            IsisModuleCoreRuntimeServices.class,
-            IsisModuleSecurityShiro.class,
-            IsisModuleJdoDataNucleus5.class,
-            IsisModuleViewerRestfulObjectsJaxrsResteasy4.class,
-            IsisModuleViewerWicketViewer.class,
-
-            IsisModuleTestingFixturesApplib.class,
-            IsisModuleTestingH2ConsoleUi.class,
-
-            IsisModuleExtFlywayImpl.class,
-
-            ApplicationModule.class,
-
-            // discoverable fixtures
-            DomainAppDemo.class
-    })
-    public static class AppManifest {
-    }
-
     /**
      * @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(...)}
diff --git a/webapp/src/main/java/domainapp/webapp/application/ApplicationModule.java b/webapp/src/main/java/domainapp/webapp/application/ApplicationModule.java
index b0211ad..ec319e8 100644
--- a/webapp/src/main/java/domainapp/webapp/application/ApplicationModule.java
+++ b/webapp/src/main/java/domainapp/webapp/application/ApplicationModule.java
@@ -1,12 +1,18 @@
 package domainapp.webapp.application;
 
+import java.lang.annotation.Documented;
+
 import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 import domainapp.modules.simple.SimpleModule;
 
-@org.apache.isis.applib.annotation.Module
+@Configuration
 @Import(SimpleModule.class)
-public class ApplicationModule implements ModuleWithFixtures {
+@ComponentScan
+public class ApplicationModule {
 
 }
diff --git a/webapp/src/main/java/domainapp/webapp/application/fixture/scenarios/DomainAppDemo.java b/webapp/src/main/java/domainapp/webapp/application/fixture/scenarios/DomainAppDemo.java
index 70336f5..e0445b2 100644
--- a/webapp/src/main/java/domainapp/webapp/application/fixture/scenarios/DomainAppDemo.java
+++ b/webapp/src/main/java/domainapp/webapp/application/fixture/scenarios/DomainAppDemo.java
@@ -1,21 +1,20 @@
 package domainapp.webapp.application.fixture.scenarios;
 
+import javax.inject.Inject;
+
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
-import org.apache.isis.testing.fixtures.applib.legacy.teardown.TeardownFixtureAbstract2;
+import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixturesService;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
 import domainapp.modules.simple.fixture.SimpleObject_persona;
 
 public class DomainAppDemo extends FixtureScript {
 
+    @Inject
+    ModuleWithFixturesService moduleWithFixturesService;
+
     @Override
     protected void execute(final ExecutionContext ec) {
-        ec.executeChild(this, new TeardownFixtureAbstract2() {
-            @Override
-            protected void execute(final ExecutionContext executionContext) {
-                deleteFrom(SimpleObject.class);
-            }
-        });
+        ec.executeChildren(this, moduleWithFixturesService.getTeardownFixture());
         ec.executeChild(this, new SimpleObject_persona.PersistAll());
     }
 
diff --git a/webapp/src/main/java/domainapp/webapp/application/services/health/HealthCheckServiceImpl.java b/webapp/src/main/java/domainapp/webapp/application/services/health/HealthCheckServiceImpl.java
index feaede6..9f75c0f 100644
--- a/webapp/src/main/java/domainapp/webapp/application/services/health/HealthCheckServiceImpl.java
+++ b/webapp/src/main/java/domainapp/webapp/application/services/health/HealthCheckServiceImpl.java
@@ -7,8 +7,8 @@ import org.apache.isis.applib.services.health.Health;
 import org.apache.isis.applib.services.health.HealthCheckService;
 import org.springframework.stereotype.Service;
 
-import domainapp.modules.simple.dom.impl.SimpleObjects;
-import domainapp.modules.simple.dom.types.Name;
+import domainapp.modules.simple.dom.so.SimpleObjects;
+
 import lombok.extern.log4j.Log4j2;
 
 @Service
diff --git a/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageService.java b/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageService.java
deleted file mode 100644
index fadf3e0..0000000
--- a/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package domainapp.webapp.application.services.homepage;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.HomePage;
-import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.factory.FactoryService;
-
-@Service
-@Named("domainapp.HomePageService")
-public class HomePageService {
-
-    private final FactoryService factoryService;
-
-    @Inject
-    public HomePageService(final FactoryService factoryService) {
-        this.factoryService = factoryService;
-    }
-
-    @Action(semantics = SemanticsOf.SAFE)
-    @HomePage
-    public HomePageViewModel homePage() {
-        return factoryService.instantiate(HomePageViewModel.class);
-    }
-
-}
diff --git a/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.java b/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.java
index db8cfd3..570d3dd 100644
--- a/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.java
+++ b/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.java
@@ -5,16 +5,18 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.HomePage;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 
-import domainapp.modules.simple.dom.impl.SimpleObject;
-import domainapp.modules.simple.dom.impl.SimpleObjects;
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
 
 @DomainObject(
         nature = Nature.VIEW_MODEL,
         objectType = "domainapp.HomePageViewModel"
         )
+@HomePage
 public class HomePageViewModel {
 
     public TranslatableString title() {
diff --git a/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.layout.xml b/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.layout.xml
index 37b0af8..fb55faa 100644
--- a/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.layout.xml
+++ b/webapp/src/main/java/domainapp/webapp/application/services/homepage/HomePageViewModel.layout.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <bs3:grid xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" xmlns="http://isis.apache.org/applib/layout/component" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <bs3:row>
-        <bs3:col span="2">
-            <bs3:sizeSpan size="LG" span="2" offset="true"/>
+        <bs3:col span="3">
             <bs3:row>
                 <bs3:col span="12" unreferencedActions="true">
                     <domainObject/>
@@ -14,13 +13,15 @@
                 </bs3:col>
             </bs3:row>
         </bs3:col>
-        <bs3:col span="4" unreferencedCollections="true">
+        <bs3:col span="6" unreferencedCollections="true">
             <bs3:row>
                 <bs3:col span="12">
                     <collection id="objects" defaultView="table"/>
                 </bs3:col>
             </bs3:row>
         </bs3:col>
+        <bs3:col span="3">
+        </bs3:col>
     </bs3:row>
     <bs3:row>
 
diff --git a/webapp/src/main/resources/application.yml b/webapp/src/main/resources/application.yml
index 65ba537..f7f1c9c 100644
--- a/webapp/src/main/resources/application.yml
+++ b/webapp/src/main/resources/application.yml
@@ -5,7 +5,6 @@
 #
 isis:
 
-
   applib:
     annotation:
       action:
@@ -19,7 +18,6 @@ isis:
             discard.*:btn-warning,
             remove.*:btn-warning
       domain-object:
-        editing: false
         auditing: all
         publishing: all
       property:
@@ -35,34 +33,37 @@ isis:
         no-params-only: true
         explicit-object-type: true
 
+    runtime-services:
+      translation:
+        po:
+          mode: disabled
+
   viewer:
     wicket:
       application:
-        menubars-layout-xml: domainapp/webapp/application/layout/menubars.layout.xml
-        brand-logo-header: /images/apache-isis/logo-48x48.png
-        favicon-url: /images/favicon.png
-        name: Simple App
+        about: Simple App
+        brand-logo-header: images/apache-isis/logo-48x48.png
         css: css/application.css
+        favicon-url: images/favicon.png
         js: scripts/application.js
-        about: Simple App
+        name: Simple App
+        menubars-layout-xml: menubars.layout.xml
 
       credit:
         - url:  http://isis.apache.org
-          image: /images/apache-isis/logo-48x48.png
+          image: images/apache-isis/logo-48x48.png
           name: Apache Isis
 
       themes:
-        initial: Flatly
-        showChooser: true
-        enabled: bootstrap-theme, Cerulean, Cosmo, Cyborg, Darkly, Flatly, Journal, Lumen, Paper, Readable, Sandstone, Simplex, Slate, Spacelab, Superhero, United, Yeti
+        show-chooser: true
 
       max-title-length-in-standalone-tables: 0
       max-title-length-in-parented-tables: 0
 
-      development-utilities:
-        enable: true
       bookmarked-pages:
-        show-chooser: false
+        show-chooser: true
+        show-drop-down-on-footer: true
+
 
   persistence:
     jdo-datanucleus:
diff --git a/webapp/src/main/resources/config/application-SQLSERVER.properties b/webapp/src/main/resources/config/application-SQLSERVER.properties
index 4747259..d9a71f6 100644
--- a/webapp/src/main/resources/config/application-SQLSERVER.properties
+++ b/webapp/src/main/resources/config/application-SQLSERVER.properties
@@ -23,9 +23,11 @@ isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionDriverName = co
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName = simpleapp
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword = simpleapp
 
+isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateAll=false
+
+spring.flyway.enabled=true
+
 spring.flyway.url=${isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionURL}
 spring.flyway.user=${isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName}
 spring.flyway.password=${isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword}
 
-spring.flyway.enabled=true
-isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateAll=false
diff --git a/webapp/src/main/resources/config/application.properties b/webapp/src/main/resources/config/application.properties
index 8e3d195..43689aa 100644
--- a/webapp/src/main/resources/config/application.properties
+++ b/webapp/src/main/resources/config/application.properties
@@ -16,5 +16,5 @@ isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionDriverName = or
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName = sa
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword =
 
+isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateAll=true
 spring.flyway.enabled=false
-isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateAll=true
\ No newline at end of file
diff --git a/webapp/src/main/resources/log4j2-spring.xml b/webapp/src/main/resources/log4j2-spring.xml
index 44bb55c..62d6ae5 100644
--- a/webapp/src/main/resources/log4j2-spring.xml
+++ b/webapp/src/main/resources/log4j2-spring.xml
@@ -35,6 +35,8 @@
         <logger name="DataNucleus.Datastore.Schema" level="info"/>
         <logger name="DataNucleus.Datastore.Native" level="info"/>
 
+        <logger name="org.apache.isis.applib.services.publish.PublisherServiceLogging" level="debug"/>
+
         <Root level="info">
             <AppenderRef ref="Console" />
         </Root>
diff --git a/webapp/src/main/java/domainapp/webapp/application/layout/menubars.layout.xml b/webapp/src/main/resources/menubars.layout.xml
similarity index 100%
rename from webapp/src/main/java/domainapp/webapp/application/layout/menubars.layout.xml
rename to webapp/src/main/resources/menubars.layout.xml
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/RunIntegBddSpecs.java b/webapp/src/test/java/domainapp/webapp/bdd/RunIntegBddSpecs.java
index 7c2f316..f61b05d 100644
--- a/webapp/src/test/java/domainapp/webapp/bdd/RunIntegBddSpecs.java
+++ b/webapp/src/test/java/domainapp/webapp/bdd/RunIntegBddSpecs.java
@@ -1,10 +1,9 @@
 package domainapp.webapp.bdd;
 
-import io.cucumber.junit.Cucumber;
-import io.cucumber.junit.CucumberOptions;
-
 import org.junit.runner.RunWith;
 
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
 
 /**
  * Runs scenarios in all <tt>.feature</tt> files (this package and any subpackages). 
@@ -18,8 +17,10 @@ import org.junit.runner.RunWith;
         strict = true,
         tags = { "not @backlog", "not @ignore" },
         glue = {
+        },
+        features = {
         }
-        )
+)
 public class RunIntegBddSpecs {
     // intentionally empty 
 }
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/fixtures/DomainAppDemoStepDef.java b/webapp/src/test/java/domainapp/webapp/bdd/fixtures/DomainAppDemoStepDef.java
new file mode 100644
index 0000000..b66da87
--- /dev/null
+++ b/webapp/src/test/java/domainapp/webapp/bdd/fixtures/DomainAppDemoStepDef.java
@@ -0,0 +1,37 @@
+package domainapp.webapp.bdd.fixtures;
+
+import java.util.List;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
+
+import lombok.val;
+
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
+import domainapp.webapp.application.fixture.scenarios.DomainAppDemo;
+import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.When;
+
+public class DomainAppDemoStepDef {
+
+    @Inject private FixtureScripts fixtureScripts;
+
+    @Before(value="@DomainAppDemo", order= OrderPrecedence.MIDPOINT)
+    public void runDomainAppDemo() {
+        fixtureScripts.runFixtureScript(new DomainAppDemo(), null); // <1>
+    }
+
+}
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/glue/SimpleObjectsStepDef.java b/webapp/src/test/java/domainapp/webapp/bdd/glue/SimpleObjectsStepDef.java
deleted file mode 100644
index 733a89b..0000000
--- a/webapp/src/test/java/domainapp/webapp/bdd/glue/SimpleObjectsStepDef.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package domainapp.webapp.bdd.glue;
-
-import domainapp.modules.simple.dom.impl.SimpleObject;
-import domainapp.modules.simple.dom.impl.SimpleObjects;
-import domainapp.modules.simple.fixture.SimpleObject_persona;
-import domainapp.webapp.application.fixture.scenarios.DomainAppDemo;
-import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
-import io.cucumber.java.After;
-import io.cucumber.java.Before;
-import io.cucumber.java.en.Given;
-import io.cucumber.java.en.When;
-import lombok.val;
-
-import java.util.List;
-import java.util.UUID;
-
-import javax.inject.Inject;
-
-import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.support.TransactionTemplate;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectsStepDef extends ApplicationIntegTestAbstract {
-
-    @Given("^there are.* (\\d+) simple objects$")
-    public void there_are_N_simple_objects(int n) throws Throwable {
-        final List<SimpleObject> list = wrap(simpleObjects).listAll();
-        assertThat(list.size(), is(n));
-    }
-
-    @When("^.*create a .*simple object$")
-    public void create_a_simple_object() throws Throwable {
-        wrap(simpleObjects).create(UUID.randomUUID().toString());
-    }
-
-    // -- TRANSACTION ASPECT
-
-    private Runnable afterScenario;
-
-    @Before //TODO is there another way to make scenarios transactional?
-    public void beforeScenario(){
-        val txTemplate = new TransactionTemplate(txMan);
-        val status = txTemplate.getTransactionManager().getTransaction(null);
-        afterScenario = () -> {
-            txTemplate.getTransactionManager().rollback(status);
-        };
-
-        fixtureScripts.runPersonas(
-                SimpleObject_persona.BANG,
-                SimpleObject_persona.BAR,
-                SimpleObject_persona.BAZ);
-
-        status.flush();
-    } 
-
-    @After
-    public void afterScenario(){
-        if(afterScenario==null) {
-            return;
-        }
-        afterScenario.run();
-        afterScenario = null;
-    }
-
-
-    // -- DEPENDENCIES
-
-    @Inject protected SimpleObjects simpleObjects;
-    @Inject private FixtureScripts fixtureScripts;
-    //@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
-    @Inject private PlatformTransactionManager txMan;
-
-    @Before(value="@DomainAppDemo", order=20000)
-    public void runDomainAppDemo() {
-        fixtureScripts.runFixtureScript(new DomainAppDemo(), null); // <1>
-    }
-
-}
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/infrastructure/BootstrapStepDef.java b/webapp/src/test/java/domainapp/webapp/bdd/infrastructure/BootstrapStepDef.java
new file mode 100644
index 0000000..b69042a
--- /dev/null
+++ b/webapp/src/test/java/domainapp/webapp/bdd/infrastructure/BootstrapStepDef.java
@@ -0,0 +1,23 @@
+package domainapp.webapp.bdd.infrastructure;
+
+import javax.inject.Inject;
+
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+
+import lombok.val;
+
+import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+
+public class BootstrapStepDef extends ApplicationIntegTestAbstract {
+
+    @Before(order= OrderPrecedence.FIRST)
+    public void bootstrap() {
+        // empty
+    }
+
+}
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/infrastructure/TransactionalStepDef.java b/webapp/src/test/java/domainapp/webapp/bdd/infrastructure/TransactionalStepDef.java
new file mode 100644
index 0000000..6c35809
--- /dev/null
+++ b/webapp/src/test/java/domainapp/webapp/bdd/infrastructure/TransactionalStepDef.java
@@ -0,0 +1,55 @@
+package domainapp.webapp.bdd.infrastructure;
+
+import java.util.List;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+
+import lombok.val;
+
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
+import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.When;
+
+/**
+ * equivalent to the Spring @Transactional attribute
+ */
+public class TransactionalStepDef {
+
+    private Runnable afterScenario;
+
+    @Before(order = OrderPrecedence.EARLY)
+    public void beforeScenario(){
+        val txTemplate = new TransactionTemplate(txMan);
+        val status = txTemplate.getTransactionManager().getTransaction(null);
+        afterScenario = () -> {
+            txTemplate.getTransactionManager().rollback(status);
+        };
+
+        status.flush();
+    } 
+
+    @After
+    public void afterScenario(){
+        if(afterScenario==null) {
+            return;
+        }
+        afterScenario.run();
+        afterScenario = null;
+    }
+
+    @Inject private PlatformTransactionManager txMan;
+
+}
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature b/webapp/src/test/java/domainapp/webapp/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature
index 0cbca41..ca807b4 100644
--- a/webapp/src/test/java/domainapp/webapp/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature
+++ b/webapp/src/test/java/domainapp/webapp/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature
@@ -1,8 +1,14 @@
 Feature: List and Create New Simple Objects
 
+  @DomainAppDemo
   Scenario: Existing simple objects can be listed and new ones created
-    Given there are initially 3 simple objects
+    Given there are initially 10 simple objects
     When  I create a new simple object
-    Then  there are 4 simple objects
+    Then  there are 11 simple objects
+
+  Scenario: When there are no objects at all
+    Given there are initially 0 simple objects
+    When  I create a new simple object
+    And   I create another new simple object
+    Then  there are 2 simple objects
 
-    
\ No newline at end of file
diff --git a/webapp/src/test/java/domainapp/webapp/bdd/stepdefs/SimpleObjectsStepDef.java b/webapp/src/test/java/domainapp/webapp/bdd/stepdefs/SimpleObjectsStepDef.java
new file mode 100644
index 0000000..ef3fac0
--- /dev/null
+++ b/webapp/src/test/java/domainapp/webapp/bdd/stepdefs/SimpleObjectsStepDef.java
@@ -0,0 +1,48 @@
+package domainapp.webapp.bdd.stepdefs;
+
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
+import domainapp.modules.simple.fixture.SimpleObject_persona;
+import domainapp.webapp.application.fixture.scenarios.DomainAppDemo;
+import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import lombok.val;
+
+import java.util.List;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectsStepDef {
+
+    @Given("^there (?:is|are).* (\\d+) simple object[s]?$")
+    public void there_are_N_simple_objects(int n) {
+        final List<SimpleObject> list = wrap(simpleObjects).listAll();
+        assertThat(list.size(), is(n));
+    }
+
+    @When("^.*create (?:a|another) .*simple object$")
+    public void create_a_simple_object() {
+        wrap(simpleObjects).create(UUID.randomUUID().toString());
+    }
+
+    <T> T wrap(T domainObject) {
+        return wrapperFactory.wrap(domainObject);
+    }
+
+    @Inject protected SimpleObjects simpleObjects;
+    @Inject protected WrapperFactory wrapperFactory;
+
+}
diff --git a/webapp/src/test/java/domainapp/webapp/integtests/ApplicationIntegTestAbstract.java b/webapp/src/test/java/domainapp/webapp/integtests/ApplicationIntegTestAbstract.java
index ab5b46e..0731500 100644
--- a/webapp/src/test/java/domainapp/webapp/integtests/ApplicationIntegTestAbstract.java
+++ b/webapp/src/test/java/domainapp/webapp/integtests/ApplicationIntegTestAbstract.java
@@ -28,11 +28,12 @@ public abstract class ApplicationIntegTestAbstract extends IsisIntegrationTestAb
 
     @Configuration
     @Import({
-            IsisModuleCoreRuntimeServices.class,
-            IsisModuleJdoDataNucleus5.class,
-            IsisModuleSecurityBypass.class,
-            IsisModuleTestingFixturesApplib.class,
-            ApplicationModule.class
+        IsisModuleCoreRuntimeServices.class,
+        IsisModuleJdoDataNucleus5.class,
+        IsisModuleSecurityBypass.class,
+        IsisModuleTestingFixturesApplib.class,
+
+        ApplicationModule.class
     })
     public static class AppManifest {
     }
diff --git a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/LockDownMetaModel_IntegTest.java b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/LockDownMetaModel_IntegTest.java
index f81da1f..f22ffeb 100644
--- a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/LockDownMetaModel_IntegTest.java
+++ b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/LockDownMetaModel_IntegTest.java
@@ -19,9 +19,9 @@ import org.apache.isis.schema.metamodel.v2.MetamodelDto;
 
 import static org.approvaltests.Approvals.getReporter;
 import static org.approvaltests.Approvals.verify;
+import static org.assertj.core.api.Assumptions.assumeThat;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assume.assumeThat;
 
 import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
 import domainapp.webapp.util.CurrentVsApprovedApprovalTextWriter;
@@ -33,7 +33,7 @@ class LockDownMetaModel_IntegTest extends ApplicationIntegTestAbstract {
 
     @BeforeEach
     public void setUp() throws Exception {
-        assumeThat(System.getProperty("metamodel.lockdown"), is(notNullValue()));
+        assumeThat(System.getProperty("metamodel.lockdown")).isNotNull();
     }
 
     @UseReporter(DiffReporter.class)
diff --git a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObject.xml b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObject.xml
index 97959f5..75575ed 100644
--- a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObject.xml
+++ b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObject.xml
@@ -366,7 +366,7 @@
                     <mml:attr name="value">40</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.objectvalue.mustsatisfyspec.MustSatisfySpecificationFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.MustSatisfySpecificationFacetForPropertyAnnotation">
-                    <mml:attr name="specifications">domainapp.modules.simple.dom.types.Name$NoExclamationMarks</mml:attr>
+                    <mml:attr name="specifications">domainapp.modules.simple.types.Name$NoExclamationMarks</mml:attr>
                     <mml:attr name="validating">true</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.typicallen.fromtype.TypicalLengthFacetOnPropertyDerivedFromType">
@@ -375,8 +375,9 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessor">
                     <mml:attr name="intent.getName">ACCESSOR</mml:attr>
-                    <mml:attr name="methods">public java.lang.String domainapp.modules.simple.dom.impl.SimpleObject.getName()</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="methods">public java.lang.String
+                        domainapp.modules.simple.dom.so.SimpleObject.getName()</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.defaults.fromtype.PropertyDefaultFacetDerivedFromDefaultedFacet">
                     <mml:attr name="typeFacet">org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetUsingDefaultsProvider</mml:attr>
@@ -397,7 +398,8 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacetViaSetterMethod">
                     <mml:attr name="intent.setName">MODIFY_PROPERTY</mml:attr>
-                    <mml:attr name="methods">public void domainapp.modules.simple.dom.impl.SimpleObject.setName(java.lang.String)</mml:attr>
+                    <mml:attr name="methods">public void
+                        domainapp.modules.simple.dom.so.SimpleObject.setName(java.lang.String)</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromDefault">
                     <mml:attr name="getterFacet">org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessor</mml:attr>
@@ -457,8 +459,9 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessor">
                     <mml:attr name="intent.getNotes">ACCESSOR</mml:attr>
-                    <mml:attr name="methods">public java.lang.String domainapp.modules.simple.dom.impl.SimpleObject.getNotes()</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="methods">public java.lang.String
+                        domainapp.modules.simple.dom.so.SimpleObject.getNotes()</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.defaults.fromtype.PropertyDefaultFacetDerivedFromDefaultedFacet">
                     <mml:attr name="typeFacet">org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetUsingDefaultsProvider</mml:attr>
@@ -479,7 +482,8 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacetViaSetterMethod">
                     <mml:attr name="intent.setNotes">MODIFY_PROPERTY</mml:attr>
-                    <mml:attr name="methods">public void domainapp.modules.simple.dom.impl.SimpleObject.setNotes(java.lang.String)</mml:attr>
+                    <mml:attr name="methods">public void
+                        domainapp.modules.simple.dom.so.SimpleObject.setNotes(java.lang.String)</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromDefault">
                     <mml:attr name="getterFacet">org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessor</mml:attr>
@@ -671,8 +675,8 @@
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault">
                     <mml:attr name="eventType">org.apache.isis.applib.events.domain.ActionDomainEvent.Default</mml:attr>
                     <mml:attr name="intent.delete">EXECUTE</mml:attr>
-                    <mml:attr name="methods">public void domainapp.modules.simple.dom.impl.SimpleObject.delete()</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="methods">public void domainapp.modules.simple.dom.so.SimpleObject.delete()</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                     <mml:attr name="returnType">void</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.command.CommandFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration">
@@ -1200,9 +1204,10 @@
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault">
                     <mml:attr name="eventType">org.apache.isis.applib.events.domain.ActionDomainEvent.Default</mml:attr>
                     <mml:attr name="intent.updateName">EXECUTE</mml:attr>
-                    <mml:attr name="methods">public domainapp.modules.simple.dom.impl.SimpleObject domainapp.modules.simple.dom.impl.SimpleObject.updateName(java.lang.String)</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
-                    <mml:attr name="returnType">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="methods">public domainapp.modules.simple.dom.so.SimpleObject
+                        domainapp.modules.simple.dom.so.SimpleObject.updateName(java.lang.String)</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
+                    <mml:attr name="returnType">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.command.CommandFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration">
                     <mml:attr name="disabled">false</mml:attr>
@@ -1242,7 +1247,7 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.property.publishing.PublishedPropertyFacetFromConfiguration"/>
             </mml:facets>
-            <mml:returnType>domainapp.modules.simple.dom.impl.SimpleObject</mml:returnType>
+            <mml:returnType>domainapp.modules.simple.dom.so.SimpleObject</mml:returnType>
             <mml:params>
                 <mml:param xsi:type="mml:scalarParam" id="name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                     <mml:facets>
@@ -1271,7 +1276,7 @@
                             <mml:attr name="value">40</mml:attr>
                         </mml:facet>
                         <mml:facet id="org.apache.isis.core.metamodel.facets.objectvalue.mustsatisfyspec.MustSatisfySpecificationFacet" fqcn="org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation">
-                            <mml:attr name="specifications">domainapp.modules.simple.dom.types.Name$NoExclamationMarks</mml:attr>
+                            <mml:attr name="specifications">domainapp.modules.simple.types.Name$NoExclamationMarks</mml:attr>
                             <mml:attr name="underlyingFacet">org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation</mml:attr>
                             <mml:attr name="validating">true</mml:attr>
                         </mml:facet>
@@ -1281,11 +1286,13 @@
                         </mml:facet>
                         <mml:facet id="org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet" fqcn="org.apache.isis.core.metamodel.facets.param.defaults.methodnum.ActionParameterDefaultsFacetViaMethod">
                             <mml:attr name="intent.default0UpdateName">DEFAULTS</mml:attr>
-                            <mml:attr name="methods">public java.lang.String domainapp.modules.simple.dom.impl.SimpleObject.default0UpdateName()</mml:attr>
+                            <mml:attr name="methods">public java.lang.String
+                                domainapp.modules.simple.dom.so.SimpleObject.default0UpdateName()</mml:attr>
                         </mml:facet>
                         <mml:facet id="org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacet" fqcn="org.apache.isis.core.metamodel.facets.param.validate.method.ActionParameterValidationFacetViaMethod">
                             <mml:attr name="intent.validate0UpdateName">CHECK_IF_VALID</mml:attr>
-                            <mml:attr name="methods">public java.lang.String domainapp.modules.simple.dom.impl.SimpleObject.validate0UpdateName(java.lang.String)</mml:attr>
+                            <mml:attr name="methods">public java.lang.String
+                                domainapp.modules.simple.dom.so.SimpleObject.validate0UpdateName(java.lang.String)</mml:attr>
                             <mml:attr name="underlyingFacet">org.apache.isis.core.metamodel.facets.param.validate.method.ActionParameterValidationFacetViaMethod</mml:attr>
                             <mml:attr name="validating">true</mml:attr>
                         </mml:facet>
diff --git a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObjects.xml b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObjects.xml
index f56a593..a64b5fa 100644
--- a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObjects.xml
+++ b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.modules.simple.dom.impl.SimpleObjects.xml
@@ -60,14 +60,15 @@
                     <mml:attr name="disabling">true</mml:attr>
                     <mml:attr name="hiding">true</mml:attr>
                     <mml:attr name="validating">true</mml:attr>
-                    <mml:attr name="value">domainapp.modules.simple.dom.impl.SimpleObjects.CreateDomainEvent</mml:attr>
+                    <mml:attr name="value">domainapp.modules.simple.dom.so.SimpleObjects.CreateDomainEvent</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionAnnotation">
-                    <mml:attr name="eventType">domainapp.modules.simple.dom.impl.SimpleObjects.CreateDomainEvent</mml:attr>
+                    <mml:attr name="eventType">domainapp.modules.simple.dom.so.SimpleObjects.CreateDomainEvent</mml:attr>
                     <mml:attr name="intent.create">EXECUTE</mml:attr>
-                    <mml:attr name="methods">public domainapp.modules.simple.dom.impl.SimpleObject domainapp.modules.simple.dom.impl.SimpleObjects.create(java.lang.String)</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObjects</mml:attr>
-                    <mml:attr name="returnType">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="methods">public domainapp.modules.simple.dom.so.SimpleObject
+                        domainapp.modules.simple.dom.so.SimpleObjects.create(java.lang.String)</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObjects</mml:attr>
+                    <mml:attr name="returnType">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.command.CommandFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration">
                     <mml:attr name="disabled">false</mml:attr>
@@ -102,7 +103,7 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet" fqcn="org.apache.isis.core.metamodel.facets.properties.property.publishing.PublishedPropertyFacetFromConfiguration"/>
             </mml:facets>
-            <mml:returnType>domainapp.modules.simple.dom.impl.SimpleObject</mml:returnType>
+            <mml:returnType>domainapp.modules.simple.dom.so.SimpleObject</mml:returnType>
             <mml:params>
                 <mml:param xsi:type="mml:scalarParam" id="name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                     <mml:facets>
@@ -131,7 +132,7 @@
                             <mml:attr name="value">40</mml:attr>
                         </mml:facet>
                         <mml:facet id="org.apache.isis.core.metamodel.facets.objectvalue.mustsatisfyspec.MustSatisfySpecificationFacet" fqcn="org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation">
-                            <mml:attr name="specifications">domainapp.modules.simple.dom.types.Name$NoExclamationMarks</mml:attr>
+                            <mml:attr name="specifications">domainapp.modules.simple.types.Name$NoExclamationMarks</mml:attr>
                             <mml:attr name="underlyingFacet">org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation</mml:attr>
                             <mml:attr name="validating">true</mml:attr>
                         </mml:facet>
@@ -152,7 +153,7 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet" fqcn="org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics">
                     <mml:attr name="underlyingFacet">org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics</mml:attr>
-                    <mml:attr name="value">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="value">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault">
                     <mml:attr name="disabling">true</mml:attr>
@@ -163,8 +164,9 @@
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault">
                     <mml:attr name="eventType">org.apache.isis.applib.events.domain.ActionDomainEvent.Default</mml:attr>
                     <mml:attr name="intent.findByName">EXECUTE</mml:attr>
-                    <mml:attr name="methods">public java.util.List&lt;domainapp.modules.simple.dom.impl.SimpleObject&gt; domainapp.modules.simple.dom.impl.SimpleObjects.findByName(java.lang.String)</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObjects</mml:attr>
+                    <mml:attr name="methods">public java.util.List&lt;domainapp.modules.simple.dom.impl.SimpleObject&gt;
+                        domainapp.modules.simple.dom.so.SimpleObjects.findByName(java.lang.String)</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObjects</mml:attr>
                     <mml:attr name="returnType">java.util.List</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.command.CommandFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration">
@@ -229,7 +231,7 @@
                             <mml:attr name="value">40</mml:attr>
                         </mml:facet>
                         <mml:facet id="org.apache.isis.core.metamodel.facets.objectvalue.mustsatisfyspec.MustSatisfySpecificationFacet" fqcn="org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation">
-                            <mml:attr name="specifications">domainapp.modules.simple.dom.types.Name$NoExclamationMarks</mml:attr>
+                            <mml:attr name="specifications">domainapp.modules.simple.types.Name$NoExclamationMarks</mml:attr>
                             <mml:attr name="underlyingFacet">org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation</mml:attr>
                             <mml:attr name="validating">true</mml:attr>
                         </mml:facet>
@@ -250,7 +252,7 @@
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet" fqcn="org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics">
                     <mml:attr name="underlyingFacet">org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics</mml:attr>
-                    <mml:attr name="value">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="value">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault">
                     <mml:attr name="disabling">true</mml:attr>
@@ -261,8 +263,9 @@
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault">
                     <mml:attr name="eventType">org.apache.isis.applib.events.domain.ActionDomainEvent.Default</mml:attr>
                     <mml:attr name="intent.listAll">EXECUTE</mml:attr>
-                    <mml:attr name="methods">public java.util.List&lt;domainapp.modules.simple.dom.impl.SimpleObject&gt; domainapp.modules.simple.dom.impl.SimpleObjects.listAll()</mml:attr>
-                    <mml:attr name="onType">domainapp.modules.simple.dom.impl.SimpleObjects</mml:attr>
+                    <mml:attr name="methods">public java.util.List&lt;domainapp.modules.simple.dom.impl.SimpleObject&gt;
+                        domainapp.modules.simple.dom.so.SimpleObjects.listAll()</mml:attr>
+                    <mml:attr name="onType">domainapp.modules.simple.dom.so.SimpleObjects</mml:attr>
                     <mml:attr name="returnType">java.util.List</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actions.command.CommandFacet" fqcn="org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration">
diff --git a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.webapp.application.services.homepage.HomePageViewModel.xml b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.webapp.application.services.homepage.HomePageViewModel.xml
index e793202..0cf3bdd 100644
--- a/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.webapp.application.services.homepage.HomePageViewModel.xml
+++ b/webapp/src/test/java/domainapp/webapp/integtests/metamodel/lockdown/approved/domainapp.webapp.application.services.homepage.HomePageViewModel.xml
@@ -238,7 +238,7 @@
                     <mml:attr name="hiding">true</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet" fqcn="org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics">
-                    <mml:attr name="value">domainapp.modules.simple.dom.impl.SimpleObject</mml:attr>
+                    <mml:attr name="value">domainapp.modules.simple.dom.so.SimpleObject</mml:attr>
                 </mml:facet>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet" fqcn="org.apache.isis.core.metamodel.facets.members.describedas.annotprop.DescribedAsFacetOnMemberDerivedFromType"/>
                 <mml:facet id="org.apache.isis.core.metamodel.facets.all.named.NamedFacet" fqcn="org.apache.isis.core.metamodel.facets.all.i18n.NamedFacetTranslated">
@@ -297,7 +297,7 @@
                     <mml:attr name="onType">domainapp.webapp.application.services.homepage.HomePageViewModel</mml:attr>
                 </mml:facet>
             </mml:facets>
-            <mml:type>domainapp.modules.simple.dom.impl.SimpleObject</mml:type>
+            <mml:type>domainapp.modules.simple.dom.so.SimpleObject</mml:type>
         </mml:coll>
     </mml:collections>
     <mml:actions>
diff --git a/webapp/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java b/webapp/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
index 1d9846b..94465ee 100644
--- a/webapp/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
+++ b/webapp/src/test/java/domainapp/webapp/integtests/smoke/Smoke_IntegTest.java
@@ -14,8 +14,8 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import domainapp.webapp.integtests.ApplicationIntegTestAbstract;
-import domainapp.modules.simple.dom.impl.SimpleObject;
-import domainapp.modules.simple.dom.impl.SimpleObjects;
+import domainapp.modules.simple.dom.so.SimpleObject;
+import domainapp.modules.simple.dom.so.SimpleObjects;
 
 @Transactional
 class Smoke_IntegTest extends ApplicationIntegTestAbstract {
@@ -33,7 +33,6 @@ class Smoke_IntegTest extends ApplicationIntegTestAbstract {
         assertThat(all).isEmpty();
 
 
-
         // when
         final SimpleObject fred = wrap(menu).create("Fred");
         transactionService.flushTransaction();
@@ -44,7 +43,6 @@ class Smoke_IntegTest extends ApplicationIntegTestAbstract {
         assertThat(all).contains(fred);
 
 
-
         // when
         final SimpleObject bill = wrap(menu).create("Bill");
         transactionService.flushTransaction();
@@ -55,7 +53,6 @@ class Smoke_IntegTest extends ApplicationIntegTestAbstract {
         assertThat(all).contains(fred, bill);
 
 
-
         // when
         wrap(fred).updateName("Freddy");
         transactionService.flushTransaction();
@@ -86,10 +83,9 @@ class Smoke_IntegTest extends ApplicationIntegTestAbstract {
         wrap(fred).delete();
         transactionService.flushTransaction();
 
-
+        // then
         all = wrap(menu).listAll();
         assertThat(all).hasSize(1);
-
     }
 
 }