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/03/26 19:17:54 UTC

[isis] 04/04: ISIS-2062: refguide (annotations)

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

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

commit 522c704608ff25d92fa7121b160a91326c7cb4fc
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Mar 26 19:17:36 2020 +0000

    ISIS-2062: refguide (annotations)
---
 .../fun/pages/concepts-patterns/metamodel.adoc     |  3 +-
 .../fun/pages/object-members/collections.adoc      |  2 +-
 .../fun/pages/object-members/properties.adoc       |  2 +-
 .../pages/overview/types-of-domain-objects.adoc    |  2 +-
 .../main/adoc/modules/applib-ant/pages/Action.adoc | 22 ++---
 .../applib-ant/pages/Action/associateWith.adoc     | 48 ++++++++---
 .../modules/applib-ant/pages/Action/command.adoc   | 16 +---
 .../applib-ant/pages/Action/domainEvent.adoc       | 51 +++++------
 .../modules/applib-ant/pages/Action/hidden.adoc    | 11 ++-
 .../modules/applib-ant/pages/Action/invokeOn.adoc  | 64 --------------
 .../applib-ant/pages/Action/publishing.adoc        |  9 +-
 .../applib-ant/pages/Action/restrictTo.adoc        | 26 ++++--
 .../modules/applib-ant/pages/Action/semantics.adoc | 46 ++++------
 .../modules/applib-ant/pages/Action/typeOf.adoc    |  9 +-
 .../applib-ant/pages/ActionLayout/bookmarking.adoc |  4 +-
 .../pages/ActionLayout/contributedAs.adoc          | 53 ++++--------
 .../applib-ant/pages/ActionLayout/cssClass.adoc    |  9 +-
 .../applib-ant/pages/ActionLayout/cssClassFa.adoc  | 19 +++--
 .../applib-ant/pages/ActionLayout/describedAs.adoc | 12 +--
 .../applib-ant/pages/ActionLayout/hidden.adoc      | 23 ++---
 .../applib-ant/pages/ActionLayout/named.adoc       | 15 ++--
 .../applib-ant/pages/ActionLayout/position.adoc    | 54 +++++++-----
 .../applib-ant/pages/ActionLayout/promptStyle.adoc | 36 ++++----
 .../applib-ant/pages/ActionLayout/redirect.adoc    | 15 ++--
 .../applib-ant/pages/Collection/domainEvent.adoc   | 98 +++++++++++-----------
 .../modules/applib-ant/pages/DomainObject.adoc     |  2 +-
 .../pages/DomainObject/autoCompleteRepository.adoc |  1 +
 .../pages/DomainObject/createdLifecycleEvent.adoc  |  3 +-
 .../pages/DomainObject/loadedLifecycleEvent.adoc   |  3 +-
 .../DomainObject/persistedLifecycleEvent.adoc      |  3 +-
 .../DomainObject/persistingLifecycleEvent.adoc     |  3 +-
 .../pages/DomainObject/removingLifecycleEvent.adoc |  3 +-
 .../pages/DomainObject/updatedLifecycleEvent.adoc  |  3 +-
 .../pages/DomainObject/updatingLifecycleEvent.adoc |  3 +-
 .../pages/DomainObjectLayout/cssClassUiEvent.adoc  |  5 +-
 .../pages/DomainObjectLayout/iconUiEvent.adoc      |  3 +-
 .../pages/DomainObjectLayout/layoutUiEvent.adoc    |  3 +-
 .../pages/DomainObjectLayout/titleUiEvent.adoc     |  3 +-
 .../adoc/modules/applib-ant/pages/MemberOrder.adoc |  5 +-
 .../modules/applib-ant/pages/MemberOrder/name.adoc |  3 +-
 .../applib-ant/pages/MemberOrder/sequence.adoc     |  2 +-
 .../applib-ant/pages/Property/domainEvent.adoc     | 24 +++---
 .../main/adoc/modules/applib-cm/pages/classes.adoc |  2 +-
 .../applib-cm/pages/methods/reserved/layout.adoc   |  2 +-
 .../modules/applib-svc/pages/EventBusService.adoc  |  1 -
 .../applib-svc/pages/RepositoryService.adoc        |  4 +-
 .../modules/archdesign/partials/module-nav.adoc    |  2 +-
 .../application-specific/application-css.adoc      | 33 ++++++++
 .../pages/customisation/tweaking-css-classes.adoc  | 45 ++++------
 .../adoc/modules/ROOT/partials/module-nav.adoc     |  1 -
 50 files changed, 369 insertions(+), 442 deletions(-)

diff --git a/api/adoc/userguide/modules/fun/pages/concepts-patterns/metamodel.adoc b/api/adoc/userguide/modules/fun/pages/concepts-patterns/metamodel.adoc
index 96b8dc5..2e5629d 100644
--- a/api/adoc/userguide/modules/fun/pages/concepts-patterns/metamodel.adoc
+++ b/api/adoc/userguide/modules/fun/pages/concepts-patterns/metamodel.adoc
@@ -21,8 +21,7 @@ The framework integrates an ORM for persistence, specifically DataNucleus and th
 Both JDO and JPA can map to both relational databases and also to various NoSQL objectstores such as MongoDB or Neo4J.
 Apache Isis recognizes a number of these persistence-specific annotations, for example `@javax.jdo.annotations.Column(allowsNull=...)`.
 
-In addition, the framework builds up the metamodel for each domain object using
-xref:vw:ROOT:layout.adoc[layout hints], such as `Customer.layout.xml`.
+In addition, the framework builds up the metamodel for each domain object using xref:userguide:fun:ui.adoc#object-layout[layout hints], such as `Customer.layout.xml`.
 These provide metadata such as grouping elements of the UI together, using multi-column layouts, and so on.
 The layout file can be modified while the application is still running, and are picked up automatically; a useful way to speed up feedback.
 
diff --git a/api/adoc/userguide/modules/fun/pages/object-members/collections.adoc b/api/adoc/userguide/modules/fun/pages/object-members/collections.adoc
index b044736..f22e362 100644
--- a/api/adoc/userguide/modules/fun/pages/object-members/collections.adoc
+++ b/api/adoc/userguide/modules/fun/pages/object-members/collections.adoc
@@ -16,7 +16,7 @@ Most collections (those that are modifiable) will also have a setter and, if per
 And collections properties will also have a number of annotations:
 
 * Apache Isis defines its own xref xref:refguide:applib-ant:Collection.adoc[`@Collection`] annotation for capturing domain semantics.
