You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/02/28 05:53:58 UTC

[isis] branch master updated: ISIS-2534: rename Identifier -> FeatureIdentifier

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/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 354e1a8  ISIS-2534: rename Identifier -> FeatureIdentifier
354e1a8 is described below

commit 354e1a8d9804f11087a55d8074c814415069a291
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Feb 28 06:53:43 2021 +0100

    ISIS-2534: rename Identifier -> FeatureIdentifier
---
 .../events/ActionArgumentUsabilityEvent.java       |  4 +-
 .../events/ActionArgumentVisibilityEvent.java      |  4 +-
 .../applib/events/domain/AbstractDomainEvent.java  |  8 ++--
 .../recoverable/InteractionException.java          |  4 +-
 .../id/{Identifier.java => FeatureIdentifier.java} | 44 ++++++++++------------
 .../java/org/apache/isis/applib/package-info.java  |  2 +-
 .../services/wrapper/events/AccessEvent.java       |  4 +-
 .../wrapper/events/ActionArgumentEvent.java        |  4 +-
 .../wrapper/events/ActionInvocationEvent.java      |  4 +-
 .../wrapper/events/ActionUsabilityEvent.java       |  4 +-
 .../wrapper/events/ActionVisibilityEvent.java      |  4 +-
 .../wrapper/events/CollectionAccessEvent.java      |  4 +-
 .../wrapper/events/CollectionAddToEvent.java       |  4 +-
 .../wrapper/events/CollectionMethodEvent.java      |  4 +-
 .../wrapper/events/CollectionRemoveFromEvent.java  |  4 +-
 .../wrapper/events/CollectionUsabilityEvent.java   |  4 +-
 .../wrapper/events/CollectionVisibilityEvent.java  |  4 +-
 .../services/wrapper/events/InteractionEvent.java  | 18 ++++-----
 .../services/wrapper/events/ObjectTitleEvent.java  |  4 +-
 .../wrapper/events/ObjectValidityEvent.java        |  4 +-
 .../wrapper/events/ObjectVisibilityEvent.java      |  4 +-
 .../services/wrapper/events/ParseValueEvent.java   |  6 +--
 .../wrapper/events/PropertyAccessEvent.java        |  4 +-
 .../wrapper/events/PropertyModifyEvent.java        |  4 +-
 .../wrapper/events/PropertyUsabilityEvent.java     |  4 +-
 .../wrapper/events/PropertyVisibilityEvent.java    |  4 +-
 .../services/wrapper/events/UsabilityEvent.java    |  4 +-
 .../services/wrapper/events/ValidityEvent.java     |  4 +-
 .../services/wrapper/events/VisibilityEvent.java   |  4 +-
 .../org/apache/isis/applib/IdentifierTests.java    | 12 +++---
 .../isis/applib/events/InteractionEventTest.java   |  6 +--
 .../isis/core/metamodel/facetapi/FeatureType.java  | 24 ++++++------
 .../core/metamodel/facetapi/IdentifiedHolder.java  |  4 +-
 .../core/metamodel/facets/DomainEventHelper.java   | 28 +++++++-------
 .../isis/core/metamodel/facets/FacetedMethod.java  |  6 +--
 .../metamodel/facets/FacetedMethodParameter.java   |  6 +--
 .../annotation/HomePageFacetAnnotationFactory.java |  4 +-
 .../facets/all/deficiencies/DeficiencyFacet.java   |  6 +--
 .../ViewModelSemanticCheckingFacetFactory.java     | 10 ++---
 .../disabled/DisabledObjectFacetAbstract.java      |  6 +--
 .../method/DisabledObjectFacetViaMethod.java       |  6 +--
 .../DisabledObjectFacetViaMethodFactory.java       |  4 +-
 .../DomainObjectAnnotationFacetFactory.java        |  4 +-
 .../mixin/MetaModelValidatorForMixinTypes.java     |  6 +--
 .../parser/ParseableFacetUsingParser.java          |  4 +-
 .../core/metamodel/interactions/AccessContext.java |  4 +-
 .../interactions/ActionArgUsabilityContext.java    |  4 +-
 .../interactions/ActionArgValidityContext.java     |  4 +-
 .../interactions/ActionArgVisibilityContext.java   |  4 +-
 .../interactions/ActionUsabilityContext.java       |  4 +-
 .../interactions/ActionValidityContext.java        |  4 +-
 .../interactions/ActionVisibilityContext.java      |  4 +-
 .../interactions/CollectionAccessContext.java      |  4 +-
 .../interactions/CollectionAddToContext.java       |  4 +-
 .../interactions/CollectionRemoveFromContext.java  |  4 +-
 .../interactions/CollectionUsabilityContext.java   |  4 +-
 .../interactions/CollectionVisibilityContext.java  |  4 +-
 .../metamodel/interactions/InteractionContext.java |  6 +--
 .../metamodel/interactions/ObjectTitleContext.java |  4 +-
 .../interactions/ObjectValidityContext.java        |  4 +-
 .../interactions/ObjectVisibilityContext.java      |  4 +-
 .../metamodel/interactions/ParseValueContext.java  |  4 +-
 .../interactions/PropertyAccessContext.java        |  4 +-
 .../interactions/PropertyModifyContext.java        |  4 +-
 .../interactions/PropertyUsabilityContext.java     |  4 +-
 .../interactions/PropertyVisibilityContext.java    |  4 +-
 .../metamodel/interactions/UsabilityContext.java   |  4 +-
 .../metamodel/interactions/ValidityContext.java    |  4 +-
 .../metamodel/interactions/VisibilityContext.java  |  4 +-
 .../interactions/managed/ManagedFeature.java       |  4 +-
 .../interactions/managed/ManagedMember.java        |  4 +-
 .../managed/ParameterNegotiationModel.java         |  4 +-
 .../MemberIdentifierComparator.java                |  6 +--
 .../dflt/ProgrammingModelFacetsJava8.java          |  4 +-
 .../services/appfeat/ApplicationFeatureId.java     |  4 +-
 .../title/TitlesAndTranslationsValidator.java      | 10 ++---
 .../core/metamodel/spec/feature/ObjectAction.java  |  4 +-
 .../spec/feature/ObjectActionContainer.java        |  6 +--
 .../specloader/specimpl/ObjectActionMixedIn.java   | 10 ++---
 .../specimpl/ObjectActionParameterAbstract.java    |  4 +-
 .../specloader/specimpl/ObjectMemberAbstract.java  |  4 +-
 .../specimpl/ObjectSpecificationAbstract.java      |  8 ++--
 .../specimpl/OneToManyAssociationMixedIn.java      | 10 ++---
 .../specimpl/OneToOneAssociationMixedIn.java       | 10 ++---
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  4 +-
 .../specloader/validator/MetaModelValidator.java   |  4 +-
 .../validator/MetaModelValidatorAbstract.java      |  4 +-
 .../MetaModelValidatorForDeprecatedAnnotation.java |  4 +-
 ...etaModelValidatorForDeprecatedMethodPrefix.java |  4 +-
 .../specloader/validator/ValidationFailure.java    |  4 +-
 .../specloader/validator/ValidationFailures.java   |  4 +-
 .../facetapi/FeatureTypeTest_identifierFor.java    |  6 +--
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  4 +-
 .../metamodel/facets/AbstractFacetFactoryTest.java | 10 ++---
 ...nEventHelperTest_newActionInteractionEvent.java |  8 ++--
 ...HelperTest_newCollectionDomainEvent_forAdd.java |  8 ++--
 ...perTest_newCollectionDomainEvent_forRemove.java |  8 ++--
 ...HelperTest_newPropertyDomainEvent_forClear.java |  6 +--
 ...elperTest_newPropertyDomainEvent_forModify.java |  6 +--
 .../ObjectDisabledMethodFacetFactoryTest.java      |  6 +--
 .../facets/object/mixin/MixinIntendedAs.java       |  4 +-
 .../objects/ObjectActionLayoutXmlDefaultTest.java  |  4 +-
 .../objects/OneToManyAssociationDefaultTest.java   |  4 +-
 .../metamodel/MetaModelServiceDefaultTest.java     |  4 +-
 .../testspec/ObjectSpecificationStub.java          |  6 +--
 .../manager/AuthorizationManager.java              |  8 ++--
 .../authorization/standard/Authorizor.java         |  6 +--
 .../secman/api/authorizor/AuthorizorSecman.java    |  8 ++--
 .../object/query/VisitorForClauseAbstract.java     |  4 +-
 .../facets/object/query/VisitorForFromClause.java  |  4 +-
 .../object/query/VisitorForVariablesClause.java    |  4 +-
 ...AnnotationFacetFactoryTest_refineMetaModel.java |  6 +--
 .../testing/AbstractFacetFactoryTest.java          | 10 ++---
 .../bypass/authorization/AuthorizorBypass.java     |  6 +--
 .../keycloak/authorization/AuthorizorKeycloak.java |  8 ++--
 .../shiro/authorization/AuthorizorShiro.java       | 12 +++---
 ...AuthenticatorOrAuthorizorTest_authenticate.java | 10 ++---
 ...ticatorOrAuthorizorTest_isVisibleInAnyRole.java |  6 +--
 .../applib/validate/DomainModelValidator.java      |  4 +-
 .../wicket/model/models/PageParameterUtil.java     |  4 +-
 120 files changed, 354 insertions(+), 358 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentUsabilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentUsabilityEvent.java
index e808ef1..74b9d59 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentUsabilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentUsabilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.UsabilityEvent;
 
 /**
@@ -40,7 +40,7 @@ public class ActionArgumentUsabilityEvent extends UsabilityEvent {
     private final int position;
 
     public ActionArgumentUsabilityEvent(
-            final Object source, final Identifier actionIdentifier,
+            final Object source, final FeatureIdentifier actionIdentifier,
             final Object[] args, final int position) {
         super(source, actionIdentifier);
         this.args = args;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentVisibilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentVisibilityEvent.java
index 0a82bc2..53ce9f9 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentVisibilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/ActionArgumentVisibilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
 
 /**
@@ -39,7 +39,7 @@ public class ActionArgumentVisibilityEvent extends VisibilityEvent {
     private final int position;
 
     public ActionArgumentVisibilityEvent(
-            final Object source, final Identifier actionIdentifier,
+            final Object source, final FeatureIdentifier actionIdentifier,
             final Object[] args, final int position) {
         super(source, actionIdentifier);
         this.args = args;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java b/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java
index d542e3a..a69c403 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/events/domain/AbstractDomainEvent.java
@@ -22,7 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.isis.applib.events.EventObjectBase;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
@@ -49,7 +49,7 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
 
     public AbstractDomainEvent(
             final S source,
-            final Identifier identifier) {
+            final FeatureIdentifier identifier) {
         super(source);
         this.identifier = identifier;
     }
@@ -135,12 +135,12 @@ public abstract class AbstractDomainEvent<S> extends EventObjectBase<S> {
      * If the no-arg constructor is used, then the framework will populate this field reflectively.
      */
     @Getter
-    private Identifier identifier;
+    private FeatureIdentifier identifier;
 
     /**
      * Not API, set by the framework if the no-arg constructor is used.
      */
