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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 5c9221d00c CAUSEWAY-3697: deprecates 
DomainService(nature=NatureOfService..)
5c9221d00c is described below

commit 5c9221d00cd73671207ebf5059d0bcb60ea67d70
Author: Andi Huber <[email protected]>
AuthorDate: Thu Mar 14 11:36:11 2024 +0100

    CAUSEWAY-3697: deprecates DomainService(nature=NatureOfService..)
    
    - leaving some TODO markers for implementing a SPI
---
 api/applib/src/main/java/module-info.java          |   1 +
 .../causeway/applib/annotation/DomainService.java  |   4 +-
 .../applib/annotation/NatureOfService.java         |  74 +-----------
 .../services/appfeatui/ApplicationFeatureMenu.java |   5 +-
 .../services/confview/ConfigurationMenu.java       |   5 +-
 .../services/metamodel/MetaModelServiceMenu.java   |   5 +-
 .../scope/ActionContributionFilterService.java     |  29 +++--
 .../applib/services/user/ImpersonateMenu.java      |   5 +-
 .../applib/services/user/ImpersonateStopMenu.java  |   5 +-
 .../causeway/applib/services/userui/UserMenu.java  |   5 +-
 .../config/beans/CausewayBeanTypeClassifier.java   |  26 +++++
 .../beans/CausewayBeanTypeClassifierDefault.java   |   5 +-
 core/metamodel/src/main/java/module-info.java      |   1 -
 .../WebApiOnlyActionFacetAbstract.java             |  39 -------
 ...viceMenuFacetFromDomainServiceFacetFactory.java |  65 -----------
 ...ebApiOnlyActionFacetFromDomainServiceFacet.java |  55 ---------
 .../object/domainservice/DomainServiceFacet.java   |  54 +++------
 .../domainservice/DomainServiceFacetAbstract.java  |  26 +++--
 .../DomainServiceFacetAnnotationFactory.java       |   3 +-
 .../DomainServiceFacetForAnnotation.java           |  28 ++++-
 .../RemoveAnnotatedMethodsFacetFactory.java        |  18 +--
 .../LogicalTypeFacetFromClassNameFactory.java      |   5 +-
 .../dflt/ProgrammingModelFacetsJava11.java         |   3 -
 .../services/metamodel/MetaModelExporter.java      |  35 +-----
 .../core/metamodel/spec/ObjectSpecification.java   |   5 +
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  13 +++
 ...tionFacetFromDomainServiceFacetFactoryTest.java | 129 ---------------------
 .../DomainServiceFacetAnnotationFactoryTest.java   |   3 +-
 .../facets/param/name/ParameterNameFacetTest.java  |   2 +-
 .../bootstrap/MenuBarsServiceBootstrap.java        |  14 +--
 .../runtimeservices/menubars/bootstrap/Bar.java    |   5 +-
 .../security/authentication/logout/LogoutMenu.java |   5 +-
 .../commandlog/applib/app/CommandLogMenu.java      |   3 +-
 .../docgen/help/menu/DocumentationMenu.java        |   3 +-
 .../bulkupdate/BulkUpdateMenuForDemoToDoItem.java  |   5 +-
 .../ExcelPivotByCategoryAndSubcategoryMenu.java    |   5 +-
 .../ExcelUploadServiceForDemoToDoItem.java         |   5 +-
 .../todomodule/dom/ExcelDemoToDoItemMenu.java      |   5 +-
 .../executionlog/applib/app/ExecutionLogMenu.java  |   3 +-
 .../applib/app/ExecutionOutboxMenu.java            |   5 +-
 .../applib/restapi/OutboxRestApi.java              |   3 +-
 .../github/menu/LayoutLoadersGitHubMenu.java       |   3 +-
 .../audittrail/applib/app/AuditTrailMenu.java      |   3 +-
 .../permission/menu/ApplicationPermissionMenu.java |   5 +-
 .../applib/role/menu/ApplicationRoleMenu.java      |   5 +-
 .../tenancy/menu/ApplicationTenancyMenu.java       |   5 +-
 .../applib/user/menu/ApplicationUserMenu.java      |   5 +-
 .../secman/applib/user/menu/MeService.java         |   5 +-
 .../sessionlog/applib/app/SessionLogMenu.java      |   3 +-
 .../restapi/CommandRetrievalOnPrimaryService.java  |   3 +-
 .../testdomain/jdo/JdoInventoryResource.java       |   2 -
 .../testdomain/jpa/JpaInventoryResource.java       |   3 +-
 .../causeway/testdomain/rospec/RoSpecSampler.java  |   3 +-
 .../dom/FakeDataDemoObjectWithAllMenu.java         |   5 +-
 .../applib/fixturescripts/FixtureScripts.java      |   5 +-
 .../h2console/ui/services/H2ManagerMenu.java       |   5 +-
 .../hsqldbmgr/dom/services/HsqlDbManagerMenu.java  |   5 +-
 .../viewer/test/domain/admin/AdminMenu.java        |   9 +-
 .../viewer/test/domain/calc/Calculator.java        |  53 +++++----
 .../viewer/test/domain/dept/Departments.java       |   4 +-
 .../graphql/viewer/test/domain/dept/DeptHeads.java |   3 +-
 .../graphql/viewer/test/domain/dept/People.java    |   8 +-
 .../graphql/viewer/test/domain/dept/Staff.java     |   4 +-
 .../viewer/test/domain/i18n/I18nCalculator.java    |   3 +-
 .../swagger/internal/_OpenApiModelFactory.java     |   2 +-
 ...sewayViewerRestfulObjectsIntegTestAbstract.java |   9 +-
 .../test/domain/dom/Departments.java               |   4 +-
 .../restfulobjects/test/domain/dom/DeptHeads.java  |   3 +-
 .../restfulobjects/test/domain/dom/People.java     |   8 +-
 .../restfulobjects/test/domain/dom/Staff.java      |   4 +-
 .../test/scenarios/dept/Department_IntegTest.java  |  15 +--
 .../resources/DomainServiceResourceServerside.java |   5 +-
 72 files changed, 242 insertions(+), 671 deletions(-)