-It also provides a xref:refguide:applib-ant:CollectionLayout.adoc[`@CollectionLayout`] for UI hints (though the information in this annotation may instead be provided by a supplementary xref:vw:ROOT:layout.adoc[`.layout.xml`] file)
+It also provides a xref:refguide:applib-ant:CollectionLayout.adoc[`@CollectionLayout`] for UI hints (though the information in this annotation may instead be provided by a supplementary xref:userguide:fun:ui.adoc#object-layout[`.layout.xml`] file)
 
 * the collections of domain entities are often annotated with ORM annotation(s).
 In the case of JDO/DataNucleus annotations this is most notably `javax.jdo.annotations.Persistent`.
diff --git a/api/adoc/userguide/modules/fun/pages/object-members/properties.adoc b/api/adoc/userguide/modules/fun/pages/object-members/properties.adoc
index 2017165..03b1550 100644
--- a/api/adoc/userguide/modules/fun/pages/object-members/properties.adoc
+++ b/api/adoc/userguide/modules/fun/pages/object-members/properties.adoc
@@ -16,7 +16,7 @@ Most properties (those that are editable/modifiable) will also have a setter and
 And most properties will also have a number of annotations:
 
 * Apache Isis defines its own xref:refguide:applib-ant:Property.adoc[`@Property`] annotation for capturing domain semantics.
-It also provides a xref:refguide:applib-ant:PropertyLayout.adoc[`@PropertyLayout`] for UI hints (though the information in this annotation may instead be provided by a supplementary xref:vw:ROOT:layout.adoc[`.layout.xml`] file)
+It also provides a xref:refguide:applib-ant:PropertyLayout.adoc[`@PropertyLayout`] for UI hints (though the information in this annotation may instead be provided by a supplementary xref:userguide:fun:ui.adoc#object-layout[`.layout.xml`] file)
 
 * the properties of domain entities are usually also annotated with an ORM annotation.
 +
diff --git a/api/adoc/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc b/api/adoc/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc
index d006f48..26f8327 100644
--- a/api/adoc/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc
+++ b/api/adoc/userguide/modules/fun/pages/overview/types-of-domain-objects.adoc
@@ -28,7 +28,7 @@ Similarly, JAXB annotations are typically used for view models.
 
 The framework also defines supplementary annotations, notably xref:refguide:applib-ant:DomainObjectLayout.adoc[`@DomainObjectLayout`] and xref:refguide:applib-ant:DomainServiceLayout.adoc[`@DomainServiceLayout`].
 These provide hints relating to the layout of the domain object in the user interface.
-Alternatively, these UI hints might be defined in a supplementary xref:vw:ROOT:layout.adoc[`.layout.xml`] file.
+Alternatively, these UI hints might be defined in a supplementary xref:userguide:fun:ui.adoc#object-layout[`.layout.xml`] file.
 
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action.adoc
index 0dcab6b..417d55e 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action.adoc
@@ -9,6 +9,7 @@ The `@Action` annotation groups together all domain-specific metadata for an inv
 ----
 include::refguide:applib-ant:example$annotation/Action.java[tags="refguide"]
 ----
+
 <.> xref:refguide:applib-ant:Action.adoc#associateWith[`associateWith()`]
 +
 associates an action with another property or collection of the action.
@@ -54,7 +55,7 @@ The action's semantics (ie whether objects are modified as the result of invokin
 +
 The `...ARE_YOU_SURE` variants cause a confirmation dialog to be displayed in the xref:vw:ROOT:about.adoc[Wicket viewer].
 
-<.> xref:refguide:applib-ant:Action.adoc#typeof[`typeOf()`]
+<.> xref:refguide:applib-ant:Action.adoc#typeOf[`typeOf()`]
 +
 If the action returns a collection, hints as to the run-time type of the objects within that collection (as a fallback)
 
@@ -67,25 +68,19 @@ public class ToDoItem {
     public static class CompletedEvent extends ActionDomainEvent<ToDoItem> { }
     @Action(
         command=CommandReification.ENABLED,
-        commandExecuteIn=CommandExecuteIn.FOREGROUND,          // <1>
-        commandPersistence=CommandPersistence.NOT_PERSISTED,   // <2>
+        commandExecuteIn=CommandExecuteIn.FOREGROUND,          // <.>
+        commandPersistence=CommandPersistence.NOT_PERSISTED,   // <.>
         domainEvent=CompletedEvent.class,
-        hidden = Where.NOWHERE,                                // <3>
-        invokeOn = InvokeOn.OBJECT_ONLY,                       // <4>
+        hidden = Where.NOWHERE,                                // <.>
         publishing = Publishing.ENABLED,
         semantics = SemanticsOf.IDEMPOTENT
     )
     public ToDoItem completed() { /* ... */ }
 }
 ----
-<1> default value, so could be omitted
-<2> default value, so could be omitted
-<3> default value, so could be omitted
-<4> default value, so could be omitted
-
-
-
-
+<.> default value, so could be omitted
+<.> default value, so could be omitted
+<.> default value, so could be omitted
 
 
 
@@ -95,7 +90,6 @@ include::Action/associateWith.adoc[leveloffset=+1]
 include::Action/command.adoc[leveloffset=+1]
 include::Action/domainEvent.adoc[leveloffset=+1]
 include::Action/hidden.adoc[leveloffset=+1]
-include::Action/invokeOn.adoc[leveloffset=+1]
 include::Action/publishing.adoc[leveloffset=+1]
 include::Action/restrictTo.adoc[leveloffset=+1]
 include::Action/semantics.adoc[leveloffset=+1]
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/associateWith.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/associateWith.adoc
index 9219f40..2d136e3 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/associateWith.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/associateWith.adoc
@@ -16,18 +16,33 @@ For example, an `Order` could have a collection of ``OrderItem``s, and might pro
 ----
 public class Order {
 
+    @Getter @Setter
     @Collection
-    SortedSet<OrderItem> getItems() { /* ... */ }
-
-    @Action(associateWith="items", associateWithSequence="1")
-    public Order addItem(Product p, int quantity) { /* ... */ }
-
-    @Action(associateWith="items", associateWithSequence="2")
-    public Order removeItem(OrderItem item) { /* ... */ }
-    ...
+    private final SortedSet<OrderItem> items = ...
+
+    @Action(
+        associateWith="items",                      // <.>
+        associateWithSequence="1" )                 // <.>
+    public Order addItem(Product p, int quantity) {
+        // ...
+    }
+
+    @Action(
+        associateWith="items",                      // <.>
+        associateWithSequence="2" )                 // <.>
+    public Order removeItem(OrderItem item) {
+        // ...
+    }
+
+    // ...
 }
 ----
 
+<.> matches the name of the collection
+<.> first action in the list of all associated actions
+<.> matches the name of the collection
+<.> second action in the list of all associated actions
+
 These actions - `addItem()` and `removeItem()` can be thought of as associated with with the `items` collection because that is the state that they primarily affect.
 
 In the user interface associated actions are rendered close to the member to which they relate.
@@ -37,7 +52,6 @@ In the user interface associated actions are rendered close to the member to whi
 The same effect can be accomplished using `@MemberOrder` or with the `.layout.xml` file.
 ====
 
-
 == Inferred Defaults and Choices
 
 If an action is associated with a collection, then any scalar or collection parameter of the action that is the same type as that collection will automatically have a list of choices provided for it, being the items of the associated collection.
@@ -52,15 +66,23 @@ For example, suppose we have a "removeItems(...)" action:
 
 [source,java]
 ----
+import lombok.Getter;
+import lombok.Setter;
+
 public class Order {
 
+    @Getter @Setter
     @Collection
-    SortedSet<OrderItem> getItems() { /* ... */ }
+    private final SortedSet<OrderItem> items = ...
 
-    ...
+    @Action(
+        associateWith="items",
+        associateWithSequence="2" )
+    public Order removeItems(SortedSet<OrderItem> items) {
+        // ...
+    }
 
-    @Action(associateWith="items", associateWithSequence="2")
-    public Order removeItems(SortedSet<OrderItem> items) { /* ... */ }
+    // ...
 }
 ----
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/command.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/command.adoc
index 03845eb..5a35003 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/command.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/command.adoc
@@ -13,7 +13,6 @@ Note that for a `Command` to actually be persisted requires an appropriate imple
 The framework does _not_ provide an implementation of this SPI "out-of-the-box".
 However, the xref:extensions:command-log:about.adoc[Command Log] extension _does_ provide such an implementation.
 
-
 == Design
 
 The annotation works with (and is influenced by the behaviour of) a number of domain services:
@@ -21,7 +20,7 @@ The annotation works with (and is influenced by the behaviour of) a number of do
 * xref:refguide:applib-svc:CommandContext.adoc[`CommandContext`]
 * xref:refguide:applib-svc:CommandService.adoc[`CommandService`]
 //* xref:refguide:applib-svc:BackgroundService.adoc[`BackgroundService`] and
-* xref:refguide:applib-svc:BackgroundCommandService.adoc[`BackgroundCommandService`]
+//* xref:refguide:applib-svc:BackgroundCommandService.adoc[`BackgroundCommandService`]
 
 
 Each action invocation is automatically reified by the xref:refguide:applib-svc:CommandContext.adoc[`CommandContext`] service into a `Command` object, capturing details of the target object, the action, the parameter arguments, the user, a timestamp and so on.
@@ -45,12 +44,12 @@ By default, actions are invoked in directly in the thread of the invocation.
 The `command()` and `commandPersistence() attributes work together to determine whether a command will actually be persisted.
 There inter-relationship is somewhat complex, so is probably best explained by way of examples:
 
-[cols="1a,1a,1a,1a,1a,2a", options="header"]
+[cols="1a,1a,1a,1a,1a,2a",options="header"]
 |===
 
 | `command()`
 |`isis.services.
-command.actions` config property
+  command.actions` config property
 | action's declared `semantics()`
 | `command
 Persistence()`
@@ -272,11 +271,6 @@ As can be seen, whether a command is actually persisted does not always follow t
 This is because the `command` attribute actually determines whether any command metadata for the action is captured within the framework's internal metamodel.
 If `command` is `DISABLED` or does not otherwise apply due to the action's declared semantics, then the framework decides to persist a command based solely on whether the action dirtied any objects (as if `commandPersistence()` was set to `IF_HINTED`).
 
-
-
-
-
-
 == `commandExecuteIn`
 
 For persisted commands, the `commandExecuteIn` attribute determines whether the `Command` should be executed in the foreground (the default) or executed in the background.
@@ -340,7 +334,6 @@ A `CommandDtoProcessor` can be provided to re-attach blob information if require
 * replaying ``Command``s requires this missing parameter information to be reinstated.
 The `CommandDtoProcessor` therefore offers a hook to dynamically re-attach the missing `Blob` or `Clob` argument.
 
-
 As a special case, returning `null` means that the command's DTO is effectively excluded when retrieving the list of commands.
 If replicating from master to slave, this effectively allows certain commands to be ignored.
 The `CommandDtoProcessor.Null` class provides a convenience implementation for this requirement.
@@ -350,8 +343,6 @@ The `CommandDtoProcessor.Null` class provides a convenience implementation for t
 If `commandDtoProcessor()` is specified, then `command()` is assumed to be ENABLED.
 ====
 
-
-
 === Example implementation
 
 Consider the following method:
@@ -404,7 +395,6 @@ public class DeriveBlobArg0FromReturnedDocument
 }
 ----
 
-
 === Null implementation
 
 The null implementation can be used to simply indicate that no DTO should be returned for a `Command`.
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/domainEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/domainEvent.adoc
index ce49000..8f1acd2 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/domainEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/domainEvent.adoc
@@ -14,7 +14,7 @@ In the cases of the domain object's actions, the events that are fired are:
 * pre-execute phase: before the invocation of the action
 * post-execute: after the invocation of the action
 
-Subscribers subscribe through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] using either link:https://github.com/google/guava[Guava] or link:http://www.axonframework.org/[Axon Framework] annotations and can influence each of these phases.
+Subscribers subscribe through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] and can influence each of these phases.
 
 By default the event raised is `ActionDomainEvent.Default`.
 For example:
@@ -22,16 +22,16 @@ For example:
 [source,java]
 ----
 public class ToDoItem {
+
     @Action()
-    public ToDoItem completed() { /* ... */ }
+    public ToDoItem completed() {
+        // ...
+    }
     ...
 }
 ----
 
-
-The `domainEvent` attribute allows a custom subclass to be emitted allowing more precise subscriptions (to those
-subclasses) to be defined instead.
-
+The `domainEvent` attribute allows a custom subclass to be emitted allowing more precise subscriptions (to those subclasses) to be defined instead.
 
 For example:
 
