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 2022/09/01 09:36:49 UTC

[isis] branch ISIS-3197 created (now e44e411a5a)

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

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


      at e44e411a5a ISIS-3197: adds support for datatables.net

This branch includes the following new commits:

     new e44e411a5a ISIS-3197: adds support for datatables.net

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[isis] 01/01: ISIS-3197: adds support for datatables.net

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e44e411a5a33c4e3186eed0855768a517003a39f
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Sep 1 10:33:22 2022 +0100

    ISIS-3197: adds support for datatables.net
---
 .../isis/applib/annotation/ActionLayout.java       |   1 +
 .../isis/applib/annotation/CollectionLayout.java   |   9 ++
 .../isis/applib/annotation/DomainObjectLayout.java |   8 ++
 .../isis/applib/annotation/TableDecoration.java    |  60 ++++++++
 bom/pom.xml                                        |   2 +
 .../apache/isis/core/config/IsisConfiguration.java | 157 ++++++++++++++-------
 ...shingPolicies.java => ActionConfigOptions.java} |  57 ++------
 ...ies.java => CollectionLayoutConfigOptions.java} |  41 ++++--
 ...uration.java => DomainObjectConfigOptions.java} |  22 +--
 ...s.java => DomainObjectLayoutConfigOptions.java} |  30 ++--
 ...erPolicies.java => ParameterConfigOptions.java} |   4 +-
 ...nfiguration.java => PropertyConfigOptions.java} |  21 +--
 .../actions/layout/ActionLayoutFacetFactory.java   |   1 +
 .../layout/CollectionLayoutFacetFactory.java       |   8 ++
 .../PagedFacetForCollectionLayoutAnnotation.java   |  11 +-
 ...agedFacetOverriddenByDataTablesDecoration.java} |  17 +--
 .../CollectionLayoutTableDecorationFacet.java      |  75 ++++++++++
 ...lectionLayoutTableDecorationFacetAbstract.java} |  16 +--
 ...orationFacetForCollectionLayoutAnnotation.java} |  12 +-
 ...ForCollectionLayoutAnnotationAsConfigured.java} |  12 +-
 ...youtTableDecorationFacetFromConfiguration.java} |  12 +-
 .../CommandPublishingFacetForActionAnnotation.java |   4 +-
 ...ommandPublishingFacetForPropertyAnnotation.java |   4 +-
 ...onPublishingActionFacetForActionAnnotation.java |   4 +-
 ...blishingPropertyFacetForPropertyAnnotation.java |   4 +-
 .../ImmutableFacetForDomainObjectAnnotation.java   |   4 +-
 ...gePublishingFacetForDomainObjectAnnotation.java |   4 +-
 .../DomainObjectLayoutFacetFactory.java            |   5 +
 .../PagedFacetForDomainObjectLayoutAnnotation.java |  12 +-
 ...agedFacetOverriddenByDataTablesDecoration.java} |  13 +-
 .../DomainObjectLayoutTableDecorationFacet.java    |  74 ++++++++++
 ...nObjectLayoutTableDecorationFacetAbstract.java} |  16 +--
 ...ationFacetForDomainObjectLayoutAnnotation.java} |  12 +-
 ...rDomainObjectLayoutAnnotationAsConfigured.java} |  12 +-
 ...youtTableDecorationFacetFromConfiguration.java} |  12 +-
 .../metamodel/facets/object/paged/PagedFacet.java  |  14 --
 ...ActionFacetForActionAnnotationAsConfigured.java |   4 +-
 .../depdef/ParameterDependentDefaultsFacet.java    |  13 +-
 .../ParameterDependentDefaultsFacetAbstract.java   |   6 +-
 ...pendentDefaultsFacetForParameterAnnotation.java |   4 +-
 ...terDependentDefaultsFacetFromConfiguration.java |   4 +-
 .../apache/isis/core/metamodel/util/Facets.java    |   6 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |   4 +-
 ...tationFacetFactoryTest_executionPublishing.java |  26 ++--
 .../DomainObjectAnnotationFacetFactoryTest.java    |  29 ++--
 core/pom.xml                                       |   6 +
 viewers/wicket/ui/pom.xml                          |  37 ++---
 .../entity/collection/EntityCollectionPanel.java   |   7 +
 .../StandaloneCollectionPanel.java                 |   6 +
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  11 ++
 .../bootstrap/css/bootstrap-overrides-all-v2.css   |  18 ++-
 .../DatatablesCssBootstrap5ReferenceWkt.java       |  48 +++++++
 .../datatables/DatatablesCssReferenceWkt.java      |  48 +++++++
 ...DatatablesJavaScriptBootstrap5ReferenceWkt.java |  49 +++++++
 .../DatatablesJavaScriptReferenceWkt.java          |  49 +++++++
 .../DatatablesJavaScriptResourceReferenceInit.java |  75 ++++++++++
 .../ui/pages/common/datatables/dataTables.init.js  |  14 +-
 .../common/viewer/js/jquery.isis.wicket.viewer.js  |   7 +-
 .../config/WicketViewerCssBundleInit.java          |   2 +
 59 files changed, 922 insertions(+), 321 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index fece9cda9a..6eeadfa62f 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -261,4 +261,5 @@ public @interface ActionLayout {
     String sequence()
             default "";
 
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
index f02ced6c30..ee703ec938 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
@@ -59,6 +59,7 @@ public @interface CollectionLayout {
     String cssClass()
             default "";
 
+
     /**
      * Indicates which view is used by default to render the collection.
      *
@@ -167,4 +168,12 @@ public @interface CollectionLayout {
     Class<? extends Comparator> sortedBy()
             default Comparator.class;
 
+    /**
+     * Whether a parented collection when represented in a table form should additionally be
+     * &quot;decorated&quot; with client-side (javascript) enhancements, for example to enable paging and filtering.
+     */
+    TableDecoration tableDecoration()
+            default TableDecoration.NOT_SPECIFIED;
+
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
index 5eeeb6dd27..56b2df4d75 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
@@ -140,6 +140,14 @@ public @interface DomainObjectLayout {
     String plural()
             default "";
 
+    /**
+     * Whether a standalone collection when represented in a table form should additionally be
+     * &quot;decorated&quot; with client-side (javascript) enhancements, for example to enable paging and filtering.
+     */
+    TableDecoration tableDecoration()
+            default TableDecoration.NOT_SPECIFIED;
+
+
     /**
      * Which subclass of {@link CssClassUiEvent} should be used to obtain a CSS class.
      *
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/TableDecoration.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/TableDecoration.java
new file mode 100644
index 0000000000..b350c45c67
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/TableDecoration.java
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.annotation;
+
+/**
+ * The options for defining how a parented or standalone collection when represented in a table form should additionally
+ * be &quot;decorated&quot; with client-side (javascript) enhancements.
+ *
+ * <p>
+ *     This is supported by the Wicket viewer, the principle use case being to enable <a href="https://datatables.net>datatables.net</a>
+ *     to be used for client-side paging and filtering.
+ * </p>
+ *
+ * @since 1.x {@index}
+ */
+public enum TableDecoration {
+
+    /**
+     * The collection's table representation should be decorated, if at all, as configured in <tt>application.properties</tt>.
+     *
+     * <p>
+     *     If there is no configuration, then default to use {@link TableDecoration#NONE no} decoration.
+     * </p>
+     */
+    AS_CONFIGURED,
+
+    /**
+     * If this option declares that the collection's table representation should not be decorated.
+     */
+    NONE,
+
+    /**
+     * If this option declares that the collection's table representation be decorated using
+     * <a href="https://datatables.net>datatables.net</a> for client-side paging and filtering.
+     */
+    DATATABLES_NET,
+
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
+
+}
diff --git a/bom/pom.xml b/bom/pom.xml
index fe4b1d6693..a67a0a4c54 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -348,6 +348,8 @@ It is therefore a copy of org.apache:apache, with customisations clearly identif
         <datanucleus-maven-plugin.version>6.0.0-release</datanucleus-maven-plugin.version>
         <datanucleus-rdbms.version>6.0.1</datanucleus-rdbms.version>
 
+        <datatables.version>1.12.1</datatables.version>
+
         <docx4j.version>11.3.2</docx4j.version>
 
         <easymock.version>4.3</easymock.version>
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index fc578dbed0..6679ae37f9 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -49,7 +49,8 @@ import org.springframework.validation.annotation.Validated;
 
 import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.DependentDefaultsPolicy;
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -63,12 +64,12 @@ import org.apache.isis.applib.services.userui.UserMenu;
 import org.apache.isis.applib.value.semantics.TemporalValueSemantics.TemporalEditingPattern;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.core.config.metamodel.facets.DefaultViewConfiguration;
-import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies.ActionPublishingPolicy;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies.EntityChangePublishingPolicy;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies.PropertyPublishingPolicy;
+import org.apache.isis.core.config.metamodel.facets.ActionConfigOptions;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectLayoutConfigOptions;
+import org.apache.isis.core.config.metamodel.facets.CollectionLayoutConfigOptions;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectConfigOptions;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
+import org.apache.isis.core.config.metamodel.facets.PropertyConfigOptions;
 import org.apache.isis.core.config.metamodel.services.ApplicationFeaturesInitConfiguration;
 import org.apache.isis.core.config.metamodel.specloader.IntrospectionMode;
 import org.apache.isis.core.config.viewer.web.DialogMode;
@@ -133,7 +134,7 @@ public class IsisConfiguration {
              * Setting this option to {@literal true} allows {@code CsrfFilter}(s) to be
              * configured. Yet EXPERIMENTAL.
              *
-             * @see org.springframework.security.web.csrf.CsrfFilter
+             * @see <code>org.springframework.security.web.csrf.CsrfFilter</code>
              * @see "https://www.baeldung.com/spring-security-registered-filters"
              */
             private boolean allowCsrfFilters = false;
@@ -272,7 +273,7 @@ public class IsisConfiguration {
                  *     Note: this applies only to domain entities, not view models.
                  * </p>
                  */
-                private EntityChangePublishingPolicy entityChangePublishing = EntityChangePublishingPolicy.NONE;
+                private DomainObjectConfigOptions.EntityChangePublishingPolicy entityChangePublishing = DomainObjectConfigOptions.EntityChangePublishingPolicy.NONE;
 
                 /**
                  * The default for whether the properties of domain objects can be edited, or whether instead they
@@ -282,7 +283,7 @@ public class IsisConfiguration {
                  * This setting can be overridden on a case-by-case basis using {@link DomainObject#getEditing()  DomainObject#getEditing()}
                  * </p>
                  */
-                private EditingObjectsConfiguration editing = EditingObjectsConfiguration.FALSE;
+                private DomainObjectConfigOptions.EditingObjectsConfiguration editing = DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE;
 
                 private final CreatedLifecycleEvent createdLifecycleEvent = new CreatedLifecycleEvent();
                 @Data
@@ -561,6 +562,12 @@ public class IsisConfiguration {
                  */
                 private int paged = 25;
 
+                /**
+                 * Defines whether the table representation of a standalone collection of this domain class should be
+                 * decorated using a client-side Javascript library, eg for client-side paging and filtering.
+                 */
+                private DomainObjectLayoutConfigOptions.TableDecoration tableDecoration = DomainObjectLayoutConfigOptions.TableDecoration.NONE;
+
                 private final CssClassUiEvent cssClassUiEvent = new CssClassUiEvent();
                 @Data
                 public static class CssClassUiEvent {
@@ -749,7 +756,7 @@ public class IsisConfiguration {
                  *  {@link org.apache.isis.applib.annotation.Action#commandPublishing()}.
                  * </p>
                  */
-                private ActionPublishingPolicy commandPublishing = ActionPublishingPolicy.NONE;
+                private ActionConfigOptions.PublishingPolicy commandPublishing = ActionConfigOptions.PublishingPolicy.NONE;
 
                 /**
                  * The default for whether action invocations should be sent through to the
@@ -767,7 +774,7 @@ public class IsisConfiguration {
                  *  This setting can be overridden on a case-by-case basis using {@link org.apache.isis.applib.annotation.Action#executionPublishing()  Action#executionPublishing()}.
                  * </p>
                  */
-                private ActionPublishingPolicy executionPublishing = ActionPublishingPolicy.NONE;
+                private ActionConfigOptions.PublishingPolicy executionPublishing = ActionConfigOptions.PublishingPolicy.NONE;
 
                 private final DomainEvent domainEvent = new DomainEvent();
                 @Data
@@ -841,6 +848,7 @@ public class IsisConfiguration {
                     @Getter(lazy = true)
                     private final Map<Pattern, String> patternsAsMap = asMap(getPatterns());
 
+
                 }
 
                 private final CssClassFa cssClassFa = new CssClassFa();
@@ -919,7 +927,6 @@ public class IsisConfiguration {
             public static class Property {
 
                 /**
-                 * TODO[2464] semantic renaming audit/dispatch -> publishing
                  * The default for whether property edits should be reified
                  * as a {@link org.apache.isis.applib.services.command.Command},
                  * to be sent to any registered
@@ -929,18 +936,17 @@ public class IsisConfiguration {
                  *
                  * <p>
                  *  This setting can be overridden on a case-by-case basis using
-                 *  {@link org.apache.isis.applib.annotation.Property#commandDispatch()}.
+                 *  {@link org.apache.isis.applib.annotation.Property#commandPublishing()}.
                  * </p>
                  */
-                private PropertyPublishingPolicy commandPublishing = PropertyPublishingPolicy.NONE;
+                private PropertyConfigOptions.PublishingPolicy commandPublishing = PropertyConfigOptions.PublishingPolicy.NONE;
 
                 /**
-                 * TODO[2464] semantic renaming audit/dispatch -> publishing
                  * The default for whether property edits should be sent through to the
                  * {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber} for publishing.
                  *
                  * <p>
-                 * The service's {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber#publish(Execution) publish}
+                 * The service's {@link org.apache.isis.applib.services.publishing.spi.ExecutionSubscriber#onExecution(Execution)}  publish}
                  * method is called only once per transaction, with
                  * {@link Execution} collecting details of
                  * the identity of the target object, the property edited, and the new value of the property.
@@ -948,10 +954,10 @@ public class IsisConfiguration {
                  *
                  * <p>
                  * This setting can be overridden on a case-by-case basis using
-                 * {@link org.apache.isis.applib.annotation.Property#publishing()}.
+                 * {@link org.apache.isis.applib.annotation.Property#executionPublishing()}.
                  * </p>
                  */
-                private PropertyPublishingPolicy executionPublishing = PropertyPublishingPolicy.NONE;
+                private PropertyConfigOptions.PublishingPolicy executionPublishing = PropertyConfigOptions.PublishingPolicy.NONE;
 
                 private final DomainEvent domainEvent = new DomainEvent();
                 @Data
@@ -1076,7 +1082,7 @@ public class IsisConfiguration {
                  *     view.
                  * </p>
                  */
-                private DefaultViewConfiguration defaultView = DefaultViewConfiguration.TABLE;
+                private CollectionLayoutConfigOptions.DefaultView defaultView = CollectionLayoutConfigOptions.DefaultView.TABLE;
 
                 /**
                  * Defines the default number of objects that are shown in a &quot;parented&quot; collection of a
@@ -1089,6 +1095,13 @@ public class IsisConfiguration {
                  * </p>
                  */
                 private int paged = 12;
+
+                /**
+                 * Defines whether the table representation of a collection should be decorated using a client-side
+                 * Javascript library, eg for client-side paging and filtering.
+                 */
+                private CollectionLayoutConfigOptions.TableDecoration tableDecoration = CollectionLayoutConfigOptions.TableDecoration.NONE;
+
             }
 
             private final ViewModel viewModel = new ViewModel();
@@ -1102,10 +1115,8 @@ public class IsisConfiguration {
                     public static class SemanticChecking {
                         /**
                          * Whether to check for inconsistencies between the usage of
-                         * {@link org.apache.isis.applib.annotation.DomainObject},
-                         * {@link org.apache.isis.applib.annotation.ViewModel},
-                         * {@link org.apache.isis.applib.annotation.DomainObjectLayout} and
-                         * {@link org.apache.isis.applib.annotation.ViewModelLayout}.
+                         * {@link org.apache.isis.applib.annotation.DomainObject} and
+                         * {@link org.apache.isis.applib.annotation.DomainObjectLayout}.
                           */
                         private boolean enable = false;
                     }
@@ -1123,15 +1134,16 @@ public class IsisConfiguration {
                      * Influences whether an {@link org.apache.isis.applib.events.ui.CssClassUiEvent} should
                      * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
                      * whenever a view model (annotated with
-                     * {@link org.apache.isis.applib.annotation.ViewModel @ViewModel}) is about to be rendered in the
+                     * {@link org.apache.isis.applib.annotation.DomainObject#nature() @DomainObject#nature} of
+                     * {@link org.apache.isis.applib.annotation.Nature#VIEW_MODEL}) is about to be rendered in the
                      * UI - thereby allowing subscribers to optionally
                      * {@link org.apache.isis.applib.events.ui.CssClassUiEvent#setCssClass(String)} change) the CSS
                      * classes that are used.
                      *
                      * <p>
                      *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
-                     *     {@link org.apache.isis.applib.annotation.ViewModelLayout#cssClassUiEvent()}  @ViewModelLayout(cssClassEvent=...)} for the
-                     *     domain object in question:
+                     *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#cssClassUiEvent() @DomainObjectLayout(cssClassEvent=...)}
+                     *     for the domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -1160,15 +1172,16 @@ public class IsisConfiguration {
                      * Influences whether an {@link org.apache.isis.applib.events.ui.IconUiEvent} should
                      * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
                      * whenever a view model (annotated with
-                     * {@link org.apache.isis.applib.annotation.ViewModel @ViewModel}) is about to be rendered in the
+                     * {@link org.apache.isis.applib.annotation.DomainObject#nature() @DomainObject#nature} of
+                     * {@link org.apache.isis.applib.annotation.Nature#VIEW_MODEL})  is about to be rendered in the
                      * UI - thereby allowing subscribers to optionally
                      * {@link org.apache.isis.applib.events.ui.IconUiEvent#setIconName(String)} change) the icon that
                      * is used.
                      *
                      * <p>
                      *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
-                     *     {@link org.apache.isis.applib.annotation.ViewModelLayout#iconUiEvent()}  @ViewModelLayout(iconEvent=...)} for the
-                     *     domain object in question:
+                     *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent() @ViewModelLayout(iconEvent=...)}
+                     *     for the domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -1197,7 +1210,8 @@ public class IsisConfiguration {
                      * Influences whether an {@link org.apache.isis.applib.events.ui.LayoutUiEvent} should
                      * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
                      * whenever a view model (annotated with
-                     * {@link org.apache.isis.applib.annotation.ViewModel @ViewModel}) is about to be rendered in the
+                     * {@link org.apache.isis.applib.annotation.DomainObject#nature() @DomainObject#nature} of
+                     * {@link org.apache.isis.applib.annotation.Nature#VIEW_MODEL})  is about to be rendered in the
                      * UI - thereby allowing subscribers to optionally
                      * {@link org.apache.isis.applib.events.ui.LayoutUiEvent#setLayout(String)} change) the layout that is used.
                      *
@@ -1208,8 +1222,8 @@ public class IsisConfiguration {
                      *
                      * <p>
                      *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
-                     *     {@link org.apache.isis.applib.annotation.ViewModelLayout#layoutUiEvent()}  @ViewModelLayout(layoutEvent=...)} for the
-                     *     domain object in question:
+                     *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#layoutUiEvent() @DomainObjectLayout(layoutEvent=...)}
+                     *     for the domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -1238,14 +1252,15 @@ public class IsisConfiguration {
                      * Influences whether an {@link org.apache.isis.applib.events.ui.TitleUiEvent} should
                      * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
                      * whenever a view model (annotated with
-                     * {@link org.apache.isis.applib.annotation.ViewModel @ViewModel}) is about to be rendered in the
+                     * {@link org.apache.isis.applib.annotation.DomainObject#nature() @DomainObject#nature} of
+                     * {@link org.apache.isis.applib.annotation.Nature#VIEW_MODEL})  is about to be rendered in the
                      * UI - thereby allowing subscribers to
                      * optionally {@link org.apache.isis.applib.events.ui.TitleUiEvent#setTitle(String)} change)
                      * the title that is used.
                      *
                      * <p>
                      *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
-                     *     {@link org.apache.isis.applib.annotation.ViewModelLayout#titleUiEvent()}  @ViewModelLayout(titleEvent=...)} for the
+                     *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent() @DomainObjectLayout(titleEvent=...)} for the
                      *     domain object in question:
                      * </p>
                      *
@@ -1283,7 +1298,7 @@ public class IsisConfiguration {
                  *     {@link org.apache.isis.applib.annotation.Parameter#dependentDefaultsPolicy() Parameter#dependentDefaultsPolicy()}.
                  * </p>
                  */
-                private ParameterPolicies.DependentDefaultsPolicy dependentDefaultsPolicy = ParameterPolicies.DependentDefaultsPolicy.UPDATE_DEPENDENT;
+                private ParameterConfigOptions.DependentDefaultsPolicy dependentDefaultsPolicy = ParameterConfigOptions.DependentDefaultsPolicy.UPDATE_DEPENDENT;
 
             }
 
@@ -1791,7 +1806,7 @@ public class IsisConfiguration {
             /**
              * Vendor specific SQL syntax to create a DB schema.
              * <p>
-             * This template is passed through {@link String#format(String, schemaName)} to
+             * This template is passed through {@link String#format(String, Object...)} to
              * make the actual SQL statement thats to be used against the configured data-source.
              * <p>
              * Default template is {@literal CREATE SCHEMA IF NOT EXISTS %S} with the schema name
@@ -2622,6 +2637,49 @@ public class IsisConfiguration {
                 }
             }
 
+            private final Table table = new Table();
+            @Data
+            public static class Table {
+
+                private final Decoration decoration = new Decoration();
+                @Data
+                public static class Decoration {
+
+                    private final DataTablesNet dataTablesNet = new DataTablesNet();
+                    @Data
+                    public static class DataTablesNet {
+
+                        /**
+                         * If specified, then the string is passed verbatim as the initialization options for the
+                         * <a href="https://datatables.net">https://datatables.net</a> table decoration
+                         * (as defined by {@link DomainObjectLayout#tableDecoration()} or by
+                         * {@link CollectionLayout#tableDecoration()}).
+                         *
+                         * <p>
+                         *     For example, a value of "info: false, pagingType: 'numbers'" will result in
+                         *     datatables.net being initialized using:
+                         *
+                         *     <pre>
+                         *     $(document).ready(function () {
+                         *       $('table.table-decoration').DataTable({
+                         *         info: false, pagingType: 'numbers'
+                         *       });
+                         *     });
+                         *     </pre>
+                         *     thus switching off the info panel and using the simple 'numbers' paging type.
+                         * </p>
+                         *
+                         * @see <a href="https://datatables.net/examples/basic_init/index.html">https://datatables.net/examples/basic_init/index.html</a>
+                         */
+                        private Optional<String> options = Optional.empty();
+
+                    }
+
+                }
+
+
+            }
+
         }
     }
 
@@ -2684,9 +2742,8 @@ public class IsisConfiguration {
 
 
                 /**
-                 * How to handle objects that are to be
-                 * {@link FixtureScripts#newFixtureResult(FixtureScript, String, Object, boolean) added}
-                 * into a {@link FixtureResult} but which are not yet persisted.
+                 * How to handle objects that are to be added into a <code>FixtureResult</code> but which are not yet
+                 * persisted.
                  */
                 public enum NonPersistedObjectsStrategy {
                     PERSIST,
@@ -2697,11 +2754,10 @@ public class IsisConfiguration {
                  * How to handle fixture scripts that are submitted to be executed more than once.
                  *
                  * <p>
-                 *     Note that this is a {@link FixtureScripts#getMultipleExecutionStrategy() global setting} of the
-                 *     {@link FixtureScripts} service; there isn't (currently) any way to mix-and-match fixture scripts that are
-                 *     written with differing semantics in mind.  Ideally it should be the responsibility of the fixture script
-                 *     itself to determine whether it should be run.  As a partial solution to this, the
-                 *
+                 *     Note that this is a global setting of the <code>FixtureScripts</code> service; there isn't
+                 *     (currently) any way to mix-and-match fixture scripts that are written with differing semantics
+                 *     in mind.  Ideally it should be the responsibility of the fixture script itself to determine
+                 *     whether it should be run.
                  * </p>
                  */
                 public enum MultipleExecutionStrategy {
@@ -2776,7 +2832,7 @@ public class IsisConfiguration {
                  *
                  * <p>
                  * Note that this policy can be overridden on a fixture-by-fixture basis if the fixture implements
-                 * {@link FixtureScriptWithExecutionStrategy}.
+                 * <code>FixtureScriptWithExecutionStrategy</code>.
                  * </p>
                  */
                 private MultipleExecutionStrategy multipleExecutionStrategy = MultipleExecutionStrategy.EXECUTE_ONCE_BY_CLASS;
@@ -3162,7 +3218,8 @@ public class IsisConfiguration {
              * whether to prefer to allow the permission or to veto it.
              *
              * <p>
-             *     This is only used if a {@link org.apache.isis.extensions.secman.applib.permission.spi.PermissionsEvaluationService} has not been declared explicitly.
+             *     This is only used an implementation of secman's <code>PermissionsEvaluationService</code> SPI has
+             *     not been provided explicitly.
              * </p>
              */
             private PermissionsEvaluationPolicy permissionsEvaluationPolicy = PermissionsEvaluationPolicy.ALLOW_BEATS_VETO;
@@ -3190,12 +3247,12 @@ public class IsisConfiguration {
             }
 
             /**
-             * Whether the presence of SecMan should result in the automatic suppression of the {@link org.apache.isis.applib.services.userui.UserMenu}'s
-             * {@link UserMenu#me() me} action.
+             * Whether the presence of SecMan should result in the automatic suppression of the
+             * {@link org.apache.isis.applib.services.userui.UserMenu}'s {@link UserMenu.me#act() me()} action.
              *
              * <p>
              *     This is normally what is required as SecMan's <code>ApplicationUser</code> is a more comprehensive
-             *     representation of the current user.  If the default {@link UserMenu#me() me} action is not
+             *     representation of the current user.  If the default {@link UserMenu.me#act() me()} action is not
              *     suppressed, then the end-user will see two actions with the name &quot;me&quot; in the tertiary menu.
              * </p>
              */
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/PublishingPolicies.java b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ActionConfigOptions.java
similarity index 54%
rename from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/PublishingPolicies.java
rename to core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ActionConfigOptions.java
index a116b89d6e..199cb37d17 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/PublishingPolicies.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ActionConfigOptions.java
@@ -22,60 +22,25 @@ import org.apache.isis.core.config.IsisConfiguration;
 
 import lombok.NonNull;
 
-public final class PublishingPolicies {
+public final class ActionConfigOptions {
 
-    // -- ACTIONS
-
-    public static enum ActionPublishingPolicy {
-        ALL,
-        IGNORE_SAFE,
-        /**
-         * Alias for {@link #IGNORE_SAFE}
-         */
-        IGNORE_QUERY_ONLY,
-        NONE;
-    }
-
-    // -- PROPERTIES
-
-    public enum PropertyPublishingPolicy {
-        ALL,
-        NONE;
-    }
-
-    // -- ENTITIES
-
-    public enum EntityChangePublishingPolicy {
-        ALL,
-        NONE;
-    }
-
-    // -- FACTORIES
-
-    public static ActionPublishingPolicy actionCommandPublishingPolicy(
+    public static PublishingPolicy actionCommandPublishingPolicy(
             final @NonNull IsisConfiguration configuration) {
         return configuration.getApplib().getAnnotation().getAction().getCommandPublishing();
     }
 
-    public static ActionPublishingPolicy actionExecutionPublishingPolicy(
+    public static PublishingPolicy actionExecutionPublishingPolicy(
             final @NonNull IsisConfiguration configuration) {
         return configuration.getApplib().getAnnotation().getAction().getExecutionPublishing();
     }
 
-    public static PropertyPublishingPolicy propertyCommandPublishingPolicy(
-            final @NonNull IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getProperty().getCommandPublishing();
-    }
-
-    public static PropertyPublishingPolicy propertyExecutionPublishingPolicy(
-            final @NonNull IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getProperty().getExecutionPublishing();
-    }
-
-    public static EntityChangePublishingPolicy entityChangePublishingPolicy(
-            final @NonNull IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getDomainObject().getEntityChangePublishing();
+    public static enum PublishingPolicy {
+        ALL,
+        IGNORE_SAFE,
+        /**
+         * Alias for {@link #IGNORE_SAFE}
+         */
+        IGNORE_QUERY_ONLY,
+        NONE;
     }
-
-
 }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/CollectionLayoutConfigOptions.java
similarity index 51%
copy from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java
copy to core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/CollectionLayoutConfigOptions.java
index 2e2d6c6f1e..07d9872d32 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/CollectionLayoutConfigOptions.java
@@ -22,34 +22,47 @@ import org.apache.isis.core.config.IsisConfiguration;
 
 import lombok.NonNull;
 
-public final class ParameterPolicies {
+public final class CollectionLayoutConfigOptions {
 
-    // -- ACTIONS
+    public enum TableDecoration {
 
-    public static enum DependentDefaultsPolicy {
         /**
-         * Allows user provided parameters in the UI to be overwritten via defaults semantics.
+         * If this option declares that the collection's table representation should not be decorated.
          */
-        UPDATE_DEPENDENT,
+        NONE,
+
         /**
-         * Forbids user provided parameters in the UI to be overwritten via defaults semantics.
+         * If this option declares that the collection's table representation be decorated using
+         * <a href="https://datatables.net>datatables.net</a> for client-side paging and filtering.
          */
-        PRESERVE_CHANGES;
-        public boolean isUpdateDependent() { return this == UPDATE_DEPENDENT; }
-        public boolean isPreserveChanges() { return this == PRESERVE_CHANGES; }
+        DATATABLES_NET;
+
+        public boolean isNone() { return this == NONE; }
+        public boolean isDataTablesNet() { return this == DATATABLES_NET; }
 
-        public static DependentDefaultsPolicy defaultsIfNotSpecifiedOtherwise() {
-            return UPDATE_DEPENDENT; // backwards compatibility
-        }
     }
 
 
     // -- FACTORIES
 
-    public static DependentDefaultsPolicy dependentDefaultsPolicy(
+    public static TableDecoration tableDecoration(
             final @NonNull IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getParameter().getDependentDefaultsPolicy();
+        return configuration.getApplib().getAnnotation().getCollectionLayout().getTableDecoration();
     }
 
 
+    public enum DefaultView {
+        HIDDEN(),
+        TABLE();
+
+        public String toNameLower() {
+            return name().toLowerCase();
+        }
+
+        public static DefaultView from(IsisConfiguration configuration) {
+            return configuration.getApplib().getAnnotation().getCollectionLayout().getDefaultView();
+        }
+
+
+    }
 }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DefaultViewConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DomainObjectConfigOptions.java
similarity index 66%
copy from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DefaultViewConfiguration.java
copy to core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DomainObjectConfigOptions.java
index 3656876e88..33ba72326f 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DefaultViewConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DomainObjectConfigOptions.java
@@ -20,17 +20,23 @@ package org.apache.isis.core.config.metamodel.facets;
 
 import org.apache.isis.core.config.IsisConfiguration;
 
-public enum DefaultViewConfiguration {
-    HIDDEN(),
-    TABLE();
+import lombok.NonNull;
 
-    public String toNameLower() {
-        return name().toLowerCase();
-    }
+public final class DomainObjectConfigOptions {
 
-    public static DefaultViewConfiguration from(IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getCollectionLayout().getDefaultView();
+    public enum EntityChangePublishingPolicy {
+        ALL,
+        NONE;
     }
 
+    public enum EditingObjectsConfiguration {
+        TRUE,
+        FALSE;
+    }
+    
+    public static EntityChangePublishingPolicy entityChangePublishingPolicy(
+            final @NonNull IsisConfiguration configuration) {
+        return configuration.getApplib().getAnnotation().getDomainObject().getEntityChangePublishing();
+    }
 
 }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DomainObjectLayoutConfigOptions.java
similarity index 56%
copy from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java
copy to core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DomainObjectLayoutConfigOptions.java
index 2e2d6c6f1e..d55678e651 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DomainObjectLayoutConfigOptions.java
@@ -15,6 +15,7 @@
  *  KIND, either express or implied.  See the License for the
  *  specific language governing permissions and limitations
  *  under the License.
+ *
  */
 package org.apache.isis.core.config.metamodel.facets;
 
@@ -22,33 +23,30 @@ import org.apache.isis.core.config.IsisConfiguration;
 
 import lombok.NonNull;
 
-public final class ParameterPolicies {
+public final class DomainObjectLayoutConfigOptions {
 
-    // -- ACTIONS
+    public enum TableDecoration {
 
-    public static enum DependentDefaultsPolicy {
         /**
-         * Allows user provided parameters in the UI to be overwritten via defaults semantics.
+         * If this option declares that the collection's table representation should not be decorated.
          */
-        UPDATE_DEPENDENT,
+        NONE,
+
         /**
-         * Forbids user provided parameters in the UI to be overwritten via defaults semantics.
+         * If this option declares that the collection's table representation be decorated using
+         * <a href="https://datatables.net>datatables.net</a> for client-side paging and filtering.
          */
-        PRESERVE_CHANGES;
-        public boolean isUpdateDependent() { return this == UPDATE_DEPENDENT; }
-        public boolean isPreserveChanges() { return this == PRESERVE_CHANGES; }
+        DATATABLES_NET;
 
-        public static DependentDefaultsPolicy defaultsIfNotSpecifiedOtherwise() {
-            return UPDATE_DEPENDENT; // backwards compatibility
-        }
-    }
+        public boolean isNone() { return this == NONE; }
+        public boolean isDataTablesNet() { return this == DATATABLES_NET; }
 
+    }
 
-    // -- FACTORIES
 
-    public static DependentDefaultsPolicy dependentDefaultsPolicy(
+    public static DomainObjectLayoutConfigOptions.TableDecoration tableDecoration(
             final @NonNull IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getParameter().getDependentDefaultsPolicy();
+        return configuration.getApplib().getAnnotation().getDomainObjectLayout().getTableDecoration();
     }
 
 
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterConfigOptions.java
similarity index 97%
rename from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java
rename to core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterConfigOptions.java
index 2e2d6c6f1e..a12abdaf1a 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterPolicies.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/ParameterConfigOptions.java
@@ -22,9 +22,7 @@ import org.apache.isis.core.config.IsisConfiguration;
 
 import lombok.NonNull;
 
-public final class ParameterPolicies {
-
-    // -- ACTIONS
+public final class ParameterConfigOptions {
 
     public static enum DependentDefaultsPolicy {
         /**
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DefaultViewConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/PropertyConfigOptions.java
similarity index 61%
rename from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DefaultViewConfiguration.java
rename to core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/PropertyConfigOptions.java
index 3656876e88..dc6f36ffb3 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/DefaultViewConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/PropertyConfigOptions.java
@@ -20,17 +20,22 @@ package org.apache.isis.core.config.metamodel.facets;
 
 import org.apache.isis.core.config.IsisConfiguration;
 
-public enum DefaultViewConfiguration {
-    HIDDEN(),
-    TABLE();
+import lombok.NonNull;
 
-    public String toNameLower() {
-        return name().toLowerCase();
-    }
+public final class PropertyConfigOptions {
 
-    public static DefaultViewConfiguration from(IsisConfiguration configuration) {
-        return configuration.getApplib().getAnnotation().getCollectionLayout().getDefaultView();
+    public static PublishingPolicy propertyCommandPublishingPolicy(
+            final @NonNull IsisConfiguration configuration) {
+        return configuration.getApplib().getAnnotation().getProperty().getCommandPublishing();
     }
 
+    public static PublishingPolicy propertyExecutionPublishingPolicy(
+            final @NonNull IsisConfiguration configuration) {
+        return configuration.getApplib().getAnnotation().getProperty().getExecutionPublishing();
+    }
 
+    public enum PublishingPolicy {
+        ALL,
+        NONE;
+    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index cc33a71c92..284b44c702 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec.DomainObjectLayoutTableDecorationFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetFallback;
 import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacetFallback;
 import org.apache.isis.core.metamodel.facets.members.layout.group.LayoutGroupFacetFromActionLayoutAnnotation;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
index 0e04a491cd..866598b809 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.collections.layout.tabledec.CollectionLayoutTableDecorationFacet;
 import org.apache.isis.core.metamodel.facets.members.layout.order.LayoutOrderFacetFromCollectionLayoutAnnotation;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForAmbiguousMixinAnnotations;
 
@@ -72,6 +73,10 @@ extends FacetFactoryAbstract {
                 MemberNamedFacetForCollectionLayoutAnnotation
                 .create(collectionLayoutIfAny, facetHolder));
 
+        addFacetIfPresent(
+                CollectionLayoutTableDecorationFacet
+                        .create(collectionLayoutIfAny, getConfiguration(), facetHolder));
+
         addFacetIfPresent(
                 PagedFacetForCollectionLayoutAnnotation
                 .create(collectionLayoutIfAny, facetHolder));
@@ -79,6 +84,9 @@ extends FacetFactoryAbstract {
         addFacetIfPresent(
                 SortedByFacetForCollectionLayoutAnnotation
                 .create(collectionLayoutIfAny, facetHolder));
+
+
+
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
index a4a4e795e1..4d2a1fdf1a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
@@ -22,14 +22,23 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.collections.layout.tabledec.CollectionLayoutTableDecorationFacet;
+import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
+import lombok.val;
+
 public class PagedFacetForCollectionLayoutAnnotation extends PagedFacetAbstract {
 
-    public static Optional<PagedFacetForCollectionLayoutAnnotation> create(
+    public static Optional<PagedFacet> create(
             final Optional<CollectionLayout> collectionLayoutIfAny,
             final FacetHolder holder) {
 
+        val tableDecorationFacet = holder.getFacet(CollectionLayoutTableDecorationFacet.class);
+        if (tableDecorationFacet.value().isDataTablesNet()) {
+            return Optional.of(new PagedFacetOverriddenByDataTablesDecoration(holder));
+        }
+
         return collectionLayoutIfAny
                 .map(CollectionLayout::paged)
                 .filter(paged -> paged != -1)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetOverriddenByDataTablesDecoration.java
similarity index 64%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetOverriddenByDataTablesDecoration.java
index a4a4e795e1..e13c953a9d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetOverriddenByDataTablesDecoration.java
@@ -22,22 +22,13 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.collections.layout.tabledec.CollectionLayoutTableDecorationFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
-public class PagedFacetForCollectionLayoutAnnotation extends PagedFacetAbstract {
+public class PagedFacetOverriddenByDataTablesDecoration extends PagedFacetAbstract {
 
-    public static Optional<PagedFacetForCollectionLayoutAnnotation> create(
-            final Optional<CollectionLayout> collectionLayoutIfAny,
-            final FacetHolder holder) {
-
-        return collectionLayoutIfAny
-                .map(CollectionLayout::paged)
-                .filter(paged -> paged != -1)
-                .map(paged -> new PagedFacetForCollectionLayoutAnnotation(paged, holder));
-    }
-
-    private PagedFacetForCollectionLayoutAnnotation(final int paged, final FacetHolder holder) {
-        super(paged, holder);
+    PagedFacetOverriddenByDataTablesDecoration(final FacetHolder holder) {
+        super(Integer.MAX_VALUE, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacet.java
new file mode 100644
index 0000000000..4af53730f6
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacet.java
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.isis.core.metamodel.facets.collections.layout.tabledec;
+
+import java.util.Optional;
+
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.commons.internal.base._Optionals;
+import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.config.metamodel.facets.CollectionLayoutConfigOptions;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleValueFacet;
+
+/**
+ * Determines how dependent parameter values should be updated,
+ * if one of the earlier parameter values is changed.
+ * <p>
+ * Corresponds to annotating the action method {@link Parameter#dependentDefaultsPolicy()}.
+ *
+ * @since 2.0
+ */
+public interface CollectionLayoutTableDecorationFacet
+extends SingleValueFacet<CollectionLayoutConfigOptions.TableDecoration> {
+
+    static Optional<CollectionLayoutTableDecorationFacet> create(
+            final Optional<CollectionLayout> collectionLayoutIfAny,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        final CollectionLayoutConfigOptions.TableDecoration defaultPolicyFromConfig =
+                CollectionLayoutConfigOptions.tableDecoration(configuration);
+
+        return _Optionals.orNullable(
+
+        collectionLayoutIfAny
+        .map(CollectionLayout::tableDecoration)
+        .<CollectionLayoutTableDecorationFacet>map(tableDecoration -> {
+            switch (tableDecoration) {
+            case NONE:
+                return new CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation(
+                        CollectionLayoutConfigOptions.TableDecoration.NONE, holder);
+            case DATATABLES_NET:
+                return new CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation(
+                        CollectionLayoutConfigOptions.TableDecoration.DATATABLES_NET, holder);
+            case NOT_SPECIFIED:
+            case AS_CONFIGURED:
+                return new CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation(defaultPolicyFromConfig, holder);
+            default:
+            }
+            throw new IllegalStateException("tableDecoration '" + tableDecoration + "' not recognised");
+        })
+        ,
+        () -> new CollectionLayoutTableDecorationFacetFromConfiguration(defaultPolicyFromConfig, holder));
+
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetAbstract.java
similarity index 66%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetAbstract.java
index aa184e2f2f..9d120cd398 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetAbstract.java
@@ -17,23 +17,23 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.collections.layout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.CollectionLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 
-abstract class ParameterDependentDefaultsFacetAbstract
-extends SingleValueFacetAbstract<ParameterPolicies.DependentDefaultsPolicy>
-implements ParameterDependentDefaultsFacet {
+abstract class CollectionLayoutTableDecorationFacetAbstract
+extends SingleValueFacetAbstract<CollectionLayoutConfigOptions.TableDecoration>
+implements CollectionLayoutTableDecorationFacet {
 
     private static final Class<? extends Facet> type() {
-        return ParameterDependentDefaultsFacet.class;
+        return CollectionLayoutTableDecorationFacet.class;
     }
 
-    protected ParameterDependentDefaultsFacetAbstract(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    protected CollectionLayoutTableDecorationFacetAbstract(
+            final CollectionLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(type(), value, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation.java
similarity index 66%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation.java
index c0bb59a50c..0423facc44 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation.java
@@ -17,16 +17,16 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.collections.layout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.CollectionLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ParameterDependentDefaultsFacetFromConfiguration
-extends ParameterDependentDefaultsFacetAbstract {
+public class CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation
+extends CollectionLayoutTableDecorationFacetAbstract {
 
-    ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation(
+            final CollectionLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotationAsConfigured.java
similarity index 64%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotationAsConfigured.java
index c0bb59a50c..186356653d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotationAsConfigured.java
@@ -17,16 +17,16 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.collections.layout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.CollectionLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ParameterDependentDefaultsFacetFromConfiguration
-extends ParameterDependentDefaultsFacetAbstract {
+public class CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotationAsConfigured
+extends CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotation {
 
-    ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    CollectionLayoutTableDecorationFacetForCollectionLayoutAnnotationAsConfigured(
+            final CollectionLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetFromConfiguration.java
similarity index 68%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetFromConfiguration.java
index e36364da56..6a1e82c379 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/tabledec/CollectionLayoutTableDecorationFacetFromConfiguration.java
@@ -17,16 +17,16 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.collections.layout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.CollectionLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ParameterDependentDefaultsFacetForParameterAnnotation
-extends ParameterDependentDefaultsFacetAbstract {
+public class CollectionLayoutTableDecorationFacetFromConfiguration
+extends CollectionLayoutTableDecorationFacetAbstract {
 
-    ParameterDependentDefaultsFacetForParameterAnnotation(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    CollectionLayoutTableDecorationFacetFromConfiguration(
+            final CollectionLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java
index 5a05bf35fb..3f2cd2aaaf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForActionAnnotation.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.ActionConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 
@@ -40,7 +40,7 @@ public class CommandPublishingFacetForActionAnnotation extends CommandPublishing
             final ServiceInjector servicesInjector,
             final FacetHolder holder) {
 
-        val publishingPolicy = PublishingPolicies.actionCommandPublishingPolicy(configuration);
+        val publishingPolicy = ActionConfigOptions.actionCommandPublishingPolicy(configuration);
 
         return _Optionals.orNullable(
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java
index 2ffcf478a2..63c5dcdf38 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/command/CommandPublishingFacetForPropertyAnnotation.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.PropertyConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 import lombok.val;
@@ -39,7 +39,7 @@ public class CommandPublishingFacetForPropertyAnnotation extends CommandPublishi
             final FacetHolder holder,
             final ServiceInjector servicesInjector) {
 
-        val publishingPolicy = PublishingPolicies.propertyCommandPublishingPolicy(configuration);
+        val publishingPolicy = PropertyConfigOptions.propertyCommandPublishingPolicy(configuration);
 
         return _Optionals.orNullable(
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingActionFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingActionFacetForActionAnnotation.java
index fafcf7fb6e..76dd442291 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingActionFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingActionFacetForActionAnnotation.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.ActionConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 
@@ -38,7 +38,7 @@ extends ExecutionPublishingFacetAbstract {
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        val publishingPolicy = PublishingPolicies.actionExecutionPublishingPolicy(configuration);
+        val publishingPolicy = ActionConfigOptions.actionExecutionPublishingPolicy(configuration);
 
         return _Optionals.orNullable(
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingPropertyFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingPropertyFacetForPropertyAnnotation.java
index a5aa850da5..1080565d50 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingPropertyFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/publish/execution/ExecutionPublishingPropertyFacetForPropertyAnnotation.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.PropertyConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 import lombok.val;
@@ -37,7 +37,7 @@ extends ExecutionPublishingFacetAbstract {
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        val publishingPolicy = PublishingPolicies.propertyExecutionPublishingPolicy(configuration);
+        val publishingPolicy = PropertyConfigOptions.propertyExecutionPublishingPolicy(configuration);
 
         return _Optionals.orNullable(
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
index 439fe2f1a8..bfba27e892 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
@@ -23,7 +23,7 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacetAbstract;
@@ -42,7 +42,7 @@ extends ImmutableFacetAbstract {
 
         final boolean editingDisabledByDefault =
                 configuration.getApplib().getAnnotation().getDomainObject().getEditing()
-                == EditingObjectsConfiguration.FALSE;
+                == DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE;
 
         if(domainObjectIfAny.isPresent()) {
             val domainObject = domainObjectIfAny.get();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java
index 92101d7127..38766c2ba5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/entitychangepublishing/EntityChangePublishingFacetForDomainObjectAnnotation.java
@@ -24,7 +24,7 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.publish.entitychange.EntityChangePublishingFacet;
 import org.apache.isis.core.metamodel.facets.object.publish.entitychange.EntityChangePublishingFacetAbstract;
@@ -45,7 +45,7 @@ extends EntityChangePublishingFacetAbstract {
         case NOT_SPECIFIED:
         case AS_CONFIGURED:
 
-            val publishingPolicy = PublishingPolicies.entityChangePublishingPolicy(configuration);
+            val publishingPolicy = DomainObjectConfigOptions.entityChangePublishingPolicy(configuration);
             switch (publishingPolicy) {
             case NONE:
                 return Optional.of(entityChangePublishingIfAny.isPresent()
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index 8a4cdb5a29..955f24d025 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@ -23,6 +23,7 @@ import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec.DomainObjectLayoutTableDecorationFacet;
 import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 
 import lombok.val;
@@ -74,6 +75,10 @@ extends FacetFactoryAbstract {
                 ObjectNamedFacetForDomainObjectLayoutAnnotation
                 .create(domainObjectLayoutIfAny, facetHolder));
 
+        addFacetIfPresent(
+                DomainObjectLayoutTableDecorationFacet
+                        .create(domainObjectLayoutIfAny, getConfiguration(), facetHolder));
+
         addFacetIfPresent(
                 PagedFacetForDomainObjectLayoutAnnotation
                 .create(domainObjectLayoutIfAny, facetHolder));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java
index fa6f6ac49f..428ed44f0c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java
@@ -23,15 +23,25 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec.DomainObjectLayoutTableDecorationFacet;
+import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
+import lombok.val;
+
 
 public class PagedFacetForDomainObjectLayoutAnnotation extends PagedFacetAbstract {
 
-    public static Optional<PagedFacetForDomainObjectLayoutAnnotation> create(
+    public static Optional<PagedFacet> create(
             final Optional<DomainObjectLayout> domainObjectLayoutIfAny,
             final FacetHolder holder) {
 
+
+        val tableDecorationFacet = holder.getFacet(DomainObjectLayoutTableDecorationFacet.class);
+        if (tableDecorationFacet.value().isDataTablesNet()) {
+            return Optional.of(new PagedFacetOverriddenByDataTablesDecoration(holder));
+        }
+
         return domainObjectLayoutIfAny
                 .map(DomainObjectLayout::paged)
                 .filter(paged -> paged > 1)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetOverriddenByDataTablesDecoration.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetOverriddenByDataTablesDecoration.java
index c0bb59a50c..69776cef28 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetOverriddenByDataTablesDecoration.java
@@ -15,19 +15,16 @@
  *  KIND, either express or implied.  See the License for the
  *  specific language governing permissions and limitations
  *  under the License.
- *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
-public class ParameterDependentDefaultsFacetFromConfiguration
-extends ParameterDependentDefaultsFacetAbstract {
+public class PagedFacetOverriddenByDataTablesDecoration extends PagedFacetAbstract {
 
-    ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
-        super(value, holder);
+    PagedFacetOverriddenByDataTablesDecoration(final FacetHolder holder) {
+        super(Integer.MAX_VALUE, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacet.java
new file mode 100644
index 0000000000..73cc2b0351
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacet.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec;
+
+import java.util.Optional;
+
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.commons.internal.base._Optionals;
+import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectLayoutConfigOptions;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleValueFacet;
+
+/**
+ * Determines how dependent parameter values should be updated,
+ * if one of the earlier parameter values is changed.
+ * <p>
+ * Corresponds to annotating the action method {@link Parameter#dependentDefaultsPolicy()}.
+ *
+ * @since 2.0
+ */
+public interface DomainObjectLayoutTableDecorationFacet
+extends SingleValueFacet<DomainObjectLayoutConfigOptions.TableDecoration> {
+
+    static Optional<DomainObjectLayoutTableDecorationFacet> create(
+            final Optional<DomainObjectLayout> domainObjectLayoutIfAny,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        final DomainObjectLayoutConfigOptions.TableDecoration defaultPolicyFromConfig =
+                DomainObjectLayoutConfigOptions.tableDecoration(configuration);
+
+        return _Optionals.orNullable(
+
+        domainObjectLayoutIfAny
+        .map(DomainObjectLayout::tableDecoration)
+        .<DomainObjectLayoutTableDecorationFacet>map(tableDecoration -> {
+            switch (tableDecoration) {
+            case NONE:
+                return new DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation(
+                        DomainObjectLayoutConfigOptions.TableDecoration.NONE, holder);
+            case DATATABLES_NET:
+                return new DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation(
+                        DomainObjectLayoutConfigOptions.TableDecoration.DATATABLES_NET, holder);
+            case NOT_SPECIFIED:
+            case AS_CONFIGURED:
+                return new DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation(defaultPolicyFromConfig, holder);
+            default:
+            }
+            throw new IllegalStateException("tableDecoration '" + tableDecoration + "' not recognised");
+        })
+        ,
+        () -> new DomainObjectLayoutTableDecorationFacetFromConfiguration(defaultPolicyFromConfig, holder));
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetAbstract.java
similarity index 65%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetAbstract.java
index aa184e2f2f..56c6eceb22 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetAbstract.java
@@ -17,23 +17,23 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 
-abstract class ParameterDependentDefaultsFacetAbstract
-extends SingleValueFacetAbstract<ParameterPolicies.DependentDefaultsPolicy>
-implements ParameterDependentDefaultsFacet {
+abstract class DomainObjectLayoutTableDecorationFacetAbstract
+extends SingleValueFacetAbstract<DomainObjectLayoutConfigOptions.TableDecoration>
+implements DomainObjectLayoutTableDecorationFacet {
 
     private static final Class<? extends Facet> type() {
-        return ParameterDependentDefaultsFacet.class;
+        return DomainObjectLayoutTableDecorationFacet.class;
     }
 
-    protected ParameterDependentDefaultsFacetAbstract(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    protected DomainObjectLayoutTableDecorationFacetAbstract(
+            final DomainObjectLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(type(), value, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation.java
similarity index 65%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation.java
index c0bb59a50c..1c6b8aac28 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation.java
@@ -17,16 +17,16 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ParameterDependentDefaultsFacetFromConfiguration
-extends ParameterDependentDefaultsFacetAbstract {
+public class DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation
+extends DomainObjectLayoutTableDecorationFacetAbstract {
 
-    ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation(
+            final DomainObjectLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotationAsConfigured.java
similarity index 63%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotationAsConfigured.java
index c0bb59a50c..f54fdf68bc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotationAsConfigured.java
@@ -17,16 +17,16 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ParameterDependentDefaultsFacetFromConfiguration
-extends ParameterDependentDefaultsFacetAbstract {
+public class DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotationAsConfigured
+extends DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotation {
 
-    ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    DomainObjectLayoutTableDecorationFacetForDomainObjectLayoutAnnotationAsConfigured(
+            final DomainObjectLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetFromConfiguration.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetFromConfiguration.java
index c0bb59a50c..842621e09d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/tabledec/DomainObjectLayoutTableDecorationFacetFromConfiguration.java
@@ -17,16 +17,16 @@
  *  under the License.
  *
  */
-package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
+package org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectLayoutConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ParameterDependentDefaultsFacetFromConfiguration
-extends ParameterDependentDefaultsFacetAbstract {
+public class DomainObjectLayoutTableDecorationFacetFromConfiguration
+extends DomainObjectLayoutTableDecorationFacetAbstract {
 
-    ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+    DomainObjectLayoutTableDecorationFacetFromConfiguration(
+            final DomainObjectLayoutConfigOptions.TableDecoration value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacet.java
index 14ea5195cc..14b122699b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/PagedFacet.java
@@ -29,18 +29,4 @@ public interface PagedFacet extends Facet {
 
     int value();
 
-    /**
-     * Returns the page-size as held by given {@code pagedFacet} if present, otherwise
-     * falls back to {@code defaultPageSize}.
-     * @param pagedFacet - null-able
-     * @param defaultPageSize
-     */
-    static int pageSizeOrDefault(
-            final @Nullable PagedFacet pagedFacet,
-            final int defaultPageSize) {
-        return pagedFacet != null
-                ? pagedFacet.value()
-                : defaultPageSize;
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsActionFacetForActionAnnotationAsConfigured.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsActionFacetForActionAnnotationAsConfigured.java
index facf4fe3c5..e44bd5c9ff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsActionFacetForActionAnnotationAsConfigured.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsActionFacetForActionAnnotationAsConfigured.java
@@ -19,14 +19,14 @@
  */
 package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 public class ParameterDependentDefaultsActionFacetForActionAnnotationAsConfigured
 extends ParameterDependentDefaultsFacetForParameterAnnotation {
 
     ParameterDependentDefaultsActionFacetForActionAnnotationAsConfigured(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+            final ParameterConfigOptions.DependentDefaultsPolicy value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacet.java
index 399f449fec..3e22dc548a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacet.java
@@ -21,11 +21,10 @@ package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
 
 import java.util.Optional;
 
-import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacet;
 
@@ -38,15 +37,15 @@ import org.apache.isis.core.metamodel.facets.SingleValueFacet;
  * @since 2.0
  */
 public interface ParameterDependentDefaultsFacet
-extends SingleValueFacet<ParameterPolicies.DependentDefaultsPolicy> {
+extends SingleValueFacet<ParameterConfigOptions.DependentDefaultsPolicy> {
 
     static Optional<ParameterDependentDefaultsFacet> create(
             final Optional<Parameter> parameterIfAny,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final ParameterPolicies.DependentDefaultsPolicy defaultPolicyFromConfig =
-                ParameterPolicies.dependentDefaultsPolicy(configuration);
+        final ParameterConfigOptions.DependentDefaultsPolicy defaultPolicyFromConfig =
+                ParameterConfigOptions.dependentDefaultsPolicy(configuration);
 
         return _Optionals.orNullable(
 
@@ -56,10 +55,10 @@ extends SingleValueFacet<ParameterPolicies.DependentDefaultsPolicy> {
             switch (policy) {
             case PRESERVE_CHANGES:
                 return new ParameterDependentDefaultsFacetForParameterAnnotation(
-                        ParameterPolicies.DependentDefaultsPolicy.PRESERVE_CHANGES, holder);
+                        ParameterConfigOptions.DependentDefaultsPolicy.PRESERVE_CHANGES, holder);
             case UPDATE_DEPENDENT:
                 return new ParameterDependentDefaultsFacetForParameterAnnotation(
-                        ParameterPolicies.DependentDefaultsPolicy.UPDATE_DEPENDENT, holder);
+                        ParameterConfigOptions.DependentDefaultsPolicy.UPDATE_DEPENDENT, holder);
             case NOT_SPECIFIED:
             case AS_CONFIGURED:
                 return new ParameterDependentDefaultsFacetForParameterAnnotation(defaultPolicyFromConfig, holder);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
index aa184e2f2f..7cbf17f60d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetAbstract.java
@@ -19,13 +19,13 @@
  */
 package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 
 abstract class ParameterDependentDefaultsFacetAbstract
-extends SingleValueFacetAbstract<ParameterPolicies.DependentDefaultsPolicy>
+extends SingleValueFacetAbstract<ParameterConfigOptions.DependentDefaultsPolicy>
 implements ParameterDependentDefaultsFacet {
 
     private static final Class<? extends Facet> type() {
@@ -33,7 +33,7 @@ implements ParameterDependentDefaultsFacet {
     }
 
     protected ParameterDependentDefaultsFacetAbstract(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+            final ParameterConfigOptions.DependentDefaultsPolicy value, final FacetHolder holder) {
         super(type(), value, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java
index e36364da56..b4d4a5e65b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetForParameterAnnotation.java
@@ -19,14 +19,14 @@
  */
 package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 public class ParameterDependentDefaultsFacetForParameterAnnotation
 extends ParameterDependentDefaultsFacetAbstract {
 
     ParameterDependentDefaultsFacetForParameterAnnotation(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+            final ParameterConfigOptions.DependentDefaultsPolicy value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
index c0bb59a50c..de8be9cc33 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/depdef/ParameterDependentDefaultsFacetFromConfiguration.java
@@ -19,14 +19,14 @@
  */
 package org.apache.isis.core.metamodel.facets.param.parameter.depdef;
 
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 public class ParameterDependentDefaultsFacetFromConfiguration
 extends ParameterDependentDefaultsFacetAbstract {
 
     ParameterDependentDefaultsFacetFromConfiguration(
-            final ParameterPolicies.DependentDefaultsPolicy value, final FacetHolder holder) {
+            final ParameterConfigOptions.DependentDefaultsPolicy value, final FacetHolder holder) {
         super(value, holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java
index a11dae3ce3..57ed70cb2f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Facets.java
@@ -38,7 +38,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.config.metamodel.facets.ParameterPolicies;
+import org.apache.isis.core.config.metamodel.facets.ParameterConfigOptions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -172,11 +172,11 @@ public final class Facets {
         .map(DefaultViewFacet::value);
     }
 
-    public static ParameterPolicies.DependentDefaultsPolicy dependentDefaultsPolicy(
+    public static ParameterConfigOptions.DependentDefaultsPolicy dependentDefaultsPolicy(
             final ObjectActionParameter parameter) {
         return parameter.lookupFacet(ParameterDependentDefaultsFacet.class)
                 .map(ParameterDependentDefaultsFacet::value)
-                .orElseGet(ParameterPolicies.DependentDefaultsPolicy::defaultsIfNotSpecifiedOtherwise);
+                .orElseGet(ParameterConfigOptions.DependentDefaultsPolicy::defaultsIfNotSpecifiedOtherwise);
     }
 
     public boolean domainServiceIsPresent(final ObjectSpecification objectSpec) {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index 9b05d572a9..398ba2e57f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -27,7 +27,7 @@ import org.junit.After;
 import org.junit.Before;
 
 import org.apache.isis.applib.mixins.system.HasInteractionId;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.ActionConfigOptions;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -90,7 +90,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     }
 
-    void allowingPublishingConfigurationToReturn(final PublishingPolicies.ActionPublishingPolicy value) {
+    void allowingPublishingConfigurationToReturn(final ActionConfigOptions.PublishingPolicy value) {
         val config = metaModelContext.getConfiguration();
         config.getApplib().getAnnotation().getAction().setExecutionPublishing(value);
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
index b3609cea44..5e266fe656 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java
@@ -29,7 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.commons.internal.base._Blackhole;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.ActionConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
@@ -64,7 +64,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
     public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
 
         // given
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.IGNORE_QUERY_ONLY);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY);
         final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
 
         facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
@@ -82,7 +82,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
     public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
 
         // given
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.IGNORE_QUERY_ONLY);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY);
         final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
 
         facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
@@ -103,7 +103,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
     public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
 
         // given
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.IGNORE_QUERY_ONLY);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY);
         final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
 
         // when
@@ -117,7 +117,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
     public void given_noAnnotation_and_configurationSetToNone_thenNone() {
 
         // given
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.NONE);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE);
         final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
 
         // when
@@ -138,7 +138,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
         // given
         final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
 
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.ALL);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.ALL);
 
         // when
         processExecutionPublishing(facetFactory, ProcessMethodContext
@@ -160,7 +160,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
             }
         }
 
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.IGNORE_QUERY_ONLY);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY);
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
         facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
@@ -185,7 +185,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
             }
         }
 
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.IGNORE_QUERY_ONLY);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY);
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
         facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
@@ -212,7 +212,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
             }
         }
 
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.IGNORE_QUERY_ONLY);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY);
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
         processExecutionPublishing(facetFactory, ProcessMethodContext
@@ -228,7 +228,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
             }
         }
 
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.NONE);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE);
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
         processExecutionPublishing(facetFactory, ProcessMethodContext
@@ -253,7 +253,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
         }
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.ALL);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.ALL);
 
         // when
         processExecutionPublishing(facetFactory, ProcessMethodContext
@@ -281,7 +281,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
         // even though configuration is disabled
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.NONE);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE);
 
         // when
         processExecutionPublishing(facetFactory, ProcessMethodContext
@@ -307,7 +307,7 @@ public class ActionAnnotationFacetFactoryTest_executionPublishing extends Action
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
         // even though configuration is disabled
-        allowingPublishingConfigurationToReturn(PublishingPolicies.ActionPublishingPolicy.NONE);
+        allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE);
 
         // when
         processExecutionPublishing(facetFactory, ProcessMethodContext
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 0459b2bed5..6a25f547f6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -39,8 +39,7 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
-import org.apache.isis.core.config.metamodel.facets.PublishingPolicies;
+import org.apache.isis.core.config.metamodel.facets.DomainObjectConfigOptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
@@ -92,14 +91,14 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     }
 
-    void allowingEntityChangePublishingToReturn(final PublishingPolicies.EntityChangePublishingPolicy value) {
+    void allowingEntityChangePublishingToReturn(final DomainObjectConfigOptions.EntityChangePublishingPolicy value) {
         if(value!=null) {
             val config = super.metaModelContext.getConfiguration();
             config.getApplib().getAnnotation().getDomainObject().setEntityChangePublishing(value);
         }
     }
 
-    void allowingObjectsEditingToReturn(final EditingObjectsConfiguration value) {
+    void allowingObjectsEditingToReturn(final DomainObjectConfigOptions.EditingObjectsConfiguration value) {
         if(value!=null) {
             final IsisConfiguration config = super.metaModelContext.getConfiguration();
             config.getApplib().getAnnotation().getDomainObject().setEditing(value);
@@ -129,7 +128,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_all() {
-                allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
+                allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.ALL);
 
                 val context = ProcessClassContext
                         .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder);
@@ -145,7 +144,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_none() {
-                allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.NONE);
+                allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.NONE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder));
@@ -163,7 +162,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_all() {
-                allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
+                allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.ALL);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(CustomerWithDomainObjectAndAuditingSetToAsConfigured.class, mockMethodRemover, facetHolder));
@@ -178,7 +177,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_none() {
-                allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.NONE);
+                allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.NONE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(CustomerWithDomainObjectAndAuditingSetToAsConfigured.class, mockMethodRemover, facetHolder));
@@ -214,7 +213,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
+                allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.ALL);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(CustomerWithDomainObjectAndAuditingSetToDisabled.class, mockMethodRemover, facetHolder));
@@ -421,7 +420,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_true() {
-                allowingObjectsEditingToReturn(EditingObjectsConfiguration.TRUE);
+                allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.TRUE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder));
@@ -434,7 +433,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_false() {
-                allowingObjectsEditingToReturn(EditingObjectsConfiguration.FALSE);
+                allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder));
@@ -467,7 +466,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_true() {
-                allowingObjectsEditingToReturn(EditingObjectsConfiguration.TRUE);
+                allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.TRUE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, mockMethodRemover, facetHolder));
@@ -480,7 +479,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void configured_value_set_to_false() {
-                allowingObjectsEditingToReturn(EditingObjectsConfiguration.FALSE);
+                allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, mockMethodRemover, facetHolder));
@@ -511,7 +510,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingObjectsEditingToReturn(EditingObjectsConfiguration.FALSE);
+                allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(
@@ -529,7 +528,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingObjectsEditingToReturn(EditingObjectsConfiguration.TRUE);
+                allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.TRUE);
 
                 facetFactory.process(ProcessClassContext
                         .forTesting(
diff --git a/core/pom.xml b/core/pom.xml
index a31c1125d1..1093a56a50 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -1281,6 +1281,12 @@
 				<version>${togglz.version}</version>
 			</dependency>
 
+			<dependency>
+				<groupId>org.webjars</groupId>
+				<artifactId>datatables</artifactId>
+				<version>${datatables.version}</version>
+			</dependency>
+
 			<dependency>
 				<groupId>org.webjars</groupId>
 				<artifactId>jquery</artifactId>
diff --git a/viewers/wicket/ui/pom.xml b/viewers/wicket/ui/pom.xml
index e894690598..b05a838a68 100644
--- a/viewers/wicket/ui/pom.xml
+++ b/viewers/wicket/ui/pom.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	you under the Apache License, Version 2.0 (the "License"); you may not use 
-	this file except in compliance with the License. You may obtain a copy of 
-	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+	license agreements. See the NOTICE file distributed with this work for additional
+	information regarding copyright ownership. The ASF licenses this file to
+	you under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+	by applicable law or agreed to in writing, software distributed under the
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+	OF ANY KIND, either express or implied. See the License for the specific
 	language governing permissions and limitations under the License. -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -52,9 +52,9 @@
 				<artifactId>yuicompressor-maven-plugin</artifactId>
 			</plugin>
 			<plugin>
-				<!-- overrides defaults as configured in our core pom, 
+				<!-- overrides defaults as configured in our core pom,
         			to make javadoc failures non fatal and let the build continue;
-        			this we can set on a per module basis, to apply only to those, 
+        			this we can set on a per module basis, to apply only to those,
         			we don't know how to fix otherwise -->
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
@@ -71,17 +71,17 @@
 			<groupId>org.apache.isis.viewer</groupId>
 			<artifactId>isis-viewer-wicket-model</artifactId>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
             <artifactId>isis-viewer-commons-services</artifactId>
         </dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
             <artifactId>isis-viewer-commons-prism</artifactId>
         </dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
 			<artifactId>wicket-devutils</artifactId>
@@ -137,7 +137,7 @@
 					<artifactId>slf4j-api</artifactId>
 				</exclusion>
 				<exclusion>
-					<!-- for Java7 compatibility (we don't use the proxying capability of 
+					<!-- for Java7 compatibility (we don't use the proxying capability of
 						this component) -->
 					<groupId>cglib</groupId>
 					<artifactId>cglib</artifactId>
@@ -169,6 +169,11 @@
 			<artifactId>select2</artifactId>
 		</dependency>
 
+		<dependency>
+			<groupId>org.webjars</groupId>
+			<artifactId>datatables</artifactId>
+		</dependency>
+
 		<dependency>
 			<groupId>org.webjars</groupId>
 			<artifactId>jquery</artifactId>
@@ -344,7 +349,7 @@
 			<artifactId>isis-core-internaltestsupport</artifactId>
 			<scope>test</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-core-runtimeservices</artifactId>
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
index d329a61965..c0e45dd2d3 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
@@ -26,6 +26,8 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.collections.layout.tabledec.CollectionLayoutTableDecorationFacet;
+import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec.DomainObjectLayoutTableDecorationFacet;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -126,6 +128,11 @@ implements HasDynamicallyVisibleContent {
             Facets.cssClass(collectionMetaModel, objectAdapter)
             .ifPresent(cssClass->Wkt.cssAppend(div, cssClass));
 
+            val decorationFacet = collectionMetaModel.getFacet(CollectionLayoutTableDecorationFacet.class);
+            if (decorationFacet != null && decorationFacet.value().isDataTablesNet()) {
+                Wkt.cssAppend(div, "table-decoration");
+            }
+
             val collectionPanel = new CollectionPanel(ID_COLLECTION, collectionModel);
             div.addOrReplace(collectionPanel);
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index 354759c855..754220166e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@ -24,6 +24,7 @@ import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.Model;
 
+import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.tabledec.DomainObjectLayoutTableDecorationFacet;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.isis.viewer.commons.model.components.ComponentType;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
@@ -73,6 +74,11 @@ implements CollectionCountProvider, CollectionPresentationSelectorProvider {
         Wkt.cssAppend(outerDiv, featureId);
         Wkt.cssAppend(outerDiv, collectionModel.getElementType().getFeatureIdentifier());
 
+        val decorationFacet = collectionModel.getMetaModel().getElementType().getFacet(DomainObjectLayoutTableDecorationFacet.class);
+        if (decorationFacet != null && decorationFacet.value().isDataTablesNet()) {
+            Wkt.cssAppend(outerDiv, "table-decoration");
+        }
+
         // selector
         final CollectionPresentationSelectorHelper selectorHelper = new CollectionPresentationSelectorHelper(collectionModel, getComponentFactoryRegistry());
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 137290a0cc..dc78985381 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -71,6 +71,11 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.Breadcrum
 import org.apache.isis.viewer.wicket.ui.errors.ExceptionModel;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 import org.apache.isis.viewer.wicket.ui.pages.common.bootstrap.css.BootstrapOverridesCssResourceReference;
+import org.apache.isis.viewer.wicket.ui.pages.common.datatables.DatatablesCssBootstrap5ReferenceWkt;
+import org.apache.isis.viewer.wicket.ui.pages.common.datatables.DatatablesCssReferenceWkt;
+import org.apache.isis.viewer.wicket.ui.pages.common.datatables.DatatablesJavaScriptBootstrap5ReferenceWkt;
+import org.apache.isis.viewer.wicket.ui.pages.common.datatables.DatatablesJavaScriptReferenceWkt;
+import org.apache.isis.viewer.wicket.ui.pages.common.datatables.DatatablesJavaScriptResourceReferenceInit;
 import org.apache.isis.viewer.wicket.ui.pages.common.fontawesome.FontAwesomeCssReferenceWkt;
 import org.apache.isis.viewer.wicket.ui.pages.common.livequery.js.LiveQueryJsResourceReference;
 import org.apache.isis.viewer.wicket.ui.pages.common.sidebar.css.SidebarCssResourceReference;
@@ -239,6 +244,12 @@ implements ActionPromptProvider {
         response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(BootstrapJavaScriptReference.instance())));
         response.render(FontAwesomeCssReferenceWkt.asHeaderItem());
 
+        response.render(DatatablesJavaScriptReferenceWkt.asHeaderItem());
+        response.render(DatatablesJavaScriptBootstrap5ReferenceWkt.asHeaderItem());
+        response.render(DatatablesCssReferenceWkt.asHeaderItem());
+        response.render(DatatablesCssBootstrap5ReferenceWkt.asHeaderItem());
+        response.render(DatatablesJavaScriptResourceReferenceInit.instance(getConfiguration()));
+
         response.render(BootstrapOverridesCssResourceReference.asHeaderItem());
         BootstrapOverridesCssResourceReference
             .contributeThemeSpecificOverrides(getApplication(), response);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
index 4154997c97..bdc03a9da9 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
@@ -58,8 +58,8 @@ td .badge,
 .form-control-sm .badge {
 	font-size:.85rem
 }
-td .badge span, 
-.scalarPlaceholder .badge span, 
+td .badge span,
+.scalarPlaceholder .badge span,
 .form-control-sm .badge span {
   padding: 0;
 }
@@ -1262,6 +1262,20 @@ ul.navbar-wrap {
   margin-bottom: 5px;
 }
 
+/* DATATABLES.NET */
+
+div.entityCollection div.dataTables_wrapper {
+    margin-top: 15px;
+}
+
+div.dataTables_wrapper select.form-select {
+    min-width: 60px;
+}
+
+div.dataTables_wrapper ul.pagination {
+    font-size: small;
+}
+
 /* TOOLTIPS */
 
 .tooltip {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesCssBootstrap5ReferenceWkt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesCssBootstrap5ReferenceWkt.java
new file mode 100644
index 0000000000..81af0f3fd3
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesCssBootstrap5ReferenceWkt.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.isis.viewer.wicket.ui.pages.common.datatables;
+
+import org.apache.wicket.markup.head.CssHeaderItem;
+
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
+import de.agilecoders.wicket.webjars.request.resource.WebjarsCssResourceReference;
+
+public class DatatablesCssBootstrap5ReferenceWkt extends WebjarsCssResourceReference {
+    private static final long serialVersionUID = 1L;
+
+    @Getter(lazy = true) @Accessors(fluent = true)
+    private static final DatatablesCssBootstrap5ReferenceWkt instance =
+        new DatatablesCssBootstrap5ReferenceWkt();
+
+    public static CssHeaderItem asHeaderItem() {
+        return CssHeaderItem.forReference(DatatablesCssBootstrap5ReferenceWkt.instance());
+    }
+
+    /**
+     * Private constructor.
+     */
+    private DatatablesCssBootstrap5ReferenceWkt() {
+        super(RESOURCE);
+    }
+
+    private static final String RESOURCE = "datatables/1.12.1/css/dataTables.bootstrap5.min.css";
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesCssReferenceWkt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesCssReferenceWkt.java
new file mode 100644
index 0000000000..f7ba0bf2fe
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesCssReferenceWkt.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.isis.viewer.wicket.ui.pages.common.datatables;
+
+import org.apache.wicket.markup.head.CssHeaderItem;
+
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
+import de.agilecoders.wicket.webjars.request.resource.WebjarsCssResourceReference;
+
+public class DatatablesCssReferenceWkt extends WebjarsCssResourceReference {
+    private static final long serialVersionUID = 1L;
+
+    @Getter(lazy = true) @Accessors(fluent = true)
+    private static final DatatablesCssReferenceWkt instance =
+        new DatatablesCssReferenceWkt();
+
+    public static CssHeaderItem asHeaderItem() {
+        return CssHeaderItem.forReference(DatatablesCssReferenceWkt.instance());
+    }
+
+    /**
+     * Private constructor.
+     */
+    private DatatablesCssReferenceWkt() {
+        super(RESOURCE);
+    }
+
+    private static final String RESOURCE = "datatables/1.12.1/css/jquery.dataTables.min.css";
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptBootstrap5ReferenceWkt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptBootstrap5ReferenceWkt.java
new file mode 100644
index 0000000000..cfba077a2b
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptBootstrap5ReferenceWkt.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.isis.viewer.wicket.ui.pages.common.datatables;
+
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
+
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
+import de.agilecoders.wicket.webjars.request.resource.WebjarsJavaScriptResourceReference;
+
+public class DatatablesJavaScriptBootstrap5ReferenceWkt extends WebjarsJavaScriptResourceReference {
+    private static final long serialVersionUID = 1L;
+
+    @Getter(lazy = true) @Accessors(fluent = true)
+    private static final DatatablesJavaScriptBootstrap5ReferenceWkt instance =
+        new DatatablesJavaScriptBootstrap5ReferenceWkt();
+
+    public static JavaScriptReferenceHeaderItem asHeaderItem() {
+        return JavaScriptHeaderItem.forReference(DatatablesJavaScriptBootstrap5ReferenceWkt.instance());
+    }
+
+    /**
+     * Private constructor.
+     */
+    private DatatablesJavaScriptBootstrap5ReferenceWkt() {
+        super(RESOURCE);
+    }
+
+    private static final String RESOURCE = "datatables/1.12.1/js/dataTables.bootstrap5.min.js";
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptReferenceWkt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptReferenceWkt.java
new file mode 100644
index 0000000000..adc751a45f
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptReferenceWkt.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.isis.viewer.wicket.ui.pages.common.datatables;
+
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
+
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
+import de.agilecoders.wicket.webjars.request.resource.WebjarsJavaScriptResourceReference;
+
+public class DatatablesJavaScriptReferenceWkt extends WebjarsJavaScriptResourceReference {
+    private static final long serialVersionUID = 1L;
+
+    @Getter(lazy = true) @Accessors(fluent = true)
+    private static final DatatablesJavaScriptReferenceWkt instance =
+        new DatatablesJavaScriptReferenceWkt();
+
+    public static JavaScriptReferenceHeaderItem asHeaderItem() {
+        return JavaScriptHeaderItem.forReference(DatatablesJavaScriptReferenceWkt.instance());
+    }
+
+    /**
+     * Private constructor.
+     */
+    private DatatablesJavaScriptReferenceWkt() {
+        super(RESOURCE);
+    }
+
+    private static final String RESOURCE = "datatables/1.12.1/js/jquery.dataTables.min.js";
+}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptResourceReferenceInit.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptResourceReferenceInit.java
new file mode 100644
index 0000000000..c44b05a808
--- /dev/null
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/DatatablesJavaScriptResourceReferenceInit.java
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.pages.common.datatables;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import org.apache.wicket.markup.head.JavaScriptContentHeaderItem;
+import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.util.FileCopyUtils;
+
+import org.apache.isis.core.config.IsisConfiguration;
+
+/**
+ * Javascript (client-side) extensions and fixes.
+ */
+public class DatatablesJavaScriptResourceReferenceInit extends JavaScriptContentHeaderItem {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID = "dataTablesInit";
+
+    private static DatatablesJavaScriptResourceReferenceInit instance = null;
+
+    public static final DatatablesJavaScriptResourceReferenceInit instance(IsisConfiguration configuration) {
+        if (instance == null) {
+            String javascript = readResource(configuration);
+            instance = new DatatablesJavaScriptResourceReferenceInit(javascript, ID);
+        }
+        return instance;
+    }
+
+    private DatatablesJavaScriptResourceReferenceInit(CharSequence javaScript, String id) {
+        super(javaScript, id);
+    }
+
+    private static String readResource(IsisConfiguration configuration) {
+        String options = configuration.getViewer().getWicket().getTable().getDecoration().getDataTablesNet().getOptions().orElse("");
+        return readScript().replace("$PLACEHOLDER$", options);
+    }
+
+    private static String readScript() {
+        return asString(new ClassPathResource("dataTables.init.js", DatatablesJavaScriptResourceReferenceInit.class));
+    }
+
+    private static String asString(Resource resource) {
+        try (Reader reader = new InputStreamReader(resource.getInputStream(), UTF_8)) {
+            return FileCopyUtils.copyToString(reader);
+        } catch (IOException e) {
+            return "";
+        }
+    }
+
+}
diff --git a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/EditingObjectsConfiguration.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/dataTables.init.js
similarity index 83%
rename from core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/EditingObjectsConfiguration.java
rename to viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/dataTables.init.js
index 3e7f6cd43e..e3cf350549 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/metamodel/facets/EditingObjectsConfiguration.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/datatables/dataTables.init.js
@@ -16,9 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.config.metamodel.facets;
+(function($) {
+
+  $(document).ready( function () {
+       $('div.table-decoration table.contents').DataTable({
+            $PLACEHOLDER$
+       });
+  } );
+
+})(jQuery);
 
-public enum EditingObjectsConfiguration {
-    TRUE,
-    FALSE;
-}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
index 7c9a58cce0..ae3bdefe2d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/viewer/js/jquery.isis.wicket.viewer.js
@@ -108,9 +108,9 @@ $(function() {
             let el = $('#'+elementId).find('.inputFormTable.parameters')
             	.find('input,textarea,div.cbx,select').filter(':visible:first');
             if(el) {
-	
+
 				//console.log('Isis.Topic.FOCUS_FIRST_PARAMETER: elementId=' + elementId);
-	
+
                 let elNodeName = $(el).prop('nodeName')
                 if (elNodeName) {
                     let x = elNodeName.toLowerCase()
@@ -213,7 +213,7 @@ $(function() {
 	    });
 	}
 	$(document, '.wkt-component-with-tooltip').on('click', hidePopover);
-	
+
 	/* stop event bubbling on html links that have a container with onClick event already */
 	$('.no-click-bubbling').click(function(event){
 	    event.stopImmediatePropagation();
@@ -276,6 +276,7 @@ $(function() {
 
 });
 
+
 /**
  * enables 'maxlength' to work as an attribute on 'textarea'
  *
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/config/WicketViewerCssBundleInit.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/config/WicketViewerCssBundleInit.java
index 35495524d6..c88a40020d 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/config/WicketViewerCssBundleInit.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/wicketapp/config/WicketViewerCssBundleInit.java
@@ -32,6 +32,8 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.string.MultiLineStrin
 import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
 import org.apache.isis.viewer.wicket.viewer.wicketapp.IsisWicketApplication;
 
+import de.agilecoders.wicket.webjars.request.resource.WebjarsCssResourceReference;
+
 @Configuration
 public class WicketViewerCssBundleInit implements WicketApplicationInitializer {