-    public void setIdentifier(final Identifier identifier) {
+    public void setIdentifier(final FeatureIdentifier identifier) {
         this.identifier = identifier;
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/exceptions/recoverable/InteractionException.java b/api/applib/src/main/java/org/apache/isis/applib/exceptions/recoverable/InteractionException.java
index 443d0a4..3fbbedb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/exceptions/recoverable/InteractionException.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/exceptions/recoverable/InteractionException.java
@@ -20,7 +20,7 @@
 package org.apache.isis.applib.exceptions.recoverable;
 
 import org.apache.isis.applib.exceptions.RecoverableException;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.InteractionEvent;
 
 public abstract class InteractionException extends RecoverableException {
@@ -62,7 +62,7 @@ public abstract class InteractionException extends RecoverableException {
      * {@link InteractionEvent#getIdentifier() identifier} of the wrapped
      * {@link #getInteractionEvent() interaction event}.
      */
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return interactionEvent.getIdentifier();
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/id/Identifier.java b/api/applib/src/main/java/org/apache/isis/applib/id/FeatureIdentifier.java
similarity index 82%
rename from api/applib/src/main/java/org/apache/isis/applib/id/Identifier.java
rename to api/applib/src/main/java/org/apache/isis/applib/id/FeatureIdentifier.java
index 7cec6b7..99d3a4b 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/id/Identifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/id/FeatureIdentifier.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 /**
  * @since 1.x revised for 2.0 {@index}
  */
-public class Identifier implements Comparable<Identifier> {
+public class FeatureIdentifier implements Comparable<FeatureIdentifier> {
 
     /**
      * What type of feature this identifies.
@@ -45,28 +45,28 @@ public class Identifier implements Comparable<Identifier> {
 
     // -- FACTORY METHODS
 
-    public static Identifier classIdentifier(final TypeIdentifier typeIdentifier) {
-        return new Identifier(typeIdentifier, "", Can.empty(), Type.CLASS);
+    public static FeatureIdentifier classIdentifier(final TypeIdentifier typeIdentifier) {
+        return new FeatureIdentifier(typeIdentifier, "", Can.empty(), Type.CLASS);
     }
 
-    public static Identifier propertyOrCollectionIdentifier(
+    public static FeatureIdentifier propertyOrCollectionIdentifier(
             final TypeIdentifier typeIdentifier,
             final String propertyOrCollectionName) {
-        return new Identifier(typeIdentifier, propertyOrCollectionName, Can.empty(), Type.PROPERTY_OR_COLLECTION);
+        return new FeatureIdentifier(typeIdentifier, propertyOrCollectionName, Can.empty(), Type.PROPERTY_OR_COLLECTION);
     }
 
-    public static Identifier actionIdentifier(
+    public static FeatureIdentifier actionIdentifier(
             final TypeIdentifier typeIdentifier,
             final String actionName, 
             final Class<?>... parameterClasses) {
         return actionIdentifier(typeIdentifier, actionName, classNamesOf(parameterClasses));
     }
 
-    public static Identifier actionIdentifier(
+    public static FeatureIdentifier actionIdentifier(
             final TypeIdentifier typeIdentifier,
             final String actionName, 
             final Can<String> parameterClassNames) {
-        return new Identifier(typeIdentifier, actionName, parameterClassNames, Type.ACTION);
+        return new FeatureIdentifier(typeIdentifier, actionName, parameterClassNames, Type.ACTION);
     }
 
     // -- INSTANCE FIELDS
@@ -77,7 +77,7 @@ public class Identifier implements Comparable<Identifier> {
     
     @Getter private final String memberName;
     
-    private final Can<String> parameterClassNames;
+    @Getter private final Can<String> memberParameterClassNames;
     
     @Getter private final Type type;
     
@@ -99,21 +99,21 @@ public class Identifier implements Comparable<Identifier> {
 
     // -- CONSTRUCTOR
 
-    private Identifier(
+    private FeatureIdentifier(
             final TypeIdentifier typeIdentifier,
             final String memberName, 
-            final Can<String> parameterClassNames, 
+            final Can<String> memberParameterClassNames, 
             final Type type) {
         
         this.typeIdentifier = typeIdentifier;
         this.className = typeIdentifier.getClassName();
         this.memberName = memberName;
-        this.parameterClassNames = parameterClassNames;
+        this.memberParameterClassNames = memberParameterClassNames;
         this.type = type;
          
         this.memberNameAndParameterClassNamesIdentityString =
                 memberName + (type.isAction() 
-                        ? "(" + parameterClassNames.stream().collect(Collectors.joining(",")) + ")" 
+                        ? "(" + memberParameterClassNames.stream().collect(Collectors.joining(",")) + ")" 
                         : "");
         
         this.translationContext = 
@@ -136,18 +136,14 @@ public class Identifier implements Comparable<Identifier> {
         return naturalName(memberName);
     }
 
-    public Can<String> getMemberParameterClassNames() {
-        return parameterClassNames;
-    }
-
     public Can<String> getMemberParameterNaturalNames() {
-        return naturalNames(parameterClassNames);
+        return naturalNames(memberParameterClassNames);
     }
 
     // -- OBJECT CONTRACT
 
     @Override
-    public int compareTo(final Identifier other) {
+    public int compareTo(final FeatureIdentifier other) {
         return toString().compareTo(other.toString());
     }
 
@@ -156,16 +152,16 @@ public class Identifier implements Comparable<Identifier> {
         if (this == obj) {
             return true;
         }
-        if (obj instanceof Identifier) {
-            return isEqualTo((Identifier) obj);
+        if (obj instanceof FeatureIdentifier) {
+            return isEqualTo((FeatureIdentifier) obj);
         }
         return false;
     }
 
-    public boolean isEqualTo(final Identifier other) {
+    public boolean isEqualTo(final FeatureIdentifier other) {
         return Objects.equals(this.className, other.className) 
                 && Objects.equals(this.memberName, other.memberName) 
-                && this.parameterClassNames.equals(other.parameterClassNames);
+                && this.memberParameterClassNames.equals(other.memberParameterClassNames);
     }
 
     @Override
@@ -231,7 +227,7 @@ public class Identifier implements Comparable<Identifier> {
     }
     
     private static Can<String> naturalNames(final Can<String> names) {
-        return names.map(Identifier::naturalName);
+        return names.map(FeatureIdentifier::naturalName);
     }
     
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/package-info.java b/api/applib/src/main/java/org/apache/isis/applib/package-info.java
index 7ff6a10..4bd38fa 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/package-info.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/package-info.java
@@ -29,7 +29,7 @@
  * {@link org.apache.isis.applib.AbstractFactoryAndRepository repositories}.
  *
  * <p>
- * In addition, it contains a {@link org.apache.isis.applib.id.Identifier class}
+ * In addition, it contains a {@link org.apache.isis.applib.id.FeatureIdentifier class}
  * that represents the identifier of an object or object member, used for
  * example in the <tt>events</tt> package as well as internally within the
  * framework.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/AccessEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/AccessEvent.java
index f194f90..e6467c5 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/AccessEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/AccessEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of a property, collection or title.
@@ -38,7 +38,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public abstract class AccessEvent extends InteractionEvent {
 
-    public AccessEvent(final Object source, final Identifier identifier) {
+    public AccessEvent(final Object source, final FeatureIdentifier identifier) {
         super(source, identifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionArgumentEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionArgumentEvent.java
index a265dea..7baf746 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionArgumentEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionArgumentEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a particular argument for an action is valid
@@ -40,7 +40,7 @@ public class ActionArgumentEvent extends ValidityEvent {
     private final int position;
     private final Object proposed;
 
-    public ActionArgumentEvent(final Object source, final Identifier actionIdentifier, final Object[] args, final int position) {
+    public ActionArgumentEvent(final Object source, final FeatureIdentifier actionIdentifier, final Object[] args, final int position) {
         super(source, actionIdentifier);
         this.args = args;
         this.position = position;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionInvocationEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionInvocationEvent.java
index 101331b..eeaef80 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionInvocationEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionInvocationEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 
 /**
@@ -38,7 +38,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
  */
 public class ActionInvocationEvent extends ValidityEvent {
 
-    public ActionInvocationEvent(final Object source, final Identifier actionIdentifier, final Object[] args) {
+    public ActionInvocationEvent(final Object source, final FeatureIdentifier actionIdentifier, final Object[] args) {
         super(source, actionIdentifier);
         this.args = args;
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionUsabilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionUsabilityEvent.java
index c7e2aae..ff5de2e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionUsabilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionUsabilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether an action is usable or has been disabled.
@@ -31,7 +31,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class ActionUsabilityEvent extends UsabilityEvent {
 
-    public ActionUsabilityEvent(final Object source, final Identifier actionIdentifier) {
+    public ActionUsabilityEvent(final Object source, final FeatureIdentifier actionIdentifier) {
         super(source, actionIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionVisibilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionVisibilityEvent.java
index 2fb332f..8d9f4f8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionVisibilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ActionVisibilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 
 /**
@@ -34,7 +34,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
  */
 public class ActionVisibilityEvent extends VisibilityEvent {
 
-    public ActionVisibilityEvent(final Object source, final Identifier actionIdentifier) {
+    public ActionVisibilityEvent(final Object source, final FeatureIdentifier actionIdentifier) {
         super(source, actionIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAccessEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAccessEvent.java
index 5b9508b..ab86807 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAccessEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAccessEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of a collection.
@@ -34,7 +34,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class CollectionAccessEvent extends AccessEvent {
 
-    public CollectionAccessEvent(final Object source, final Identifier collectionIdentifier) {
+    public CollectionAccessEvent(final Object source, final FeatureIdentifier collectionIdentifier) {
         super(source, collectionIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAddToEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAddToEvent.java
index 965d18c..118ce64 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAddToEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionAddToEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a particular object to be added to a
@@ -37,7 +37,7 @@ public class CollectionAddToEvent extends ValidityEvent {
 
     private final Object proposed;
 
-    public CollectionAddToEvent(final Object source, final Identifier collectionIdentifier, final Object proposed) {
+    public CollectionAddToEvent(final Object source, final FeatureIdentifier collectionIdentifier, final Object proposed) {
         super(source, collectionIdentifier);
         this.proposed = proposed;
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionMethodEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionMethodEvent.java
index 4323b64..89076e9 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionMethodEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionMethodEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an interaction with a collection object itself.
@@ -33,7 +33,7 @@ public class CollectionMethodEvent extends AccessEvent {
     private final Object[] args;
     private final Object returnValue;
 
-    public CollectionMethodEvent(final Object source, final Identifier collectionIdentifier, final Object domainObject, final String methodName, final Object[] args, final Object returnValue) {
+    public CollectionMethodEvent(final Object source, final FeatureIdentifier collectionIdentifier, final Object domainObject, final String methodName, final Object[] args, final Object returnValue) {
         super(source, collectionIdentifier);
         this.domainObject = domainObject;
         this.methodName = methodName;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionRemoveFromEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionRemoveFromEvent.java
index 9e6af88..7c224ab 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionRemoveFromEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionRemoveFromEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a particular object to be removed from a
@@ -36,7 +36,7 @@ import org.apache.isis.applib.id.Identifier;
 
     private final Object proposed;
 
-    public CollectionRemoveFromEvent(final Object source, final Identifier collectionIdentifier, final Object proposed) {
+    public CollectionRemoveFromEvent(final Object source, final FeatureIdentifier collectionIdentifier, final Object proposed) {
         super(source, collectionIdentifier);
         this.proposed = proposed;
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionUsabilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionUsabilityEvent.java
index 4a6c067..05afcfb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionUsabilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionUsabilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a collection is usable or has been disabled.
@@ -33,7 +33,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class CollectionUsabilityEvent extends UsabilityEvent {
 
-    public CollectionUsabilityEvent(final Object source, final Identifier identifier) {
+    public CollectionUsabilityEvent(final Object source, final FeatureIdentifier identifier) {
         super(source, identifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionVisibilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionVisibilityEvent.java
index 1ffc662..81e71da 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionVisibilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/CollectionVisibilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a collection is visible or has been hidden.
@@ -31,7 +31,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class CollectionVisibilityEvent extends VisibilityEvent {
 
-    public CollectionVisibilityEvent(final Object source, final Identifier identifier) {
+    public CollectionVisibilityEvent(final Object source, final FeatureIdentifier identifier) {
         super(source, identifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/InteractionEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/InteractionEvent.java
index 34e4889..9759399 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/InteractionEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/InteractionEvent.java
@@ -20,7 +20,7 @@
 package org.apache.isis.applib.services.wrapper.events;
 
 import org.apache.isis.applib.events.EventObjectBase;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.collections.Can;
 
 /**
@@ -36,11 +36,11 @@ import org.apache.isis.commons.collections.Can;
  */
 public abstract class InteractionEvent extends EventObjectBase<Object> {
 
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
     private String reason;
     private Class<?> advisorClass;
 
-    public InteractionEvent(final Object source, final Identifier identifier) {
+    public InteractionEvent(final Object source, final FeatureIdentifier identifier) {
         super(source);
         this.identifier = identifier;
     }
@@ -54,15 +54,15 @@ public abstract class InteractionEvent extends EventObjectBase<Object> {
     }
 
     /**
-     * The {@link Identifier} of the feature of the object being interacted
+     * The {@link FeatureIdentifier} of the feature of the object being interacted
      * with.
      *
      * <p>
      * Will be consistent with the subclass of {@link InteractionEvent}. So for
-     * example a {@link PropertyModifyEvent} will have an {@link Identifier}
+     * example a {@link PropertyModifyEvent} will have an {@link FeatureIdentifier}
      * that identifies the property being modified.
      */
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
@@ -77,7 +77,7 @@ public abstract class InteractionEvent extends EventObjectBase<Object> {
 
     /**
      * Convenience method that returns the
-     * {@link Identifier#getClassNaturalName() natural class name} of the
+     * {@link FeatureIdentifier#getClassNaturalName() natural class name} of the
      * {@link #getIdentifier() identifier}.
      */
     public String getClassNaturalName() {
@@ -85,7 +85,7 @@ public abstract class InteractionEvent extends EventObjectBase<Object> {
     }
 
     /**
-     * Convenience method that returns the {@link Identifier#getMemberName()
+     * Convenience method that returns the {@link FeatureIdentifier#getMemberName()
      * member name} of the {@link #getIdentifier() identifier}.
      *
      * @see #getIdentifier
@@ -102,7 +102,7 @@ public abstract class InteractionEvent extends EventObjectBase<Object> {
     }
 
     /**
-     * Convenience method that returns the {@link Identifier#getClassName()
+     * Convenience method that returns the {@link FeatureIdentifier#getClassName()
      * class name} of the {@link #getIdentifier() identifier}.
      */
     public Can<String> getMemberParameterNames() {
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
index 2b1b3fc..4e33625 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of an object's title.
@@ -34,7 +34,7 @@ public class ObjectTitleEvent extends AccessEvent {
 
     private final String title;
 
-    public ObjectTitleEvent(final Object source, final Identifier classIdentifier, final String title) {
+    public ObjectTitleEvent(final Object source, final FeatureIdentifier classIdentifier, final String title) {
         super(source, classIdentifier);
         this.title = title;
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectValidityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectValidityEvent.java
index 33ba59c..430097b 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectValidityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectValidityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether the current values of the
@@ -34,7 +34,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class ObjectValidityEvent extends ValidityEvent {
 
-    public ObjectValidityEvent(final Object source, final Identifier classIdentifier) {
+    public ObjectValidityEvent(final Object source, final FeatureIdentifier classIdentifier) {
         super(source, classIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectVisibilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectVisibilityEvent.java
index 3977468..b0157a8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectVisibilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectVisibilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether an object is visible or has been hidden.
@@ -32,7 +32,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class ObjectVisibilityEvent extends VisibilityEvent {
 
-    public ObjectVisibilityEvent(final Object source, final Identifier classIdentifier) {
+    public ObjectVisibilityEvent(final Object source, final FeatureIdentifier classIdentifier) {
         super(source, classIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ParseValueEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ParseValueEvent.java
index 478a2e8..79639c5 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ParseValueEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ParseValueEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether the proposed values of the value type is
@@ -39,14 +39,14 @@ public class ParseValueEvent extends ValidityEvent {
 
     private final String proposed;
 
-    public ParseValueEvent(final Object source, final Identifier classIdentifier, final String proposed) {
+    public ParseValueEvent(final Object source, final FeatureIdentifier classIdentifier, final String proposed) {
         super(coalesce(source, proposed), classIdentifier);
         this.proposed = proposed;
     }
 
     /**
      * Will be the source provided in the
-     * {@link #ParseValueEvent(Object, Identifier, String) constructor} if not
+     * {@link #ParseValueEvent(Object, FeatureIdentifier, String) constructor} if not
      * null, otherwise will fallback to the proposed value.
      */
     @Override
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyAccessEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyAccessEvent.java
index cd0a3ce..08a8b84 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyAccessEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyAccessEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of a property.
@@ -33,7 +33,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class PropertyAccessEvent extends AccessEvent {
 
-    public PropertyAccessEvent(final Object source, final Identifier propertyIdentifier, final Object value) {
+    public PropertyAccessEvent(final Object source, final FeatureIdentifier propertyIdentifier, final Object value) {
         super(source, propertyIdentifier);
         this.value = value;
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyModifyEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyModifyEvent.java
index fb7390a..4fbdc05 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyModifyEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyModifyEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a particular value for a property is valid
@@ -34,7 +34,7 @@ public class PropertyModifyEvent extends ValidityEvent {
 
     private final Object proposed;
 
-    public PropertyModifyEvent(final Object source, final Identifier propertyIdentifier, final Object proposed) {
+    public PropertyModifyEvent(final Object source, final FeatureIdentifier propertyIdentifier, final Object proposed) {
         super(source, propertyIdentifier);
         this.proposed = proposed;
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyUsabilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyUsabilityEvent.java
index 0197089..413d443 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyUsabilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyUsabilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a property is usable or has been disabled.
@@ -31,7 +31,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class PropertyUsabilityEvent extends UsabilityEvent {
 
-    public PropertyUsabilityEvent(final Object source, final Identifier propertyIdentifier) {
+    public PropertyUsabilityEvent(final Object source, final FeatureIdentifier propertyIdentifier) {
         super(source, propertyIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyVisibilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyVisibilityEvent.java
index 63abf99..fcbf657 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyVisibilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/PropertyVisibilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check as to whether a property is visible or has been hidden.
@@ -31,7 +31,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public class PropertyVisibilityEvent extends VisibilityEvent {
 
-    public PropertyVisibilityEvent(final Object source, final Identifier propertyIdentifier) {
+    public PropertyVisibilityEvent(final Object source, final FeatureIdentifier propertyIdentifier) {
         super(source, propertyIdentifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/UsabilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/UsabilityEvent.java
index ac9b530..da07131 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/UsabilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/UsabilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check to determine whether a member of an object is usable or
@@ -36,7 +36,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public abstract class UsabilityEvent extends InteractionEvent {
 
-    public UsabilityEvent(final Object source, final Identifier identifier) {
+    public UsabilityEvent(final Object source, final FeatureIdentifier identifier) {
         super(source, identifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ValidityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ValidityEvent.java
index 785a385..e86fc46 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ValidityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ValidityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 /**
  * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents a check to determine whether a proposed change is valid.
@@ -45,7 +45,7 @@ import org.apache.isis.applib.id.Identifier;
  */
 public abstract class ValidityEvent extends InteractionEvent implements ProposedHolderEvent {
 
-    public ValidityEvent(final Object source, final Identifier identifier) {
+    public ValidityEvent(final Object source, final FeatureIdentifier identifier) {
         super(source, identifier);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/VisibilityEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/VisibilityEvent.java
index 08f3818..2cff905 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/VisibilityEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/VisibilityEvent.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.applib.services.wrapper.events;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 
 /**
@@ -38,7 +38,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
  */
 public abstract class VisibilityEvent extends InteractionEvent {
 
-    public VisibilityEvent(final Object source, final Identifier identifier) {
+    public VisibilityEvent(final Object source, final FeatureIdentifier identifier) {
         super(source, identifier);
     }
 
diff --git a/api/applib/src/test/java/org/apache/isis/applib/IdentifierTests.java b/api/applib/src/test/java/org/apache/isis/applib/IdentifierTests.java
index 5f5d6eb..b4ec347 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/IdentifierTests.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/IdentifierTests.java
@@ -29,13 +29,13 @@ import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.collections.Can;
 
 public class IdentifierTests {
 
-    private Identifier identifier;
+    private FeatureIdentifier identifier;
 
     @Before
     public void setUp() {
@@ -43,7 +43,7 @@ public class IdentifierTests {
 
     @Test
     public void canInstantiateClassIdentifier() {
-        identifier = Identifier.classIdentifier(TypeIdentifier.fqcn(SomeDomainClass.class));
+        identifier = FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(SomeDomainClass.class));
         assertThat(identifier, is(not(nullValue())));
     }
 
@@ -51,21 +51,21 @@ public class IdentifierTests {
     public void classIdentifierClassNameIsSet() {
         final Class<?> domainClass = SomeDomainClass.class;
         final String domainClassFullyQualifiedName = domainClass.getCanonicalName();
-        identifier = Identifier.classIdentifier(TypeIdentifier.fqcn(domainClass));
+        identifier = FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(domainClass));
         assertThat(identifier.getClassName(), is(domainClassFullyQualifiedName));
     }
 
     @Test
     public void memberParameterNames() {
         final Class<?> domainClass = SomeDomainClass.class;
-        identifier = Identifier.actionIdentifier(TypeIdentifier.fqcn(domainClass), "placeOrder", int.class, String.class);
+        identifier = FeatureIdentifier.actionIdentifier(TypeIdentifier.fqcn(domainClass), "placeOrder", int.class, String.class);
         assertThat(identifier.getMemberParameterClassNames(), is(Can.of("int", "java.lang.String")));
     }
 
     @Test
     public void paramsIdentityString() {
         final Class<?> domainClass = SomeDomainClass.class;
-        identifier = Identifier.actionIdentifier(TypeIdentifier.fqcn(domainClass), "placeOrder", int.class, String.class, BigDecimal.class);
+        identifier = FeatureIdentifier.actionIdentifier(TypeIdentifier.fqcn(domainClass), "placeOrder", int.class, String.class, BigDecimal.class);
         assertThat(
                 identifier.getFullIdentityString(), 
                 is("org.apache.isis.applib.SomeDomainClass#placeOrder(int,java.lang.String,java.math.BigDecimal)"));
diff --git a/api/applib/src/test/java/org/apache/isis/applib/events/InteractionEventTest.java b/api/applib/src/test/java/org/apache/isis/applib/events/InteractionEventTest.java
index acffcf3..693928b 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/events/InteractionEventTest.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/events/InteractionEventTest.java
@@ -29,7 +29,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.wrapper.events.InteractionEvent;
 
@@ -41,7 +41,7 @@ public class InteractionEventTest {
     private InteractionEvent interactionEvent;
 
     private Object source;
-    private Identifier identifier;
+    private FeatureIdentifier identifier;
 
     private Class<? extends InteractionEventTest> advisorClass;
 
@@ -50,7 +50,7 @@ public class InteractionEventTest {
     @Before
     public void setUp() {
         source = new Object();
-        identifier = Identifier.actionIdentifier(
+        identifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifier.fqcn(CustomerOrder.class), 
                 "cancelOrder", new Class[] { String.class, boolean.class });
         advisorClass = this.getClass();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
index eed6c07..6fb6a67 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
@@ -22,7 +22,7 @@ package org.apache.isis.core.metamodel.facetapi;
 import java.beans.Introspector;
 import java.lang.reflect.Method;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.commons.StringExtensions;
@@ -43,28 +43,28 @@ public enum FeatureType {
          * The supplied method can be null; at any rate it will be ignored.
          */
         @Override
-        public Identifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
-            return Identifier.classIdentifier(typeIdentifier);
+        public FeatureIdentifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
+            return FeatureIdentifier.classIdentifier(typeIdentifier);
         }
     },
     PROPERTY("Property") {
         @Override
-        public Identifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
+        public FeatureIdentifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
             return propertyOrCollectionIdentifierFor(typeIdentifier, method);
         }
     },
     COLLECTION("Collection") {
         @Override
-        public Identifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
+        public FeatureIdentifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
             return propertyOrCollectionIdentifierFor(typeIdentifier, method);
         }
     },
     ACTION("Action") {
         @Override
-        public Identifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
+        public FeatureIdentifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
             final String fullMethodName = method.getName();
             final Class<?>[] parameterTypes = method.getParameterTypes();
-            return Identifier.actionIdentifier(typeIdentifier, fullMethodName, parameterTypes);
+            return FeatureIdentifier.actionIdentifier(typeIdentifier, fullMethodName, parameterTypes);
         }
     },
     ACTION_PARAMETER_SCALAR("Scalar Parameter") {
@@ -72,7 +72,7 @@ public enum FeatureType {
          * Always returns <tt>null</tt>.
          */
         @Override
-        public Identifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
+        public FeatureIdentifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
             return null;
         }
     },
@@ -81,7 +81,7 @@ public enum FeatureType {
          * Always returns <tt>null</tt>.
          */
         @Override
-        public Identifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
+        public FeatureIdentifier identifierFor(final TypeIdentifier typeIdentifier, final Method method) {
             return null;
         }
     };
@@ -120,13 +120,13 @@ public enum FeatureType {
         this.name = name;
     }
 
-    private static Identifier propertyOrCollectionIdentifierFor(
+    private static FeatureIdentifier propertyOrCollectionIdentifierFor(
             final TypeIdentifier typeIdentifier, 
             final Method method) {
         
         final String capitalizedName = StringExtensions.asJavaBaseName(method.getName());
         final String beanName = Introspector.decapitalize(capitalizedName);
-        return Identifier.propertyOrCollectionIdentifier(typeIdentifier, beanName);
+        return FeatureIdentifier.propertyOrCollectionIdentifier(typeIdentifier, beanName);
     }
 
     public boolean isProperty() {
@@ -152,7 +152,7 @@ public enum FeatureType {
         return isProperty() || isCollection();
     }
 
-    public abstract Identifier identifierFor(TypeIdentifier typeIdentifier, Method method);
+    public abstract FeatureIdentifier identifierFor(TypeIdentifier typeIdentifier, Method method);
 
     @Override
     public String toString() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java
index b2ef5d8..0fcee16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java
@@ -19,13 +19,13 @@
 
 package org.apache.isis.core.metamodel.facetapi;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 public interface IdentifiedHolder extends FacetHolder {
 
     /**
      * Identifier of this feature.
      */
-    Identifier getIdentifier();
+    FeatureIdentifier getIdentifier();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 8ed7e53..f827c7b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.exceptions.UnrecoverableException;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
@@ -120,7 +120,7 @@ public class DomainEventHelper {
                 // all other phases, create a new event
                 final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
                 final Object[] arguments = UnwrapUtil.multipleAsArray(argumentAdapters);
-                final Identifier identifier = identified.getIdentifier();
+                final FeatureIdentifier identifier = identified.getIdentifier();
                 event = newActionDomainEvent(eventType, identifier, source, arguments);
 
                 // copy over if have
@@ -164,7 +164,7 @@ public class DomainEventHelper {
 
     static <S> ActionDomainEvent<S> newActionDomainEvent(
             final Class<? extends ActionDomainEvent<S>> type,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final S source,
             final Object... arguments) 
         throws IllegalArgumentException,
@@ -190,7 +190,7 @@ public class DomainEventHelper {
         val updateEventConstructor = constructors
                 .filter(paramCount(3)
                         .and(paramAssignableFrom(0, source.getClass()))
-                        .and(paramAssignableFrom(1, Identifier.class))
+                        .and(paramAssignableFrom(1, FeatureIdentifier.class))
                         .and(paramAssignableFrom(2, Object[].class))
                         )
                 .getFirst()
@@ -201,7 +201,7 @@ public class DomainEventHelper {
             return uncheckedCast(event);    
         }
         
-        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", [Ljava.lang.Object;)");
+        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + FeatureIdentifier.class.getName() + ", [Ljava.lang.Object;)");
     }
 
     // same as in ActionDomainEvent's constructor.
@@ -234,7 +234,7 @@ public class DomainEventHelper {
                 // all other phases, create a new event
                 
                 final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
-                final Identifier identifier = identified.getIdentifier();
+                final FeatureIdentifier identifier = identified.getIdentifier();
                 
                 event = newPropertyDomainEvent(eventType, identifier, source, oldValue, newValue);
 
@@ -263,7 +263,7 @@ public class DomainEventHelper {
 
     static <S,T> PropertyDomainEvent<S,T> newPropertyDomainEvent(
             final @NonNull Class<? extends PropertyDomainEvent<S, T>> type,
-            final @NonNull Identifier identifier,
+            final @NonNull FeatureIdentifier identifier,
             final S source,
             final T oldValue,
             final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
@@ -288,7 +288,7 @@ public class DomainEventHelper {
         val updateEventConstructors = constructors
                 .filter(paramCount(4)
                         .and(paramAssignableFrom(0, source.getClass()))
-                        .and(paramAssignableFrom(1, Identifier.class))
+                        .and(paramAssignableFrom(1, FeatureIdentifier.class))
                         .and(paramAssignableFromValue(2, oldValue))
                         .and(paramAssignableFromValue(3, newValue))
                         );
@@ -299,7 +299,7 @@ public class DomainEventHelper {
         }
 
         // else
-        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object, java.lang.Object)");
+        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + FeatureIdentifier.class.getName() + ", java.lang.Object, java.lang.Object)");
     }
 
 
@@ -324,7 +324,7 @@ public class DomainEventHelper {
             } else {
                 // all other phases, create a new event
                 final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
-                final Identifier identifier = identified.getIdentifier();
+                final FeatureIdentifier identifier = identified.getIdentifier();
                 event = newCollectionDomainEvent(eventType, phase, identifier, source, of, reference);
 
                 // copy over if have
@@ -345,7 +345,7 @@ public class DomainEventHelper {
     <S, T> CollectionDomainEvent<S, T> newCollectionDomainEvent(
             final Class<? extends CollectionDomainEvent<S, T>> type,
                     final AbstractDomainEvent.Phase phase,
-                    final Identifier identifier,
+                    final FeatureIdentifier identifier,
                     final S source,
                     final CollectionDomainEvent.Of of,
                     final T value)
@@ -372,7 +372,7 @@ public class DomainEventHelper {
         val updateEventConstructors = constructors
                 .filter(paramCount(4)
                         .and(paramAssignableFrom(0, source.getClass()))
-                        .and(paramAssignableFrom(1, Identifier.class))
+                        .and(paramAssignableFrom(1, FeatureIdentifier.class))
                         .and(paramAssignableFrom(2, CollectionDomainEvent.Of.class))
                         .and(paramAssignableFromValue(3, value))
                         );
@@ -392,7 +392,7 @@ public class DomainEventHelper {
                 val eventConstructors = constructors
                         .filter(paramCount(3)
                                 .and(paramAssignableFrom(0, source.getClass()))
-                                .and(paramAssignableFrom(1, Identifier.class))
+                                .and(paramAssignableFrom(1, FeatureIdentifier.class))
                                 .and(paramAssignableFromValue(2, value))
                                 );
                 for (val constructor : eventConstructors) {
@@ -403,7 +403,7 @@ public class DomainEventHelper {
         }
         
         // else
-        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object)");
+        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + FeatureIdentifier.class.getName() + ", java.lang.Object)");
     }
 
     private static <T> T invokeConstructor(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
index b304ff8..3002506 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
@@ -24,7 +24,7 @@ import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -152,7 +152,7 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
 
     private final Class<?> owningType;
     private final Method method;
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
     private final List<FacetedMethodParameter> parameters;
 
     public List<FacetedMethodParameter> getParameters() {
@@ -200,7 +200,7 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
index f9bc4b8..35d7e26 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
@@ -20,7 +20,7 @@ package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
@@ -31,7 +31,7 @@ public class FacetedMethodParameter
 extends TypedHolderDefault 
 implements IdentifiedHolder {
 
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
 
     public FacetedMethodParameter(
             final FeatureType featureType,
@@ -50,7 +50,7 @@ implements IdentifiedHolder {
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
index 0f1622d..e33c1ff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java
@@ -25,7 +25,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.isis.applib.annotation.HomePage;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -105,7 +105,7 @@ implements MetaModelRefiner {
                     
                     final Set<String> homepageActionIdSet = actionsHavingHomePageFacet.values().stream()
                             .map(ObjectAction::getIdentifier)
-                            .map(Identifier::getFullIdentityString)
+                            .map(FeatureIdentifier::getFullIdentityString)
                             .collect(Collectors.toCollection(HashSet::new));
                     
                     for (val objectAction : actionsHavingHomePageFacet.values()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/deficiencies/DeficiencyFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/deficiencies/DeficiencyFacet.java
index 8a633fa..cf65c1c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/deficiencies/DeficiencyFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/deficiencies/DeficiencyFacet.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -49,7 +49,7 @@ public final class DeficiencyFacet implements Facet {
     
     @Value(staticConstructor = "of")
     public static final class Deficiency {
-        @NonNull @Getter private Identifier deficiencyOrigin;
+        @NonNull @Getter private FeatureIdentifier deficiencyOrigin;
         @NonNull @Getter private String deficiencyMessage;
     }
     
@@ -62,7 +62,7 @@ public final class DeficiencyFacet implements Facet {
      */
     public static DeficiencyFacet appendTo(
             @NonNull FacetHolder facetHolder, 
-            @NonNull Identifier deficiencyOrigin, 
+            @NonNull FeatureIdentifier deficiencyOrigin, 
             @NonNull String deficiencyMessage) {
         
         val deficiencyFacet = computeIfAbsent(facetHolder.getFacet(DeficiencyFacet.class), 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
index 793d8cd..c5e3b48 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.RecreatableDomainObject;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Nature;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -76,7 +76,7 @@ implements MetaModelRefiner {
         if(implementsViewModel && implementsRecreatableDomainObject) {
             validator.onFailure(
                     facetHolder,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                     "Inconsistent view model / domain object semantics; %s should not implement "
                     + "both %s and %s interfaces (implement one or the other)",
                     cls.getName(),
@@ -87,7 +87,7 @@ implements MetaModelRefiner {
         if(implementsViewModel && annotatedWithDomainObject) {
             validator.onFailure(
                     facetHolder,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                     "Inconsistent view model / domain object semantics; %1$s should not implement "
                     + "%2$s and be annotated with @%3$s (annotate with %4$s instead of %2$s, or implement %5s instead of %2$s)",
                     cls.getName(),
@@ -100,7 +100,7 @@ implements MetaModelRefiner {
         if(implementsViewModel && annotatedWithDomainObjectLayout) {
             validator.onFailure(
                     facetHolder,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                     "Inconsistent view model / domain object semantics; %1$s should not implement "
                     + "%2$s and be annotated with @%3$s (annotate with @%4$s instead of %3$s, or implement %5$s instead of %2$s)",
                     cls.getName(),
@@ -115,7 +115,7 @@ implements MetaModelRefiner {
                 && implementsRecreatableDomainObject) {
             validator.onFailure(
                     facetHolder,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                     "Inconsistent view model / domain object semantics; %1$s should not be annotated with "
                     + "@%2$s with nature of %3$s and also implement %4$s (specify a nature of %5$s)",
                     cls.getName(),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java
index 498bd0d..0c3a127 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/DisabledObjectFacetAbstract.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.object.disabled;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -39,10 +39,10 @@ public abstract class DisabledObjectFacetAbstract extends FacetAbstract implemen
     @Override
     public String disables(final UsabilityContext ic) {
         final ManagedObject toDisable = ic.getTarget();
-        final Identifier identifier = ic.getIdentifier();
+        final FeatureIdentifier identifier = ic.getIdentifier();
         return toDisable != null ? disabledReason(toDisable, identifier) : null;
     }
 
-    protected abstract String disabledReason(ManagedObject toDisable, Identifier identifier);
+    protected abstract String disabledReason(ManagedObject toDisable, FeatureIdentifier identifier);
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
index 3f2a86a..c729316 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethod.java
@@ -24,8 +24,8 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.applib.id.Identifier;
-import org.apache.isis.applib.id.Identifier.Type;
+import org.apache.isis.applib.id.FeatureIdentifier;
+import org.apache.isis.applib.id.FeatureIdentifier.Type;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -63,7 +63,7 @@ public class DisabledObjectFacetViaMethod extends DisabledObjectFacetAbstract im
     }
 
     @Override
-    public String disabledReason(final ManagedObject owningAdapter, final Identifier identifier) {
+    public String disabledReason(final ManagedObject owningAdapter, final FeatureIdentifier identifier) {
         final Type type = identifier.getType();
         final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, owningAdapter, type);
         if(returnValue instanceof String) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
index 96d5cc5..94b32c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/disabled/method/DisabledObjectFacetViaMethodFactory.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.object.disabled.method;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -58,7 +58,7 @@ public class DisabledObjectFacetViaMethodFactory extends MethodPrefixBasedFacetF
     public void process(final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
-        val paramTypes = new Class<?>[] {Identifier.Type.class};
+        val paramTypes = new Class<?>[] {FeatureIdentifier.Type.class};
 
         val method = MethodFinderUtils.findMethod_returningText(
                 cls, MethodLiteralConstants.DISABLED,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index c54e965..cc7f6d5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -38,7 +38,7 @@ import org.apache.isis.applib.events.lifecycle.ObjectPersistingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectRemovingEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatedEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.having.HasUniqueId;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -221,7 +221,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         }
         autoCompleteMethodInvalid.onFailure(
                 facetHolder,
-                Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                 "%s annotation on %s specifies method '%s' that does not exist in repository '%s'",
                 annotationName, cls.getName(), methodName, repositoryClass.getName());
         return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java
index 4c44b93..44c1339 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.object.mixin;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -52,14 +52,14 @@ public class MetaModelValidatorForMixinTypes extends MetaModelValidatorForValida
         if(mixinContructors.getCardinality().isZero()) {
             onFailure(
                     facetHolder,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(candidateMixinType)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(candidateMixinType)),
                     "%s: annotated with %s annotation but does not have a public 1-arg constructor",
                     candidateMixinType.getName(), 
                     annotation);
         } else {
             onFailure(
                     facetHolder,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(candidateMixinType)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(candidateMixinType)),
                     "%s: annotated with %s annotation needs a single public 1-arg constructor but has %d",
                     candidateMixinType.getName(), 
                     annotation,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
index e77e574..7f61fc4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
@@ -24,7 +24,7 @@ import java.util.IllegalFormatException;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.ParsingException;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
@@ -78,7 +78,7 @@ implements ParseableFacet {
                 && getFacetHolder().containsFacet(ValueFacet.class)) {
             
             val entryAdapter = getObjectManager().adapt(entry);
-            final Identifier identifier = getIdentified().getIdentifier();
+            final FeatureIdentifier identifier = getIdentified().getIdentifier();
             final ParseValueContext parseValueContext =
                     new ParseValueContext(
                             InteractionHead.simple(contextAdapter), identifier, entryAdapter, interactionInitiatedBy
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/AccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/AccessContext.java
index fab7837..6b93143 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/AccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/AccessContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.AccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -35,7 +35,7 @@ implements InteractionEventSupplier<AccessEvent> {
 
     public AccessContext(
             final InteractionContextType interactionType,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionHead head,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(interactionType, interactionInitiatedBy, identifier, head, Where.NOT_SPECIFIED);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
index b77b11b..02efa6a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.events.ActionArgumentUsabilityEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ActionArgumentEvent;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
@@ -47,7 +47,7 @@ implements ActionInteractionContext {
     public ActionArgUsabilityContext(
             final InteractionHead head,
             final ObjectAction objectAction,
-            final Identifier id,
+            final FeatureIdentifier id,
             final Can<ManagedObject> args,
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
index d1d79c8..b3dd0b0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ActionArgumentEvent;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
@@ -46,7 +46,7 @@ implements ProposedHolder, ActionInteractionContext {
     public ActionArgValidityContext(
             final InteractionHead head,
             final ObjectAction objectAction,
-            final Identifier id,
+            final FeatureIdentifier id,
             final Can<ManagedObject> args,
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
index ea93aec..bd6fa27 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.events.ActionArgumentVisibilityEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ActionArgumentEvent;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
@@ -47,7 +47,7 @@ implements ActionInteractionContext {
     public ActionArgVisibilityContext(
             final InteractionHead head,
             final ObjectAction objectAction,
-            final Identifier id,
+            final FeatureIdentifier id,
             final Can<ManagedObject> args,
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
index 2440948..791a42e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ActionUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -40,7 +40,7 @@ implements ActionInteractionContext {
     public ActionUsabilityContext(
             final InteractionHead head,
             final ObjectAction objectAction,
-            final Identifier id,
+            final FeatureIdentifier id,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.ACTION_USABLE, head, id, interactionInitiatedBy, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
index f35dff6..a754517 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ActionInvocationEvent;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
@@ -44,7 +44,7 @@ implements ActionInteractionContext {
     public ActionValidityContext(
             final InteractionHead head,
             final ObjectAction objectAction,
-            final Identifier id,
+            final FeatureIdentifier id,
             final Can<ManagedObject> args,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
index 9841c6d..3ebf091 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ActionVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -40,7 +40,7 @@ implements ActionInteractionContext  {
     public ActionVisibilityContext(
             final InteractionHead head,
             final ObjectAction objectAction,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.ACTION_VISIBLE, head, identifier, interactionInitiatedBy, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
index bdf26f4..c97ab70 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionAccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -33,7 +33,7 @@ public class CollectionAccessContext extends AccessContext {
 
     public CollectionAccessContext(
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.COLLECTION_READ, identifier, head, interactionInitiatedBy);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
index 9032587..55716f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionAddToEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -38,7 +38,7 @@ implements ProposedHolder {
 
     public CollectionAddToContext(
             final InteractionHead head,
-            final Identifier id,
+            final FeatureIdentifier id,
             final ManagedObject proposed,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.COLLECTION_ADD_TO, head, id, interactionInitiatedBy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
index 31a5c4f..ad86eaa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionRemoveFromEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -38,7 +38,7 @@ implements ProposedHolder{
 
     public CollectionRemoveFromContext(
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final ManagedObject proposed,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.COLLECTION_REMOVE_FROM, head, identifier, interactionInitiatedBy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionUsabilityContext.java
index 02ec151..bd0c3ba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionUsabilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -34,7 +34,7 @@ extends UsabilityContext {
 
     public CollectionUsabilityContext(
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.COLLECTION_USABLE, head, identifier, interactionInitiatedBy, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
index 1fd84e2..6f0a46e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -35,7 +35,7 @@ extends VisibilityContext {
 
     public CollectionVisibilityContext(
             final InteractionHead head,
-            final Identifier identifierAdapter,
+            final FeatureIdentifier identifierAdapter,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.COLLECTION_VISIBLE, head, identifierAdapter, interactionInitiatedBy, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
index eadf93b..346a009 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.InteractionEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -88,7 +88,7 @@ public abstract class InteractionContext {
      * the {@link #getTarget() target} object's specification. Otherwise will be
      * the identifier of the member.
      */
-    @Getter private final Identifier identifier;
+    @Getter private final FeatureIdentifier identifier;
     
     /**
      * Model that holds the object involved with the interaction.
@@ -103,7 +103,7 @@ public abstract class InteractionContext {
     protected InteractionContext(
             final InteractionContextType interactionType,
             final InteractionInitiatedBy invocationMethod,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionHead head,
             final Where where) {
         this.interactionType = interactionType;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
index 17601c1..ad0e184 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ObjectTitleEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -37,7 +37,7 @@ extends AccessContext {
 
     public ObjectTitleContext(
             final ManagedObject targetAdapter,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final String title,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
index 5d46a2e..7470edb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ObjectValidityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -36,7 +36,7 @@ implements ProposedHolder {
 
     public ObjectValidityContext(
             final ManagedObject targetAdapter,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
         super(InteractionContextType.OBJECT_VALIDATE, 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
index 7bd7757..7e83ee3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ObjectVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -37,7 +37,7 @@ implements ProposedHolder {
 
     public ObjectVisibilityContext(
             final ManagedObject targetAdapter,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
index 6647306..08f94cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ParseValueEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -38,7 +38,7 @@ implements ProposedHolder {
 
     public ParseValueContext(
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final ManagedObject proposed,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
index fc9b716..6a52184 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.PropertyAccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -37,7 +37,7 @@ extends AccessContext {
 
     public PropertyAccessContext(
             final InteractionHead head,
-            final Identifier id,
+            final FeatureIdentifier id,
             final ManagedObject value,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.PROPERTY_READ, id, head, interactionInitiatedBy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
index da23ed2..f871099 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.PropertyModifyEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -38,7 +38,7 @@ implements ProposedHolder {
 
     public PropertyModifyContext(
             final InteractionHead head,
-            final Identifier id,
+            final FeatureIdentifier id,
             final ManagedObject proposed,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.PROPERTY_MODIFY, head, id, interactionInitiatedBy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
index 5e3910f..c26703a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.PropertyUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -35,7 +35,7 @@ extends UsabilityContext {
 
     public PropertyUsabilityContext(
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.PROPERTY_USABLE, head, identifier, interactionInitiatedBy, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
index 3df8adc..9251d9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -34,7 +34,7 @@ public class PropertyVisibilityContext extends VisibilityContext {
 
     public PropertyVisibilityContext(
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.PROPERTY_VISIBLE, head, identifier, interactionInitiatedBy, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/UsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/UsabilityContext.java
index 8bde887..a92dee9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/UsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/UsabilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.UsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -36,7 +36,7 @@ implements InteractionEventSupplier<UsabilityEvent> {
     public UsabilityContext(
             final InteractionContextType interactionType,
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(interactionType, interactionInitiatedBy, identifier, head, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ValidityContext.java
index 4cacee3..e152a3d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ValidityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -36,7 +36,7 @@ implements InteractionEventSupplier<ValidityEvent> {
     public ValidityContext(
             final InteractionContextType interactionType,
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy invocationMethod) {
         super(interactionType, invocationMethod, identifier, head, Where.NOT_SPECIFIED);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/VisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/VisibilityContext.java
index e717e03..408abc9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/VisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/VisibilityContext.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.interactions;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -36,7 +36,7 @@ implements InteractionEventSupplier<VisibilityEvent> {
     public VisibilityContext(
             final InteractionContextType interactionType,
             final InteractionHead head,
-            final Identifier identifier,
+            final FeatureIdentifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(interactionType, interactionInitiatedBy, identifier, head, where);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedFeature.java
index d32bb20..b0fba3f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedFeature.java
@@ -22,7 +22,7 @@ import java.util.Optional;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -30,7 +30,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 public interface ManagedFeature {
 
-    Identifier getIdentifier();
+    FeatureIdentifier getIdentifier();
     
     /**
      * @return The feature's display name, as rendered with the UI. 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
index 21d9475..61d9013 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
@@ -22,7 +22,7 @@ import java.util.Optional;
 import java.util.function.BiFunction;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.Veto;
@@ -127,7 +127,7 @@ public abstract class ManagedMember implements ManagedFeature {
     }
     
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return getMetaModel().getIdentifier();
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index 14b0b7f..e93f64d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -22,7 +22,7 @@ import java.util.stream.IntStream;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.binding.Bindable;
 import org.apache.isis.commons.binding.Observable;
 import org.apache.isis.commons.collections.Can;
@@ -276,7 +276,7 @@ public class ParameterNegotiationModel {
         // -- MANAGED PARAMETER 
 
         @Override
-        public Identifier getIdentifier() {
+        public FeatureIdentifier getIdentifier() {
             return getMetaModel().getIdentifier();
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberIdentifierComparator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberIdentifierComparator.java
index 7a885a9..481f4b0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberIdentifierComparator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberIdentifierComparator.java
@@ -22,7 +22,7 @@ package org.apache.isis.core.metamodel.layout.memberorderfacet;
 import java.io.Serializable;
 import java.util.Comparator;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 
@@ -36,8 +36,8 @@ public class MemberIdentifierComparator implements Comparator<IdentifiedHolder>,
 
     @Override
     public int compare(final IdentifiedHolder o1, final IdentifiedHolder o2) {
-        final Identifier identifier1 = o1.getIdentifier();
-        final Identifier identifier2 = o2.getIdentifier();
+        final FeatureIdentifier identifier1 = o1.getIdentifier();
+        final FeatureIdentifier identifier2 = o2.getIdentifier();
         return identifier1.compareTo(identifier2);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
index 3e12260..b200a69 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
@@ -19,7 +19,7 @@ package org.apache.isis.core.metamodel.progmodels.dflt;
 
 import java.util.stream.Collectors;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.core.metamodel.authorization.standard.AuthorizationFacetFactory;
@@ -368,7 +368,7 @@ public final class ProgrammingModelFacetsJava8 extends ProgrammingModelAbstract
 
                 val actionIds = actions.stream()
                 .map(ObjectAction::getIdentifier)
-                .map(Identifier::toString)
+                .map(FeatureIdentifier::toString)
                 .collect(Collectors.joining(", "));
 
                 validator.onFailure(objectSpec, objectSpec.getIdentifier(),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
index 3763e9a..f2f0406 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
@@ -32,7 +32,7 @@ import static java.util.Comparator.nullsFirst;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Value;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
@@ -68,7 +68,7 @@ implements
 
     // -- FACTORY METHODS
 
-    public static ApplicationFeatureId fromIdentifier(final @NonNull Identifier identifier) {
+    public static ApplicationFeatureId fromIdentifier(final @NonNull FeatureIdentifier identifier) {
         
         val logicalTypeName = identifier.getTypeIdentifier().getLogicalTypeName();
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java
index a5595e6..4841bfc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.services.title;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.title.TitleService;
@@ -63,7 +63,7 @@ public class TitlesAndTranslationsValidator extends MetaModelValidatorAbstract {
             
             if(domainService == null) {
                 
-                val deficiencyOrigin = Identifier.classIdentifier(
+                val deficiencyOrigin = FeatureIdentifier.classIdentifier(
                         TypeIdentifier.eager(managedBeanAdapter.getBeanClass(), objectType));
                 val facetHolder = specificationLoader.loadSpecification(managedBeanAdapter.getBeanClass());
                 
@@ -84,7 +84,7 @@ public class TitlesAndTranslationsValidator extends MetaModelValidatorAbstract {
 
                 e.printStackTrace();
                 
-                val deficiencyOrigin = Identifier.classIdentifier(
+                val deficiencyOrigin = FeatureIdentifier.classIdentifier(
                         TypeIdentifier.eager(managedBeanAdapter.getBeanClass(), objectType));
                 val facetHolder = specificationLoader.loadSpecification(managedBeanAdapter.getBeanClass());
 
@@ -121,7 +121,7 @@ public class TitlesAndTranslationsValidator extends MetaModelValidatorAbstract {
 
                     } catch (Exception e) {
 
-                        val deficiencyOrigin = Identifier.classIdentifier(
+                        val deficiencyOrigin = FeatureIdentifier.classIdentifier(
                                 TypeIdentifier.eager(correspondingClass, objSpec.getSpecId().asString()));
                         val facetHolder = objSpec;
 
@@ -156,7 +156,7 @@ public class TitlesAndTranslationsValidator extends MetaModelValidatorAbstract {
             } catch (Exception e) {
 
                 val facetHolder = specificationLoader.loadSpecification(MessageRegistry.class);
-                val deficiencyOrigin = Identifier.classIdentifier(
+                val deficiencyOrigin = FeatureIdentifier.classIdentifier(
                         TypeIdentifier.eager(MessageRegistry.class, facetHolder.getSpecId().asString()));
 
                 super.onFailure(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 930ac0f..92959cd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
 import org.apache.isis.commons.collections.Can;
@@ -312,7 +312,7 @@ public interface ObjectAction extends ObjectMember {
 
         public static String actionIdentifierFor(final ObjectAction action) {
             @SuppressWarnings("unused")
-            final Identifier identifier = action.getIdentifier();
+            final FeatureIdentifier identifier = action.getIdentifier();
 
             final String className = action.getOnType().getSpecId().asString().replace(".","-");
             final String actionId = action.getId();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
index 2503226..94d1518 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
@@ -24,7 +24,7 @@ import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.spec.ActionType;
@@ -67,8 +67,8 @@ public interface ObjectActionContainer {
      * Get the action object represented by the specified identity string. (mixed-in included)
      * <p>
      * The identity string can be either fully specified with parameters (as per
-     * {@link Identifier#toNameParmsIdentityString()} or in abbreviated form (
-     * {@link Identifier#toNameIdentityString()}).
+     * {@link FeatureIdentifier#toNameParmsIdentityString()} or in abbreviated form (
+     * {@link FeatureIdentifier#toNameIdentityString()}).
      *
      * @see #getDeclaredAction(String)
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 1fcc04f..8a94917 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.collections.CanVector;
@@ -62,7 +62,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
     @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
 
     public ObjectActionMixedIn(
             final Class<?> mixinType,
@@ -88,9 +88,9 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
         }
 
         // calculate the identifier
-        final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
+        final FeatureIdentifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
         val memberParameterClassNames = mixinIdentifier.getMemberParameterClassNames();
-        identifier = Identifier.actionIdentifier(
+        identifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifier.eager(
                         getOnType().getCorrespondingClass(),
                         getOnType().getSpecId().asString()),
@@ -177,7 +177,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
      * @see ObjectMemberAbstract#getIdentifier()
      */
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 49f1112..b22a814 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -22,7 +22,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 import java.util.ArrayList;
 
 import org.apache.isis.applib.exceptions.unrecoverable.DomainModelException;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
@@ -122,7 +122,7 @@ implements ObjectActionParameter, HasFacetHolder {
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return parentAction.getIdentifier();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 8069655..08b4bd3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -24,7 +24,7 @@ import java.util.UUID;
 import java.util.function.Function;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.consent.Consent;
@@ -92,7 +92,7 @@ implements ObjectMember, HasMetaModelContext, HasFacetHolder {
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return getFacetedMethod().getIdentifier();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 01c6e1b..dfb0056 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -32,7 +32,7 @@ import java.util.stream.Stream;
 
 import javax.enterprise.inject.Vetoed;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
@@ -182,7 +182,7 @@ implements ObjectSpecification {
     private final Class<?> correspondingClass;
     private final String fullName;
     private final String shortName;
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
     private final boolean isAbstract;
 
     // derived lazily, cached since immutable
@@ -213,7 +213,7 @@ implements ObjectSpecification {
 
         this.isAbstract = ClassExtensions.isAbstract(introspectedClass);
 
-        this.identifier = Identifier.classIdentifier(
+        this.identifier = FeatureIdentifier.classIdentifier(
                 TypeIdentifier.lazy(
                         introspectedClass,
                         ()->specIdLazy.get().asString()));
@@ -612,7 +612,7 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index 3f1086c..1553a5f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -19,7 +19,7 @@
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
@@ -68,7 +68,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
     @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
 
     private static ObjectSpecification typeOfSpec(
             final ObjectActionDefault objectAction) {
@@ -125,10 +125,10 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         }
 
         // calculate the identifier
-        final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
+        final FeatureIdentifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
         val memberParameterNames = mixinIdentifier.getMemberParameterClassNames();
 
-        identifier = Identifier.actionIdentifier(
+        identifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifier.eager(
                         mixeeSpec.getCorrespondingClass(), 
                         mixeeSpec.getSpecId().asString()), 
@@ -163,7 +163,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index e527919..246bb7d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -19,7 +19,7 @@
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
@@ -64,7 +64,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
     @Getter(onMethod = @__(@Override))
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
-    private final Identifier identifier;
+    private final FeatureIdentifier identifier;
 
     public OneToOneAssociationMixedIn(
             final ObjectActionDefault mixinAction,
@@ -105,10 +105,10 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
 
 
         // calculate the identifier
-        final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
+        final FeatureIdentifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
         val memberParameterClassNames = mixinIdentifier.getMemberParameterClassNames();
 
-        identifier = Identifier.actionIdentifier(
+        identifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifier.eager(
                         mixeeSpec.getCorrespondingClass(), 
                         mixeeSpec.getSpecId().asString()),
@@ -145,7 +145,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
     }
 
     @Override
-    public Identifier getIdentifier() {
+    public FeatureIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 108c1c8..c6b828b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -26,7 +26,7 @@ import java.util.Optional;
 import java.util.function.BiConsumer;
 import java.util.stream.Stream;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.base._Lazy;
@@ -292,7 +292,7 @@ implements FacetHolder {
 
         return candidateActions
                 .filter(action->{
-                    final Identifier identifier = action.getIdentifier();
+                    final FeatureIdentifier identifier = action.getIdentifier();
 
                     if (id.equals(identifier.getMemberNameAndParameterClassNamesIdentityString())) {
                         return true;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidator.java
index 9ffc271..3f23abc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidator.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.specloader.validator;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.deficiencies.DeficiencyFacet;
 
@@ -30,7 +30,7 @@ public interface MetaModelValidator {
 
     default void onFailure(
             @NonNull FacetHolder facetHolder,
-            @NonNull Identifier deficiencyOrigin,
+            @NonNull FeatureIdentifier deficiencyOrigin,
             @NonNull String deficiencyMessageFormat,
             Object ...args) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorAbstract.java
index a0cbbaf..1d91266 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorAbstract.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.specloader.validator;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.context.MetaModelContextAware;
@@ -49,7 +49,7 @@ implements MetaModelValidator, MetaModelContextAware {
     @Override
     public void onFailure(
             @NonNull FacetHolder facetHolder, 
-            @NonNull Identifier deficiencyOrigin,
+            @NonNull FeatureIdentifier deficiencyOrigin,
             @NonNull String deficiencyMessageFormat, 
             Object... args) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java
index 6d53a24..1870165 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.validator;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
@@ -40,7 +40,7 @@ class MetaModelValidatorForDeprecatedAnnotation extends MetaModelValidatorForDep
         final boolean inherited = isInherited(processContext);
 
         final IdentifiedHolder facetHolder = (IdentifiedHolder) facet.getFacetHolder();
-        final Identifier identifier = facetHolder.getIdentifier();
+        final FeatureIdentifier identifier = facetHolder.getIdentifier();
         final String id = identifier.getFullIdentityString();
         return String.format(
                 "%s%s: annotation '%s' is deprecated",
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java
index 311d466..e8737a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.validator;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
@@ -40,7 +40,7 @@ class MetaModelValidatorForDeprecatedMethodPrefix extends MetaModelValidatorForD
         final boolean inherited = isInherited(processMethodContext);
 
         final IdentifiedHolder identifiedHolder = (IdentifiedHolder) facet.getFacetHolder();
-        final Identifier identifier = identifiedHolder.getIdentifier();
+        final FeatureIdentifier identifier = identifiedHolder.getIdentifier();
         final String id = identifier.getFullIdentityString();
         return String.format(
                 "%s%s: method prefix '%s' is deprecated",
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailure.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailure.java
index f7f8c60..590a858 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailure.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailure.java
@@ -24,7 +24,7 @@ import java.util.Objects;
 import static java.util.Comparator.naturalOrder;
 import static java.util.Comparator.nullsFirst;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 
 import lombok.NonNull;
 import lombok.Value;
@@ -37,7 +37,7 @@ import lombok.Value;
 @Value(staticConstructor = "of")
 public final class ValidationFailure implements Comparable<ValidationFailure> {
 
-    @NonNull private Identifier origin;
+    @NonNull private FeatureIdentifier origin;
     @NonNull private String message;
 
     private static final Comparator<ValidationFailure> comparator = Comparator
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
index a71de86..fd064f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
@@ -26,7 +26,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
 
@@ -36,7 +36,7 @@ public final class ValidationFailures implements Iterable<ValidationFailure> {
 
     private final Set<ValidationFailure> failures = _Sets.newConcurrentHashSet();
 
-    public void add(Identifier origin, String pattern, Object... arguments) {
+    public void add(FeatureIdentifier origin, String pattern, Object... arguments) {
         val message = String.format(pattern, arguments);
         failures.add(ValidationFailure.of(origin, message));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java
index bf96988..90e60c6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java
@@ -27,7 +27,7 @@ import org.junit.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 
 public class FeatureTypeTest_identifierFor {
@@ -57,7 +57,7 @@ public class FeatureTypeTest_identifierFor {
     @Test
     public void property_whenMethodNameIs_XYyyZzz() throws Exception {
         final Method method = SomeDomainClass.class.getMethod("getABigDecimal");
-        final Identifier identifierFor = FeatureType.PROPERTY.identifierFor(
+        final FeatureIdentifier identifierFor = FeatureType.PROPERTY.identifierFor(
                 TypeIdentifier.fqcn(SomeDomainClass.class), method);
         assertThat(identifierFor.getMemberName(), is("ABigDecimal")); // very
         // odd
@@ -80,7 +80,7 @@ public class FeatureTypeTest_identifierFor {
     @Test
     public void property_whenMethodNameIs_XxxxYyyZzz() throws Exception {
         final Method method = SomeDomainClass.class.getMethod("getAnotherBigDecimal");
-        final Identifier identifierFor = FeatureType.PROPERTY.identifierFor(
+        final FeatureIdentifier identifierFor = FeatureType.PROPERTY.identifierFor(
                 TypeIdentifier.fqcn(SomeDomainClass.class), method);
         assertThat(identifierFor.getMemberName(), is("anotherBigDecimal"));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index 27d1626..938cf26 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -28,7 +28,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -118,7 +118,7 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
         }});
 
         facetHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(
-                Identifier.propertyOrCollectionIdentifier(TypeIdentifier.fqcn(Customer.class), "firstName"));
+                FeatureIdentifier.propertyOrCollectionIdentifier(TypeIdentifier.fqcn(Customer.class), "firstName"));
         facetedMethod = FacetedMethod.createForProperty(AbstractFacetFactoryTest.Customer.class, "firstName");
         facetedMethodParameter = new FacetedMethodParameter(FeatureType.ACTION_PARAMETER_SCALAR, facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class);
         
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index 88b1334..dcc65f4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 import org.jmock.Expectations;
 import org.junit.Rule;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
@@ -75,14 +75,14 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
 
     public static class IdentifiedHolderImpl extends FacetHolderImpl implements IdentifiedHolder {
 
-        private Identifier identifier;
+        private FeatureIdentifier identifier;
 
-        public IdentifiedHolderImpl(final Identifier identifier) {
+        public IdentifiedHolderImpl(final FeatureIdentifier identifier) {
             this.identifier = identifier;
         }
 
         @Override
-        public Identifier getIdentifier() {
+        public FeatureIdentifier getIdentifier() {
             return identifier;
         }
     }
@@ -94,7 +94,7 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
         // PRODUCTION
 
         facetHolder = new IdentifiedHolderImpl(
-                Identifier.propertyOrCollectionIdentifier(TypeIdentifier.fqcn(Customer.class), "firstName"));
+                FeatureIdentifier.propertyOrCollectionIdentifier(TypeIdentifier.fqcn(Customer.class), "firstName"));
         facetedMethod = FacetedMethod.createForProperty(Customer.class, "firstName");
         facetedMethodParameter = new FacetedMethodParameter(
                 FeatureType.ACTION_PARAMETER_SCALAR, facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java
index 88a10c8..fe64c9b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java
@@ -27,7 +27,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertSame;
 
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 
 import static junit.framework.Assert.assertEquals;
@@ -43,7 +43,7 @@ public class DomainEventHelperTest_newActionInteractionEvent {
     @Test
     public void defaultEventType() throws Exception {
         final SomeDomainObject sdo = new SomeDomainObject();
-        final Identifier identifier = Identifier.actionIdentifier(TypeIdentifier.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class});
+        final FeatureIdentifier identifier = FeatureIdentifier.actionIdentifier(TypeIdentifier.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class});
 
         Utils.domainEventHelper();
         final ActionDomainEvent<Object> ev = DomainEventHelper.newActionDomainEvent(
@@ -58,7 +58,7 @@ public class DomainEventHelperTest_newActionInteractionEvent {
     @Test
     public void actionInvokedEventDefaultEventType() throws Exception {
         final SomeDomainObject sdo = new SomeDomainObject();
-        final Identifier identifier = Identifier.actionIdentifier(TypeIdentifier.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class});
+        final FeatureIdentifier identifier = FeatureIdentifier.actionIdentifier(TypeIdentifier.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class});
 
         Utils.domainEventHelper();
         final ActionDomainEvent<Object> ev = DomainEventHelper.newActionDomainEvent(
@@ -73,7 +73,7 @@ public class DomainEventHelperTest_newActionInteractionEvent {
     @Test
     public void customEventType() throws Exception {
         final SomeDomainObject sdo = new SomeDomainObject();
-        final Identifier identifier = Identifier.actionIdentifier(TypeIdentifier.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class});
+        final FeatureIdentifier identifier = FeatureIdentifier.actionIdentifier(TypeIdentifier.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class});
 
         Utils.domainEventHelper();
         final ActionDomainEvent<SomeDomainObject> ev = DomainEventHelper.newActionDomainEvent(
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
index 0e378b4..3ba0498 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertSame;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 
 public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
@@ -44,7 +44,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
     public void defaultEventType() throws Exception {
         final SomeDomainObject sdo = new SomeDomainObject();
         final SomeReferencedObject other = new SomeReferencedObject();
-        final Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        final FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
@@ -59,7 +59,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
     public void collectionAddedToDefaultEventType() throws Exception {
         final SomeDomainObject sdo = new SomeDomainObject();
         final SomeReferencedObject other = new SomeReferencedObject();
-        final Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        final FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
@@ -74,7 +74,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forAdd {
     public void customEventType() throws Exception {
         final SomeDomainObject sdo = new SomeDomainObject();
         final SomeReferencedObject other = new SomeReferencedObject();
-        final Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        final FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
index 25bd077..97838f2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertSame;
 
 import org.apache.isis.applib.events.domain.AbstractDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 
 public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
@@ -44,7 +44,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
     public void defaultEventType() throws Exception {
         SomeDomainObject sdo = new SomeDomainObject();
         SomeReferencedObject other = new SomeReferencedObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
@@ -59,7 +59,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
     public void collectionRemovedFromDefaultEventType() throws Exception {
         SomeDomainObject sdo = new SomeDomainObject();
         SomeReferencedObject other = new SomeReferencedObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<Object, Object> ev = Utils.domainEventHelper().newCollectionDomainEvent(
@@ -74,7 +74,7 @@ public class DomainEventHelperTest_newCollectionDomainEvent_forRemove {
     public void customEventType() throws Exception {
         SomeDomainObject sdo = new SomeDomainObject();
         SomeReferencedObject other = new SomeReferencedObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "references");
 
         final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = Utils.domainEventHelper().newCollectionDomainEvent(
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
index cac60f7..004e023 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 
 import static junit.framework.Assert.assertEquals;
@@ -44,7 +44,7 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forClear {
     public void defaultEventType() throws Exception {
 
         SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "someDateProperty");
         LocalDate oldValue = LocalDate.of(2013,4,1);
         LocalDate newValue = null;
@@ -63,7 +63,7 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forClear {
     public void customEventType() throws Exception {
 
         SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "someDateProperty");
         LocalDate oldValue = LocalDate.of(2013,4,1);
         LocalDate newValue = null;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
index ca11679..93dcb9d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
@@ -26,7 +26,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 
 public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
@@ -40,7 +40,7 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
     public void defaultEventType() throws Exception {
 
         SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "someDateProperty");
         LocalDate oldValue = LocalDate.of(2013,4,1);
         LocalDate newValue = LocalDate.of(2013,5,2);
@@ -59,7 +59,7 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
     public void customEventType() throws Exception {
 
         SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(
+        FeatureIdentifier identifier = FeatureIdentifier.propertyOrCollectionIdentifier(
                 TypeIdentifier.fqcn(SomeDomainObject.class), "someDateProperty");
         LocalDate oldValue = LocalDate.of(2013,4,1);
         LocalDate newValue = LocalDate.of(2013,5,2);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
index 2d40419..7a72678 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
@@ -21,8 +21,8 @@ package org.apache.isis.core.metamodel.facets.object.disabled;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.applib.id.Identifier;
-import org.apache.isis.applib.id.Identifier.Type;
+import org.apache.isis.applib.id.FeatureIdentifier;
+import org.apache.isis.applib.id.FeatureIdentifier.Type;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
@@ -48,7 +48,7 @@ public class ObjectDisabledMethodFacetFactoryTest extends AbstractFacetFactoryTe
 
     public void testDisabledMethodPickedUpAndMethodRemoved() {
         final Class<?>[] params = new Class<?>[1];
-        params[0] = Identifier.Type.class;
+        params[0] = FeatureIdentifier.Type.class;
 
         class Customer {
             @SuppressWarnings("unused")
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
index 5dec6d7..8c6bf99 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
@@ -25,7 +25,7 @@ import org.mockito.Mockito;
 
 import static org.mockito.Mockito.when;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.i18n.Mode;
 import org.apache.isis.applib.services.i18n.TranslationService;
@@ -91,7 +91,7 @@ abstract class MixinIntendedAs {
     protected FacetHolder runTypeContextOn(Class<?> type) {
 
         val facetHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(
-              Identifier.classIdentifier(TypeIdentifier.fqcn(type)));
+              FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(type)));
         facetHolder.setMetaModelContext(metaModelContext);
 
         val processClassContext =
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java
index 371d4b1..13e3055 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java
@@ -29,7 +29,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertEquals;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
@@ -66,7 +66,7 @@ public class ObjectActionLayoutXmlDefaultTest {
         context.checking(new Expectations() {
             {
                 oneOf(mockFacetedMethod).getIdentifier();
-                will(returnValue(Identifier.actionIdentifier(TypeIdentifierTestFactory.newCustomer(), "reduceheadcount")));
+                will(returnValue(FeatureIdentifier.actionIdentifier(TypeIdentifierTestFactory.newCustomer(), "reduceheadcount")));
             }
         });
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java
index 6e096f6..cb7f24d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java
@@ -30,7 +30,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertNotNull;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -121,7 +121,7 @@ public class OneToManyAssociationDefaultTest {
         context.checking(new Expectations() {
             {
                 oneOf(mockPeer).getIdentifier();
-                will(returnValue(Identifier.propertyOrCollectionIdentifier(
+                will(returnValue(FeatureIdentifier.propertyOrCollectionIdentifier(
                         TypeIdentifierTestFactory.newCustomer(), COLLECTION_ID)));
             }
         });
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java
index b120f3c..4f6f339 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java
@@ -40,7 +40,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.metamodel.DomainMember;
 import org.apache.isis.applib.services.metamodel.DomainModel;
@@ -79,7 +79,7 @@ class MetaModelServiceDefaultTest {
         context.checking(new Expectations() {
             {
                 allowing(mockFacetedMethod).getIdentifier();
-                will(returnValue(Identifier.actionIdentifier(
+                will(returnValue(FeatureIdentifier.actionIdentifier(
                         TypeIdentifierTestFactory.newCustomer(), "reduceheadcount")));
 
                 allowing(mockFacetedMethod).getFacet(with(facetMatcher));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index b549dda..a76a9b9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -26,7 +26,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
@@ -256,8 +256,8 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     }
 
     @Override
-    public Identifier getIdentifier() {
-        return Identifier.classIdentifier(TypeIdentifier.fqcn(correspondingClass));
+    public FeatureIdentifier getIdentifier() {
+        return FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(correspondingClass));
     }
 
     @Override
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java b/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
index e40cabb..e650bf0 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authorization/manager/AuthorizationManager.java
@@ -29,7 +29,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.core.security.authentication.Authentication;
 import org.apache.isis.core.security.authorization.standard.Authorizor;
@@ -61,7 +61,7 @@ public class AuthorizationManager {
      */
     public boolean isUsable(
             final Authentication authentication, 
-            final Identifier identifier) {
+            final FeatureIdentifier identifier) {
         if (isPerspectiveMember(identifier)) {
             return true;
         }
@@ -84,7 +84,7 @@ public class AuthorizationManager {
      */
     public boolean isVisible(
             final Authentication authentication, 
-            final Identifier identifier) {
+            final FeatureIdentifier identifier) {
         if (isPerspectiveMember(identifier)) {
             return true;
         }
@@ -111,7 +111,7 @@ public class AuthorizationManager {
         return session.getUser().hasRoleName(SudoService.ACCESS_ALL_ROLE.getName());
     }
     
-    private boolean isPerspectiveMember(final Identifier identifier) {
+    private boolean isPerspectiveMember(final FeatureIdentifier identifier) {
         return (identifier.getClassName().equals(""));
     }
 
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authorization/standard/Authorizor.java b/core/security/src/main/java/org/apache/isis/core/security/authorization/standard/Authorizor.java
index 098d7f1..8f891e2 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authorization/standard/Authorizor.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authorization/standard/Authorizor.java
@@ -19,12 +19,12 @@
 
 package org.apache.isis.core.security.authorization.standard;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.security.authentication.Authentication;
 
 public interface Authorizor {
 
-    boolean isVisible(Authentication authentication, Identifier identifier);
-    boolean isUsable(Authentication authentication, Identifier identifier);
+    boolean isVisible(Authentication authentication, FeatureIdentifier identifier);
+    boolean isUsable(Authentication authentication, FeatureIdentifier identifier);
 
 }
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java
index 8e31b06..fae248d 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java
@@ -26,7 +26,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.security.authentication.Authentication;
 import org.apache.isis.core.security.authorization.standard.Authorizor;
@@ -46,12 +46,12 @@ public class AuthorizorSecman implements Authorizor {
     @Inject ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
     @Override
-    public boolean isVisible(final Authentication authentication, final Identifier identifier) {
+    public boolean isVisible(final Authentication authentication, final FeatureIdentifier identifier) {
         return grants(authentication, identifier, ApplicationPermissionMode.VIEWING);
     }
 
     @Override
-    public boolean isUsable(final Authentication authentication, final Identifier identifier) {
+    public boolean isUsable(final Authentication authentication, final FeatureIdentifier identifier) {
         return grants(authentication, identifier, ApplicationPermissionMode.CHANGING);
     }
     
@@ -59,7 +59,7 @@ public class AuthorizorSecman implements Authorizor {
     
     private boolean grants(
             final Authentication authentication, 
-            final Identifier identifier, 
+            final FeatureIdentifier identifier, 
             final ApplicationPermissionMode permissionMode) {
         
         return applicationUserRepository
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForClauseAbstract.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForClauseAbstract.java
index d36e9c5..f151c6d 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForClauseAbstract.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForClauseAbstract.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.persistence.jdo.metamodel.facets.object.query;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -83,7 +83,7 @@ abstract class VisitorForClauseAbstract implements MetaModelValidatorVisiting.Vi
         if (getSpecificationLoader().loadSpecification(ObjectSpecId.of(classNameFromClause))==null) {
             validator.onFailure(
                     objectSpec,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                     "%s: error in JDOQL query, class name for '%s' clause not recognized (JDOQL : %s)",
                     cls.getName(), clause, query);
             return;
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForFromClause.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForFromClause.java
index 17d789c..50d2a88 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForFromClause.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForFromClause.java
@@ -20,7 +20,7 @@ package org.apache.isis.persistence.jdo.metamodel.facets.object.query;
 
 import java.util.Objects;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.core.metamodel.spec.Hierarchical;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -59,7 +59,7 @@ class VisitorForFromClause extends VisitorForClauseAbstract {
         }
         validator.onFailure(
                 objectSpec,
-                Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                 "%s: error in JDOQL query, class name after '%s' clause should be same as class name on which annotated, or one of its supertypes (JDOQL : %s)",
                 cls.getName(), clause, query);
     }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForVariablesClause.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForVariablesClause.java
index 206d4ea..22032da 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForVariablesClause.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/VisitorForVariablesClause.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.persistence.jdo.metamodel.facets.object.query;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -59,7 +59,7 @@ class VisitorForVariablesClause extends VisitorForClauseAbstract {
         if(persistenceCapableFacet == null) {
             validator.onFailure(
                     objectSpec,
-                    Identifier.classIdentifier(TypeIdentifier.fqcn(cls)),
+                    FeatureIdentifier.classIdentifier(TypeIdentifier.fqcn(cls)),
                     "%s: error in JDOQL query, class name for '%s' clause is not annotated as @PersistenceCapable (JDOQL : %s)",
                     cls.getName(), clause, query);
             return;
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
index eb78dda..97d3ad1 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
@@ -29,7 +29,7 @@ import org.junit.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -189,7 +189,7 @@ public class JdoVersionAnnotationFacetFactoryTest_refineMetaModel {
                 
                 oneOf(mockChildType).getIdentifier();
                 inSequence(sequence);
-                will(returnValue(Identifier.classIdentifier(TypeIdentifierTestFactory.customer())));
+                will(returnValue(FeatureIdentifier.classIdentifier(TypeIdentifierTestFactory.customer())));
 
                 oneOf(mockChildType).getFullIdentifier();
                 inSequence(sequence);
@@ -252,7 +252,7 @@ public class JdoVersionAnnotationFacetFactoryTest_refineMetaModel {
                 
                 oneOf(mockChildType).getIdentifier();
                 inSequence(sequence);
-                will(returnValue(Identifier.classIdentifier(TypeIdentifierTestFactory.customer())));
+                will(returnValue(FeatureIdentifier.classIdentifier(TypeIdentifierTestFactory.customer())));
 
                 oneOf(mockChildType).getFullIdentifier();
                 inSequence(sequence);
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
index d10d531..6034519 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 import org.jmock.Expectations;
 import org.junit.Rule;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.id.TypeIdentifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.repository.EntityState;
@@ -80,14 +80,14 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
 
     public static class IdentifiedHolderImpl extends FacetHolderImpl implements IdentifiedHolder {
 
-        private Identifier identifier;
+        private FeatureIdentifier identifier;
 
-        public IdentifiedHolderImpl(final Identifier identifier) {
+        public IdentifiedHolderImpl(final FeatureIdentifier identifier) {
             this.identifier = identifier;
         }
 
         @Override
-        public Identifier getIdentifier() {
+        public FeatureIdentifier getIdentifier() {
             return identifier;
         }
     }
@@ -99,7 +99,7 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
         // PRODUCTION
 
         facetHolder = new IdentifiedHolderImpl(
-                Identifier.propertyOrCollectionIdentifier(TypeIdentifier.fqcn(Customer.class), "firstName"));
+                FeatureIdentifier.propertyOrCollectionIdentifier(TypeIdentifier.fqcn(Customer.class), "firstName"));
         facetedMethod = FacetedMethod.createForProperty(Customer.class, "firstName");
         facetedMethodParameter = new FacetedMethodParameter(
                 FeatureType.ACTION_PARAMETER_SCALAR, facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class
diff --git a/security/bypass/src/main/java/org/apache/isis/security/bypass/authorization/AuthorizorBypass.java b/security/bypass/src/main/java/org/apache/isis/security/bypass/authorization/AuthorizorBypass.java
index b33eb5e..ea1b6b8 100644
--- a/security/bypass/src/main/java/org/apache/isis/security/bypass/authorization/AuthorizorBypass.java
+++ b/security/bypass/src/main/java/org/apache/isis/security/bypass/authorization/AuthorizorBypass.java
@@ -26,7 +26,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.security.authentication.Authentication;
 import org.apache.isis.core.security.authorization.standard.Authorizor;
 
@@ -40,12 +40,12 @@ import org.apache.isis.core.security.authorization.standard.Authorizor;
 public class AuthorizorBypass implements Authorizor {
 
     @Override
-    public boolean isVisible(final Authentication authentication, final Identifier identifier) {
+    public boolean isVisible(final Authentication authentication, final FeatureIdentifier identifier) {
         return true;
     }
 
     @Override
-    public boolean isUsable(final Authentication authentication, final Identifier identifier) {
+    public boolean isUsable(final Authentication authentication, final FeatureIdentifier identifier) {
         return true;
     }
 
diff --git a/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authorization/AuthorizorKeycloak.java b/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authorization/AuthorizorKeycloak.java
index 55976e4..96bfc88 100644
--- a/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authorization/AuthorizorKeycloak.java
+++ b/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authorization/AuthorizorKeycloak.java
@@ -26,7 +26,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.security.authentication.Authentication;
 import org.apache.isis.core.security.authorization.standard.Authorizor;
 
@@ -40,16 +40,16 @@ import org.apache.isis.core.security.authorization.standard.Authorizor;
 public class AuthorizorKeycloak implements Authorizor {
 
     @Override
-    public boolean isVisible(final Authentication authentication, Identifier identifier) {
+    public boolean isVisible(final Authentication authentication, FeatureIdentifier identifier) {
         return isPermitted(identifier, "r");
     }
 
     @Override
-    public boolean isUsable(final Authentication authentication, Identifier identifier) {
+    public boolean isUsable(final Authentication authentication, FeatureIdentifier identifier) {
         return isPermitted(identifier, "w");
     }
 
-    private boolean isPermitted(Identifier identifier, String qualifier) {
+    private boolean isPermitted(FeatureIdentifier identifier, String qualifier) {
         return true;
     }
 
diff --git a/security/shiro/src/main/java/org/apache/isis/security/shiro/authorization/AuthorizorShiro.java b/security/shiro/src/main/java/org/apache/isis/security/shiro/authorization/AuthorizorShiro.java
index 7249041..262de45 100644
--- a/security/shiro/src/main/java/org/apache/isis/security/shiro/authorization/AuthorizorShiro.java
+++ b/security/shiro/src/main/java/org/apache/isis/security/shiro/authorization/AuthorizorShiro.java
@@ -32,7 +32,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.context._Context;
@@ -66,16 +66,16 @@ public class AuthorizorShiro implements Authorizor {
     @Inject private SpecificationLoader specificationLoader;
 
     @Override
-    public boolean isVisible(final Authentication authentication, final Identifier identifier) {
+    public boolean isVisible(final Authentication authentication, final FeatureIdentifier identifier) {
         return isPermitted(authentication.getUserName(), identifier, "r");
     }
 
     @Override
-    public boolean isUsable(final Authentication authentication, final Identifier identifier) {
+    public boolean isUsable(final Authentication authentication, final FeatureIdentifier identifier) {
         return isPermitted(authentication.getUserName(), identifier, "w");
     }
 
-    private boolean isPermitted(String userName, Identifier identifier, String qualifier) {
+    private boolean isPermitted(String userName, FeatureIdentifier identifier, String qualifier) {
 
         RealmSecurityManager securityManager = getSecurityManager();
         if(securityManager == null) {
@@ -95,7 +95,7 @@ public class AuthorizorShiro implements Authorizor {
         }
     }
 
-    private String asPermissionsString(Identifier identifier) {
+    private String asPermissionsString(FeatureIdentifier identifier) {
         String fullyQualifiedLogicalTypeName = asFeatureFqns(identifier);
         int lastDot = fullyQualifiedLogicalTypeName.lastIndexOf('.');
         String packageName;
@@ -126,7 +126,7 @@ public class AuthorizorShiro implements Authorizor {
      * @deprecated while this is technically correct, we should not need to call the SpecificationLoader
      * on every permission check
      */
-    private String asFeatureFqns(Identifier identifier) {
+    private String asFeatureFqns(FeatureIdentifier identifier) {
         val className = identifier.getClassName();
         return Result.of(()->_Context.loadClass(className))
                 .<String>mapSuccess(this::asFeatureFqns)
diff --git a/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java b/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java
index 3cc38e0..6f034b9 100644
--- a/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java
+++ b/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java
@@ -34,7 +34,7 @@ import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -99,19 +99,19 @@ public class ShiroAuthenticatorOrAuthorizorTest_authenticate {
         assertThat(authentication.getUserName(), is("lonestarr"));
         assertThat(authentication.getValidationCode(), is("test code"));
 
-        Identifier changeAddressIdentifier = Identifier.actionIdentifier(
+        FeatureIdentifier changeAddressIdentifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifierTestFactory.customer(), "changeAddress", String.class, String.class);
         assertThat(authorizor.isVisible(authentication, changeAddressIdentifier), is(true));
 
-        Identifier changeEmailIdentifier = Identifier.actionIdentifier(
+        FeatureIdentifier changeEmailIdentifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifierTestFactory.customer(), "changeEmail", String.class);
         assertThat(authorizor.isVisible(authentication, changeEmailIdentifier), is(true));
 
-        Identifier submitOrderIdentifier = Identifier.actionIdentifier(
+        FeatureIdentifier submitOrderIdentifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifierTestFactory.order(), "submit");
         assertThat(authorizor.isVisible(authentication, submitOrderIdentifier), is(true));
 
-        Identifier cancelOrderIdentifier = Identifier.actionIdentifier(
+        FeatureIdentifier cancelOrderIdentifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifierTestFactory.order(), "cancel");
         assertThat(authorizor.isVisible(authentication, cancelOrderIdentifier), is(false));
     }
diff --git a/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java b/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java
index be7d5e2..f0ebcd4 100644
--- a/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java
+++ b/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java
@@ -32,7 +32,7 @@ import org.junit.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -85,7 +85,7 @@ public class ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole {
         Authentication authentication = authenticator.authenticate(ar, "test code");
 
         // when, then
-        Identifier changeAddressIdentifier = Identifier.actionIdentifier(
+        FeatureIdentifier changeAddressIdentifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifierTestFactory.customer(), "changeAddress", String.class, String.class);
         assertThat(authorizor.isVisible(authentication, changeAddressIdentifier), is(true));
 
@@ -102,7 +102,7 @@ public class ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole {
         Authentication authentication = authenticator.authenticate(ar, "test code");
 
         // when, then
-        Identifier removeCustomerIdentifier = Identifier.actionIdentifier(
+        FeatureIdentifier removeCustomerIdentifier = FeatureIdentifier.actionIdentifier(
                 TypeIdentifierTestFactory.customer(), "remove");
         assertThat(authorizor.isVisible(authentication, removeCustomerIdentifier), is(true));
     }
diff --git a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/validate/DomainModelValidator.java b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/validate/DomainModelValidator.java
index ab9e078..61dfb1d 100644
--- a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/validate/DomainModelValidator.java
+++ b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/validate/DomainModelValidator.java
@@ -31,7 +31,7 @@ import javax.inject.Inject;
 import org.junit.jupiter.api.Assertions;
 
 import org.apache.isis.applib.exceptions.unrecoverable.DomainModelException;
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
@@ -122,7 +122,7 @@ public class DomainModelValidator {
         return validationFailures.getFailures(); // already wrapped unmodifiable
     }
 
-    public Stream<ValidationFailure> streamFailures(@Nullable Predicate<Identifier> filter) {
+    public Stream<ValidationFailure> streamFailures(@Nullable Predicate<FeatureIdentifier> filter) {
         if(validationFailures==null) {
             return Stream.empty();
         }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java
index ee45087..22b1a6e 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java
@@ -24,7 +24,7 @@ import java.util.regex.Pattern;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
-import org.apache.isis.applib.id.Identifier;
+import org.apache.isis.applib.id.FeatureIdentifier;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.primitives._Ints;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -174,7 +174,7 @@ public class PageParameterUtil {
     }
     
     private static String determineActionId(final ObjectAction objectAction) {
-        final Identifier identifier = objectAction.getIdentifier();
+        final FeatureIdentifier identifier = objectAction.getIdentifier();
         if (identifier != null) {
             return identifier.getMemberNameAndParameterClassNamesIdentityString();
         }