@@ -46,18 +46,15 @@ public class ToDoItem {
 
 The benefit is that subscribers can be more targeted as to the events that they subscribe to.
 
-
 [NOTE]
 ====
 The framework provides no-arg constructor and will initialize the domain event using (non-API) setters rather than through the constructor.
 This substantially reduces the boilerplate required in subclasses because no explicit constructor is required.
 ====
 
-
-
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
@@ -91,8 +88,6 @@ public class SomeSubscriber {
 }
 ----
 
-
-
 The subscriber's method is called (up to) 5 times:
 
 * whether to veto visibility (hide)
@@ -106,7 +101,7 @@ Thus the general form is:
 
 [source,java]
 ----
- import org.springframework.context.event.EventListener;
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
 @Service
@@ -115,16 +110,14 @@ public class SomeSubscriber {
     @EventListener(ActionDomainEvent.class)
     public void on(ActionDomainEvent ev) {
         switch(ev.getEventPhase()) {
-            case HIDE:
-                // call ev.hide() or ev.veto("") to hide the action
+
+            case HIDE:                      // <.>
                 break;
-            case DISABLE:
-                // call ev.disable("...") or ev.veto("...") to disable the action
+            case DISABLE:                   // <.>
                 break;
-            case VALIDATE:
-                // call ev.invalidate("...") or ev.veto("...")
-                // if action arguments are invalid
+            case VALIDATE:                  // <.>
                 break;
+
             case EXECUTING:
                 break;
             case EXECUTED:
@@ -134,10 +127,14 @@ public class SomeSubscriber {
 }
 ----
 
-It is also possible to abort the transaction during the executing or executed phases by throwing an exception. If the exception is a subtype of `RecoverableException` then the exception will be rendered as a user-friendly warning (eg Growl/toast) rather than an error.
+<.> call `ev.hide()` or `ev.veto("")` to hide the action
 
+<.> call `ev.disable("...")` or `ev.veto("...")` to disable the action
 
+<.> call ev.invalidate("...") or ev.veto("...") if action arguments are invalid
 
+It is also possible to abort the transaction during the executing or executed phases by throwing an exception.
+If the exception is a subtype of `RecoverableException` then the exception will be rendered as a user-friendly warning (eg Growl/toast) rather than an error.
 
 == Default, Doop and Noop events
 
@@ -150,8 +147,6 @@ The framework provides `ActionDomainEvent.Doop` as such a subclass, so setting t
 
 And, conversely, the framework also provides `ActionDomainEvent.Noop`; if `domainEvent` attribute is set to this class, then no event will be posted.
 
-
-
 === Class-level default
 
 Sometimes a subscriber is interested in all of the actions of a given class, though not any individual action.
@@ -162,12 +157,12 @@ For this use, the default action domain event can be annotated using `@DomainObj
 [source,java]
 ----
 @DomainObject(
-    actionDomainEvent=ToDoItem.ActionDomainEventDefault.class
+    actionDomainEvent=ToDoItem.ActionDomainEvent.class
 )
 public class ToDoItem {
-    public static class ActionDomainEventDefault
-        extends org.apache.isis.applib.events.domain.ActionDomainEvent<Object> { }
-    ...
+    public static class ActionDomainEvent extends
+        org.apache.isis.applib.events.domain.ActionDomainEvent<Object> { }
+    // ...
 
     public void updateDescription(final String description) {
         this.description = description;
@@ -176,13 +171,11 @@ public class ToDoItem {
 }
 ----
 
-
 == Raising events programmatically
 
 Normally events are only raised for interactions through the UI.
 However, events can be raised programmatically either by calling the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] API directly, or by emulating the UI by wrapping the target object using the xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`] domain service.
 
-
 == See also
 
 This attribute is also supported for:
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/hidden.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/hidden.adoc
index b8720f4..d88e4f9 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/hidden.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/hidden.adoc
@@ -20,8 +20,12 @@ For example:
 [source,java]
 ----
 public class Customer {
+
     @Action(hidden=Where.EVERYWHERE)
-    public void updateStatus() { /* ... */ }
+    public void updateStatus() {
+        // ...
+    }
+
     ...
 }
 ----
@@ -41,11 +45,6 @@ The other values of the `Where` enum have no meaning for a collection.
 
 
 
-[NOTE]
-====
-For actions of domain services the visibility is dependent upon its xref:refguide:applib-ant:DomainService.adoc#nature[`@DomainService#nature`] and also on whether it is contributed (as per  xref:refguide:applib-ant:ActionLayout.adoc#contributedAs[`@ActionLayout#contributedAs`]).
-====
-
 
 
 == See also
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/invokeOn.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/invokeOn.adoc
deleted file mode 100644
index ef32879..0000000
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/invokeOn.adoc
+++ /dev/null
@@ -1,64 +0,0 @@
-[#invokeOn]
-= `invokeOn()`
-
-:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
-:page-partial:
-
-
-
-The `invokeOn` attribute indicates whether the an action can be invoked on a single object (the default) and/or on many objects in a collection.
-
-For example:
-
-[source,java]
-----
-public class ToDoItem {
-    @Action(invokeOn=InvokeOn.OBJECT_AND_COLLECTION)
-    public void markAsCompleted() {
-        setCompleted(true);
-    }
-    ...
-}
-----
-
-
-Actions to be invoked on collection (currently) have a number of constraints.  It:
-
-* must take no arguments
-* cannot be hidden (any annotations or supporting methods to that effect will be ignored)
-* cannot be disabled (any annotations or supporting methods to that effect will be ignored).
-
-The example given above is probably ok, because `setCompleted()` is most likely idempotent. However, if the action also called some other method, then we should add a guard.
-
-For example, for this non-idempotent action:
-
-[source,java]
-----
-@Action(invokeOn=InvokeOn.OBJECT_AND_COLLECTION)
-public void markAsCompleted() {
-    setCompleted(true);
-    todoTotalizer.incrementNumberCompleted();
-}
-----
-
-we should instead write it as:
-
-[source,java]
-----
-@Action(invokeOn=InvokeOn.OBJECT_AND_COLLECTION)
-public void markAsCompleted() {
-    if(isCompleted()) {
-        return;
-    }
-    setCompleted(true);
-    todoTotalizer.incrementNumberCompleted();
-}
-----
-
-[NOTE]
-====
-This attribute has no meaning if annotated on an action of a domain service.
-====
-
-
-
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/publishing.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/publishing.adoc
index 97364be..1c1eb67 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/publishing.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/publishing.adoc
@@ -5,8 +5,6 @@
 :page-partial:
 
 
-
-
 The `publishing` attribute determines whether and how an action invocation is published via the registered implementation of xref:refguide:applib-svc:PublisherService.adoc[`PublisherService`].
 
 A common use case is to notify external "downstream" systems of changes in the state of the Apache Isis application.
@@ -33,10 +31,13 @@ For example:
 [source,java]
 ----
 public class Order {
-    @Action(publishing=Publishing.ENABLED)           // <.>
-    public Invoice generateInvoice(...) { /* ... */ }
+    @Action(publishing=Publishing.ENABLED)    // <.>
+    public Invoice generateInvoice(...) {
+        // ...
+    }
 }
 ----
+
 <.> because set to enabled, will be published irrespective of the configured value.
 
 == See also
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/restrictTo.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/restrictTo.adoc
index 17d3c7e..20b0283 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/restrictTo.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/restrictTo.adoc
@@ -6,24 +6,36 @@
 
 
 
-
-By default actions are available irrespective of the xref:refguide:config:about.adoc#deployment-types[deployment mode].  The `restrictTo` attribute specifies whether the action should instead be restricted to only available in prototyping mode.
+By default actions are available irrespective of the xref:refguide:config:about.adoc#deployment-types[deployment mode].
+The `restrictTo` attribute specifies whether the action should instead be restricted to only available in prototyping mode.
 
 For example:
 
 [source,java]
 ----
 public class Customer {
-    public Order placeNewOrder() { /* ... */ }
-    public List<Order> listRecentOrders() { /* ... */ }
 
-    @Action(restrictTo=RestrictTo.PROTOTYPING)
-    public List<Order> listAllOrders() { /* ... */ }
+    @Action
+    public Order placeNewOrder() {
+        // ...
+    }
+    @Action(semantics=SemanticsOf.SAFE)
+    public List<Order> listRecentOrders() {
+        // ...
+    }
+
+    @Action(restrictTo=RestrictTo.PROTOTYPING)      // <.>
+    public List<Order> listAllOrders() {
+        // ...
+    }
     ...
 }
 ----
 
-In this case the listing of all orders (in the `listAllOrders()` action) probably doesn't make sense for production; there could be thousands or millions.  However, it would be useful to disaply how for a test or demo system where there are only a handful of orders.
+<.> Only visible in prototype mode.
+
+In this case the listing of all orders (in the `listAllOrders()` action) probably doesn't make sense for production; there could be thousands or millions.
+However, it would be useful to disaply how for a test or demo system where there are only a handful of orders.
 
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/semantics.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/semantics.adoc
index 355b40b..9d7e29f 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/semantics.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/semantics.adoc
@@ -1,18 +1,19 @@
 [#semantics]
 = `semantics()`
-
+r
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 :page-partial:
 
 
 
-The `semantics` attribute describes whether the invocation modifies state of the system, and if so whether it does so idempotently.  If the action invocation does _not_ modify the state of the system, in other words is safe, then it also can beused to specify whether the results of the action can be cached automatically for the remainder of the request.
+The `semantics` attribute describes whether the invocation modifies state of the system, and if so whether it does so idempotently.
+If the action invocation does _not_ modify the state of the system, in other words is safe, then it also can beused to specify whether the results of the action can be cached automatically for the remainder of the request.
 
 The attribute was originally introduced for the xref:vro:ROOT:about.adoc[RestfulObjects viewer] in order that action invocations could be using the appropriate `HTTP` verb (`GET`, `PUT` and `POST`).
 
 The table below summarizes the semantics:
 
-[cols="2,1,3,1", options="header"]
+[cols="2,1,3,1",options="header"]
 |===
 | Semantic
 | Changes state
@@ -46,7 +47,6 @@ The "are you sure" variant requires that the user must explicitly confirm the ac
 
 |===
 
-
 The actions' semantics are also used by the core runtime as part of the in-built concurrency checkng; invocation of a safe action (which includes request-cacheable) does _not_ perform a concurrency check, whereas non-safe actions _do_ perform a concurrency check.
 
 For example:
@@ -54,38 +54,28 @@ For example:
 [source,java]
 ----
 public class Customer {
+
     @Action(semantics=SemanticsOf.SAFE_AND_REQUEST_CACHEABLE)
-    public CreditRating checkCredit() { /* ... */ }
+    public CreditRating checkCredit() {
+        // ...
+    }
 
     @Action(semantics=SemanticsOf.IDEMPOTENT)
-    public void changeOfAddress(Address address) { /* ... */ }
+    public void changeOfAddress(Address address) {
+        // ...
+    }
 
     @Action(semantics=SemanticsOf.NON_IDEMPOTENT)
-    public Order placeNewOrder() { /* ... */ }
-    ...
-}
-----
-
-Actions that are safe and request-cacheable automatically use the xref:refguide:applib-svc:QueryResultsCache.adoc[`QueryResultsCache`] service to cache the result of the method.  Note though that the results of this caching will only be apparent if the action is invoked from another method using the xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`] service.
-
-Continuing the example above, imagine code that loops over a set of ``Order``s where each `Order` has an associated `Customer`.  We want to check the credit rating of each `Customer` (a potentially expensive operation) but we don't want to do it more than once per `Customer`.  Invoking through the `WrapperFactory` will allow us to accomplish this by exploiting the semantics of `checkCredit()` action:
-
-[source,java]
-----
-public void dispatchToCreditWorthyCustomers(final List<Order> orders) {
-    for(Order order: orders) {
-        Customer customer = order.getCustomer();
-        CreditRating creditRating = wrapperFactory.wrapSkipRules(customer).checkCredit();  // <1>
-        if(creditRating.isWorthy()) {
-            order.dispatch();
-        }
+    public Order placeNewOrder() {
+        // ...
     }
+
+    // ...
 }
-@Inject
-WrapperFactory wrapperFactory;
 ----
-<1> wrap the customer to dispatch.
 
-In the above example we've used `wrapSkipRules(...)` but if we wanted to enforce any business rules associated with the `checkCredit()` method, we would have used `wrap(...)`.
+Actions that are safe and request-cacheable automatically use the xref:refguide:applib-svc:QueryResultsCache.adoc[`QueryResultsCache`] service to cache the result of the method.
+Note though that the results of this caching will only be apparent if the action is invoked from another method using the xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`] service.
+
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/typeOf.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/typeOf.adoc
index 013b020..9c8efee 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Action/typeOf.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Action/typeOf.adoc
@@ -8,28 +8,23 @@
 
 The `typeOf` attribute specifies the expected type of an element returned by the action (returning a collection), when for whatever reason the type cannot be inferred from the generic type, or to provide a hint about the actual run-time (as opposed to compile-time) type.
 
-
 For example:
 
 [source,java]
 ----
 public void AccountService {
+
     @Action(typeOf=Customer.class)
     public List errantAccounts() {
         return customers.allNewCustomers();
     }
     ...
 
-    @Inject
-    CustomerRepository customers;
+    @Inject CustomerRepository customers;
 }
 ----
 
-[TIP]
-====
 In general we recommend that you use generics instead, eg `List<Customer>`.
-====
-
 
 == See also
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/bookmarking.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/bookmarking.adoc
index 7c0c32d..34417d7 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/bookmarking.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/bookmarking.adoc
@@ -9,8 +9,6 @@
 The `bookmarking` attribute indicates if an action (with safe xref:refguide:applib-ant:Action.adoc#semantics[action semantics]) is automatically bookmarked.
 
 
-
-
 In the xref:vw:ROOT:about.adoc[Wicket viewer], a link to a bookmarked object is shown in the bookmarks panel:
 
 image::reference-annotations/ActionLayout/bookmarking.png[width="720px",link="{imagesdir}/reference-annotations/ActionLayout/bookmarking.png"]
@@ -46,7 +44,7 @@ indicates that the `notYetComplete()` action is bookmarkable.
 
 [NOTE]
 ====
-The enum value `AS_CHILD` has no meaning for actions; it relates only to bookmarked xref:refguide:applib-ant:DomainObject.adoc#bookmarking[domain object]s.
+The enum value `AS_CHILD` has no meaning for actions; it relates only to bookmarked xref:refguide:applib-ant:DomainObjectLayout.adoc#bookmarking[domain object]s.
 ====
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/contributedAs.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/contributedAs.adoc
index 5876855..11e4e29 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/contributedAs.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/contributedAs.adoc
@@ -1,54 +1,29 @@
-[#contributedas]
+[#contributedAs]
 = `contributedAs()`
 
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 :page-partial:
 
 
-
-For a domain service action that _can_ be contributed, the `contributedAs` attribute determines how it is contributed: as an action or as an association (ie a property or collection).
-
-The distinction between property or collection is automatic: if the action returns a `java.util.Collection` (or subtype) then the action is contributed as a collection; otherwise it is contributed as a property.
-
-For a domain service action to be contributed, the domain services must have a xref:refguide:applib-ant:DomainService.adoc#nature[nature] nature of either `VIEW` or `VIEW_CONTRIBUTIONS_ONLY`, and the action must have xref:refguide:applib-ant:Action.adoc#semantics[safe action semantics], and takes a single argument, namely the contributee domain object.
+For mixin actions that could qualify as derived properties or collections, the `contributedAs` attribute determines _how_ it is contributed.
 
 For example:
 
 [source,java]
 ----
-@DomainService(nature=NatureOfService.VIEW_CONTRIBUTIONS_ONLY)
-public class CustomerContributions {
-    @Action(semantics=SemanticsOf.SAFE)
-    @ActionLayout(contributedAs=Contributed.AS_ASSOCIATION)
-    public List<Order> mostRecentOrders(Customer customer) { /* ... */ }
-    ...
-}
-----
-
-[TIP]
-====
-The `@ActionLayout` is not required if the action does not have safe semantics, or if the action takes more than one argument; in these cases the action can only be contributed _as_ an action.
-====
-
-
-It's also possible to use the attribute to suppress the action completely:
-
-[source,java]
-----
-@DomainService(nature=NatureOfService.VIEW)
-public class OrderContributions {
-    @ActionLayout(contributedAs=Contributed.AS_NEITHER)
-    public void cancel(Order order);
-    ...
+public class Customer {
+    @Mixin
+    public class mostRecentOrders {                             // <.>
+        @Action(semantics=SemanticsOf.SAFE)
+        @ActionLayout(contributedAs=Contributed.AS_ASSOCIATION) // <.>
+        public List<Order> $$() {
+            // ...
+        }
+        // ...
+    }
 }
 ----
 
-In such cases, though, it would probably make more sense to annotate the action as either xref:refguide:applib-ant:Action.adoc#hidden[hidden] or indeed xref:refguide:applib-ant:Programmatic.adoc[`@Programmatic`].
-
-
-
-[NOTE]
-====
-Unlike other `@ActionLayout` attributes, this attribute _cannot_ be specified using a file-based layout because it relates to the contributor domain service, not the contributee domain object.
-====
+<.> mixin as a nested (non-static) class
+<.> contributed as an association, that is, a collection.
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClass.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClass.adoc
index 4be9c84..03a263f 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClass.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClass.adoc
@@ -6,8 +6,8 @@
 
 
 
-The `cssClass` attribute can be used to render additional CSS classes in the HTML (a wrapping `<div>`) that represents the action.   xref:refguide:config:application-specific/application-css.adoc[Application-specific CSS] can then be used to target and adjust the UI representation of that particular element.
-
+The `cssClass` attribute can be used to render additional CSS classes in the HTML (a wrapping `<div>`) that represents the action.
+xref:refguide:config:application-specific/application-css.adoc[Application-specific CSS] can then be used to target and adjust the UI representation of that particular element.
 
 For example:
 
@@ -22,12 +22,9 @@ public class ToDoItem {
 
 [NOTE]
 ====
-The similar xref:refguide:applib-ant:ActionLayout.adoc#cssClassFa[`@ActionLayout#cssClassFa`] annotation attribute is also used as a hint
-to apply CSS, specifically to add http://fortawesome.github.io/Font-Awesome/icons/[Font Awesome icons] on action menu items or buttons.
+The similar xref:refguide:applib-ant:ActionLayout.adoc#cssClassFa[`@ActionLayout#cssClassFa`] annotation attribute is also used as a hint to apply CSS, specifically to add http://fortawesome.github.io/Font-Awesome/icons/[Font Awesome icons] on action menu items or buttons.
 ====
 
-
-
 == Alternatives
 
 As an alternative to using the annotation, the dynamic xref:userguide:fun:ui.adoc#object-layout[file-based layout] can be used instead.
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClassFa.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClassFa.adoc
index f673158..dab4ec5 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClassFa.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/cssClassFa.adoc
@@ -5,37 +5,42 @@
 :page-partial:
 
 
-The `cssClassFa` attribute is used to specify the name of a link:http://fortawesome.github.io/Font-Awesome/icons/[Font Awesome icon] name, to be rendered on the action's representation as a button or menu item.    The related `cssClassFaPosition` attribute specifies the positioning of the icon, to the left or the right of the text.
+The `cssClassFa` attribute is used to specify the name of a link:http://fortawesome.github.io/Font-Awesome/icons/[Font Awesome icon] name, to be rendered on the action's representation as a button or menu item.
+The related `cssClassFaPosition` attribute specifies the positioning of the icon, to the left or the right of the text.
 
 These attributes can also be applied to xref:refguide:applib-ant:DomainObjectLayout.adoc#cssClassFa[domain objects] to specify the object's icon.
 
-
 For example:
 
 [source,java]
 ----
 public class ToDoItem {
+
     @ActionLayout(
         cssClassFa="fa-step-backward"
     )
-    public ToDoItem previous() { /* ... */ }
+    public ToDoItem previous() {
+        // ...
+    }
 
     @ActionLayout(
         cssClassFa="fa-step-forward",
         cssClassFaPosition=ActionLayout.CssClassFaPosition.RIGHT
     )
-    public ToDoItem next() { /* ... */ }
+    public ToDoItem next() {
+        // ...
+    }
 }
 ----
 
-There can be multiple "fa-" classes, eg to mirror or rotate the icon. There is no need to include the mandatory `fa` "marker" CSS class; it will be automatically added to the list.  The `fa-` prefix can also be omitted from the class names; it will be prepended to each if required.
-
+There can be multiple "fa-" classes, eg to mirror or rotate the icon.
+There is no need to include the mandatory `fa` "marker" CSS class; it will be automatically added to the list.
+The `fa-` prefix can also be omitted from the class names; it will be prepended to each if required.
 
 == Alternatives
 
 As an alternative to using the annotation, the dynamic xref:userguide:fun:ui.adoc#object-layout[file-based layout] can be used instead.
 
-
 [NOTE]
 ====
 The similar xref:refguide:applib-ant:ActionLayout.adoc#cssClass[`@ActionLayout#cssClass`] annotation attribute is also used as a hint to apply CSS, but for wrapping the representation of an object or object member so that it can be styled in an application-specific way.
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/describedAs.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/describedAs.adoc
index 2acc6e2..56ee6c3 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/describedAs.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/describedAs.adoc
@@ -6,28 +6,24 @@
 
 
 
-The `describedAs` attribute is used to provide a short description of the action to the user.  In the xref:vw:ROOT:about.adoc[Wicket viewer] it is displayed as a 'tool tip'.
-
+The `describedAs` attribute is used to provide a short description of the action to the user.
+In the xref:vw:ROOT:about.adoc[Wicket viewer] it is displayed as a 'tool tip'.
 
 For example:
 
 [source,java]
 ----
 public class Customer {
-    @ActionLayout(describedAs="Place a repeat order of the last (most recently placed) order")
+    @ActionLayout(describedAs=
+        "Place a repeat order of the last (most recently placed) order")
     public Order placeRepeatOrder(...) { /* ... */ }
 }
 ----
 
-
-
-
 == Alternatives
 
 As an alternative to using the annotation, the dynamic xref:userguide:fun:ui.adoc#object-layout[file-based layout] can be used instead.
 
-
-
 == See also
 
 This attribute can also be specified for:
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/hidden.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/hidden.adoc
index c91737d..2e5752a 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/hidden.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/hidden.adoc
@@ -7,11 +7,9 @@
 
 The `hidden` attribute indicates where (in the UI) the action should be hidden from the user.
 
-
 [TIP]
 ====
 It is also possible to use xref:refguide:applib-ant:Action.adoc#hidden[`@Action#hidden`] to hide an action at the domain layer.
-Both options are provided with a view that in the future the view-layer semantics may be under the control of (expert) users, whereas domain-layer semantics should never be overridden or modified by the user.
 ====
 
 For example:
@@ -19,41 +17,32 @@ For example:
 [source,java]
 ----
 public class Customer {
+
     @ActionLayout(hidden=Where.EVERYWHERE)
-    public void updateStatus() { /* ... */ }
+    public void updateStatus() {
+        // ...
+    }
     ...
 }
 ----
 
 The acceptable values for the `where` parameter are:
 
-* `Where.EVERYWHERE` or `Where.ANYWHERE` +
+* `Where.EVERYWHERE` or `Where.ANYWHERE`
 +
 The action should be hidden at all times.
 
-* `Where.NOWHERE` +
+* `Where.NOWHERE`
 +
 The action should not be hidden.
 
-
 The other values of the `Where` enum have no meaning for a collection.
 
 
-[NOTE]
-====
-For actions of domain services the visibility is dependent upon its xref:refguide:applib-ant:DomainService.adoc#nature[`@DomainService#nature`] and also on whether it is contributed (as per  xref:refguide:applib-ant:ActionLayout.adoc#contributedAs[`@ActionLayout#contributedAs`]).
-====
-
-
 == Alternatives
 
 As an alternative to using the annotation, the dynamic xref:userguide:fun:ui.adoc#object-layout[file-based layout] can be used instead.
 
-
-
-
-
-
 == See also
 
 This attribute can also be applied to:
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/named.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/named.adoc
index b19ffce..bbcd17f 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/named.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/named.adoc
@@ -7,35 +7,32 @@
 
 The `named` attribute explicitly specifies the action's name, overriding the name that would normally be inferred from the Java source code.
 
-
 [TIP]
 ====
-Following the link:http://en.wikipedia.org/wiki/Don%27t_repeat_yourself[don't repeat yourself] principle, we recommend that you only use this attribute when the desired name cannot be used in Java source code.
+Only use this attribute when the desired name cannot be used in Java source code.
 Examples of that include a name that would be a reserved Java keyword (eg "package"), or a name that has punctuation, eg apostrophes.
 ====
 
-
-
 For example:
 
 [source,java]
 ----
 public class Customer {
-    @ActionLayout(named="Get credit rating")
-    public CreditRating obtainCreditRating() { /* ... */ }
+    @ActionLayout(named="Get credit rating")        // <.>
+    public CreditRating obtainCreditRating() {
+        // ...
+    }
 }
 ----
 
+<.> "get" normally indicates a property rather than an action.
 
 == Alternatives
 
-
 As an alternative to using the annotation, the dynamic xref:userguide:fun:ui.adoc#object-layout[file-based layout] can be used instead.
 
 The framework also provides a separate, powerful mechanism for xref:userguide:btb:i18n.adoc[internationalization].
 
-
-
 == See also
 
 This attribute can also be specified for:
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/position.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/position.adoc
index dacc3f2..3403478 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/position.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/position.adoc
@@ -6,9 +6,8 @@
 
 
 
-
-
-The `position` attribute pertains only to actions that have been associated with properties using xref:refguide:applib-ant:MemberOrder.adoc[`@MemberOrder#named`].  For these actions, it specifies the positioning of the action's button with respect to the field representing the object property.
+The `position` attribute pertains only to actions that have been associated with properties using xref:refguide:applib-ant:MemberOrder.adoc[`@MemberOrder#named`].
+For these actions, it specifies the positioning of the action's button with respect to the field representing the object property.
 
 The attribute can take one of four values: `BELOW`, `RIGHT`, `PANEL` or `PANEL_DROPDOWN`.
 
@@ -16,28 +15,44 @@ For example:
 
 [source,java]
 ----
+import lombok.Getter;
+import lombok.Setter;
+
 public class Customer {
 
-    @Property(
-        editing=Editing.DISABLED                 // <1>
-    )
-    public CustomerStatus getStatus() { /* ... */ }
-    public void setStatus(CustomerStatus customerStatus) { /* ... */ }
+    @Property( editing=Editing.DISABLED )
+    @Getter @Setter
+    private BigDecimal cost;
+
+    @Property( editing=Editing.DISABLED )
+    @Getter @Setter
+    private String location;
 
-    @MemberOrder(
-        named="status",                          // <2>
-        sequence="1"
+    @MemberOrder( named="cost" )                        // <.>
+    @ActionLayout(
+        named="Update",                                 // <.>
+        position=Position.BELOW                         // <.>
     )
+    public Customer updateCost(BigDecimal cost ) {
+        // ...
+    }
+
+    @MemberOrder( named="location" )
     @ActionLayout(
-        named="Update",                          // <3>
+        named="Update",
         position=Position.BELOW
     )
-    public CreditRating updateStatus(Customer ) { /* ... */ }
+    public Customer updateLocation(String latitude, String longitude) {
+        // ...
+    }
 }
 ----
-<1> indicate the property as read-only, such that it can only be updated using an action
-<2> associate the "updateStatus" action with the "status" property
-<3> give the action an abbreviated name, because the fact that the "status" property is to be updated is implied by its positioning
+
+<.> associate the "updateCost" action with the "cost" property
+
+<.> give the action an abbreviated name, because the fact that the "cost" property is to be updated is implied by its positioning
+
+<.> positioning of the action's button
 
 
 The default is `BELOW`, which is rendered (by the xref:vw:ROOT:about.adoc[Wicket viewer]) as shown below:
@@ -45,7 +60,8 @@ The default is `BELOW`, which is rendered (by the xref:vw:ROOT:about.adoc[Wicket
 image::reference-annotations/ActionLayout/position-BELOW.png[width="720px",link="{imagesdir}/reference-annotations/ActionLayout/position-BELOW.png"]
 
 
-If the action is positioned as `RIGHT`, then the action's button is rendered to the right of the property's field, in a compact drop-down.  This is ideal if there are many actions associated with a property:
+If the action is positioned as `RIGHT`, then the action's button is rendered to the right of the property's field, in a compact drop-down.
+This is ideal if there are many actions associated with a property:
 
 image::reference-annotations/ActionLayout/position-RIGHT.png[width="720px",link="{imagesdir}/reference-annotations/ActionLayout/position-RIGHT.png"]
 
@@ -64,8 +80,8 @@ image::reference-annotations/ActionLayout/position-PANEL_DROPDOWN.png[width="720
 
 
 
-If there are multiple actions associated with a single property then the positioning can be mix'ed-and-match'ed as required.  If the `PANEL` or `PANEL_DROPDOWN` are used, then (as the screenshots above show) the actions from potentially multiple properties grouped by that panel will be shown together.
-
+If there are multiple actions associated with a single property then the positioning can be mix'ed-and-match'ed as required.
+If the `PANEL` or `PANEL_DROPDOWN` are used, then (as the screenshots above show) the actions from potentially multiple properties grouped by that panel will be shown together.
 
 == Alternatives
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/promptStyle.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/promptStyle.adoc
index 1d72a46..6b70367 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/promptStyle.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/promptStyle.adoc
@@ -12,51 +12,55 @@ The prompt style is influenced by two xref:vw:ROOT:configuration-properties.adoc
 
 * if the `promptStyle` attribute is set to `DIALOG`, then a configuration property is used to determine whether to render using a modal dialog or a sidebar:
 
-** `isis.viewer.wicket.dialogMode` if the action is for a domain object (entity or view model)
+** xref:refguide:config:sections/isis.viewer.wicket.adoc#isis.viewer.wicket.dialog-mode[`isis.viewer.wicket.dialog-mode`] if the action is for a domain object (entity or view model)
 +
 If the configuration property is not set, then sidebar is used.
 
-** `isis.viewer.wicket.dialogModeForMenu` if the action is for a domain service
+** xref:refguide:config:sections/isis.viewer.wicket.adoc#isis.viewer.wicket.dialog-mode-for-menu[`isis.viewer.wicket.dialog-mode-for-menu`] if the action is for a domain service
 +
 If the configuration property is not set, then modal is used.
 
 
-* If the attribute is not set at all, then the `isis.viewer.wicket.promptStyle` configuration property is used to specify the preferred prompt style.
+* if the attribute is not set at all, then thexref:refguide:config:sections/isis.viewer.wicket.adoc#isis.viewer.wicket.prompt-style[`isis.viewer.wicket.prompt-style`] configuration property is used to specify the preferred prompt style.
 +
 If the configuration property is not set, then an inline prompt is used.
 +
-And, if this _is_ set but is set to just `DIALOG`, then the `isis.viewer.wicket.dialogMode` configuration property determines which style.
+And, if this _is_ set but is set to just `DIALOG`, then the xref:refguide:config:sections/isis.viewer.wicket.adoc#isis.viewer.wicket.dialog-mode[`isis.viewer.wicket.dialog-mode`] configuration property determines which style.
 
 For example:
 
 [source,java]
 ----
+import lombok.Getter;
+import lombok.Setter;
+
 public class Customer {
 
-    public int getNotes(){ /* ... */ }
-    public void setNotes(String notes) { /* ... */ }
+    @Property(editing = Editing.DISABLED)           // <.>
+    @Getter @Setter
+    private String notes;
 
-    @MemberOrder(
-            named="notes",                          // <1>
-            sequence="1")
+    @Action(associateWith="notes")                  // <.>
     @ActionLayout(
-        promptStyle=PromptStyle.INLINE              // <2>
+        promptStyle=PromptStyle.INLINE              // <.>
     )
-    public int getNotes(){ /* ... */ }
-    public void setNotes(String notes) { /* ... */ }
+    public Customer updateNotes(String notes) {
+        // ...
+    }
+
 }
 ----
-<1> associate this action with the "notes" property
-<2> prompt for the action's parameters using an inline panel.
+
+<.> property is not editable
+<.> instead, associate this action with the "notes" property
+<.> prompt for the action's parameters using an inline panel.
 
 Exactly one action for a given property can be specified with `INLINE_AS_IF_EDIT`.
 Assuming that the corresponding property is not itself editable, this means that the property will be rendered as if it is editable, but the action's prompt form will be rendered instead.
 The net effect is that a property conceptually consisting of different parts (eg a name, an address or a date) can be updated using an action that lets each separate part be specified independently.
 
-
 == Alternatives
 
-
 As an alternative to using the annotation, the dynamic xref:userguide:fun:ui.adoc#object-layout[file-based layout] can be used instead.
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/redirect.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/redirect.adoc
index d7685fb..889e167 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/redirect.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/ActionLayout/redirect.adoc
@@ -16,7 +16,7 @@ This makes for a smoother UI.
 +
 [NOTE]
 ====
-Any properties with xref:refguide:applib-ant:PropertyLayout.adoc#unchanging[`@PropertyLayout#unchanging`] are _not_ updated.
+Any properties with xref:refguide:applib-ant:PropertyLayout.adoc#repainting[`@PropertyLayout#repainting`] set to `NO_REPAINT` are then _not_ updated.
 ====
 
 * if set to `EVEN_IF_SAME`, then a redirect occurs and a new web page is rendered.
@@ -29,18 +29,21 @@ For example:
 
 [source,java]
 ----
+import lombok.Getter;
+import lombok.Setter;
+
 public class Customer {
 
     @Getter @Setter
     @PropertyLayout(hidden=ALWAYS)
     private String layout;
 
-    public String layout() {                // <1>
+    public String layout() {                // <.>
         return layout;
     }
 
     @ActionLayout(
-        redirect=EVEN_IF_SAME               // <2>
+        redirect=EVEN_IF_SAME               // <.>
     )
     public Customer switchToEditMode() {
         setLayout("edit");
@@ -48,12 +51,12 @@ public class Customer {
     }
 }
 ----
-<1> specifies the alternate layout to use, eg `Customer-edit.layout.xml`.
-<2> even though this action returns the same target object, still re-render the page.
 
+<.> specifies the alternate layout to use, eg `Customer-edit.layout.xml`.
 
-If `switchToEditMode()` action is invoked, then the UI will attempt to render the customer using a `Customer.layout.edit.xml` layout file (instead of the default `Customer.layout.xml`).
+<.> even though this action returns the same target object, still re-render the page.
 
+If `switchToEditMode()` action is invoked, then the UI will attempt to render the customer using a `Customer.layout.edit.xml` layout file (instead of the default `Customer.layout.xml`).
 
 == Alternatives
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Collection/domainEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Collection/domainEvent.adoc
index 42dc0b1..cca7ae0 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Collection/domainEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Collection/domainEvent.adoc
@@ -14,8 +14,7 @@ In the cases of the domain object's collections, the events that are fired are:
 * pre-execute phase: before the modification of the collection
 * post-execute: after the modification of the collection
 
-Subscribers subscribe through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] using either link:https://github.com/google/guava[Guava] or link:http://www.axonframework.org/[Axon Framework] annotations and can influence each of these phases.
-
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`], and can influence each of these phases.
 
 [WARNING]
 ====
@@ -25,39 +24,48 @@ However, domain events are still relevant to determine if such collections shoul
 The workaround is to create add/remove actions and use xref:refguide:applib-ant:MemberOrder.adoc[UI hints] to render them close to the collection.
 ====
 
-By default the event raised is `CollectionDomainEvent.Default`. For example:
+By default the event raised is `CollectionDomainEvent.Default`.
+For example:
 
 [source,java]
 ----
+import lombok.Getter;
+import lombok.Setter;
+
 public class ToDoItem {
+
     @Collection()
-    public SortedSet<ToDoItem> getDependencies() { /* ... */ }
-    ...
+    @Getter @Setter
+    private SortedSet<ToDoItem> dependencies = ...
+
+    // ...
 }
 ----
 
 The `domainEvent` attribute allows a custom subclass to be emitted allowing more precise subscriptions (to those subclasses) to be defined instead.
 
-
 For example:
 
 [source,java]
 ----
 public class ToDoItem {
+
     public static class DependenciesChangedEvent
-            extends CollectionDomainEvent<ToDoItem, ToDoItem> { } // <1>
+            extends CollectionDomainEvent<ToDoItem, ToDoItem> { } // <.>
     @Collection(
         domainEvent=DependenciesChangedEvent.class
     )
-    public SortedSet<ToDoItem> getDependencies() { /* ... */ }
-    ...
+    @Getter @Setter
+    private SortedSet<ToDoItem> dependencies = ...
+
+    // ...
 }
 ----
-<1> inherit from `CollectionDomainEvent<T,E>` where `T` is the type of the domain object being interacted with, and `E` is the type of the element in the collection (both `ToDoItem` in this example)
 
+<.> inherit from `CollectionDomainEvent<T,E>` where `T` is the type of the domain object being interacted with, and `E` is the type of the element in the collection (both `ToDoItem` in this example)
 
-The benefit is that subscribers can be more targetted as to the events that they subscribe to.
 
+The benefit is that subscribers can be more targetted as to the events that they subscribe to.
 
 [NOTE]
 ====
@@ -65,27 +73,22 @@ The framework provides a no-arg constructor and will initialize the domain event
 This substantially reduces the boilerplate in the subclasses because no explicit constructor is required..
 ====
 
-
-
-
-
-
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below use the Guava API.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
 [source,java]
 ----
 import org.springframework.stereotype.Service;
+import org.springframework.context.event.EventListener;
 
 @Service
 public class SomeSubscriber {
-    @com.google.common.eventbus.Subscribe
+    @EventListener(CollectionDomainEvent.class)
     public void on(CollectionDomainEvent ev) {
-        ...
+        // ...
     }
 }
 ----
@@ -101,12 +104,11 @@ import org.springframework.stereotype.Service;
 public class SomeSubscriber {
     @EventListener(ToDoItem.DependenciesChangedEvent.class)
     public void on(ToDoItem.DependenciesChangedEvent ev) {
-        ...
+        // ...
     }
 }
 ----
 
-
 The subscriber's method is called (up to) 5 times:
 
 * whether to veto visibility (hide)
@@ -120,33 +122,40 @@ Thus the general form is:
 
 [source,java]
 ----
-@Programmatic
-@com.google.common.eventbus.Subscribe
-public void on(CollectionDomainEvent ev) {
-    switch(ev.getEventPhase()) {
-        case HIDE:
-            // call ev.hide() or ev.veto("") to hide the collection
-            break;
-        case DISABLE:
-            // call ev.disable("...") or ev.veto("...") to disable the collection
-            break;
-        case VALIDATE:
-            // call ev.invalidate("...") or ev.veto("...")
-            // if object being added/removed to collection is invalid
-            break;
-        case EXECUTING:
-            break;
-        case EXECUTED:
-            break;
+ import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SomeSubscriber {
+
+    @EventListener(CollectionDomainEvent.class)
+    public void on(CollectionDomainEvent ev) {
+        switch(ev.getEventPhase()) {
+
+            case HIDE:                      // <.>
+                break;
+            case DISABLE:                   // <.>
+                break;
+            case VALIDATE:                  // <.>
+                break;
+
+            case EXECUTING:
+                break;
+            case EXECUTED:
+                break;
+        }
     }
 }
 ----
 
-It is also possible to abort the transaction during the executing or executed phases by throwing an exception.
-If the exception is a subtype of `RecoverableException` then the exception will be rendered as a user-friendly warning (eg Growl/toast) rather than an error.
+<.> call `ev.hide()` or `ev.veto("")` to hide the collection
 
+<.> call `ev.disable("...")` or `ev.veto("...")` to disable the collection
 
+<.> call ev.invalidate("...") or ev.veto("...") if object being added/removed to collection is invalid
 
+It is also possible to abort the transaction during the executing or executed phases by throwing an exception.
+If the exception is a subtype of `RecoverableException` then the exception will be rendered as a user-friendly warning (eg Growl/toast) rather than an error.
 
 == Default, Doop and Noop events
 
@@ -159,16 +168,11 @@ The framework provides `CollectionDomainEvent.Doop` as such a subclass, so setti
 
 And, conversely, the framework also provides `CollectionDomainEvent.Noop`; if `domainEvent` attribute is set to this class, then no event will be posted.
 
-
-
-
-
 == Raising events programmatically
 
 Normally events are only raised for interactions through the UI.
 However, events can be raised programmatically either by calling the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] API directly, or by emulating the UI by wrapping the target object using the xref:refguide:applib-svc:WrapperFactory.adoc[`WrapperFactory`] domain service.
 
-
 == See also
 
 This attribute is also supported for:
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject.adoc
index 46b1aa2..6441fef 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject.adoc
@@ -21,7 +21,7 @@ xref:refguide:applib-svc:AuditerService.adoc[`AuditerService`](s)
 +
 Nominate a method on a domain service to be used for looking up instances of the domain object
 
-<.> xref:refguide:applib-ant:DomainObject.adoc#autocompleteaction[`autoCompleteAction()`]
+<.> xref:refguide:applib-ant:DomainObject.adoc#autoCompleteAction[`autoCompleteAction()`]
 +
 Override the method name to use on the auto-complete repository
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/autoCompleteRepository.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/autoCompleteRepository.adoc
index 7850c93..eb2c000 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/autoCompleteRepository.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/autoCompleteRepository.adoc
@@ -44,6 +44,7 @@ public class CustomerRepository {
 
 
 
+[#autoCompleteAction]
 == `autoCompleteAction()`
 
 As noted above, by default the method invoked on the repository is assumed to be called "autoComplete".  The optional `autoCompleteAction` attribute allows the method on the repository to be overridden.
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/createdLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/createdLifecycleEvent.adoc
index 74c7635..7523353 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/createdLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/createdLifecycleEvent.adoc
@@ -53,8 +53,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/loadedLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/loadedLifecycleEvent.adoc
index f6d1595..127d57c 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/loadedLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/loadedLifecycleEvent.adoc
@@ -44,8 +44,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below support both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistedLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistedLifecycleEvent.adoc
index 87a3b63..6d91d37 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistedLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistedLifecycleEvent.adoc
@@ -50,8 +50,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistingLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistingLifecycleEvent.adoc
index 2c06fa4..75335b8 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistingLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/persistingLifecycleEvent.adoc
@@ -52,8 +52,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/removingLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/removingLifecycleEvent.adoc
index 96d6a1b..1ec06a3 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/removingLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/removingLifecycleEvent.adoc
@@ -52,8 +52,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatedLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatedLifecycleEvent.adoc
index a8d87cd..eac4922 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatedLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatedLifecycleEvent.adoc
@@ -49,8 +49,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatingLifecycleEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatingLifecycleEvent.adoc
index df04910..5fd9d84 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatingLifecycleEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObject/updatingLifecycleEvent.adoc
@@ -53,8 +53,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/cssClassUiEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/cssClassUiEvent.adoc
index 89976dd..3016d69 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/cssClassUiEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/cssClassUiEvent.adoc
@@ -53,10 +53,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
-or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured)
-using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/iconUiEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/iconUiEvent.adoc
index b2e22d4..02ee65f 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/iconUiEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/iconUiEvent.adoc
@@ -54,8 +54,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/layoutUiEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/layoutUiEvent.adoc
index d30e4ce..e04acb6 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/layoutUiEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/layoutUiEvent.adoc
@@ -47,8 +47,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/titleUiEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/titleUiEvent.adoc
index d58d7ac..ab2913b 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/titleUiEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/DomainObjectLayout/titleUiEvent.adoc
@@ -54,8 +54,7 @@ The benefit is that subscribers can be more targeted as to the events that they
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below are compatible with both.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder.adoc
index 391c325..b2c6348 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder.adoc
@@ -20,7 +20,7 @@ All properties with this name will be grouped together.
 +
 Defines an ordering for members, within their container.
 
-As this is an important topic, there is a xref:vw:ROOT:layout.adoc[separate chapter] that discussed object layout in full.
+As this is an important topic, there is xref:userguide:fun:ui.adoc#object-layout[chapter] in the user guide that discusses object layout in full.
 
 
 [TIP]
@@ -30,3 +30,6 @@ The annotation is one of a handful (others including xref:refguide:applib-ant:Co
 ====
 
 
+include::MemberOrder/name.adoc[leveloffset=+1]
+include::MemberOrder/sequence.adoc[leveloffset=+1]
+
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/name.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/name.adoc
index e19a5bf..1632640 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/name.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/name.adoc
@@ -1,5 +1,4 @@
 [#name]
-[#name]
 = `name()`
 
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
@@ -10,5 +9,5 @@
 
 Broadly speaking the `name` attribute is used to group or associate members together.
 
-As this is an important topic, there is a xref:vw:ROOT:layout.adoc[separate chapter] that discussed object layout in full.
+As this is an important topic, there is xref:userguide:fun:ui.adoc#object-layout[chapter] in the user guide that discusses object layout in full.
 
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/sequence.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/sequence.adoc
index 9410976..e55a3db 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/sequence.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/MemberOrder/sequence.adoc
@@ -9,4 +9,4 @@
 
 Broadly speaking the `sequence` attribute orders members once they have been grouped.
 
-As this is an important topic, there is a xref:vw:ROOT:layout.adoc[separate chapter] that discussed object layout in full.
+As this is an important topic, there is xref:userguide:fun:ui.adoc#object-layout[chapter] in the user guide that discusses object layout in full.
diff --git a/api/applib/src/main/adoc/modules/applib-ant/pages/Property/domainEvent.adoc b/api/applib/src/main/adoc/modules/applib-ant/pages/Property/domainEvent.adoc
index 65e4ea1..45b3d33 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/pages/Property/domainEvent.adoc
+++ b/api/applib/src/main/adoc/modules/applib-ant/pages/Property/domainEvent.adoc
@@ -14,7 +14,7 @@ In the cases of the domain object's properties, the events that are fired are:
 * pre-execute phase: before the modification of the property
 * post-execute: after the modification of the property
 
-Subscribers subscribe through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] using either link:https://github.com/google/guava[Guava] or link:http://www.axonframework.org/[Axon Framework] annotations and can influence each of these phases.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`], and can influence each of these phases.
 
 By default the event raised is `PropertyDomainEvent.Default`.
 For example:
@@ -55,18 +55,18 @@ This substantially reduces the boilerplate in the subclasses because no explicit
 
 == Subscribers
 
-Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API or (if the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`] has been appropriately configured) using the link:http://www.axonframework.org/[Axon Framework] API.
-The examples below use the Guava API.
+Subscribers (which must be domain services) subscribe to events posted through the xref:refguide:applib-svc:EventBusService.adoc[`EventBusService`].
 
 Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
 
 [source,java]
 ----
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
 @Service
 public class SomeSubscriber {
-    @com.google.common.eventbus.Subscribe
+    @EventListener(PropertyDomainEvent.class)
     public void on(PropertyDomainEvent ev) {
         ...
     }
@@ -110,16 +110,14 @@ public class SomeSubscriber {
 
     public void on(PropertyDomainEvent ev) {
         switch(ev.getEventPhase()) {
-            case HIDE:
-                // call ev.hide() or ev.veto("") to hide the property
+
+            case HIDE:                      // <.>
                 break;
-            case DISABLE:
-                // call ev.disable("...") or ev.veto("...") to disable the property
+            case DISABLE:                   // <.>
                 break;
-            case VALIDATE:
-                // call ev.invalidate("...") or ev.veto("...")
-                // if proposed property value is invalid
+            case VALIDATE:                  // <.>
                 break;
+
             case EXECUTING:
                 break;
             case EXECUTED:
@@ -128,6 +126,10 @@ public class SomeSubscriber {
     }
 }
 ----
+<.> call `ev.hide()` or `ev.veto("")` to hide the property
+<.> call `ev.disable("...")` or `ev.veto("...")` to disable the property
+<.> call ev.invalidate("...") or ev.veto("...") if proposed new value for property is invalid
+
 
 It is also possible to abort the transaction during the executing or executed phases by throwing an exception.
 If the exception is a subtype of `RecoverableException` then the exception will be rendered as a user-friendly warning (eg Growl/toast) rather than an error.
diff --git a/api/applib/src/main/adoc/modules/applib-cm/pages/classes.adoc b/api/applib/src/main/adoc/modules/applib-cm/pages/classes.adoc
index 47b45c7..6da2e0a 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/pages/classes.adoc
+++ b/api/applib/src/main/adoc/modules/applib-cm/pages/classes.adoc
@@ -3,7 +3,7 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
 
-This chapter describes the usage of various classes and interfaces that are not otherwise associated with xref:refguide:applib-svc:about.adoc[domain services], xref:vw:ROOT:layout.adoc[object layout] or xref:refguide:config:about[configuration].
+This chapter describes the usage of various classes and interfaces that are not otherwise associated with xref:refguide:applib-svc:about.adoc[domain services], xref:userguide:fun:ui.adoc#object-layout[object layout] or xref:refguide:config:about[configuration].
 
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-cm/pages/methods/reserved/layout.adoc b/api/applib/src/main/adoc/modules/applib-cm/pages/methods/reserved/layout.adoc
index dd44024..8b4b14c 100644
--- a/api/applib/src/main/adoc/modules/applib-cm/pages/methods/reserved/layout.adoc
+++ b/api/applib/src/main/adoc/modules/applib-cm/pages/methods/reserved/layout.adoc
@@ -4,7 +4,7 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
 
-Every object has a xref:vw:ROOT:layout.adoc[layout] .
+Every object has a xref:userguide:fun:ui.adoc#object-layout[layout] .
 This may be specified using annotations such as xref:refguide:applib-ant:MemberOrder.adoc[`@MemberOrder`], xref:refguide:applib-ant:DomainObjectLayout.adoc[`@DomainObjectLayout`] and the like,  but it much more commonly specified using an xref:userguide:fun:ui.adoc#object-layout [XML layout file].
 
 The `layout` method allows the domain object to specify an alternate layout to its usual layout.
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/EventBusService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/EventBusService.adoc
index a0a559d..61c714f 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/EventBusService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/EventBusService.adoc
@@ -25,7 +25,6 @@ For more on this topic, see xref:refguide:applib-ant:Action.adoc#domainEvent[`@A
 It is also possible for domain objects to programmatically generate domain events.
 However the events are published, the primary use case is to decoupling interactions from one module/package/namespace and another.
 
-Two implementations are available, using either link:https://code.google.com/p/guava-libraries/[Guava]'s https://code.google.com/p/guava-libraries/wiki/EventBusExplained[`EventBus`], or alternatively using the link:http://www.axonframework.org/[AxonFramework]'s link:http://www.axonframework.org/docs/2.4/single.html#d5e1489[SimpleEventBus].  It is also possible to plug in a custom implementation.
 
 
 
diff --git a/api/applib/src/main/adoc/modules/applib-svc/pages/RepositoryService.adoc b/api/applib/src/main/adoc/modules/applib-svc/pages/RepositoryService.adoc
index db92fe3..be99b98 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/pages/RepositoryService.adoc
+++ b/api/applib/src/main/adoc/modules/applib-svc/pages/RepositoryService.adoc
@@ -8,8 +8,8 @@ WARNING: TODO - to review for v2.
 The `RepositoryService` collects together methods for creating, persisting and searching for entities from the underlying persistence store.
 It acts as an abstraction over the JDO/DataNucleus objectstore.
 
-You can use it during prototyping to write naive queries (find all rows, then filter using the Guava `Predicate` API, or you can use it to call JDO link:http://www.datanucleus.org/products/accessplatform_4_0/jdo/query.html#named[named queries] using JDOQL.
-
+You can use it during prototyping to write naive queries, or you can use it to call the ORM (such as
+xref:pjdo:ROOT:about.adoc[JDO/DataNucleus]).
 
 
 == API
diff --git a/core/adoc/modules/archdesign/partials/module-nav.adoc b/core/adoc/modules/archdesign/partials/module-nav.adoc
index cb14d88..2e75d9f 100644
--- a/core/adoc/modules/archdesign/partials/module-nav.adoc
+++ b/core/adoc/modules/archdesign/partials/module-nav.adoc
@@ -3,7 +3,7 @@
 
 * xref:core:archdesign:about.adoc[Architecture & Design]
 
-** xref:core:archdesign:maven-modules.adoc[Maven Modules]
+//** xref:core:archdesign:maven-modules.adoc[Maven Modules]
 ** xref:core:archdesign:metamodel.adoc[MetaModel]
 ** xref:core:archdesign:webmodules.adoc[Web Modules]
 
diff --git a/core/config/src/main/adoc/modules/config/pages/application-specific/application-css.adoc b/core/config/src/main/adoc/modules/config/pages/application-specific/application-css.adoc
new file mode 100644
index 0000000..454e1c8
--- /dev/null
+++ b/core/config/src/main/adoc/modules/config/pages/application-specific/application-css.adoc
@@ -0,0 +1,33 @@
+[#application-css]
+= `application.css`
+
+:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
+
+All of the layout annotations provide the ability to specify adhoc CSS classes, associated with the corresponding element:
+
+* xref:refguide:applib-ant:DomainObjectLayout.adoc#cssClass[`@DomainObjectLayout#cssClass()`]
+* xref:refguide:applib-ant:ActionLayout.adoc#cssClass[`@ActionLayout#cssClass()`]
+* xref:refguide:applib-ant:PropertyLayout.adoc#cssClass[`@PropertyLayout#cssClass()`]
+* xref:refguide:applib-ant:CollectionLayout.adoc#cssClass[`@CollectionLayout#cssClass()`]
+
+CSS can also be specified using the xref:userguide:fun:ui.adoc#object-layout[`Xxx.layout.xml`] layout files.
+The viewer can then use this information within the rendered page.
+For example, the xref:vw:ROOT:about.adoc[Wicket Viewer] adds the CSS as a style in a containing `<div>` for each element.
+
+The serving of the CSS (containing the style definitions) is also viewer-specific.
+In the case of the xref:vw:ROOT:about.adoc[Wicket Viewer] it uses Spring Boot to serve the CSS file, under `static` package on the classpath.
+
+The name of the file under `static` is configurable, in either `application.yml` or `application.properties`.
+For example, the xref:docs:starters:simpleapp.adoc[SimpleApp] starter app uses `application.yml`:
+
+[source,yaml]
+.application.yml
+----
+isis:
+  viewer:
+    wicket:
+      application:
+        css: css/application.css
+----
+
+This corresponds to the `static/css/application.css` (in `src/main/resources` in the simpleapp's webapp module).
diff --git a/viewers/wicket/adoc/modules/ROOT/pages/customisation/tweaking-css-classes.adoc b/viewers/wicket/adoc/modules/ROOT/pages/customisation/tweaking-css-classes.adoc
index 5f1bced..9afa98f 100644
--- a/viewers/wicket/adoc/modules/ROOT/pages/customisation/tweaking-css-classes.adoc
+++ b/viewers/wicket/adoc/modules/ROOT/pages/customisation/tweaking-css-classes.adoc
@@ -5,7 +5,9 @@
 
 
 
-The HTML generated by the Wicket viewer include plenty of CSS classes so that you can easily target the required elements as required. For example, you could use CSS to suppress the entity's icon alongside its title. This would be done using:
+The HTML generated by the Wicket viewer include plenty of CSS classes so that you can easily target the required elements as required.
+For example, you could use CSS to suppress the entity's icon alongside its title.
+This would be done using:
 
 [source,css]
 ----
@@ -16,11 +18,10 @@ The HTML generated by the Wicket viewer include plenty of CSS classes so that yo
 
 These customizations should generally be added to xref:refguide:config:application-specific/application-css.adoc[`application.css]`; this file is included by default in every webpage served up by the Wicket viewer.
 
-
-
 == Individual members
 
-For example, the `ToDoItem` object of the example https://github.com/apache/isis-app-todoapp/[TodoApp] has a `notes` property. The HTML for this will be something like:
+For example, the `ToDoItem` object of the example https://github.com/apache/isis-app-todoapp/[TodoApp] has a `notes` property.
+The HTML for this will be something like:
 
 [source,html]
 ----
@@ -43,7 +44,8 @@ For example, the `ToDoItem` object of the example https://github.com/apache/isis
 </div>
 ----
 
-The xref:refguide:config:application-specific/application-css.adoc[`application.css`] file is the place to add application-specific styles. By way of an example, if (for some reason) we wanted to completely hide the notes value, we could do so using:
+The xref:refguide:config:application-specific/application-css.adoc[`application.css`] file is the place to add application-specific styles.
+By way of an example, if (for some reason) we wanted to completely hide the notes value, we could do so using:
 
 [source,css]
 ----
@@ -54,9 +56,6 @@ div.ToDoItem-notes span.scalarValue {
 
 You can use a similar approach for collections and actions.
 
-
-
-
 == Custom CSS styles
 
 The above technique works well if you know the class member to target, but you might instead want to apply a custom style to a set of members.
@@ -94,32 +93,25 @@ div.x-myapp-highlight span.scalarName {
 
 Note also that instead of using `@PropertyLayout(cssClass=...)` annotation, you can also specify the CSS style using a xref:userguide:fun:ui.adoc#object-layout[layout file].
 
-
-
-
 == Table columns
 
-Sometimes you may want to apply styling to specific columns of tables.  For example, you might want to adjust width so that
-for certain properties have more (or less) room than they otherwise would; or you might want to hide the column
-completely.  This also applies to the initial icon/title column.
+Sometimes you may want to apply styling to specific columns of tables.
+For example, you might want to adjust width so that for certain properties have more (or less) room than they otherwise would; or you might want to hide the column completely.
+This also applies to the initial icon/title column.
 
 There is also the issue of scoping:
 
-* You may wish the style to apply globally: that is, dependent on the type of entity being rendered in the table,
-irrespective of the page on which it is shown.
+* You may wish the style to apply globally: that is, dependent on the type of entity being rendered in the table, irrespective of the page on which it is shown.
 
-* Alternativel, you may wish to target the CSS for a table as rendered either as a parented collection (owned by some
-other entity) or rendered as a standarlone collection (the result of invoking an action).
+* Alternativel, you may wish to target the CSS for a table as rendered either as a parented collection (owned by some other entity) or rendered as a standarlone collection (the result of invoking an action).
 
 In each of these cases the Wicket viewer adds CSS classes either to containing ``div``s or to the ``<th>`` and ``<td>``
- elements of the table itself so that it can custom styles can be appropriately targetted.
-
-
+elements of the table itself so that it can custom styles can be appropriately targetted.
 
 === Applying styles globally
 
-Every rendered collection containing a domain class will be wrapped in a `<div>` that lists that domain class (in CSS safe
-form).  For example:
+Every rendered collection containing a domain class will be wrapped in a `<div>` that lists that domain class (in CSS safe form).
+For example:
 
 [source,xml]
 ----
@@ -153,10 +145,8 @@ Using this, the `lastName` property could be targeted using:
 }
 ----
 
-
 === Parented collections
 
-
 Parented collections will be wrapped in ``<div>``s that identify both the entity type and also the collection Id.
 For example:
 
@@ -198,11 +188,10 @@ Using this, the `productRef` property could be targeted using:
 }
 ----
 
-
-
 === Standalone collections
 
-Standalone collections will be wrapped in a ``<div>`` that identifies the action invoked.  For example:
+Standalone collections will be wrapped in a ``<div>`` that identifies the action invoked.
+For example:
 
 [source,xml]
 ----
diff --git a/viewers/wicket/adoc/modules/ROOT/partials/module-nav.adoc b/viewers/wicket/adoc/modules/ROOT/partials/module-nav.adoc
index 8133c7b..5add83e 100644
--- a/viewers/wicket/adoc/modules/ROOT/partials/module-nav.adoc
+++ b/viewers/wicket/adoc/modules/ROOT/partials/module-nav.adoc
@@ -1,7 +1,6 @@
 
 
 
-* xref:vw:ROOT:layout.adoc[Layout]
 * xref:vw:ROOT:configuration-properties.adoc[Configuration Properties]
 * xref:vw:ROOT:features.adoc[End-user Features]
 * xref:vw:ROOT:security.adoc[Security]