diff --git a/api/applib/src/main/java/module-info.java 
b/api/applib/src/main/java/module-info.java
index bfd4bca708..b4a89c800f 100644
--- a/api/applib/src/main/java/module-info.java
+++ b/api/applib/src/main/java/module-info.java
@@ -97,6 +97,7 @@ module org.apache.causeway.applib {
     exports org.apache.causeway.applib.services.repository;
     exports org.apache.causeway.applib.services.routing;
     exports org.apache.causeway.applib.services.scratchpad;
+    exports org.apache.causeway.applib.services.scope;
     exports org.apache.causeway.applib.services.session;
     exports org.apache.causeway.applib.services.sitemap;
     exports org.apache.causeway.applib.services.sudo;
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainService.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainService.java
index d0c6b2df72..b4f7b14a81 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainService.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainService.java
@@ -68,8 +68,10 @@ public @interface DomainService {
      * The nature of this service, either in the UI or REST only
      *
      * @see DomainObject#nature()
+     * @deprecated has no scope limiting effect any longer, see [CAUSEWAY-3697]
      */
+    @Deprecated(forRemoval = true, since = "2.0.0-RC4")
     NatureOfService nature()
-            default NatureOfService.BOTH;
+            default NatureOfService.VIEW;
 
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/annotation/NatureOfService.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/annotation/NatureOfService.java
index 10f70d0167..129ba10361 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/annotation/NatureOfService.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/annotation/NatureOfService.java
@@ -19,78 +19,12 @@
 package org.apache.causeway.applib.annotation;
 
 /**
- * The different sorts of domain services recognized by Causeway, as specified 
in {@link DomainService#nature()}
+ * Corresponds to {@link DomainService#nature()}
  *
- * @since 1.x {@index}
+ * @deprecated has no scope limiting effect any longer, see [CAUSEWAY-3697]
  */
+@Deprecated(forRemoval = true, since = "2.0.0-RC4")
 public enum NatureOfService {
-    /**
-     * The service's actions appear only in the menu bar human-usable UIs 
(such as Wicket viewer).
-     * They do <i>not</i> appear in any REST or GraphQL APIs.
-     */
-    WEB_UI, //TODO perhaps rename to UI_ONLY?
-
-    /**
-     * The service's actions should only be visible in the Web API exposed by 
the Restful Objects viewer and the
-     * GraphQL viewer.  They do <i>not</i> appear in any human-usable Web UIs 
(such as Wicket viewer)
-     */
-    WEB_API, //TODO perhaps rename to WEBAPI_ONLY?
-
-    /**
-     * The service's actions appear in the menu bar of Web UIs (such as Wicket 
viewer), and also appear in the
-     * Web APIs (Restful Objects viewer and GraphQL viewer).
-     *
-     * @apiNote
-     * Contributing actions to the 'viewer' implies, that these must also be 
exposed to the REST API,
-     * simply because alternative viewers might be solely based on the 
provided REST end-points.
-     */
-    BOTH, //TODO perhaps rename to ENABLED_EVERYWHERE?
-
-    /**
-     * @deprecated use {@link #BOTH} instead
-     * @see NatureOfService#BOTH
-     */
-    @Deprecated
     VIEW,
-
-    /**
-     * @deprecated use {@link #WEB_API} instead
-     * @see NatureOfService#WEB_API
-     */
-    @Deprecated
-    REST
-
-    ;
-
-    // -- BASIC PREDICATES
-
-    /**
-     * Whether a service contributes its actions to both human-usable UIs and 
the Web APIs.
-     *
-     * @see NatureOfService#BOTH
-     */
-    public boolean isEnabledEverywhere() {
-        return this == BOTH
-                || this == VIEW;
-    }
-
-    /**
-     * Whether a service contributes its actions to human-usable UIs.
-     * @see NatureOfService#WEB_UI
-     */
-    public boolean isEnabledForUi() {
-        return isEnabledEverywhere()
-                || this == WEB_UI;
-    }
-
-    /**
-     * Whether a service contributes its actions to Web APIs (REST and GraphQL)
-     * @see NatureOfService#WEB_API
-     */
-    public boolean isEnabledForWebApi() {
-        return isEnabledEverywhere()
-                || this == WEB_API
-                || this == REST;
-    }
-
+    REST;
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/appfeatui/ApplicationFeatureMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/appfeatui/ApplicationFeatureMenu.java
index 8dc47b3e47..f323c1b010 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/appfeatui/ApplicationFeatureMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/appfeatui/ApplicationFeatureMenu.java
@@ -29,7 +29,6 @@ import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.RestrictTo;
@@ -43,9 +42,7 @@ import 
org.apache.causeway.commons.internal.collections._Lists;
 /**
  * @since 2.x  {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/confview/ConfigurationMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/confview/ConfigurationMenu.java
index edbcc58bc2..1728fdc723 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/confview/ConfigurationMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/confview/ConfigurationMenu.java
@@ -27,7 +27,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -41,9 +40,7 @@ import lombok.RequiredArgsConstructor;
  *
  * @since 2.0 {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
index 8d37c45796..87ca4373cf 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
@@ -34,7 +34,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
@@ -59,9 +58,7 @@ import lombok.val;
  * @since 2.0 {@index}
  */
 @Named(MetaModelServiceMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         named = "Prototyping",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/WebApiOnlyActionFacet.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/scope/ActionContributionFilterService.java
similarity index 51%
rename from 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/WebApiOnlyActionFacet.java
rename to 
api/applib/src/main/java/org/apache/causeway/applib/services/scope/ActionContributionFilterService.java
index 8b9eaa134f..7167d1fade 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/WebApiOnlyActionFacet.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/scope/ActionContributionFilterService.java
@@ -16,21 +16,30 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.core.metamodel.facets.actions.notinservicemenu;
+package org.apache.causeway.applib.services.scope;
 
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.interactions.VisibilityContext;
+import org.springframework.lang.Nullable;
+
+import org.apache.causeway.applib.annotation.DomainService;
+import org.apache.causeway.applib.id.LogicalType;
 
 /**
- * Indicates that the (repository) action should not be contributed to any
- * objects.
+ * Optional SPI to limit the scope of {@link DomainService} actions that 
contribute to UI or Web-API(s).
  *
- * <p>
- * In the standard Apache Causeway Programming Model, corresponds to 
annotating the
- * action method using <tt>@NotContributed</tt>.
+ * @since 2.0.0 {index}
  */
-public interface WebApiOnlyActionFacet extends Facet {
+public interface ActionContributionFilterService {
+
+    /**
+     * Whether {@link LogicalType} represents a domain-service
+     * that contributes actions to the UI.
+     */
+    boolean isContributingToUi(final @Nullable LogicalType logicalType);
 
-    String hides(VisibilityContext ic);
+    /**
+     * Whether {@link LogicalType} represents a domain-service
+     * that contributes actions to the Web API(s).
+     */
+    boolean isContributingToWebApi(final @Nullable LogicalType logicalType);
 
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateMenu.java
index 12637155e2..fdc1991b7f 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateMenu.java
@@ -31,7 +31,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.RestrictTo;
@@ -56,9 +55,7 @@ import lombok.val;
  *
  * @since 2.0 {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named(ImpersonateMenu.LOGICAL_TYPE_NAME)
 @DomainServiceLayout(
         named = "Security",
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateStopMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateStopMenu.java
index fca90d2ac5..e827c5f828 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateStopMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/user/ImpersonateStopMenu.java
@@ -27,7 +27,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.Redirect;
@@ -51,9 +50,7 @@ import lombok.RequiredArgsConstructor;
  *
  * @since 2.0 {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named(ImpersonateStopMenu.LOGICAL_TYPE_NAME)
 @DomainServiceLayout(
         named = "Security",
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/userui/UserMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/userui/UserMenu.java
index eae41ed51d..eceaf91983 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/userui/UserMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/userui/UserMenu.java
@@ -27,7 +27,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -41,9 +40,7 @@ import lombok.RequiredArgsConstructor;
  *
  * @since 2.0 {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named(UserMenu.LOGICAL_TYPE_NAME)
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
diff --git 
a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifier.java
 
b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifier.java
index 84cd4a9ee3..a12e7d8016 100644
--- 
a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifier.java
+++ 
b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifier.java
@@ -18,11 +18,16 @@
  */
 package org.apache.causeway.core.config.beans;
 
+import java.util.Optional;
+
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.io.support.SpringFactoriesLoader;
 
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.context._Context;
+import org.apache.causeway.commons.internal.reflection._ClassCache;
 
 import lombok.NonNull;
 
@@ -32,6 +37,27 @@ import lombok.NonNull;
  */
 public interface CausewayBeanTypeClassifier {
 
+    public enum Attributes {
+        /**
+         * Corresponds to presence of a {@link DomainService} annotation.
+         * @see _ClassCache#lookupAttribute(Class, String)
+         */
+        HAS_DOMAIN_SERVICE_SEMANTICS,
+
+        /**
+         * Corresponds to {@link DomainObject#mixinMethod()}.
+         * @see _ClassCache#lookupAttribute(Class, String)
+         */
+        MIXIN_MAIN_METHOD_NAME;
+
+        public void set(final _ClassCache classCache, final Class<?> type, 
final String attributeValue) {
+            classCache.setAttribute(type, this.name(), attributeValue);
+        }
+        public Optional<String> lookup(final _ClassCache classCache, final 
Class<?> type) {
+            return classCache.lookupAttribute(type, this.name());
+        }
+    }
+
     // -- INTERFACE
 
     /**
diff --git 
a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifierDefault.java
 
b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifierDefault.java
index d47a261f3c..2debdfc68d 100644
--- 
a/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifierDefault.java
+++ 
b/core/config/src/main/java/org/apache/causeway/core/config/beans/CausewayBeanTypeClassifierDefault.java
@@ -51,7 +51,7 @@ implements CausewayBeanTypeClassifier {
     private final Can<CausewayBeanTypeClassifier> classifierPlugins = 
CausewayBeanTypeClassifier.get();
 
     private final _ClassCache classCache = _ClassCache.getInstance();
-    
+
     // handle arbitrary types ...
     @Override
     public CausewayBeanMetaData classify(
@@ -109,6 +109,7 @@ implements CausewayBeanTypeClassifier {
         val aDomainService = _Annotations.synthesize(type, 
DomainService.class);
         if(aDomainService.isPresent()) {
             val logicalType = LogicalType.infer(type);
+            Attributes.HAS_DOMAIN_SERVICE_SEMANTICS.set(classCache, type, 
"true");
             return CausewayBeanMetaData
                         .injectable(BeanSort.MANAGED_BEAN_CONTRIBUTING, 
logicalType);
         }
@@ -139,7 +140,7 @@ implements CausewayBeanTypeClassifier {
                         .indifferent(BeanSort.MANAGED_BEAN_CONTRIBUTING, type);
             case MIXIN:
                 // memoize mixin main name
-                classCache.setAttribute(type, "mixin-main-method-name", 
aDomainObject.mixinMethod());
+                Attributes.MIXIN_MAIN_METHOD_NAME.set(classCache, type, 
aDomainObject.mixinMethod());
                 return CausewayBeanMetaData.causewayManaged(BeanSort.MIXIN, 
type);
             case ENTITY:
                 return 
CausewayBeanMetaData.entity(PersistenceStack.UNSPECIFIED, 
LogicalType.infer(type));
diff --git a/core/metamodel/src/main/java/module-info.java 
b/core/metamodel/src/main/java/module-info.java
index e3f8907630..1a13c1ce55 100644
--- a/core/metamodel/src/main/java/module-info.java
+++ b/core/metamodel/src/main/java/module-info.java
@@ -29,7 +29,6 @@ open module org.apache.causeway.core.metamodel {
     //XXX ... org.apache.causeway.core.metamodel.facets.* : probably don't 
expose directly
     exports 
org.apache.causeway.core.metamodel.facets.actions.action.invocation;
     exports org.apache.causeway.core.metamodel.facets.actions.layout;
-    exports org.apache.causeway.core.metamodel.facets.actions.notinservicemenu;
     exports org.apache.causeway.core.metamodel.facets.actions.semantics;
     exports org.apache.causeway.core.metamodel.facets.actcoll.typeof;
     exports org.apache.causeway.core.metamodel.facets.all.described;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/WebApiOnlyActionFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/WebApiOnlyActionFacetAbstract.java
deleted file mode 100644
index 11e2dca243..0000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/WebApiOnlyActionFacetAbstract.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.core.metamodel.facets.actions.notinservicemenu;
-
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-
-public abstract class WebApiOnlyActionFacetAbstract extends FacetAbstract 
implements WebApiOnlyActionFacet {
-
-    private static final Class<? extends Facet> type() {
-        return WebApiOnlyActionFacet.class;
-    }
-
-    public WebApiOnlyActionFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
-    }
-
-    public WebApiOnlyActionFacetAbstract(final FacetHolder holder, final 
Facet.Precedence precedence) {
-        super(type(), holder, precedence);
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactory.java
deleted file mode 100644
index 487c5d6c1e..0000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.derived;
-
-import javax.inject.Inject;
-
-import org.apache.causeway.applib.annotation.NatureOfService;
-import org.apache.causeway.core.metamodel.context.MetaModelContext;
-import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
-import org.apache.causeway.core.metamodel.facetapi.FeatureType;
-import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.causeway.core.metamodel.facets.FacetedMethod;
-import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacet;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-
-import lombok.val;
-
-public class NotInServiceMenuFacetFromDomainServiceFacetFactory
-extends FacetFactoryAbstract {
-
-    @Inject
-    public NotInServiceMenuFacetFromDomainServiceFacetFactory(final 
MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val method = processMethodContext.getMethod();
-        final Class<?> declaringClass = method.getDeclaringClass();
-        final ObjectSpecification spec = 
getSpecificationLoader().loadSpecification(declaringClass);
-
-        if(spec == null) {
-            return;
-        }
-
-        spec.lookupNonFallbackFacet(DomainServiceFacet.class)
-        .ifPresent(domainServiceFacet->{
-            final NatureOfService natureOfService = 
domainServiceFacet.getNatureOfService();
-            if(natureOfService.isEnabledForUi()) {
-                return;
-            }
-            final FacetedMethod facetHolder = 
processMethodContext.getFacetHolder();
-            FacetUtil.addFacet(new 
WebApiOnlyActionFacetFromDomainServiceFacet(natureOfService, facetHolder));
-        });
-
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/WebApiOnlyActionFacetFromDomainServiceFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/WebApiOnlyActionFacetFromDomainServiceFacet.java
deleted file mode 100644
index b0f9adddab..0000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/WebApiOnlyActionFacetFromDomainServiceFacet.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.derived;
-
-
-import java.util.function.BiConsumer;
-
-import org.apache.causeway.applib.annotation.NatureOfService;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.WebApiOnlyActionFacetAbstract;
-import org.apache.causeway.core.metamodel.interactions.VisibilityContext;
-
-
-public class WebApiOnlyActionFacetFromDomainServiceFacet
-extends WebApiOnlyActionFacetAbstract {
-
-    private final NatureOfService natureOfService;
-
-    public WebApiOnlyActionFacetFromDomainServiceFacet(
-            final NatureOfService natureOfService, final FacetHolder holder) {
-        super(holder, Precedence.HIGH); // facet has final say, don't override
-        this.natureOfService = natureOfService;
-    }
-
-    @Override
-    public String hides(final VisibilityContext ic) {
-        return String.format("@DomainService(nature=%s) annotation present", 
natureOfService);
-    }
-
-    NatureOfService getNatureOfService() {
-        return natureOfService;
-    }
-
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("natureOfService", natureOfService);
-    }
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
index fafff2a6cb..79d02c8bdf 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
@@ -18,53 +18,37 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.domainservice;
 
-import java.util.Optional;
+import java.util.function.Predicate;
 
-import org.springframework.lang.Nullable;
-
-import org.apache.causeway.applib.annotation.NatureOfService;
-import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-/**
- * Corresponds to annotating the class with the {@link 
org.apache.causeway.applib.annotation.DomainService} annotation.
- */
 public interface DomainServiceFacet extends Facet {
 
     /**
-     * Corresponds to {@link 
org.apache.causeway.applib.annotation.DomainService#nature()}.
-     *
+     * Whether facetHolder represents a service that contributes actions to 
the UI.
+     * May or may not also contribute to the Web API(s).
      */
-    NatureOfService getNatureOfService();
-
-    // -- UTILITY
-
-    static Optional<NatureOfService> getNatureOfService(final @Nullable 
FacetHolder facetHolderIfAny) {
-        return Optional.ofNullable(facetHolderIfAny)
-        .map(facetHolder->facetHolder.getFacet(DomainServiceFacet.class))
-        .filter(_NullSafe::isPresent)
-        .map(DomainServiceFacet::getNatureOfService);
-    }
+    boolean isContributingToUi();
 
     /**
-     * @param facetHolderIfAny - null-able
-     * @return whether facetHolder represents a service that contributes 
actions to the Web UI (may or may not also contribute to the Web APIs)
+     * Whether facetHolder represents a service that contributes actions the 
Web API(s).
+     * May or may not also contribute to the UI.
      */
-    static boolean isContributingToUi(final @Nullable FacetHolder 
facetHolderIfAny) {
-        return getNatureOfService(facetHolderIfAny)
-                .filter(NatureOfService::isEnabledForUi)
-                .isPresent();
+    boolean isContributingToWebApi();
+
+    // -- PREDICATES
+
+    static Predicate<ObjectSpecification> contributingToUi() {
+        return spec-> spec.lookupFacet(DomainServiceFacet.class)
+                .map(DomainServiceFacet::isContributingToUi)
+                .orElse(false);
     }
 
-    /**
-     * @param facetHolderIfAny - null-able
-     * @return whether facetHolder represents a service that contributes 
actions the Web API (may or may not also contribute to the Web UI)
-     */
-    static boolean isContributingToWebApi(final @Nullable FacetHolder 
facetHolderIfAny) {
-        return getNatureOfService(facetHolderIfAny)
-                .filter(NatureOfService::isEnabledForWebApi)
-                .isPresent();
+    static Predicate<ObjectSpecification> contributingToWebApi() {
+        return spec-> spec.lookupFacet(DomainServiceFacet.class)
+                .map(DomainServiceFacet::isContributingToWebApi)
+                .orElse(false);
     }
 
 }
\ No newline at end of file
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
index 21eda8d368..690210f276 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
@@ -18,14 +18,14 @@
  */
 package org.apache.causeway.core.metamodel.facets.object.domainservice;
 
-
 import java.util.function.BiConsumer;
 
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facetapi.FacetAbstract;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 
+import lombok.Getter;
+import lombok.NonNull;
 
 public abstract class DomainServiceFacetAbstract
 extends FacetAbstract
@@ -35,23 +35,25 @@ implements DomainServiceFacet {
         return DomainServiceFacet.class;
     }
 
-    private final NatureOfService natureOfService;
+    @Getter(onMethod_={@Override})
+    private final boolean contributingToUi;
+
+    @Getter(onMethod_={@Override})
+    private final boolean contributingToWebApi;
 
     public DomainServiceFacetAbstract(
-            final FacetHolder facetHolder,
-            final NatureOfService natureOfService) {
+            final @NonNull FacetHolder facetHolder,
+            final boolean contributingToUi,
+            final boolean contributingToWebApi) {
         super(DomainServiceFacetAbstract.type(), facetHolder);
-        this.natureOfService = natureOfService;
-    }
-
-    @Override
-    public NatureOfService getNatureOfService() {
-        return natureOfService;
+        this.contributingToUi = contributingToUi;
+        this.contributingToWebApi = contributingToWebApi;
     }
 
     @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("natureOfService", natureOfService);
+        visitor.accept("isContributingToUi", isContributingToUi());
+        visitor.accept("isContributingToWebApi", isContributingToWebApi());
     }
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index 73349582a6..beb88ce9f8 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 
 import org.apache.causeway.applib.annotation.DomainService;
+import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facetapi.MetaModelRefiner;
@@ -54,7 +55,7 @@ implements MetaModelRefiner {
         addFacet(
                 new DomainServiceFacetForAnnotation(
                         facetHolder,
-                        domainServiceIfAny.get().nature()));
+                        Can.empty())); //TODO[CAUSEWAY-3697] provide services
 
         addFacetIfPresent(
                 AliasedFacetForDomainServiceAnnotation
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
index 462d4bc7c3..1352984e3f 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java
@@ -18,16 +18,36 @@
  */
 package 
org.apache.causeway.core.metamodel.facets.object.domainservice.annotation;
 
-import org.apache.causeway.applib.annotation.NatureOfService;
+import 
org.apache.causeway.applib.services.scope.ActionContributionFilterService;
+import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacetAbstract;
 
+import lombok.NonNull;
+
 public class DomainServiceFacetForAnnotation
 extends DomainServiceFacetAbstract {
 
     public DomainServiceFacetForAnnotation(
-            final FacetHolder facetHolder,
-            final NatureOfService natureOfService) {
-        super(facetHolder, natureOfService);
+            final @NonNull FacetHolder facetHolder,
+            final @NonNull Can<ActionContributionFilterService> 
filterServices) {
+        super(facetHolder,
+                evaluateIsContributingToUi(filterServices),
+                evaluateIsContributingToWebApi(filterServices));
+    }
+
+    // -- HELPER
+
+    private static boolean evaluateIsContributingToWebApi(
+            final Can<ActionContributionFilterService> filterServices) {
+        // TODO[CAUSEWAY-3697] honor filterServices
+        return true;
     }
+
+    private static boolean evaluateIsContributingToUi(
+            final Can<ActionContributionFilterService> filterServices) {
+        // TODO[CAUSEWAY-3697] honor filterServices
+        return true;
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
index 41ba531285..7acfa89de1 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 
 import org.apache.causeway.commons.internal.functions._Predicates;
 import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
+import 
org.apache.causeway.core.config.beans.CausewayBeanTypeClassifier.Attributes;
 import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
@@ -57,7 +58,7 @@ extends FacetFactoryAbstract {
                             }
                             return true; // continue processing
                         })
-                        /* don't throw away mixin main methods, 
+                        /* don't throw away mixin main methods,
                          * those we keep irrespective of IntrospectionPolicy */
                         
.filter(_Predicates.not(isMixinMainMethod(processClassContext)))
                         .forEach(method -> {
@@ -85,25 +86,24 @@ extends FacetFactoryAbstract {
     }
 
     // -- HELPER
-    
+
     /**
      * We have no MixinFacet yet, so we need to revert to low level 
introspection tactics.
      */
     private Predicate<ResolvedMethod> isMixinMainMethod(final @NonNull 
ProcessClassContext processClassContext) {
-        
+
         // shortcut, when we already know the class is not a mixin
         if(processClassContext.getFacetHolder() instanceof 
ObjectSpecification) {
             val spec = (ObjectSpecification) 
processClassContext.getFacetHolder();
             if(!spec.getBeanSort().isMixin()) {
-                return method->false; 
+                return method->false;
             }
         }
-        // lookup attribute from class-cache as it should have been already 
processed by the BeanTypeClassifier 
-        val cls = processClassContext.getCls();        
-        val mixinMainMethodName = getClassCache()
-            .lookupAttribute(cls, "mixin-main-method-name")
+        // lookup attribute from class-cache as it should have been already 
processed by the BeanTypeClassifier
+        val cls = processClassContext.getCls();
+        val mixinMainMethodName = 
Attributes.MIXIN_MAIN_METHOD_NAME.lookup(getClassCache(), cls)
             .orElse(null);
         return method->method.name().equals(mixinMainMethodName);
     }
-    
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
index 86a8566785..224cd3f242 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
@@ -26,7 +26,6 @@ import 
org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.causeway.core.metamodel.facets.ObjectTypeFacetFactory;
-import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
@@ -122,8 +121,8 @@ implements
             return false; //skip validation
         }
         if (objectSpec.isInjectable()) {
-            // only check if domain service is contributing visible somehow 
(Web UI or Web APIREST)
-            if(DomainServiceFacet.getNatureOfService(objectSpec).isEmpty()) {
+            // only check if its a domain service (that is potentially 
contributing to UI or Web-API(s).
+            if(!objectSpec.isDomainService()) {
                 return false; //skip validation
             }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index 0d3722179e..44ecc13130 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -24,7 +24,6 @@ import 
org.apache.causeway.core.metamodel.facets.actions.action.ActionOverloadin
 import 
org.apache.causeway.core.metamodel.facets.actions.contributing.derived.ContributingFacetFromMixinFacetFactory;
 import 
org.apache.causeway.core.metamodel.facets.actions.homepage.annotation.HomePageFacetAnnotationFactory;
 import 
org.apache.causeway.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory;
-import 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.derived.NotInServiceMenuFacetFromDomainServiceFacetFactory;
 import 
org.apache.causeway.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethodFactory;
 import 
org.apache.causeway.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessorFactory;
 import 
org.apache.causeway.core.metamodel.facets.collections.collection.CollectionAnnotationFacetFactory;
@@ -180,8 +179,6 @@ extends ProgrammingModelAbstract {
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new 
BookmarkPolicyFacetFallbackFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new 
HomePageFacetAnnotationFactory(mmc));
 
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new 
NotInServiceMenuFacetFromDomainServiceFacetFactory(mmc));
-
         // must come after CssClassFacetOnMemberFactory
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new 
CssClassFacetOnActionFromConfiguredRegexFactory(mmc));
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelExporter.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelExporter.java
index c6576fdeba..b418f279fe 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelExporter.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelExporter.java
@@ -20,7 +20,6 @@ package org.apache.causeway.core.metamodel.services.metamodel;
 
 import java.lang.reflect.Modifier;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -32,7 +31,6 @@ import 
org.apache.causeway.commons.internal.collections._Lists;
 import org.apache.causeway.commons.internal.collections._Maps;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
-import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
@@ -239,7 +237,7 @@ class MetaModelExporter {
         }
 
         if (specification.isInjectable()) {
-            
if(DomainServiceFacet.getNatureOfService(specification).isPresent()) {
+            if(specification.isDomainService()) {
                 addActions(specification, domainClassByObjectSpec, config);
             }
         } else {
@@ -406,9 +404,7 @@ class MetaModelExporter {
 
         final List<org.apache.causeway.schema.metamodel.v2.Facet> facetList = 
facets.getFacet();
         facetHolder.streamFacets()
-        .filter(facet -> ! (
-                config.isIgnoreFallbackFacets()
-                    && facet.getPrecedence().isFallback()))
+        .filter(facet -> (!config.isIgnoreFallbackFacets() || 
!facet.getPrecedence().isFallback()))
         .map(facet -> asXsdType(facet, config))
         .forEach(facetList::add);
 
@@ -452,38 +448,19 @@ class MetaModelExporter {
     }
 
     private void sortFacetAttributes(final List<FacetAttr> attributes) {
-        Collections.sort(attributes, new Comparator<FacetAttr>() {
-            @Override
-            public int compare(final FacetAttr o1, final FacetAttr o2) {
-                return o1.getName().compareTo(o2.getName());
-            }
-        });
+        Collections.sort(attributes, (o1, o2) -> 
o1.getName().compareTo(o2.getName()));
     }
 
     private static void sortDomainClasses(final List<DomainClassDto> 
specifications) {
-        Collections.sort(specifications, new Comparator<DomainClassDto>() {
-            @Override
-            public int compare(final DomainClassDto o1, final DomainClassDto 
o2) {
-                return o1.getId().compareTo(o2.getId());
-            }
-        });
+        Collections.sort(specifications, (o1, o2) -> 
o1.getId().compareTo(o2.getId()));
     }
 
     private void sortMembers(final List<? extends Member> members) {
-        Collections.sort(members, new Comparator<Member>() {
-            @Override public int compare(final Member o1, final Member o2) {
-                return o1.getId().compareTo(o2.getId());
-            }
-        });
+        Collections.sort(members, (o1, o2) -> 
o1.getId().compareTo(o2.getId()));
     }
 
     private void sortFacets(final 
List<org.apache.causeway.schema.metamodel.v2.Facet> facets) {
-        Collections.sort(facets, new 
Comparator<org.apache.causeway.schema.metamodel.v2.Facet>() {
-            @Override public int compare(final 
org.apache.causeway.schema.metamodel.v2.Facet o1,
-                    final org.apache.causeway.schema.metamodel.v2.Facet o2) {
-                return o1.getId().compareTo(o2.getId());
-            }
-        });
+        Collections.sort(facets, (o1, o2) -> o1.getId().compareTo(o2.getId()));
     }
 
     private boolean isValueType(final ObjectSpecification specification) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
index bfd669bfef..8680f5e289 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
@@ -421,6 +421,11 @@ extends
      */
     boolean isInjectable();
 
+    /**
+     * Whether represents a bean, that is in effect annotated with {@link 
DomainService}.
+     */
+    boolean isDomainService();
+
     default boolean isMixin() {
         return getBeanSort().isMixin();
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 3517ccf1cf..231ed0fc8f 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -36,10 +36,12 @@ import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.commons.internal.collections._Lists;
 import org.apache.causeway.commons.internal.collections._Maps;
+import org.apache.causeway.commons.internal.reflection._ClassCache;
 import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
 import 
org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
 import org.apache.causeway.commons.internal.reflection._Reflect;
 import org.apache.causeway.core.config.beans.CausewayBeanMetaData;
+import 
org.apache.causeway.core.config.beans.CausewayBeanTypeClassifier.Attributes;
 import org.apache.causeway.core.metamodel.commons.ToString;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
@@ -342,6 +344,17 @@ implements FacetHolder {
         return isInjectableLazy.get();
     }
 
+    private _Lazy<Boolean> isDomainServiceLazy = _Lazy.threadSafe(()->
+        
Attributes.HAS_DOMAIN_SERVICE_SEMANTICS.lookup(_ClassCache.getInstance(), 
getCorrespondingClass())
+            .map("true"::equals)
+            .orElse(false));
+
+    @Override
+    public boolean isDomainService() {
+        return isDomainServiceLazy.get();
+    }
+
+
     // -- TO STRING
 
     @Override
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/WebApiOnlyActionFacetFromDomainServiceFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/WebApiOnlyActionFacetFromDomainServiceFacetFactoryTest.java
deleted file mode 100644
index 18f17e5d9f..0000000000
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/WebApiOnlyActionFacetFromDomainServiceFacetFactoryTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.derived;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
-import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract;
-import 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.WebApiOnlyActionFacet;
-
-class WebApiOnlyActionFacetFromDomainServiceFacetFactoryTest
-extends FacetFactoryTestAbstract {
-
-    private NotInServiceMenuFacetFromDomainServiceFacetFactory facetFactory;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        facetFactory = new 
NotInServiceMenuFacetFromDomainServiceFacetFactory(getMetaModelContext());
-    }
-
-    @Test
-    public void whenRest() throws Exception {
-
-        // given
-        @DomainService(nature = NatureOfService.WEB_API)
-        class CustomerService {
-            @SuppressWarnings("unused")
-            public String name() { return "Joe"; }
-        }
-
-        actionScenario(CustomerService.class, "name", (processMethodContext, 
facetHolder, facetedMethod) -> {
-            // when
-            facetFactory.process(processMethodContext);
-            // then
-            final Facet facet = 
facetedMethod.lookupNonFallbackFacet(WebApiOnlyActionFacet.class).orElse(null);
-            assertNotNull(facet);
-            assertThat(facet instanceof 
WebApiOnlyActionFacetFromDomainServiceFacet, is(true));
-            final WebApiOnlyActionFacetFromDomainServiceFacet 
facetDerivedFromDomainServiceFacet = 
(WebApiOnlyActionFacetFromDomainServiceFacet) facet;
-            assertEquals(NatureOfService.WEB_API, 
facetDerivedFromDomainServiceFacet.getNatureOfService());
-            assertNoMethodsRemoved();
-        });
-
-    }
-
-    @Test
-    public void whenView() throws Exception {
-
-        // given
-        @DomainService()
-        class CustomerService {
-            @SuppressWarnings("unused")
-            public String name() { return "Joe"; }
-        }
-
-        actionScenario(CustomerService.class, "name", (processMethodContext, 
facetHolder, facetedMethod) -> {
-            // when
-            facetFactory.process(processMethodContext);
-            // then
-            final Facet facet = 
facetedMethod.lookupNonFallbackFacet(WebApiOnlyActionFacet.class).orElse(null);
-            assertThat(facet, is(nullValue()));
-            assertNoMethodsRemoved();
-        });
-    }
-
-    @Test
-    public void whenMenu() throws Exception {
-
-        // given
-        @DomainService()
-        class CustomerService {
-            @SuppressWarnings("unused")
-            public String name() { return "Joe"; }
-        }
-
-        actionScenario(CustomerService.class, "name", (processMethodContext, 
facetHolder, facetedMethod) -> {
-            // when
-            facetFactory.process(processMethodContext);
-            // then
-            final Facet facet = 
facetedMethod.lookupNonFallbackFacet(WebApiOnlyActionFacet.class).orElse(null);
-            assertThat(facet, is(nullValue()));
-            assertNoMethodsRemoved();
-        });
-    }
-
-    @Test
-    public void whenNone() throws Exception {
-
-        // given
-        class CustomerService {
-            @SuppressWarnings("unused")
-            public String name() { return "Joe"; }
-        }
-
-        actionScenario(CustomerService.class, "name", (processMethodContext, 
facetHolder, facetedMethod) -> {
-            // when
-            facetFactory.process(processMethodContext);
-            // then
-            final Facet facet = 
facetedMethod.lookupNonFallbackFacet(WebApiOnlyActionFacet.class).orElse(null);
-            assertThat(facet, is(nullValue()));
-            assertNoMethodsRemoved();
-        });
-    }
-
-}
\ No newline at end of file
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java
index c208692026..87a2192950 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java
@@ -26,7 +26,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract;
 import 
org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 
@@ -56,7 +55,7 @@ extends FacetFactoryTestAbstract {
             //when
             facetFactory.process(processClassContext);
             //then
-            final Facet facet = facetHolder.getFacet(DomainServiceFacet.class);
+            var facet = facetHolder.getFacet(DomainServiceFacet.class);
             assertNotNull(facet);
             assertTrue(facet instanceof DomainServiceFacetForAnnotation);
             DomainServiceFacetForAnnotation domainServiceFacet = 
(DomainServiceFacetForAnnotation) facet;
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index caffee75b2..8a755a0667 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -54,7 +54,7 @@ extends FacetFactoryTestAbstract {
 
     @Test
     public void verifyProgrammingModelNumberOfFactories() {
-        assertEquals(63, programmingModel.streamFactories().count());
+        assertEquals(62, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this 
class
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBootstrap.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBootstrap.java
index 9726bea67c..f3b10cf09f 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBootstrap.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/MenuBarsServiceBootstrap.java
@@ -33,7 +33,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.layout.component.ServiceActionLayoutData;
 import org.apache.causeway.applib.layout.menubars.bootstrap.BSMenu;
@@ -58,7 +57,6 @@ import 
org.apache.causeway.core.metamodel.facets.actions.layout.CssClassFacetFor
 import 
org.apache.causeway.core.metamodel.facets.actions.layout.FaFacetForMenuBarXml;
 import 
org.apache.causeway.core.metamodel.facets.actions.layout.MemberDescribedFacetForMenuBarXml;
 import 
org.apache.causeway.core.metamodel.facets.actions.layout.MemberNamedFacetForMenuBarXml;
-import 
org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.WebApiOnlyActionFacet;
 import org.apache.causeway.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet;
 import 
org.apache.causeway.core.metamodel.facets.members.layout.group.LayoutGroupFacet;
@@ -432,20 +430,13 @@ implements MenuBarsService {
             final ActionScope actionType) {
         final ObjectSpecification serviceSpec = 
serviceAdapter.getSpecification();
 
-        // skip if annotated to not be included in repository menu using 
@DomainService
-        final DomainServiceFacet domainServiceFacet = 
serviceSpec.getFacet(DomainServiceFacet.class);
-        if (domainServiceFacet != null) {
-            final NatureOfService natureOfService = 
domainServiceFacet.getNatureOfService();
-            if (!natureOfService.isEnabledForUi()) {
-                return Stream.empty();
-            }
+        if (!DomainServiceFacet.contributingToUi().test(serviceSpec)) {
+            return Stream.empty();
         }
 
         final Stream<ObjectAction> objectActions = 
serviceSpec.streamDeclaredActions(actionType, MixedIn.INCLUDED);
 
         return objectActions
-                // skip if annotated to not be included in repository menu 
using legacy mechanism
-                
.filter(objectAction->objectAction.getFacet(WebApiOnlyActionFacet.class) == 
null)
                 .map(objectAction->{
                     val layoutGroupFacet = 
objectAction.getFacet(LayoutGroupFacet.class);
                     String serviceName = layoutGroupFacet != null
@@ -457,7 +448,6 @@ implements MenuBarsService {
                     }
                     return new ServiceAndAction(serviceName, serviceAdapter, 
objectAction);
                 });
-
     }
 
     private static Predicate<ManagedObject> with(final 
DomainServiceLayout.MenuBar menuBar) {
diff --git 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/Bar.java
 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/Bar.java
index bbe96ec193..90888c0e18 100644
--- 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/Bar.java
+++ 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/menubars/bootstrap/Bar.java
@@ -22,11 +22,8 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 
-@DomainService(
-        nature = NatureOfService.BOTH
-        )
+@DomainService
 @Named("simple.SimpleMenu")
 public class Bar {
 
diff --git 
a/core/security/src/main/java/org/apache/causeway/core/security/authentication/logout/LogoutMenu.java
 
b/core/security/src/main/java/org/apache/causeway/core/security/authentication/logout/LogoutMenu.java
index 918977d695..17fba40e25 100644
--- 
a/core/security/src/main/java/org/apache/causeway/core/security/authentication/logout/LogoutMenu.java
+++ 
b/core/security/src/main/java/org/apache/causeway/core/security/authentication/logout/LogoutMenu.java
@@ -30,7 +30,6 @@ import org.apache.causeway.applib.annotation.DomainObject;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.Nature;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -45,9 +44,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Named(LogoutMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
diff --git 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
index 69950a36c4..6f2be45e9a 100644
--- 
a/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
+++ 
b/extensions/core/commandlog/applib/src/main/java/org/apache/causeway/extensions/commandlog/applib/app/CommandLogMenu.java
@@ -32,7 +32,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.RestrictTo;
@@ -51,7 +50,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(CommandLogMenu.LOGICAL_TYPE_NAME)
-@DomainService(nature = NatureOfService.BOTH)
+@DomainService
 @DomainServiceLayout(
     menuBar = DomainServiceLayout.MenuBar.SECONDARY,
     named = "Activity"
diff --git 
a/extensions/core/docgen/help/src/main/java/org/apache/causeway/extensions/docgen/help/menu/DocumentationMenu.java
 
b/extensions/core/docgen/help/src/main/java/org/apache/causeway/extensions/docgen/help/menu/DocumentationMenu.java
index 8eb7278d15..226167eb83 100644
--- 
a/extensions/core/docgen/help/src/main/java/org/apache/causeway/extensions/docgen/help/menu/DocumentationMenu.java
+++ 
b/extensions/core/docgen/help/src/main/java/org/apache/causeway/extensions/docgen/help/menu/DocumentationMenu.java
@@ -27,7 +27,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -46,7 +45,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.x {@index}
  */
 @Named(CausewayModuleExtDocgenHelp.NAMESPACE + ".DocumentationMenu")
-@DomainService(nature = NatureOfService.BOTH)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
diff --git 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
index 56497e99a1..103363a758 100644
--- 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
+++ 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateMenuForDemoToDoItem.java
@@ -26,7 +26,6 @@ import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
@@ -37,9 +36,7 @@ import 
org.apache.causeway.extensions.excel.applib.ExcelService;
 import 
org.apache.causeway.extensions.excel.fixtures.demoapp.todomodule.dom.Category;
 import 
org.apache.causeway.extensions.excel.fixtures.demoapp.todomodule.dom.Subcategory;
 
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named("libExcelFixture.BulkUpdateMenuForDemoToDoItem")
 @DomainServiceLayout(
         named = "Excel"
diff --git 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
index 7b5b5be943..a6880704a8 100644
--- 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
+++ 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategoryMenu.java
@@ -27,7 +27,6 @@ import javax.inject.Named;
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.repository.RepositoryService;
@@ -35,9 +34,7 @@ import org.apache.causeway.applib.value.Blob;
 import org.apache.causeway.extensions.excel.applib.service.ExcelServiceDefault;
 import 
org.apache.causeway.extensions.excel.fixtures.demoapp.todomodule.dom.ExcelDemoToDoItem;
 
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named("libExcelFixture.ExcelPivotByCategoryAndSubcategoryMenu")
 @DomainServiceLayout(
         named = "Excel"
diff --git 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
index e93a52d65e..fedd65579c 100644
--- 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
+++ 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadServiceForDemoToDoItem.java
@@ -25,7 +25,6 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
@@ -37,9 +36,7 @@ import 
org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureResult;
 import 
org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript;
 import 
org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named("libExcelFixture.ExcelUploadServiceForDemoToDoItem")
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
diff --git 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
index 61e671a4f8..63c66801dc 100644
--- 
a/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
+++ 
b/extensions/core/excel/fixture/src/main/java/org/apache/causeway/extensions/excel/fixtures/demoapp/todomodule/dom/ExcelDemoToDoItemMenu.java
@@ -33,7 +33,6 @@ import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.MinLength;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Programmatic;
@@ -46,9 +45,7 @@ import org.apache.causeway.applib.services.user.UserService;
 
 import lombok.RequiredArgsConstructor;
 
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named("libExcelFixture.ExcelDemoToDoItemMenu")
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
diff --git 
a/extensions/core/executionlog/applib/src/main/java/org/apache/causeway/extensions/executionlog/applib/app/ExecutionLogMenu.java
 
b/extensions/core/executionlog/applib/src/main/java/org/apache/causeway/extensions/executionlog/applib/app/ExecutionLogMenu.java
index 8722557a0c..4a5d046026 100644
--- 
a/extensions/core/executionlog/applib/src/main/java/org/apache/causeway/extensions/executionlog/applib/app/ExecutionLogMenu.java
+++ 
b/extensions/core/executionlog/applib/src/main/java/org/apache/causeway/extensions/executionlog/applib/app/ExecutionLogMenu.java
@@ -32,7 +32,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.RestrictTo;
@@ -51,7 +50,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(ExecutionLogMenu.LOGICAL_TYPE_NAME)
-@DomainService(nature = NatureOfService.BOTH)
+@DomainService
 @DomainServiceLayout(
     menuBar = DomainServiceLayout.MenuBar.SECONDARY,
     named = "Activity"
diff --git 
a/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/app/ExecutionOutboxMenu.java
 
b/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/app/ExecutionOutboxMenu.java
index 12c00c6275..9782cd5f95 100644
--- 
a/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/app/ExecutionOutboxMenu.java
+++ 
b/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/app/ExecutionOutboxMenu.java
@@ -27,7 +27,6 @@ import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.RestrictTo;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -45,9 +44,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(ExecutionOutboxMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-    nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
     named = "Activity",
     menuBar = DomainServiceLayout.MenuBar.SECONDARY
diff --git 
a/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/restapi/OutboxRestApi.java
 
b/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/restapi/OutboxRestApi.java
index 74e7030924..6035bc1e7c 100644
--- 
a/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/restapi/OutboxRestApi.java
+++ 
b/extensions/core/executionoutbox/applib/src/main/java/org/apache/causeway/extensions/executionoutbox/applib/restapi/OutboxRestApi.java
@@ -26,7 +26,6 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.factory.FactoryService;
@@ -47,7 +46,7 @@ import lombok.val;
  * @since 2.0 {@index}
  */
 @Named(OutboxRestApi.LOGICAL_TYPE_NAME)
-@DomainService(nature = NatureOfService.WEB_API)
+@DomainService
 @RequiredArgsConstructor
 public class OutboxRestApi  {
 
diff --git 
a/extensions/core/layoutloaders/github/src/main/java/org/apache/causeway/extensions/layoutloaders/github/menu/LayoutLoadersGitHubMenu.java
 
b/extensions/core/layoutloaders/github/src/main/java/org/apache/causeway/extensions/layoutloaders/github/menu/LayoutLoadersGitHubMenu.java
index a918678e44..2c7cddd6d0 100644
--- 
a/extensions/core/layoutloaders/github/src/main/java/org/apache/causeway/extensions/layoutloaders/github/menu/LayoutLoadersGitHubMenu.java
+++ 
b/extensions/core/layoutloaders/github/src/main/java/org/apache/causeway/extensions/layoutloaders/github/menu/LayoutLoadersGitHubMenu.java
@@ -27,7 +27,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -45,7 +44,7 @@ import lombok.val;
  * @since 2.x {@index}
  */
 @Named(CausewayModuleExtLayoutLoadersGithub.NAMESPACE + 
".LayoutLoadersGitHubMenu")
-@DomainService(nature = NatureOfService.BOTH)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
diff --git 
a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
 
b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
index 2b26ea0d2b..639cba6d3c 100644
--- 
a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
+++ 
b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/app/AuditTrailMenu.java
@@ -34,7 +34,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.RestrictTo;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -53,7 +52,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(AuditTrailMenu.LOGICAL_TYPE_NAME)
-@DomainService(nature = NatureOfService.BOTH)
+@DomainService
 @DomainServiceLayout(
     menuBar = DomainServiceLayout.MenuBar.SECONDARY,
     named = "Activity"
diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
index c2b01f95a9..026264c25f 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/permission/menu/ApplicationPermissionMenu.java
@@ -28,7 +28,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
@@ -45,9 +44,7 @@ import 
org.apache.causeway.extensions.secman.applib.permission.dom.ApplicationPe
  * @since 2.0 {@index}
  */
 @Named(ApplicationPermissionMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
         named="Security"
diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
index aaf4e91ec3..09ee80443b 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
@@ -28,7 +28,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
@@ -48,9 +47,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(ApplicationRoleMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
index d61277b566..961c660267 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
@@ -29,7 +29,6 @@ import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
 import org.apache.causeway.applib.annotation.MinLength;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
@@ -48,9 +47,7 @@ import 
org.apache.causeway.extensions.secman.applib.tenancy.man.ApplicationTenan
  * @since 2.0 {@index}
  */
 @Named(ApplicationTenancyMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/ApplicationUserMenu.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/ApplicationUserMenu.java
index db42caf5dc..ca476ced45 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/ApplicationUserMenu.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/ApplicationUserMenu.java
@@ -28,7 +28,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.ParameterLayout;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -47,9 +46,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(ApplicationUserMenu.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
diff --git 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/MeService.java
 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/MeService.java
index 49fdacd922..f494b6dfaa 100644
--- 
a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/MeService.java
+++ 
b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/user/menu/MeService.java
@@ -33,7 +33,6 @@ import org.apache.causeway.applib.annotation.Domain;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.Publishing;
@@ -52,9 +51,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(MeService.LOGICAL_TYPE_NAME)
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.TERTIARY
 )
diff --git 
a/extensions/security/sessionlog/applib/src/main/java/org/apache/causeway/extensions/sessionlog/applib/app/SessionLogMenu.java
 
b/extensions/security/sessionlog/applib/src/main/java/org/apache/causeway/extensions/sessionlog/applib/app/SessionLogMenu.java
index 2efe646278..02f1eda3e6 100644
--- 
a/extensions/security/sessionlog/applib/src/main/java/org/apache/causeway/extensions/sessionlog/applib/app/SessionLogMenu.java
+++ 
b/extensions/security/sessionlog/applib/src/main/java/org/apache/causeway/extensions/sessionlog/applib/app/SessionLogMenu.java
@@ -33,7 +33,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Publishing;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import 
org.apache.causeway.extensions.sessionlog.applib.CausewayModuleExtSessionLogApplib;
@@ -50,7 +49,7 @@ import lombok.RequiredArgsConstructor;
  * @since 2.0 {@index}
  */
 @Named(SessionLogMenu.LOGICAL_TYPE_NAME)
-@DomainService(nature = NatureOfService.BOTH)
+@DomainService
 @DomainServiceLayout(
         menuBar = DomainServiceLayout.MenuBar.SECONDARY,
         named = "Activity"
diff --git 
a/incubator/extensions/core/commandreplay/primary/src/main/java/org/apache/causeway/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java
 
b/incubator/extensions/core/commandreplay/primary/src/main/java/org/apache/causeway/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java
index 66a81569a4..d74dc4f13c 100644
--- 
a/incubator/extensions/core/commandreplay/primary/src/main/java/org/apache/causeway/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java
+++ 
b/incubator/extensions/core/commandreplay/primary/src/main/java/org/apache/causeway/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java
@@ -30,7 +30,6 @@ import org.springframework.context.annotation.Profile;
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
@@ -46,7 +45,7 @@ import org.apache.causeway.schema.cmd.v2.CommandDto;
 /**
  * @since 2.0 {@index}
  */
-@DomainService(nature = NatureOfService.WEB_API)
+@DomainService
 @Named(CausewayModuleExtCommandReplayPrimary.NAMESPACE + 
".CommandRetrievalOnPrimaryService")
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @Profile("commandreplay-primary")
diff --git 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jdo/JdoInventoryResource.java
 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jdo/JdoInventoryResource.java
index 9d74b84dfe..cff0c89b28 100644
--- 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jdo/JdoInventoryResource.java
+++ 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jdo/JdoInventoryResource.java
@@ -31,7 +31,6 @@ import 
org.springframework.web.context.request.ServletRequestAttributes;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ParameterLayout;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.factory.FactoryService;
@@ -48,7 +47,6 @@ import lombok.val;
 
 @Named("testdomain.jdo.InventoryResource")
 @DomainService(
-        nature = NatureOfService.WEB_API,
         aliased = "testdomain.jdo.InventoryResourceAlias" // <-- as tested 
with RestEndpointService
 )
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
diff --git 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jpa/JpaInventoryResource.java
 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jpa/JpaInventoryResource.java
index daf2a33f01..8fa0d49b33 100644
--- 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jpa/JpaInventoryResource.java
+++ 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/jpa/JpaInventoryResource.java
@@ -30,7 +30,6 @@ import 
org.springframework.web.context.request.ServletRequestAttributes;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.ParameterLayout;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.services.repository.RepositoryService;
@@ -44,7 +43,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Named("testdomain.jpa.InventoryResource")
-@DomainService(nature = NatureOfService.WEB_API)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = { @Inject })
 public class JpaInventoryResource {
diff --git 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/rospec/RoSpecSampler.java
 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/rospec/RoSpecSampler.java
index 63caf051d5..a0e9b7d12e 100644
--- 
a/regressiontests/base/src/main/java/org/apache/causeway/testdomain/rospec/RoSpecSampler.java
+++ 
b/regressiontests/base/src/main/java/org/apache/causeway/testdomain/rospec/RoSpecSampler.java
@@ -25,12 +25,11 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 @Named("testdomain.RoSpecSampler")
-@DomainService(nature = NatureOfService.WEB_API)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 public class RoSpecSampler {
 
diff --git 
a/testing/fakedata/fixtures/src/main/java/org/apache/causeway/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
 
b/testing/fakedata/fixtures/src/main/java/org/apache/causeway/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
index d9d641e197..2e2e01596c 100644
--- 
a/testing/fakedata/fixtures/src/main/java/org/apache/causeway/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
+++ 
b/testing/fakedata/fixtures/src/main/java/org/apache/causeway/testing/fakedata/fixtures/demoapp/demomodule/dom/FakeDataDemoObjectWithAllMenu.java
@@ -27,16 +27,13 @@ import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.repository.RepositoryService;
 
 import lombok.val;
 
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named("libFakeDataFixture.FakeDataDemoObjectWithAllMenu")
 @DomainServiceLayout(
         named = "Demo"
diff --git 
a/testing/fixtures/applib/src/main/java/org/apache/causeway/testing/fixtures/applib/fixturescripts/FixtureScripts.java
 
b/testing/fixtures/applib/src/main/java/org/apache/causeway/testing/fixtures/applib/fixturescripts/FixtureScripts.java
index 32ca455ad6..c293435321 100644
--- 
a/testing/fixtures/applib/src/main/java/org/apache/causeway/testing/fixtures/applib/fixturescripts/FixtureScripts.java
+++ 
b/testing/fixtures/applib/src/main/java/org/apache/causeway/testing/fixtures/applib/fixturescripts/FixtureScripts.java
@@ -37,7 +37,6 @@ import org.apache.causeway.applib.annotation.Domain;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.ParameterLayout;
@@ -71,9 +70,7 @@ import lombok.val;
  *
  * @since 1.x {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named(FixtureScripts.LOGICAL_TYPE_NAME)
 @DomainServiceLayout(
         named="Prototyping",
diff --git 
a/testing/h2console/ui/src/main/java/org/apache/causeway/testing/h2console/ui/services/H2ManagerMenu.java
 
b/testing/h2console/ui/src/main/java/org/apache/causeway/testing/h2console/ui/services/H2ManagerMenu.java
index 3007ef8b58..b3fbe67be5 100644
--- 
a/testing/h2console/ui/src/main/java/org/apache/causeway/testing/h2console/ui/services/H2ManagerMenu.java
+++ 
b/testing/h2console/ui/src/main/java/org/apache/causeway/testing/h2console/ui/services/H2ManagerMenu.java
@@ -30,7 +30,6 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.RestrictTo;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -44,9 +43,7 @@ import lombok.RequiredArgsConstructor;
 /**
  * @since 2.0 {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named(CausewayModuleTestingH2ConsoleUi.NAMESPACE + ".H2ManagerMenu")
 @DomainServiceLayout(
         named = "Prototyping",
diff --git 
a/testing/hsqldbmgr/ui/src/main/java/org/apache/causeway/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
 
b/testing/hsqldbmgr/ui/src/main/java/org/apache/causeway/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
index 2a1f5a4e38..678ee3261d 100644
--- 
a/testing/hsqldbmgr/ui/src/main/java/org/apache/causeway/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
+++ 
b/testing/hsqldbmgr/ui/src/main/java/org/apache/causeway/extensions/hsqldbmgr/dom/services/HsqlDbManagerMenu.java
@@ -28,7 +28,6 @@ import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.DomainServiceLayout;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.RestrictTo;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -43,9 +42,7 @@ import lombok.extern.log4j.Log4j2;
 /**
  * @since 2.0 {@index}
  */
-@DomainService(
-        nature = NatureOfService.BOTH
-)
+@DomainService
 @Named(CausewayModuleExtHsqldbMgr.NAMESPACE + ".HsqlDbManagerMenu")
 @DomainServiceLayout(
         named = "Prototyping",
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/admin/AdminMenu.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/admin/AdminMenu.java
index 48fa0cdca6..bbeb16e673 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/admin/AdminMenu.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/admin/AdminMenu.java
@@ -25,7 +25,6 @@ import javax.inject.Named;
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.annotation.Where;
@@ -34,7 +33,7 @@ import org.apache.causeway.commons.internal.base._Strings;
 import lombok.RequiredArgsConstructor;
 
 @Named("university.admin.AdminMenu")
-@DomainService(nature=NatureOfService.BOTH)
+@DomainService
 @Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class AdminMenu {
@@ -55,19 +54,19 @@ public class AdminMenu {
 
 
     @Action(semantics = SemanticsOf.NON_IDEMPOTENT)
-    public void actionWithDisabledParam(String firstParam, String secondParam, 
String thirdParameter) {
+    public void actionWithDisabledParam(final String firstParam, final String 
secondParam, final String thirdParameter) {
     }
     public String disable0ActionWithDisabledParam() {
         return "yup, disabled!";
     }
-    public String disable2ActionWithDisabledParam(String firstParam, String 
secondParam) {
+    public String disable2ActionWithDisabledParam(final String firstParam, 
final String secondParam) {
         return _Strings.isNullOrEmpty(secondParam) ? null : "Disabled because 
secondParam is not empty";
     }
 
 
 
     @Action(semantics = SemanticsOf.NON_IDEMPOTENT)
-    public void actionWithHiddenParam(String firstParam, String secondParam) {
+    public void actionWithHiddenParam(final String firstParam, final String 
secondParam) {
     }
     public boolean hide0ActionWithHiddenParam() {
         return true;
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
index 755bf9019b..5e18904bc7 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
@@ -17,7 +17,6 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.Optionality;
 import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
@@ -27,134 +26,134 @@ import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 
 @Named("university.calc.Calculator")
-@DomainService(nature= NatureOfService.BOTH)
+@DomainService
 @Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class Calculator {
 
     @Action(semantics = SemanticsOf.SAFE)
-    public byte addBytes(byte x, byte y) {
+    public byte addBytes(final byte x, final byte y) {
         return (byte)(x+y);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public int addByteWrappers(Byte x, @Parameter(optionality = 
Optionality.OPTIONAL) Byte y) {
+    public int addByteWrappers(final Byte x, @Parameter(optionality = 
Optionality.OPTIONAL) final Byte y) {
         return y != null ? x+y : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public short addShorts(short x, short y) {
+    public short addShorts(final short x, final short y) {
         return (short)(x+y);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public Short addShortWrappers(Short x, @Parameter(optionality = 
Optionality.OPTIONAL) Short y) {
+    public Short addShortWrappers(final Short x, @Parameter(optionality = 
Optionality.OPTIONAL) final Short y) {
         return y != null ? (short)(x+y) : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public int addIntegers(int x, int y) {
+    public int addIntegers(final int x, final int y) {
         return x+y;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public int addIntegerWrappers(Integer x, @Parameter(optionality = 
Optionality.OPTIONAL) Integer y) {
+    public int addIntegerWrappers(final Integer x, @Parameter(optionality = 
Optionality.OPTIONAL) final Integer y) {
         return y != null ? x+y : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public double addDoubles(double x, double y) {
+    public double addDoubles(final double x, final double y) {
         return x+y;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public Double addDoubleWrappers(Double x, @Parameter(optionality = 
Optionality.OPTIONAL) Double y) {
+    public Double addDoubleWrappers(final Double x, @Parameter(optionality = 
Optionality.OPTIONAL) final Double y) {
         return y != null ? x+y : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public float addFloats(float x, float y) {
+    public float addFloats(final float x, final float y) {
         return x+y;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public Float addFloatWrappers(Float x, @Parameter(optionality = 
Optionality.OPTIONAL) Float y) {
+    public Float addFloatWrappers(final Float x, @Parameter(optionality = 
Optionality.OPTIONAL) final Float y) {
         return y != null ? (float)(x+y) : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public BigInteger addBigIntegers(BigInteger x, @Parameter(optionality = 
Optionality.OPTIONAL) BigInteger y) {
+    public BigInteger addBigIntegers(final BigInteger x, 
@Parameter(optionality = Optionality.OPTIONAL) final BigInteger y) {
         return y != null ? x.add(y) : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public BigDecimal addBigDecimals(BigDecimal x, @Parameter(optionality = 
Optionality.OPTIONAL) BigDecimal y) {
+    public BigDecimal addBigDecimals(final BigDecimal x, 
@Parameter(optionality = Optionality.OPTIONAL) final BigDecimal y) {
         return y != null ? x.add(y) : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public LocalDate jdk8LocalPlusDays(LocalDate date, int numDays) {
+    public LocalDate jdk8LocalPlusDays(final LocalDate date, final int 
numDays) {
         return date.plusDays(numDays);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public OffsetDateTime jdk8OffsetPlusDaysAndHoursAndMinutes(OffsetDateTime 
dateTime, int numDays, int numHours, int numMinutes) {
+    public OffsetDateTime jdk8OffsetPlusDaysAndHoursAndMinutes(final 
OffsetDateTime dateTime, final int numDays, final int numHours, final int 
numMinutes) {
         return 
dateTime.plusDays(numDays).plusHours(numHours).plusMinutes(numMinutes);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public ZonedDateTime jdk8ZonedPlusDaysAndHoursAndMinutes(ZonedDateTime 
dateTime, int numDays, int numHours, int numMinutes) {
+    public ZonedDateTime jdk8ZonedPlusDaysAndHoursAndMinutes(final 
ZonedDateTime dateTime, final int numDays, final int numHours, final int 
numMinutes) {
         return 
dateTime.plusDays(numDays).plusHours(numHours).plusMinutes(numMinutes);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public OffsetTime jdk8OffsetPlusHoursAndMinutes(OffsetTime time, int 
numHours, int numMinutes) {
+    public OffsetTime jdk8OffsetPlusHoursAndMinutes(final OffsetTime time, 
final int numHours, final int numMinutes) {
         return time.plusHours(numHours).plusMinutes(numMinutes);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public LocalTime jdk8LocalPlusHoursAndMinutes(LocalTime time, int 
numHours, int numMinutes) {
+    public LocalTime jdk8LocalPlusHoursAndMinutes(final LocalTime time, final 
int numHours, final int numMinutes) {
         return time.plusHours(numHours).plusMinutes(numMinutes);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public org.joda.time.LocalDate jodaLocalPlusDays(org.joda.time.LocalDate 
date, int numDays) {
+    public org.joda.time.LocalDate jodaLocalPlusDays(final 
org.joda.time.LocalDate date, final int numDays) {
         return date.plusDays(numDays);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public org.joda.time.DateTime 
jodaPlusDaysAndHoursAndMinutes(org.joda.time.DateTime dateTime, int numDays, 
int numHours, int numMinutes) {
+    public org.joda.time.DateTime jodaPlusDaysAndHoursAndMinutes(final 
org.joda.time.DateTime dateTime, final int numDays, final int numHours, final 
int numMinutes) {
         return 
dateTime.plusDays(numDays).plusHours(numHours).plusMinutes(numMinutes);
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public org.joda.time.LocalTime 
jodaLocalPlusHoursAndMinutes(org.joda.time.LocalTime time, int numHours, int 
numMinutes) {
+    public org.joda.time.LocalTime jodaLocalPlusHoursAndMinutes(final 
org.joda.time.LocalTime time, final int numHours, final int numMinutes) {
         return time.plusHours(numHours).plusMinutes(numMinutes);
     }
 
 
     @Action(semantics = SemanticsOf.SAFE)
-    public boolean and(boolean x, boolean y) {
+    public boolean and(final boolean x, final boolean y) {
         return x & y;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public boolean or(boolean x, boolean y) {
+    public boolean or(final boolean x, final boolean y) {
         return x | y;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public boolean not(boolean x) {
+    public boolean not(final boolean x) {
         return !x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public Month nextMonth(Month month) {
+    public Month nextMonth(final Month month) {
         return month.nextMonth();
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public String concat(String prefix, @Parameter(optionality = 
Optionality.OPTIONAL) String suffix) {
+    public String concat(final String prefix, @Parameter(optionality = 
Optionality.OPTIONAL) final String suffix) {
         return prefix + suffix;
     }
 
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Departments.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Departments.java
index ee7a001b1b..a12438e8a7 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Departments.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Departments.java
@@ -27,15 +27,13 @@ import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.Departments")
-@DomainService(
-        nature=NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class Departments {
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHeads.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHeads.java
index 05e98e33bb..439932e1e7 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHeads.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHeads.java
@@ -25,14 +25,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.DeptHeads")
-@DomainService(nature=NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class DeptHeads {
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/People.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/People.java
index c84c926cf2..2bc2915d04 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/People.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/People.java
@@ -7,15 +7,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.People")
-@DomainService(
-        nature= NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class People {
@@ -24,13 +22,13 @@ public class People {
     private final DeptHeadRepository deptHeadRepository;
 
     @Action(semantics = SemanticsOf.SAFE)
-    public Person findNamed(String name) {
+    public Person findNamed(final String name) {
         return 
Optional.ofNullable((Person)staffMemberRepository.findByName(name))
                 .orElse(deptHeadRepository.findByName(name));
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public String nameOf(Person person) {
+    public String nameOf(final Person person) {
         return person.getName();
     }
 }
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Staff.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Staff.java
index b3f9aa70b4..15ec874b12 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Staff.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Staff.java
@@ -25,15 +25,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.Staff")
-@DomainService(
-        nature=NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class Staff {
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/i18n/I18nCalculator.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/i18n/I18nCalculator.java
index 107b01a00b..67fa67943e 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/i18n/I18nCalculator.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/i18n/I18nCalculator.java
@@ -6,14 +6,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.calc.I18nCalculator")
-@DomainService(nature= NatureOfService.BOTH)
+@DomainService
 @Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class I18nCalculator {
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_OpenApiModelFactory.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_OpenApiModelFactory.java
index 68a31425d6..9c6d966b76 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_OpenApiModelFactory.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_OpenApiModelFactory.java
@@ -160,7 +160,7 @@ class _OpenApiModelFactory {
 
         for (val spec : specificationLoader.snapshotSpecifications()) {
 
-            if(! DomainServiceFacet.isContributingToWebApi(spec)) {
+            if(!DomainServiceFacet.contributingToWebApi().test(spec)) {
                 continue;
             }
 
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/CausewayViewerRestfulObjectsIntegTestAbstract.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/CausewayViewerRestfulObjectsIntegTestAbstract.java
index 42c1141185..b8a67d776a 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/CausewayViewerRestfulObjectsIntegTestAbstract.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/CausewayViewerRestfulObjectsIntegTestAbstract.java
@@ -26,11 +26,6 @@ import javax.inject.Inject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import org.apache.causeway.core.config.presets.CausewayPresets;
-import 
org.apache.causeway.testing.fixtures.applib.CausewayModuleTestingFixturesApplib;
-
-import 
org.apache.causeway.viewer.restfulobjects.jaxrsresteasy.CausewayModuleViewerRestfulObjectsJaxrsResteasy;
-
 import org.approvaltests.Approvals;
 import org.approvaltests.core.Options;
 import org.junit.jupiter.api.BeforeEach;
@@ -53,13 +48,15 @@ import org.springframework.test.context.ActiveProfiles;
 import org.apache.causeway.applib.services.xactn.TransactionService;
 import org.apache.causeway.applib.value.Blob;
 import org.apache.causeway.core.config.environment.CausewaySystemEnvironment;
+import org.apache.causeway.core.config.presets.CausewayPresets;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import 
org.apache.causeway.core.runtimeservices.CausewayModuleCoreRuntimeServices;
 import org.apache.causeway.security.bypass.CausewayModuleSecurityBypass;
+import 
org.apache.causeway.testing.fixtures.applib.CausewayModuleTestingFixturesApplib;
 import org.apache.causeway.viewer.restfulobjects.client.AuthenticationMode;
 import org.apache.causeway.viewer.restfulobjects.client.RestfulClient;
 import org.apache.causeway.viewer.restfulobjects.client.RestfulClientConfig;
-import 
org.apache.causeway.viewer.restfulobjects.viewer.CausewayModuleViewerRestfulObjectsViewer;
+import 
org.apache.causeway.viewer.restfulobjects.jaxrsresteasy.CausewayModuleViewerRestfulObjectsJaxrsResteasy;
 
 import static 
org.apache.causeway.commons.internal.assertions._Assert.assertNotNull;
 
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Departments.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Departments.java
index a156cd0b83..eabb6c3c8e 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Departments.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Departments.java
@@ -27,15 +27,13 @@ import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.Departments")
-@DomainService(
-        nature=NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class Departments {
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/DeptHeads.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/DeptHeads.java
index 9f303bf829..9fc390b55a 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/DeptHeads.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/DeptHeads.java
@@ -25,14 +25,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.DeptHeads")
-@DomainService(nature=NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class DeptHeads {
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/People.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/People.java
index 3af3a2e4db..511cc3b1f5 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/People.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/People.java
@@ -7,15 +7,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.People")
-@DomainService(
-        nature= NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class People {
@@ -24,13 +22,13 @@ public class People {
     private final DeptHeadRepository deptHeadRepository;
 
     @Action(semantics = SemanticsOf.SAFE)
-    public Person findNamed(String name) {
+    public Person findNamed(final String name) {
         return 
Optional.ofNullable((Person)staffMemberRepository.findByName(name))
                 .orElse(deptHeadRepository.findByName(name));
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public String nameOf(Person person) {
+    public String nameOf(final Person person) {
         return person.getName();
     }
 }
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Staff.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Staff.java
index 646ce863c7..11923234d1 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Staff.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/domain/dom/Staff.java
@@ -25,15 +25,13 @@ import javax.inject.Named;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
-import org.apache.causeway.applib.annotation.NatureOfService;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
 @Named("university.dept.Staff")
-@DomainService(
-        nature=NatureOfService.BOTH)
+@DomainService
 @javax.annotation.Priority(PriorityPrecedence.EARLY)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class Staff {
diff --git 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/dept/Department_IntegTest.java
 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/dept/Department_IntegTest.java
index 1b1b2c585b..bd2cf5b568 100644
--- 
a/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/dept/Department_IntegTest.java
+++ 
b/viewers/restfulobjects/test/src/test/java/org/apache/causeway/viewer/restfulobjects/test/scenarios/dept/Department_IntegTest.java
@@ -18,17 +18,9 @@
  */
 package org.apache.causeway.viewer.restfulobjects.test.scenarios.dept;
 
-import lombok.val;
-
-import java.util.Optional;
-
 import javax.ws.rs.client.Invocation;
 import javax.ws.rs.core.Response;
 
-import org.apache.causeway.applib.services.bookmark.Bookmark;
-
-import org.apache.causeway.viewer.restfulobjects.test.domain.dom.Department;
-
 import org.approvaltests.Approvals;
 import org.approvaltests.reporters.DiffReporter;
 import org.approvaltests.reporters.UseReporter;
@@ -36,10 +28,13 @@ import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import 
org.apache.causeway.viewer.restfulobjects.test.scenarios.Abstract_IntegTest;
-
 import org.springframework.transaction.annotation.Propagation;
 
+import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.viewer.restfulobjects.test.domain.dom.Department;
+import 
org.apache.causeway.viewer.restfulobjects.test.scenarios.Abstract_IntegTest;
+
+import lombok.val;
 
 public class Department_IntegTest extends Abstract_IntegTest {
 
diff --git 
a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java
 
b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java
index 4ea7fb83b8..c23d74f8d6 100644
--- 
a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java
+++ 
b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java
@@ -64,7 +64,10 @@ extends ResourceAbstract
 implements DomainServiceResource {
 
     private static final Predicate<ManagedObject> NATURE_REST = (final 
ManagedObject input) -> {
-        return 
DomainServiceFacet.isContributingToWebApi(input.getSpecification());
+        var isContributingToWebApi = 
input.getSpecification().lookupFacet(DomainServiceFacet.class)
+                .map(DomainServiceFacet::isContributingToWebApi)
+                .orElse(false);
+        return isContributingToWebApi;
     };
 
     public DomainServiceResourceServerside() {

Reply via email to