You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/01/20 07:29:22 UTC

[isis] 01/02: ISIS-439: completely removes concept of mutable collections

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

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

commit c1f90a906c501f96bd2aa8723ded85bfcab30157
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 20 06:51:15 2021 +0000

    ISIS-439: completely removes concept of mutable collections
    
    - CollectionAddToFacet, CollectionValidateAddToFacet, CollectionRemoveFromFacet, CollectionValidateRemoveFromFacet, CollectionClearFacet
    - remove support in Restful objects
    - remove support in WrapperFactory.
---
 .../core/metamodel/facets/ImperativeFacet.java     |   7 +-
 .../clear/CollectionClearFacetFactory.java         |  70 ----
 .../clear/CollectionClearFacetViaAccessor.java     |  80 -----
 .../clear/CollectionClearFacetViaClearMethod.java  |  71 ----
 .../CollectionAnnotationFacetFactory.java          |  50 ---
 ...ectionAddToFacetForDomainEventFromAbstract.java | 127 -------
 ...acetForDomainEventFromCollectionAnnotation.java |  43 ---
 ...lectionAddToFacetForDomainEventFromDefault.java |  41 ---
 ...nRemoveFromFacetForDomainEventFromAbstract.java | 126 -------
 ...acetForDomainEventFromCollectionAnnotation.java |  43 ---
 ...onRemoveFromFacetForDomainEventFromDefault.java |  41 ---
 ...abledFacetOnCollectionDerivedFromImmutable.java |  39 ---
 ...cetOnCollectionDerivedFromImmutableFactory.java |  45 ---
 .../collections/modify/CollectionAddToFacet.java   |  37 --
 .../modify/CollectionAddToFacetAbstract.java       |  36 --
 .../modify/CollectionAddToFacetViaAccessor.java    |  79 -----
 .../modify/CollectionAddToFacetViaMethod.java      |  75 ----
 ...tionAddToRemoveFromAndValidateFacetFactory.java | 177 ----------
 .../collections/modify/CollectionClearFacet.java   |  36 --
 .../modify/CollectionClearFacetAbstract.java       |  36 --
 .../modify/CollectionRemoveFromFacet.java          |  39 ---
 .../modify/CollectionRemoveFromFacetAbstract.java  |  36 --
 .../CollectionRemoveFromFacetViaAccessor.java      |  82 -----
 .../modify/CollectionRemoveFromFacetViaMethod.java |  75 ----
 .../TypeOfFacetInferredFromSupportingMethods.java  |  31 --
 ...etOnCollectionDerivedFromRecreatableObject.java |  46 ---
 ...CollectionDerivedFromViewModelFacetFactory.java |  54 ---
 .../param/DeriveFacetsPostProcessor.java           |  85 ++---
 .../dflt/ProgrammingModelFacetsJava8.java          |  12 +-
 .../ApplicationFeatureRepositoryDefault.java       |  34 +-
 .../spec/feature/OneToManyAssociation.java         |  71 ----
 .../specimpl/OneToManyAssociationDefault.java      |  98 ------
 .../CollectionFieldMethodsFacetFactoryTest.java    | 383 +--------------------
 .../CollectionAnnotationFacetFactoryTest.java      | 269 ---------------
 .../objects/OneToManyAssociationDefaultTest.java   | 107 ++----
 .../handlers/DomainObjectInvocationHandler.java    | 166 +++------
 .../rendering/domainobjects/MemberType.java        |   9 +-
 .../resources/DomainObjectResourceServerside.java  | 118 ++-----
 38 files changed, 146 insertions(+), 2828 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
index 18255be..0a78d1a1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
@@ -83,8 +83,6 @@ public interface ImperativeFacet extends Facet {
          * Modify property using modify/clear rather than simply using set.
          */
         MODIFY_PROPERTY_SUPPORTING,
-        MODIFY_COLLECTION_ADD,
-        MODIFY_COLLECTION_REMOVE,
         CHOICES_OR_AUTOCOMPLETE,
         DEFAULTS,
         INITIALIZATION,
@@ -108,8 +106,7 @@ public interface ImperativeFacet extends Facet {
 
         /**
          * Returns the provided {@link Facet facet} as an {@link ImperativeFacet} if
-         * it either is one or if it is a {@link DecoratingFacet} that in turn wraps
-         * an {@link ImperativeFacet}.
+         * it either is one or if it wraps one.
          *
          * <p>
          * Otherwise, returns <tt>null</tt>.
@@ -134,7 +131,7 @@ public interface ImperativeFacet extends Facet {
                     .filter(_NullSafe::isPresent)
                     .filter(imperativeFacet->imperativeFacet.getMethods().contains(method))
                     .collect(Collectors.toList());
-            
+
             switch(imperativeFacets.size()) {
             case 0:
                 break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
deleted file mode 100644
index 5771bd1..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.clear;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
-
-public class CollectionClearFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.CLEAR_PREFIX);
-
-    public CollectionClearFacetFactory() {
-        super(FeatureType.COLLECTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        attachCollectionClearFacets(processMethodContext);
-
-    }
-
-    private void attachCollectionClearFacets(final ProcessMethodContext processMethodContext) {
-
-        final Method getMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asJavaBaseName(getMethod.getName());
-
-        final Class<?> cls = processMethodContext.getCls();
-        final Method method = MethodFinderUtils.findMethod(cls, MethodLiteralConstants.CLEAR_PREFIX + capitalizedName, void.class, null);
-        processMethodContext.removeMethod(method);
-
-        final FacetHolder collection = processMethodContext.getFacetHolder();
-        super.addFacet(createCollectionClearFacet(method, getMethod, collection));
-    }
-
-    private CollectionClearFacet createCollectionClearFacet(
-            final Method clearMethodIfAny, final Method accessorMethod, final FacetHolder collection) {
-
-        if (clearMethodIfAny != null) {
-            return new CollectionClearFacetViaClearMethod(clearMethodIfAny, collection);
-        } else {
-            return new CollectionClearFacetViaAccessor(accessorMethod, collection);
-        }
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
deleted file mode 100644
index 339de42..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.clear;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-public class CollectionClearFacetViaAccessor extends CollectionClearFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-
-    public CollectionClearFacetViaAccessor(
-            final Method method,
-            final FacetHolder holder) {
-
-        super(holder);
-        this.method = method;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.ACCESSOR;
-    }
-
-    @Override
-    public void clear(final ManagedObject owningAdapter) {
-        final Collection<?> collection = (Collection<?>) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        collection.clear();
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    // /////////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // /////////////////////////////////////////////////////////
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaClearMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaClearMethod.java
deleted file mode 100644
index 3222402..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/clear/CollectionClearFacetViaClearMethod.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.clear;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-public class CollectionClearFacetViaClearMethod extends CollectionClearFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-
-    public CollectionClearFacetViaClearMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.MODIFY_COLLECTION_ADD;
-    }
-
-    @Override
-    public void clear(final ManagedObject owningAdapter) {
-        ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index c9dea13..568dfec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -38,18 +38,10 @@ import org.apache.isis.core.metamodel.facets.actions.contributing.ContributingFa
 import org.apache.isis.core.metamodel.facets.actions.contributing.ContributingFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.collection.hidden.HiddenFacetForCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionAddToFacetForDomainEventFromAbstract;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionAddToFacetForDomainEventFromCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionAddToFacetForDomainEventFromDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromAbstract;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.typeof.TypeOfFacetOnCollectionFromCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.CollectionDomainEventDefaultFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -139,48 +131,6 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
             super.addFacet(collectionDomainEventFacet);
         }
 
-
-        //
-        // if the collection is mutable, then replace the existing addTo and removeFrom facets with equivalents that
-        // also post to the event bus.
-        //
-        // here we support the deprecated annotations
-        //
-        final CollectionAddToFacet collectionAddToFacet = holder.getFacet(CollectionAddToFacet.class);
-        if (collectionAddToFacet != null) {
-            // the current collectionAddToFacet will end up as the underlying facet of
-            // one of these facets to be created.
-            final CollectionAddToFacetForDomainEventFromAbstract replacementFacet;
-
-            if(collectionDomainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation) {
-                replacementFacet = new CollectionAddToFacetForDomainEventFromCollectionAnnotation(
-                        collectionDomainEventFacet.getEventType(), getterFacet, collectionAddToFacet,
-                        collectionDomainEventFacet, holder, getServiceRegistry());
-            } else
-                // default
-            {
-                replacementFacet = new CollectionAddToFacetForDomainEventFromDefault(
-                        collectionDomainEventFacet.getEventType(), getterFacet,
-                        collectionAddToFacet, collectionDomainEventFacet, holder, getServiceRegistry());
-            }
-            super.addFacet(replacementFacet);
-        }
-
-        final CollectionRemoveFromFacet collectionRemoveFromFacet = holder.getFacet(CollectionRemoveFromFacet.class);
-        if (collectionRemoveFromFacet != null) {
-            // the current collectionRemoveFromFacet will end up as the underlying facet of the PostsCollectionRemovedFromEventFacetAnnotation
-
-            final CollectionRemoveFromFacetForDomainEventFromAbstract replacementFacet;
-
-            if(collectionDomainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation) {
-                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, getServiceRegistry(), holder);
-            } else {
-                // default
-                replacementFacet = new CollectionRemoveFromFacetForDomainEventFromDefault(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, getServiceRegistry(), holder);
-            }
-            super.addFacet(replacementFacet);
-        }
-
     }
 
     public static Class<? extends CollectionDomainEvent<?,?>> defaultFromDomainObjectIfRequired(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
deleted file mode 100644
index facac72..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.collection.modify;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.isis.applib.events.domain.AbstractDomainEvent;
-import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.DomainEventHelper;
-import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionHead;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-
-public abstract class CollectionAddToFacetForDomainEventFromAbstract
-extends SingleValueFacetAbstract<Class<? extends CollectionDomainEvent<?,?>>>
-implements CollectionAddToFacet {
-
-    private final DomainEventHelper domainEventHelper;
-
-    public static Class<? extends Facet> type() {
-        return CollectionAddToFacet.class;
-    }
-
-    private final PropertyOrCollectionAccessorFacet getterFacet;
-    private final CollectionAddToFacet collectionAddToFacet;
-
-    public CollectionAddToFacetForDomainEventFromAbstract(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final PropertyOrCollectionAccessorFacet getterFacet,
-                    final CollectionAddToFacet collectionAddToFacet,
-                    final CollectionDomainEventFacetAbstract collectionDomainEventFacet,
-                    final ServiceRegistry serviceRegistry,
-                    final FacetHolder holder) {
-
-        super(type(), eventType, holder);
-        this.getterFacet = getterFacet;
-        this.collectionAddToFacet = collectionAddToFacet;
-        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
-    }
-
-    @Override
-    public void add(
-            final ManagedObject targetAdapter,
-            final ManagedObject referencedObjectAdapter, 
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (this.collectionAddToFacet == null) {
-            return;
-        }
-
-        final Object referencedObject = UnwrapUtil.single(referencedObjectAdapter);
-
-        // get hold of underlying collection
-        final Object collection = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
-
-        // don't post event if has set semantics and already contains object
-        if(collection instanceof Set) {
-            Set<?> set = (Set<?>) collection;
-            if(set.contains(referencedObject)) {
-                return;
-            }
-        }
-
-        final InteractionHead head = InteractionHead.simple(targetAdapter);
-        
-        // either doesn't contain object, or doesn't have set semantics, so
-        // execute the add wrapped between the executing and executed events ...
-
-        // ... post the executing event
-
-        final CollectionDomainEvent<?, ?> event =
-                domainEventHelper.postEventForCollection(
-                        AbstractDomainEvent.Phase.EXECUTING,
-                        getEventType(), null,
-                        getIdentified(), head,
-                        CollectionDomainEvent.Of.ADD_TO,
-                        referencedObject);
-
-        // ... perform add
-        collectionAddToFacet.add(targetAdapter, referencedObjectAdapter, interactionInitiatedBy);
-
-        // ... post the executed event
-        domainEventHelper.postEventForCollection(
-                AbstractDomainEvent.Phase.EXECUTED,
-                getEventType(), uncheckedCast(event),
-                getIdentified(), head,
-                CollectionDomainEvent.Of.ADD_TO,
-                referencedObject);
-    }
-
-    public <S, T> Class<? extends CollectionDomainEvent<S, T>> getEventType() {
-        return uncheckedCast(value());
-    }
-
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        attributeMap.put("getterFacet", getterFacet);
-        attributeMap.put("collectionAddToFacet", collectionAddToFacet);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java
deleted file mode 100644
index 71cbfe9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromCollectionAnnotation.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.collection.modify;
-
-import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-
-public class CollectionAddToFacetForDomainEventFromCollectionAnnotation
-extends CollectionAddToFacetForDomainEventFromAbstract {
-
-    public CollectionAddToFacetForDomainEventFromCollectionAnnotation(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final PropertyOrCollectionAccessorFacet getterFacet,
-                    final CollectionAddToFacet collectionAddToFacet,
-                    final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final FacetHolder holder,
-                    final ServiceRegistry serviceRegistry) {
-
-        super(eventType, getterFacet, collectionAddToFacet, collectionInteractionFacet, serviceRegistry, holder);
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java
deleted file mode 100644
index 29c2a0d..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromDefault.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.collection.modify;
-
-import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-
-public class CollectionAddToFacetForDomainEventFromDefault
-extends CollectionAddToFacetForDomainEventFromAbstract {
-
-    public CollectionAddToFacetForDomainEventFromDefault(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-            final PropertyOrCollectionAccessorFacet getterFacet,
-            final CollectionAddToFacet collectionAddToFacet,
-            final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-            final FacetHolder holder, final ServiceRegistry serviceRegistry) {
-        super(eventType, getterFacet, collectionAddToFacet, collectionInteractionFacet, serviceRegistry, holder);
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
deleted file mode 100644
index 18f5324..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.collection.modify;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.isis.applib.events.domain.AbstractDomainEvent;
-import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.DomainEventHelper;
-import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionHead;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-
-import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-
-
-public abstract class CollectionRemoveFromFacetForDomainEventFromAbstract
-extends SingleValueFacetAbstract<Class<? extends CollectionDomainEvent<?,?>>>
-implements CollectionRemoveFromFacet {
-
-    public static Class<? extends Facet> type() {
-        return CollectionRemoveFromFacet.class;
-    }
-
-    private final PropertyOrCollectionAccessorFacet getterFacet;
-    private final CollectionRemoveFromFacet collectionRemoveFromFacet;
-
-    private final DomainEventHelper domainEventHelper;
-
-    public CollectionRemoveFromFacetForDomainEventFromAbstract(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final PropertyOrCollectionAccessorFacet getterFacet,
-                    final CollectionRemoveFromFacet collectionRemoveFromFacet,
-                    final CollectionDomainEventFacetAbstract collectionDomainEventFacet,
-                    final ServiceRegistry serviceRegistry,
-                    final FacetHolder holder) {
-
-        super(type(), eventType, holder);
-        this.getterFacet = getterFacet;
-        this.collectionRemoveFromFacet = collectionRemoveFromFacet;
-        this.domainEventHelper = DomainEventHelper.ofServiceRegistry(serviceRegistry);
-    }
-
-    @Override
-    public void remove(
-            final ManagedObject targetAdapter,
-            final ManagedObject referencedObjectAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (this.collectionRemoveFromFacet == null) {
-            return;
-        }
-
-
-        final Object referencedObject = UnwrapUtil.single(referencedObjectAdapter);
-
-        // get hold of underlying collection
-        // passing null through for authentication/deploymentType means to avoid any visibility filtering.
-        final Object collection = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
-
-        // don't post event if the collections does not contain object
-        if (!((Collection<?>) collection).contains(referencedObject)) {
-            return;
-        }
-
-        final InteractionHead head = InteractionHead.simple(targetAdapter);
-        
-        // contains the element, so
-        // execute the remove wrapped between the executing and executed events ...
-
-        // ... post the executing event
-        final CollectionDomainEvent<?, ?> event =
-                domainEventHelper.postEventForCollection(
-                        AbstractDomainEvent.Phase.EXECUTING,
-                        getEventType(), null,
-                        getIdentified(), head,
-                        CollectionDomainEvent.Of.REMOVE_FROM,
-                        referencedObject);
-
-        // ... perform remove
-        collectionRemoveFromFacet.remove(targetAdapter, referencedObjectAdapter, interactionInitiatedBy);
-
-        // ... and post the executed event
-        domainEventHelper.postEventForCollection(
-                AbstractDomainEvent.Phase.EXECUTED,
-                getEventType(), uncheckedCast(event),
-                getIdentified(), head,
-                CollectionDomainEvent.Of.REMOVE_FROM,
-                referencedObject);
-    }
-
-    public <S, T> Class<? extends CollectionDomainEvent<S, T>> getEventType() {
-        return _Casts.uncheckedCast(value());
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        attributeMap.put("getterFacet", getterFacet);
-        attributeMap.put("collectionRemoveFromFacet", collectionRemoveFromFacet);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java
deleted file mode 100644
index 8739eda..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.collection.modify;
-
-import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-
-public class CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation extends
-CollectionRemoveFromFacetForDomainEventFromAbstract {
-
-    public CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final PropertyOrCollectionAccessorFacet getterFacet,
-                    final CollectionRemoveFromFacet collectionRemoveFromFacet,
-                    final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final ServiceRegistry serviceRegistry,
-                    final FacetHolder holder) {
-
-        super(eventType, getterFacet, collectionRemoveFromFacet, collectionInteractionFacet, 
-                serviceRegistry, holder);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java
deleted file mode 100644
index 046e5aa..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromDefault.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.collection.modify;
-
-import org.apache.isis.applib.events.domain.CollectionDomainEvent;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-
-public class CollectionRemoveFromFacetForDomainEventFromDefault extends
-CollectionRemoveFromFacetForDomainEventFromAbstract {
-
-    public CollectionRemoveFromFacetForDomainEventFromDefault(
-            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
-                    final PropertyOrCollectionAccessorFacet getterFacet,
-                    final CollectionRemoveFromFacet collectionRemoveFromFacet,
-                    final CollectionDomainEventFacetAbstract collectionInteractionFacet,
-                    final ServiceRegistry serviceRegistry,
-                    final FacetHolder holder) {
-        super(eventType, getterFacet, collectionRemoveFromFacet, collectionInteractionFacet, serviceRegistry, holder);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutable.java
deleted file mode 100644
index 36b0c55..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutable.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.disabled.fromimmutable;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstract;
-import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public class DisabledFacetOnCollectionDerivedFromImmutable extends DisabledFacetAbstract {
-
-    public DisabledFacetOnCollectionDerivedFromImmutable(final ImmutableFacet immutableFacet, final FacetHolder holder) {
-        super(Where.ANYWHERE, holder);
-    }
-
-    @Override
-    public String disabledReason(final ManagedObject target) {
-        return "Immutable";
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java
deleted file mode 100644
index f343b63..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.disabled.fromimmutable;
-
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-public class DisabledFacetOnCollectionDerivedFromImmutableFactory extends FacetFactoryAbstract {
-
-    public DisabledFacetOnCollectionDerivedFromImmutableFactory() {
-        super(FeatureType.COLLECTIONS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        final Class<?> declaringClass = processMethodContext.getMethod().getDeclaringClass();
-        final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
-        if (spec.containsNonFallbackFacet(ImmutableFacet.class)) {
-            final ImmutableFacet immutableFacet = spec.getFacet(ImmutableFacet.class);
-            final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
-            super.addFacet(new DisabledFacetOnCollectionDerivedFromImmutable(immutableFacet, facetHolder));
-        }
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacet.java
deleted file mode 100644
index 2d63ad8..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacet.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Add object to a collection.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to invoking the
- * <tt>addToXxx</tt> support method for a collection.
- */
-public interface CollectionAddToFacet extends Facet {
-
-    public void add(ManagedObject inObject, ManagedObject value, InteractionInitiatedBy interactionInitiatedBy);
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetAbstract.java
deleted file mode 100644
index fe688fc..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetAbstract.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-public abstract class CollectionAddToFacetAbstract extends FacetAbstract implements CollectionAddToFacet {
-
-    public static Class<? extends Facet> type() {
-        return CollectionAddToFacet.class;
-    }
-
-    public CollectionAddToFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
deleted file mode 100644
index 0016146..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-
-public class CollectionAddToFacetViaAccessor extends CollectionAddToFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-
-    public CollectionAddToFacetViaAccessor(final Method method, final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.MODIFY_COLLECTION_ADD;
-    }
-
-    @Override
-    public void add(
-            final ManagedObject owningAdapter,
-            final ManagedObject elementAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        @SuppressWarnings("unchecked")
-        final Collection<? super Object> collection = (Collection<? super Object>) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        final Object elementPojo = UnwrapUtil.single(elementAdapter);
-        collection.add(elementPojo);
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaMethod.java
deleted file mode 100644
index aaef556..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaMethod.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-public class CollectionAddToFacetViaMethod extends CollectionAddToFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-
-    public CollectionAddToFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.MODIFY_COLLECTION_ADD;
-    }
-
-    @Override
-    public void add(
-            final ManagedObject owningAdapter,
-            final ManagedObject elementAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        ManagedObjects.InvokeUtil.invoke(method, owningAdapter, elementAdapter);
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
deleted file mode 100644
index 836750f..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
-import org.apache.isis.core.metamodel.exceptions.MetaModelException;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateAddToFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateRemoveFromFacetViaMethod;
-
-/**
- * TODO: should probably split out into two {@link FacetFactory}s, one for
- * <tt>addTo()</tt>/<tt>removeFrom()</tt> and one for <tt>validateAddTo()</tt>/
- * <tt>validateRemoveFrom()</tt>.
- */
-public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final Can<String> PREFIXES = Can.empty();
-
-    public CollectionAddToRemoveFromAndValidateFacetFactory() {
-        super(FeatureType.COLLECTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        final Class<?> collectionType = attachAddToFacetAndRemoveFromFacet(processMethodContext);
-        attachValidateAddToAndRemoveFromFacetIfMethodsFound(processMethodContext, collectionType);
-    }
-
-    private Class<?> attachAddToFacetAndRemoveFromFacet(final ProcessMethodContext processMethodContext) {
-
-        final Method accessorMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asJavaBaseName(accessorMethod.getName());
-
-        final Class<?> cls = processMethodContext.getCls();
-
-        // add
-        final Method addToMethod = MethodFinderUtils.findSingleArgMethod(cls, MethodLiteralConstants.ADD_TO_PREFIX + capitalizedName, void.class).orElse(null);
-        processMethodContext.removeMethod(addToMethod);
-
-        // remove
-        final Method removeFromMethod = MethodFinderUtils.findSingleArgMethod(cls, MethodLiteralConstants.REMOVE_FROM_PREFIX + capitalizedName, void.class).orElse(null);
-        processMethodContext.removeMethod(removeFromMethod);
-
-        // add facets
-        final FacetHolder collection = processMethodContext.getFacetHolder();
-        super.addFacet(createAddToFacet(addToMethod, accessorMethod, collection));
-        super.addFacet(createRemoveFromFacet(removeFromMethod, accessorMethod, collection));
-
-        // infer typ
-        final Class<?> addToType = ((addToMethod == null || addToMethod.getParameterTypes().length != 1) ? null : addToMethod.getParameterTypes()[0]);
-        final Class<?> removeFromType = ((removeFromMethod == null || removeFromMethod.getParameterTypes().length != 1) ? null : removeFromMethod.getParameterTypes()[0]);
-
-        return inferTypeOfIfPossible(accessorMethod, addToType, removeFromType, collection);
-    }
-
-    /**
-     * TODO need to distinguish between Java collections, arrays and other
-     * collections!
-     */
-    private CollectionAddToFacet createAddToFacet(final Method addToMethodIfAny, final Method accessorMethod, final FacetHolder holder) {
-        if (addToMethodIfAny != null) {
-            return new CollectionAddToFacetViaMethod(addToMethodIfAny, holder);
-        } else {
-            return new CollectionAddToFacetViaAccessor(accessorMethod, holder);
-        }
-    }
-
-    /**
-     * TODO need to distinguish between Java collections, arrays and other
-     * collections!
-     */
-    private CollectionRemoveFromFacet createRemoveFromFacet(final Method removeFromMethodIfAny, final Method accessorMethod, final FacetHolder holder) {
-        if (removeFromMethodIfAny != null) {
-            return new CollectionRemoveFromFacetViaMethod(removeFromMethodIfAny, holder);
-        } else {
-            return new CollectionRemoveFromFacetViaAccessor(accessorMethod, holder);
-        }
-    }
-
-    private Class<?> inferTypeOfIfPossible(final Method getMethod, final Class<?> addType, final Class<?> removeType, final FacetHolder collection) {
-
-        if (addType != null && removeType != null && addType != removeType) {
-            throw new MetaModelException("The addTo/removeFrom methods for " + getMethod.getDeclaringClass() + " must " + "both deal with same type of object: " + addType + "; " + removeType);
-        }
-
-        final Class<?> type = addType != null ? addType : removeType;
-        if (type != null) {
-            super.addFacet(new TypeOfFacetInferredFromSupportingMethods(type, collection));
-        }
-        return type;
-    }
-
-    private void attachValidateAddToAndRemoveFromFacetIfMethodsFound(final ProcessMethodContext processMethodContext, final Class<?> collectionType) {
-        attachValidateAddToFacetIfValidateAddToMethodIsFound(processMethodContext, collectionType);
-        attachValidateRemoveFacetIfValidateRemoveFromMethodIsFound(processMethodContext, collectionType);
-    }
-
-    private void attachValidateAddToFacetIfValidateAddToMethodIsFound(final ProcessMethodContext processMethodContext, final Class<?> collectionType) {
-
-        final Method getMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asJavaBaseName(getMethod.getName());
-
-        final Class<?> cls = processMethodContext.getCls();
-        final Class<?>[] paramTypes = MethodFinderUtils.paramTypesOrNull(collectionType);
-        Method validateAddToMethod = MethodFinderUtils.findMethod_returningText(
-                cls,
-                MethodLiteralConstants.VALIDATE_ADD_TO_PREFIX + capitalizedName,
-                paramTypes);
-        if (validateAddToMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(validateAddToMethod);
-
-        final IdentifiedHolder facetHolder = processMethodContext.getFacetHolder();
-        final TranslationService translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
-
-        final CollectionValidateAddToFacetViaMethod facet = new CollectionValidateAddToFacetViaMethod(validateAddToMethod, translationService, translationContext, facetHolder);
-        super.addFacet(facet);
-    }
-
-    private void attachValidateRemoveFacetIfValidateRemoveFromMethodIsFound(final ProcessMethodContext processMethodContext, final Class<?> collectionType) {
-
-        final Method getMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asJavaBaseName(getMethod.getName());
-
-        final Class<?> cls = processMethodContext.getCls();
-        final Class<?>[] paramTypes = MethodFinderUtils.paramTypesOrNull(collectionType);
-        Method validateRemoveFromMethod = MethodFinderUtils.findMethod_returningText(
-                cls,
-                MethodLiteralConstants.VALIDATE_REMOVE_FROM_PREFIX + capitalizedName,
-                paramTypes);
-        if (validateRemoveFromMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(validateRemoveFromMethod);
-
-        final IdentifiedHolder facetHolder = processMethodContext.getFacetHolder();
-        final TranslationService translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
-
-        final CollectionValidateRemoveFromFacetViaMethod facet = new CollectionValidateRemoveFromFacetViaMethod(validateRemoveFromMethod, translationService, translationContext, facetHolder);
-        super.addFacet(facet);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionClearFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionClearFacet.java
deleted file mode 100644
index 601b8fd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionClearFacet.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Clear all objects from a collection.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to either invoking
- * the <tt>clearXxx</tt> support method, or just invoking <tt>clear</tt> on the
- * collection returned by the accessor method.
- */
-public interface CollectionClearFacet extends Facet {
-
-    public void clear(ManagedObject inObject);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionClearFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionClearFacetAbstract.java
deleted file mode 100644
index 274e279..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionClearFacetAbstract.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-public abstract class CollectionClearFacetAbstract extends FacetAbstract implements CollectionClearFacet {
-
-    public static Class<? extends Facet> type() {
-        return CollectionClearFacet.class;
-    }
-
-    public CollectionClearFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacet.java
deleted file mode 100644
index 85352c7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacet.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Remove object to a collection.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to invoking the
- * <tt>removeFromXxx</tt> support method for an action.
- */
-public interface CollectionRemoveFromFacet extends Facet {
-
-    public void remove(
-            ManagedObject inObject,
-            ManagedObject element,
-            InteractionInitiatedBy interactionInitiatedBy);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetAbstract.java
deleted file mode 100644
index 4f304a8..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetAbstract.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-public abstract class CollectionRemoveFromFacetAbstract extends FacetAbstract implements CollectionRemoveFromFacet {
-
-    public static Class<? extends Facet> type() {
-        return CollectionRemoveFromFacet.class;
-    }
-
-    public CollectionRemoveFromFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
deleted file mode 100644
index 10c75a9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
-
-public class CollectionRemoveFromFacetViaAccessor extends CollectionRemoveFromFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-
-    public CollectionRemoveFromFacetViaAccessor(
-            final Method method,
-            final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.MODIFY_COLLECTION_REMOVE;
-    }
-
-    @Override
-    public void remove(
-            final ManagedObject owningAdapter,
-            final ManagedObject elementAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        @SuppressWarnings("unchecked")
-        final Collection<? super Object> collection = (Collection<? super Object>) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        collection.remove(UnwrapUtil.single(elementAdapter));
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        ImperativeFacet.Util.appendAttributesTo(this, attributeMap);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.java
deleted file mode 100644
index f0b36f6..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-public class CollectionRemoveFromFacetViaMethod extends CollectionRemoveFromFacetAbstract implements ImperativeFacet {
-
-    private final Method method;
-
-    public CollectionRemoveFromFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        this.method = method;
-    }
-
-    /**
-     * Returns a singleton list of the {@link Method} provided in the
-     * constructor.
-     */
-    @Override
-    public List<Method> getMethods() {
-        return Collections.singletonList(method);
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.MODIFY_COLLECTION_REMOVE;
-    }
-
-    @Override
-    public void remove(
-            final ManagedObject owningAdapter,
-            final ManagedObject elementAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        ManagedObjects.InvokeUtil.invoke(method, owningAdapter, elementAdapter);
-    }
-
-    @Override
-    protected String toStringValues() {
-        return "method=" + method;
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        attributeMap.put("method", method);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java
deleted file mode 100644
index 2e236fd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/TypeOfFacetInferredFromSupportingMethods.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.collections.modify;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract;
-
-public class TypeOfFacetInferredFromSupportingMethods extends TypeOfFacetAbstract {
-
-    public TypeOfFacetInferredFromSupportingMethods(final Class<?> type, final FacetHolder holder) {
-        super(type, holder);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromRecreatableObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromRecreatableObject.java
deleted file mode 100644
index 6b1e5fc..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromRecreatableObject.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.object.recreatable;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstract;
-import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public class DisabledFacetOnCollectionDerivedFromRecreatableObject extends DisabledFacetAbstract {
-
-    public DisabledFacetOnCollectionDerivedFromRecreatableObject(
-            final FacetHolder holder,
-            final Semantics semantics) {
-        super(
-                DisabledFacetOnCollectionDerivedFromRecreatableObject.class, // so don't clobber any other DisabledFacet's
-                Where.ANYWHERE, holder, semantics);
-    }
-
-    @Override
-    public String disabledReason(final ManagedObject target) {
-        final ViewModelFacet facet = target.getSpecification().getFacet(ViewModelFacet.class);
-        final Object targetObject = target.getPojo();
-        final boolean cloneable = facet.isCloneable(targetObject);
-        return !cloneable ? "Non-cloneable view models are read-only" : null;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java
deleted file mode 100644
index dd2e7d4..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.object.recreatable;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstract;
-import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-public class DisabledFacetOnCollectionDerivedFromViewModelFacetFactory extends FacetFactoryAbstract {
-
-    public DisabledFacetOnCollectionDerivedFromViewModelFacetFactory() {
-        super(FeatureType.COLLECTIONS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        final Method method = processMethodContext.getMethod();
-        final Class<?> declaringClass = method.getDeclaringClass();
-        final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
-
-        if (!spec.containsNonFallbackFacet(ViewModelFacet.class)) {
-            return;
-        }
-        final ViewModelFacet facet = spec.getFacet(ViewModelFacet.class);
-        final DisabledFacetAbstract.Semantics semantics = Util.inferSemanticsFrom(facet);
-
-        final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
-        super.addFacet(new DisabledFacetOnCollectionDerivedFromRecreatableObject(facetHolder, semantics));
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
index be12dcf..611e352 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
@@ -43,8 +43,6 @@ import org.apache.isis.core.metamodel.facets.collections.collection.CollectionAn
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacet;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.disabled.fromimmutable.DisabledFacetOnCollectionDerivedFromImmutable;
-import org.apache.isis.core.metamodel.facets.collections.disabled.fromimmutable.DisabledFacetOnCollectionDerivedFromImmutableFactory;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.describedas.annotprop.DescribedAsFacetOnMemberDerivedFromType;
 import org.apache.isis.core.metamodel.facets.members.describedas.annotprop.DescribedAsFacetOnMemberFactory;
@@ -61,8 +59,6 @@ import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.projection.ProjectionFacetFromProjectingProperty;
 import org.apache.isis.core.metamodel.facets.object.projection.ident.IconFacetDerivedFromProjectionFacet;
 import org.apache.isis.core.metamodel.facets.object.projection.ident.TitleFacetDerivedFromProjectionFacet;
-import org.apache.isis.core.metamodel.facets.object.recreatable.DisabledFacetOnCollectionDerivedFromRecreatableObject;
-import org.apache.isis.core.metamodel.facets.object.recreatable.DisabledFacetOnCollectionDerivedFromViewModelFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.recreatable.DisabledFacetOnPropertyDerivedFromRecreatableObject;
 import org.apache.isis.core.metamodel.facets.object.recreatable.DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
@@ -117,9 +113,9 @@ import lombok.val;
 /**
  * Sets up all the {@link Facet}s for an action in a single shot.
  */
-public class DeriveFacetsPostProcessor 
+public class DeriveFacetsPostProcessor
 implements ObjectSpecificationPostProcessor, MetaModelContextAware {
-    
+
     @Setter(onMethod = @__(@Override))
     private MetaModelContext metaModelContext;
 
@@ -176,8 +172,6 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
         collections.forEach(collection->{
 
             derivePropertyOrCollectionDescribedAsFromType(collection);
-            deriveCollectionDisabledFromViewModel(collection);
-            deriveCollectionDisabledFromImmutable(collection);
 
             // ... see if any of its actions has a collection parameter of the same type
             //
@@ -283,19 +277,19 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
             if(method != null) {
                 // this is basically a subset of the code that is in CollectionAnnotationFacetFactory,
                 // ignoring stuff which is deprecated for Isis v2
-                
-                final Collection collectionAnnot = 
+
+                final Collection collectionAnnot =
                         _Annotations.synthesizeInherited(method, Collection.class)
                         .orElse(null);
-                
+
 //                _Assert.assertEquals("expected same", collectionAnnot,
 //                        Annotations.getAnnotation(method, Collection.class));
-                
+
                 if(collectionAnnot != null) {
                     final Class<? extends CollectionDomainEvent<?, ?>> collectionDomainEventType =
                             CollectionAnnotationFacetFactory.defaultFromDomainObjectIfRequired(
                                     objectSpecification, collectionAnnot.domainEvent());
-                    final CollectionDomainEventFacetForCollectionAnnotation collectionDomainEventFacet = 
+                    final CollectionDomainEventFacetForCollectionAnnotation collectionDomainEventFacet =
                             new CollectionDomainEventFacetForCollectionAnnotation(
                                     collectionDomainEventType, collection);
                     this.addFacet(collectionDomainEventFacet);
@@ -329,14 +323,14 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
             if(method != null) {
                 // this is basically a subset of the code that is in CollectionAnnotationFacetFactory,
                 // ignoring stuff which is deprecated for Isis v2
-                
-                final Property propertyAnnot = 
+
+                final Property propertyAnnot =
                         _Annotations.synthesizeInherited(method, Property.class)
                         .orElse(null);
-                
+
 //                _Assert.assertEquals("expected same", propertyAnnot,
 //                        Annotations.getAnnotation(method, Property.class));
-                
+
                 if(propertyAnnot != null) {
                     final Class<? extends PropertyDomainEvent<?, ?>> propertyDomainEventType =
                             PropertyAnnotationFacetFactory.defaultFromDomainObjectIfRequired(
@@ -391,9 +385,9 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
         .lookupNonFallbackFacet(DescribedAsFacet.class)
         .ifPresent(specFacet->
             this.addFacet(
-                    new DescribedAsFacetOnMemberDerivedFromType(specFacet, 
+                    new DescribedAsFacetOnMemberDerivedFromType(specFacet,
                             facetedMethodFor(objectAction))));
-        
+
     }
 
     /**
@@ -465,7 +459,7 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
         .lookupNonFallbackFacet(TypicalLengthFacet.class)
         .ifPresent(specFacet->
             this.addFacet(
-                    new TypicalLengthFacetOnParameterDerivedFromType(specFacet, 
+                    new TypicalLengthFacetOnParameterDerivedFromType(specFacet,
                             peerFor(parameter))));
     }
 
@@ -512,7 +506,7 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
             this.addFacet(
                     new TypicalLengthFacetOnPropertyDerivedFromType(
                             specFacet, facetedMethodFor(property))));
-        
+
     }
 
     /**
@@ -554,66 +548,35 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
         if(property.containsNonFallbackFacet(DisabledFacet.class)) {
             return;
         }
-        
+
         val typeSpec = property.getOnType();
-        
+
         typeSpec
         .lookupNonFallbackFacet(ImmutableFacet.class)
         .ifPresent(immutableFacet->{
-            
+
             if(immutableFacet instanceof ImmutableFacetFromConfiguration) {
-            
+
                 val isEditingEnabledOnType = typeSpec.lookupNonFallbackFacet(EditingEnabledFacet.class)
                         .isPresent();
-                
+
                 if(isEditingEnabledOnType) {
                     // @DomainObject(editing=ENABLED)
                     return;
                 }
-            
+
             }
-            
+
             this.addFacet(
                     DisabledFacetOnPropertyDerivedFromImmutable
                         .forImmutable(facetedMethodFor(property), immutableFacet));
         });
     }
 
-    /**
-     * Replaces {@link DisabledFacetOnCollectionDerivedFromViewModelFacetFactory}
-     * @param collection
-     */
-    private void deriveCollectionDisabledFromViewModel(final OneToManyAssociation collection) {
-        if(collection.containsNonFallbackFacet(DisabledFacet.class)){
-            return;
-        }
-        collection.getOnType()
-        .lookupNonFallbackFacet(ViewModelFacet.class)
-        .ifPresent(specFacet->
-            this.addFacet(
-                    new DisabledFacetOnCollectionDerivedFromRecreatableObject(
-                            facetedMethodFor(collection), inferSemanticsFrom(specFacet))));
-    }
-
-    /**
-     * Replaces {@link DisabledFacetOnCollectionDerivedFromImmutableFactory}
-     */
-    private void deriveCollectionDisabledFromImmutable(final OneToManyAssociation collection) {
-        if(collection.containsNonFallbackFacet(DisabledFacet.class)) {
-            return;
-        }
-        collection.getOnType()
-        .lookupNonFallbackFacet(ImmutableFacet.class)
-        .ifPresent(specFacet->
-            this.addFacet(
-                    new DisabledFacetOnCollectionDerivedFromImmutable(
-                            specFacet, facetedMethodFor(collection))));
-    }
-
 
     private void addCollectionParamDefaultsFacetIfNoneAlready(final ObjectActionParameter collectionParam) {
         if(collectionParam.getNumber()!=0) {
-            return; // with current programming model this can only be the first parameter of an action dialog 
+            return; // with current programming model this can only be the first parameter of an action dialog
         }
         if(collectionParam.containsNonFallbackFacet(ActionParameterDefaultsFacet.class)) {
             return;
@@ -640,7 +603,7 @@ implements ObjectSpecificationPostProcessor, MetaModelContextAware {
         }
         return ActionType.USER_ONLY;
     }
-    
+
     private void addFacet(Facet facet) {
         FacetUtil.addFacet(facet);
     }
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 5c0ac38..13659cd 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
@@ -34,11 +34,9 @@ import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.derived.No
 import org.apache.isis.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.all.i18n.TranslationFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessorFactory;
-import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.collection.CollectionAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.javautilcollection.CollectionFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.layout.CollectionLayoutFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToRemoveFromAndValidateFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.parented.ParentedFacetSinceCollectionFactory;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.annotation.SortedByFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
@@ -162,7 +160,7 @@ public final class ProgrammingModelFacetsJava8 extends ProgrammingModelAbstract
         // must be first, so any Facets created can be replaced by other
         // FacetFactorys later.
         addFactory(FacetProcessingOrder.A1_FALLBACK_DEFAULTS, FallbackFacetFactory.class);
-        
+
         addFactory(FacetProcessingOrder.B1_OBJECT_NAMING, ObjectSpecIdFacetDerivedFromClassNameFactory.class);
         addFactory(FacetProcessingOrder.B1_OBJECT_NAMING, DomainServiceFacetAnnotationFactory.class);
 
@@ -194,8 +192,6 @@ public final class ProgrammingModelFacetsJava8 extends ProgrammingModelAbstract
 
         // collections
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, CollectionAccessorFacetViaAccessorFactory.class);
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, CollectionClearFacetFactory.class);
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, CollectionAddToRemoveFromAndValidateFacetFactory.class);
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, SortedByFacetAnnotationFactory.class);
 
         // actions
@@ -359,19 +355,19 @@ public final class ProgrammingModelFacetsJava8 extends ProgrammingModelAbstract
         addFactory(FacetProcessingOrder.Z1_FINALLY, TranslationFacetFactory.class);
 
         addFactory(FacetProcessingOrder.Z1_FINALLY, ViewModelSemanticCheckingFacetFactory.class);
-        
+
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, DeriveFacetsPostProcessor.class);
         addValidator(new TitlesAndTranslationsValidator());
 
         addValidator((objectSpec, validator) -> {
             final long numActions = objectSpec.streamObjectActions(MixedIn.INCLUDED).count();
             if (numActions > 0L) {
-                
+
                 val actionIds = objectSpec.streamObjectActions(MixedIn.INCLUDED)
                 .map(ObjectAction::getIdentifier)
                 .map(Identifier::toString)
                 .collect(Collectors.joining(", "));
-                
+
                 validator.onFailure(objectSpec, objectSpec.getIdentifier(),
                         "%s: is a (concrete) but UNKNOWN sort, yet has %d actions: {%s}",
                         objectSpec.getCorrespondingClass().getName(),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index d6caf39..3a5cebf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -45,8 +45,6 @@ import org.apache.isis.core.config.metamodel.services.ApplicationFeaturesInitCon
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleIntValueFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
@@ -134,7 +132,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
     }
 
     void createApplicationFeaturesFor(final ObjectSpecification spec) {
-        
+
         if (exclude(spec)) {
             return;
         }
@@ -171,7 +169,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
             addedMembers = newProperty(classFeatureId, property, returnType, maxLength, typicalLength, derived) || addedMembers;
         }
         for (final ObjectAssociation collection : collections) {
-            final boolean derived = !(collection.containsNonFallbackFacet(CollectionAddToFacet.class) || collection.containsNonFallbackFacet(CollectionRemoveFromFacet.class));
+            final boolean derived = false;
             final Class<?> elementType = correspondingClassFor(collection.getSpecification());
             addedMembers = newCollection(classFeatureId, collection, elementType, derived) || addedMembers;
         }
@@ -247,7 +245,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
             final ApplicationFeatureId classFeatureId,
             final ObjectMember objectMember,
             final Class<?> returnType,
-            final Integer maxLength, 
+            final Integer maxLength,
             final Integer typicalLength,
             final boolean derived) {
         return newMember(classFeatureId, objectMember, ApplicationMemberType.PROPERTY, returnType, derived, maxLength, typicalLength, null);
@@ -275,7 +273,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
             final ApplicationMemberType memberType,
             final Class<?> returnType,
             final Boolean derived,
-            final Integer maxLength, 
+            final Integer maxLength,
             final Integer typicalLength,
             final SemanticsOf actionSemantics) {
         if (objectMember.isAlwaysHidden()) {
@@ -332,14 +330,14 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
 
 
     protected boolean exclude(final ObjectSpecification spec) {
-        
+
         val excluded = spec.isAbstract() ||
                 spec.getBeanSort().isUnknown() ||
                 isBuiltIn(spec) ||
                 isHidden(spec);
-        
+
         if(excluded && log.isDebugEnabled()) {
-            log.debug("{} excluded because: abstract:{} unknown-sort:{} builtIn:{} hidden:{}", 
+            log.debug("{} excluded because: abstract:{} unknown-sort:{} builtIn:{} hidden:{}",
                     spec.getCorrespondingClass().getSimpleName(),
                     spec.isAbstract(),
                     spec.getBeanSort().isUnknown(),
@@ -347,7 +345,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
                     isHidden(spec)
                     );
         }
-        
+
         return excluded;
     }
 
@@ -355,14 +353,14 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
 //    /**
 //     * Ignore the (strict) super-classes of any services.
 //     * <p>
-//     * For example, we want to ignore <code>ExceptionRecognizerComposite</code> 
+//     * For example, we want to ignore <code>ExceptionRecognizerComposite</code>
 //     * because there is no service of that type (only of subtypes of that).
 //     * </p>
 //     */
 //    private boolean isSuperClassOfService(final ObjectSpecification spec) {
 //
 //        val specClass = spec.getCorrespondingClass();
-//        
+//
 //        // is this class a supertype or the actual type of one of the services?
 //        boolean serviceCls = false;
 //        for (final ManagedBeanAdapter bean : registeredServices.get()) {
@@ -490,7 +488,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
 
 
     // -- packageNames, packageNamesContainingClasses, classNamesContainedIn, memberNamesOf
-    @Override 
+    @Override
     public SortedSet<String> packageNames() {
         initializeIfRequired();
         return stream(allFeatures(ApplicationFeatureType.PACKAGE))
@@ -498,7 +496,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
-    @Override 
+    @Override
     public SortedSet<String> packageNamesContainingClasses(final ApplicationMemberType memberType) {
         initializeIfRequired();
         final Collection<ApplicationFeature> packages = allFeatures(ApplicationFeatureType.PACKAGE);
@@ -509,7 +507,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
-    @Override 
+    @Override
     public SortedSet<String> classNamesContainedIn(final String packageFqn, final ApplicationMemberType memberType) {
         initializeIfRequired();
         final ApplicationFeatureId packageId = ApplicationFeatureId.newPackage(packageFqn);
@@ -524,7 +522,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
-    @Override 
+    @Override
     public SortedSet<String> classNamesRecursivelyContainedIn(final String packageFqn) {
         initializeIfRequired();
         final ApplicationFeatureId packageId = ApplicationFeatureId.newPackage(packageFqn);
@@ -539,7 +537,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
-    @Override 
+    @Override
     public SortedSet<String> memberNamesOf(
             final String packageFqn,
             final String className,
@@ -557,4 +555,4 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
index 7bbc340..3d97e62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
@@ -25,76 +25,5 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 public interface OneToManyAssociation extends ObjectAssociation, OneToManyFeature {
 
-    // /////////////////////////////////////////////////////////////
-    // add
-    // /////////////////////////////////////////////////////////////
-
-
-    /**
-     * Determines if the specified element can be added to the collection field,
-     * represented as a {@link Consent}.
-     *
-     * <p>
-     * If allowed the {@link #addElement(ManagedObject, ManagedObject, InteractionInitiatedBy) add}
-     * method can be called with the same parameters.
-     *
-     * @see #addElement(ManagedObject, ManagedObject, InteractionInitiatedBy)
-     */
-    Consent isValidToAdd(
-            ManagedObject owningObjectAdapter,
-            ManagedObject proposedObjectToAdd,
-            InteractionInitiatedBy interactionInitiatedBy);
-
-    /**
-     * Add the specified element to this collection field in the specified
-     * object.
-     *
-     * <p>
-     *     Should be preceded by call to {@link #isValidToAdd(ManagedObject, ManagedObject)}.
-     * </p>
-     *
-     * @see #isValidToAdd(ManagedObject, ManagedObject)
-     */
-    void addElement(
-            ManagedObject owningObjectAdapter,
-            ManagedObject objectToAdd,
-            InteractionInitiatedBy interactionInitiatedBy);
-
-    // /////////////////////////////////////////////////////////////
-    // remove
-    // /////////////////////////////////////////////////////////////
-
-
-    /**
-     * Determines if the specified element can be removed from the collection
-     * field, represented as a {@link Consent}.
-     *
-     * <p>
-     * If allowed the {@link #removeElement(ManagedObject, ManagedObject, InteractionInitiatedBy)
-     * remove} method can be called with the same parameters.
-     *
-     * @see #removeElement(ManagedObject, ManagedObject, InteractionInitiatedBy)
-     */
-    Consent isValidToRemove(
-            ManagedObject owningObjectAdapter,
-            ManagedObject proposedObjectToRemove,
-            InteractionInitiatedBy interactionInitiatedBy);
-
-    /**
-     * Remove the specified element from this collection field in the specified
-     * object.
-     *
-     * <p>
-     *     Should be preceded by call to {@link #isValidToRemove(ManagedObject, ManagedObject)}.
-     * </p>
-     *
-     * @see #isValidToRemove(ManagedObject, ManagedObject)
-     */
-    void removeElement(
-            ManagedObject owningObjectAdapter,
-            ManagedObject oObjectToRemove,
-            InteractionInitiatedBy interactionInitiatedBy);
-
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
index 4c93c91..9d86c70 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -28,9 +28,6 @@ import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
 import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
@@ -93,64 +90,6 @@ extends ObjectAssociationAbstract implements OneToManyAssociation {
 
 
 
-    // -- Validate Add
-    // Not API
-    private ValidityContext createValidateAddInteractionContext(
-            final InteractionInitiatedBy interactionInitiatedBy,
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToAddAdapter) {
-        return new CollectionAddToContext(
-                headFor(ownerAdapter), getIdentifier(), proposedToAddAdapter,
-                interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isValidToAdd(
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToAddAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isValidToAddResult(ownerAdapter, proposedToAddAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isValidToAddResult(
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToAddAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext validityContext = createValidateAddInteractionContext(
-                interactionInitiatedBy, ownerAdapter, proposedToAddAdapter);
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-
-
-    // -- Validate Remove
-    private ValidityContext createValidateRemoveInteractionContext(
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new CollectionRemoveFromContext(
-                headFor(ownerAdapter), getIdentifier(), proposedToRemoveAdapter, interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isValidToRemove(
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isValidToRemoveResult(
-                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isValidToRemoveResult(
-            final ManagedObject ownerAdapter,
-            final ManagedObject proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext validityContext = createValidateRemoveInteractionContext(
-                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy);
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-
 
     // -- get, isEmpty, add, clear
 
@@ -180,41 +119,6 @@ extends ObjectAssociationAbstract implements OneToManyAssociation {
         return CollectionFacet.elementCount(collection) == 0;
     }
 
-    // -- add, clear
-
-    @Override
-    public void addElement(
-            final ManagedObject ownerAdapter,
-            final ManagedObject referencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        if (referencedAdapter == null) {
-            throw new IllegalArgumentException("Can't use null to add an item to a collection");
-        }
-        EntityUtil.requiresWhenFirstIsBookmarkableSecondIsAttached(
-                ownerAdapter,
-                referencedAdapter);
-
-        val facet = getFacet(CollectionAddToFacet.class);
-        facet.add(ownerAdapter, referencedAdapter, interactionInitiatedBy);
-    }
-
-    @Override
-    public void removeElement(
-            final ManagedObject ownerAdapter,
-            final ManagedObject referencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (referencedAdapter == null) {
-            throw new IllegalArgumentException("element should not be null");
-        }
-        final CollectionRemoveFromFacet facet = getFacet(CollectionRemoveFromFacet.class);
-        facet.remove(ownerAdapter, referencedAdapter, interactionInitiatedBy);
-    }
-
-    public void removeAllAssociations(final ManagedObject ownerAdapter) {
-        final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
-        facet.clear(ownerAdapter);
-    }
 
     // -- defaults
     @Override
@@ -276,6 +180,4 @@ extends ObjectAssociationAbstract implements OneToManyAssociation {
     }
 
 
-
-
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
index 983a7ab..b4005f1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
@@ -31,25 +31,8 @@ import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessor;
 import org.apache.isis.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessorFactory;
-import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetViaAccessor;
-import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetViaClearMethod;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacetViaAccessor;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToRemoveFromAndValidateFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacetViaAccessor;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.collections.modify.TypeOfFacetInferredFromSupportingMethods;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateAddToFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateRemoveFromFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -97,7 +80,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     public void testPropertyAccessorFacetIsInstalledForJavaUtilListAndMethodRemoved() {
         val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
         facetFactory.setMetaModelContext(super.metaModelContext);
-        
+
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
             public List getOrders() {
@@ -190,319 +173,6 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod));
     }
 
-    public void testAddToFacetIsInstalledViaAccessorIfNoExplicitAddToMethodExists() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionAddToFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionAddToFacetViaAccessor);
-        final CollectionAddToFacetViaAccessor collectionAddToFacetViaAccessor = (CollectionAddToFacetViaAccessor) facet;
-        assertEquals(collectionAccessorMethod, collectionAddToFacetViaAccessor.getMethods().get(0));
-    }
-
-    public void testCannotInferTypeOfFacetIfNoExplicitAddToOrRemoveFromMethods() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        assertNull(facetedMethod.getFacet(TypeOfFacet.class));
-    }
-
-    public void testRemoveFromFacetIsInstalledViaAccessorIfNoExplicitRemoveFromMethodExists() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionRemoveFromFacetViaAccessor);
-        final CollectionRemoveFromFacetViaAccessor collectionRemoveFromFacetViaAccessor = (CollectionRemoveFromFacetViaAccessor) facet;
-        assertEquals(collectionAccessorMethod, collectionRemoveFromFacetViaAccessor.getMethods().get(0));
-    }
-
-    public void testAddToFacetIsInstalledAndMethodRemoved() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-
-            @SuppressWarnings("unused")
-            public void addToOrders(final Order o) {
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-        final Method addToMethod = findMethod(Customer.class, "addToOrders", new Class[] { Order.class });
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionAddToFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionAddToFacetViaMethod);
-        final CollectionAddToFacetViaMethod collectionAddToFacetViaMethod = (CollectionAddToFacetViaMethod) facet;
-        assertEquals(addToMethod, collectionAddToFacetViaMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(addToMethod));
-    }
-
-    public void testCanInferTypeOfFacetFromExplicitAddToMethod() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-
-            @SuppressWarnings("unused")
-            public void addToOrders(final Order o) {
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetInferredFromSupportingMethods);
-        final TypeOfFacetInferredFromSupportingMethods typeOfFacetInferredFromSupportingMethods = (TypeOfFacetInferredFromSupportingMethods) facet;
-        assertEquals(Order.class, typeOfFacetInferredFromSupportingMethods.value());
-    }
-
-    public void testRemoveFromFacetIsInstalledAndMethodRemoved() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings({ "rawtypes", "unused" })
-            public Collection getOrders() {
-                return null;
-            }
-
-            @SuppressWarnings("unused")
-            public void removeFromOrders(final Order o) {
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-        final Method removeFromMethod = findMethod(Customer.class, "removeFromOrders", new Class[] { Order.class });
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionRemoveFromFacetViaMethod);
-        final CollectionRemoveFromFacetViaMethod collectionRemoveFromFacetViaMethod = (CollectionRemoveFromFacetViaMethod) facet;
-        assertEquals(removeFromMethod, collectionRemoveFromFacetViaMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(removeFromMethod));
-    }
-
-    public void testCanInferTypeOfFacetFromExplicitRemoveFromMethod() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            };
-
-            @SuppressWarnings("unused")
-            public void removeFromOrders(final Order o) {
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetInferredFromSupportingMethods);
-        final TypeOfFacetInferredFromSupportingMethods typeOfFacetInferredFromSupportingMethods = (TypeOfFacetInferredFromSupportingMethods) facet;
-        assertEquals(Order.class, typeOfFacetInferredFromSupportingMethods.value());
-    }
-
-    public void testClearFacetIsInstalledAndMethodRemoved() {
-        val facetFactory = new CollectionClearFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings({ "hiding", "unused" })
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings({ "rawtypes", "unused" })
-            public Collection getOrders() {
-                return null;
-            }
-
-            @SuppressWarnings("unused")
-            public void clearOrders() {
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-        final Method clearMethod = findMethod(Customer.class, "clearOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionClearFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionClearFacetViaClearMethod);
-        final CollectionClearFacetViaClearMethod collectionClearFacetViaClearMethod = (CollectionClearFacetViaClearMethod) facet;
-        assertEquals(clearMethod, collectionClearFacetViaClearMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(clearMethod));
-    }
-
-    public void testClearFacetIsInstalledViaAccessorIfNoExplicitClearMethod() {
-        val facetFactory = new CollectionClearFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings({ "hiding", "unused" })
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings({ "rawtypes", "unused" })
-            public Collection getOrders() {
-                return null;
-            }
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionClearFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionClearFacetViaAccessor);
-        final CollectionClearFacetViaAccessor collectionClearFacetViaAccessor = (CollectionClearFacetViaAccessor) facet;
-        assertEquals(collectionAccessorMethod, collectionClearFacetViaAccessor.getMethods().get(0));
-    }
-
-    public void testValidateAddToFacetIsInstalledAndMethodRemoved() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings({ "rawtypes", "unused" })
-            public Collection getOrders() {
-                return null;
-            }
-
-            @SuppressWarnings("unused")
-            public void addToOrders(final Order o) {
-            };
-
-            @SuppressWarnings("unused")
-            public String validateAddToOrders(final Order o) {
-                return null;
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-        final Method validateAddToMethod = findMethod(Customer.class, "validateAddToOrders", new Class[] { Order.class });
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionValidateAddToFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionValidateAddToFacetViaMethod);
-        final CollectionValidateAddToFacetViaMethod collectionValidateAddToFacetViaMethod = (CollectionValidateAddToFacetViaMethod) facet;
-        assertEquals(validateAddToMethod, collectionValidateAddToFacetViaMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateAddToMethod));
-    }
-
-    public void testValidateRemoveFromFacetIsInstalledAndMethodRemoved() {
-        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-
-            @SuppressWarnings("unused")
-            public void removeFromOrders(final Order o) {
-            };
-
-            @SuppressWarnings("unused")
-            public String validateRemoveFromOrders(final Order o) {
-                return null;
-            };
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-        final Method validateRemoveFromMethod = findMethod(Customer.class, "validateRemoveFromOrders", new Class[] { Order.class });
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionValidateRemoveFromFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionValidateRemoveFromFacetViaMethod);
-        final CollectionValidateRemoveFromFacetViaMethod collectionValidateRemoveFromFacetViaMethod = (CollectionValidateRemoveFromFacetViaMethod) facet;
-        assertEquals(validateRemoveFromMethod, collectionValidateRemoveFromFacetViaMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateRemoveFromMethod));
-    }
-
     public void testMethodFoundInSuperclass() {
         val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
         facetFactory.setMetaModelContext(super.metaModelContext);
@@ -531,57 +201,6 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
         assertEquals(collectionAccessorMethod, collectionAccessorFacetViaMethod.getMethods().get(0));
     }
 
-    public void testMethodFoundInSuperclassButHelpeMethodsFoundInSubclasses() {
-        val facetFactoryForAccessor = new CollectionAccessorFacetViaAccessorFactory();
-        val facetFactoryForHelpers = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactoryForAccessor.setMetaModelContext(super.metaModelContext);
-        facetFactoryForHelpers.setMetaModelContext(super.metaModelContext);
-
-        @SuppressWarnings("hiding")
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-        }
-
-        class CustomerEx extends Customer {
-            @SuppressWarnings("unused")
-            public void removeFromOrders(final Order o) {
-            };
-
-            @SuppressWarnings("unused")
-            public String validateRemoveFromOrders(final Order o) {
-                return null;
-            };
-        }
-
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-        final Method removeFromMethod = findMethod(CustomerEx.class, "removeFromOrders", new Class[] { Order.class });
-        final Method validateRemoveFromMethod = findMethod(CustomerEx.class, "validateRemoveFromOrders", new Class[] { Order.class });
-
-        facetFactoryForAccessor.process(new FacetFactory.ProcessMethodContext(CustomerEx.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-        facetFactoryForHelpers.process(new FacetFactory.ProcessMethodContext(CustomerEx.class, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CollectionRemoveFromFacetViaMethod);
-        final CollectionRemoveFromFacetViaMethod collectionRemoveFromFacetViaMethod = (CollectionRemoveFromFacetViaMethod) facet;
-        assertEquals(removeFromMethod, collectionRemoveFromFacetViaMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(removeFromMethod));
-
-        final Facet facet1 = facetedMethod.getFacet(CollectionValidateRemoveFromFacet.class);
-        assertNotNull(facet1);
-        assertTrue(facet1 instanceof CollectionValidateRemoveFromFacetViaMethod);
-        final CollectionValidateRemoveFromFacetViaMethod collectionValidateRemoveFromFacetViaMethod = (CollectionValidateRemoveFromFacetViaMethod) facet1;
-        assertEquals(validateRemoveFromMethod, collectionValidateRemoveFromFacetViaMethod.getMethods().get(0));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateRemoveFromMethod));
-    }
-
     static class Order {
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
index ba5dbf0..c5f8b9c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
@@ -44,19 +44,10 @@ import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredF
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.collections.collection.hidden.HiddenFacetForCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionAddToFacetForDomainEventFromCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionAddToFacetForDomainEventFromDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacet;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.typeof.TypeOfFacetOnCollectionFromCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacetAbstract;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacetAbstract;
-import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -125,266 +116,6 @@ public class CollectionAnnotationFacetFactoryTest extends AbstractFacetFactoryJU
         facetFactory = null;
     }
 
-    public static class Modify extends CollectionAnnotationFacetFactoryTest {
-
-        private void addGetterFacet(final FacetHolder holder) {
-            FacetUtil.addFacet(new PropertyOrCollectionAccessorFacetAbstract(mockOnType, holder) {
-                @Override
-                public Object getProperty(
-                        final ManagedObject inObject,
-                        final InteractionInitiatedBy interactionInitiatedBy) {
-                    return null;
-                }
-            });
-        }
-
-        private void addAddToFacet(final FacetHolder holder) {
-            FacetUtil.addFacet(new CollectionAddToFacetAbstract(holder) {
-                @Override
-                public void add(
-                        final ManagedObject inObject,
-                        final ManagedObject value,
-                        final InteractionInitiatedBy interactionInitiatedBy) {
-                }
-            });
-        }
-
-        private void addRemoveFromFacet(final FacetHolder holder) {
-            FacetUtil.addFacet(new CollectionRemoveFromFacetAbstract(holder) {
-                @Override
-                public void remove(
-                        final ManagedObject inObject,
-                        final ManagedObject element,
-                        final InteractionInitiatedBy interactionInitiatedBy) {
-                }
-            });
-        }
-
-        // @Test
-        public void withDeprecatedPostsCollectionAddedToEvent_andGetterFacet_andSetterFacet() {
-
-            class Order {
-            }
-            class Customer {
-                class OrdersAddedToOrRemovedFromDomainEvent extends CollectionDomainEvent<Customer, Order> {
-                }
-
-                @Collection(domainEvent = OrdersAddedToOrRemovedFromDomainEvent.class)
-                public List<Order> getOrders() {
-                    return null;
-                }
-
-                public void setOrders(final List<Order> orders) {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            collectionMethod = findMethod(Customer.class, "getOrders");
-
-            addGetterFacet(facetedMethod);
-            addAddToFacet(facetedMethod);
-            addRemoveFromFacet(facetedMethod);
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, collectionMethod.getReturnType());
-
-            // when
-            final FacetFactory.ProcessMethodContext processMethodContext = new FacetFactory.ProcessMethodContext(cls,
-                    null, collectionMethod, mockMethodRemover, facetedMethod);
-            processModify(facetFactory, processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(CollectionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof CollectionDomainEventFacetDefault);
-            final CollectionDomainEventFacetDefault domainEventFacetDefault = (CollectionDomainEventFacetDefault) domainEventFacet;
-            assertThat(domainEventFacetDefault.getEventType(), IsisMatchers.classEqualTo(CollectionDomainEvent.Default.class)); // this
-            // is
-            // discarded
-            // at
-            // runtime,
-            // see
-            // PropertySetterFacetForPostsPropertyChangedEventAnnotation#verify(...)
-
-            // then
-            final Facet addToFacet = facetedMethod.getFacet(CollectionAddToFacet.class);
-            Assert.assertNotNull(addToFacet);
-            Assert.assertTrue(addToFacet instanceof CollectionAddToFacetForDomainEventFromCollectionAnnotation);
-            final CollectionAddToFacetForDomainEventFromCollectionAnnotation addToFacetImpl = (CollectionAddToFacetForDomainEventFromCollectionAnnotation) addToFacet;
-            assertThat(addToFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersAddedToOrRemovedFromDomainEvent.class));
-
-            // then
-            final Facet removeFromFacet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-            Assert.assertNotNull(removeFromFacet);
-            Assert.assertTrue(removeFromFacet instanceof CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation);
-            final CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation removeFromFacetImpl = (CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation) removeFromFacet;
-            assertThat(removeFromFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersAddedToOrRemovedFromDomainEvent.class));
-        }
-
-        // @Test
-        public void withCollectionInteractionEvent() {
-
-            class Order {
-            }
-            class Customer {
-                class OrdersChangedDomainEvent extends CollectionDomainEvent<Customer, Order> {
-                }
-
-                @Collection(domainEvent = OrdersChangedDomainEvent.class)
-                public List<Order> getOrders() {
-                    return null;
-                }
-
-                public void setOrders(final List<Order> orders) {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            collectionMethod = findMethod(Customer.class, "getOrders");
-
-            addGetterFacet(facetedMethod);
-            addAddToFacet(facetedMethod);
-            addRemoveFromFacet(facetedMethod);
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, collectionMethod.getReturnType());
-
-            // when
-            final FacetFactory.ProcessMethodContext processMethodContext = new FacetFactory.ProcessMethodContext(cls,
-                    null, collectionMethod, mockMethodRemover, facetedMethod);
-            processModify(facetFactory, processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(CollectionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation);
-            final CollectionDomainEventFacetForCollectionAnnotation domainEventFacetImpl = (CollectionDomainEventFacetForCollectionAnnotation) domainEventFacet;
-            assertThat(domainEventFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersChangedDomainEvent.class));
-
-            // then
-            final Facet addToFacet = facetedMethod.getFacet(CollectionAddToFacet.class);
-            Assert.assertNotNull(addToFacet);
-            Assert.assertTrue(addToFacet instanceof CollectionAddToFacetForDomainEventFromCollectionAnnotation);
-            final CollectionAddToFacetForDomainEventFromCollectionAnnotation addToFacetImpl = (CollectionAddToFacetForDomainEventFromCollectionAnnotation) addToFacet;
-            assertThat(addToFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersChangedDomainEvent.class));
-
-            // then
-            final Facet removeFromFacet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-            Assert.assertNotNull(removeFromFacet);
-            Assert.assertTrue(removeFromFacet instanceof CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation);
-            final CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation removeFromFacetImpl = (CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation) removeFromFacet;
-            assertThat(removeFromFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersChangedDomainEvent.class));
-        }
-
-        // @Test
-        public void withCollectionDomainEvent() {
-
-            class Order {
-            }
-            class Customer {
-                class OrdersChanged extends CollectionDomainEvent<Customer, Order> {
-                }
-                @Collection(domainEvent = OrdersChanged.class)
-                public List<Order> getOrders() {
-                    return null;
-                }
-
-                public void setOrders(final List<Order> orders) {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            collectionMethod = findMethod(Customer.class, "getOrders");
-
-            addGetterFacet(facetedMethod);
-            addAddToFacet(facetedMethod);
-            addRemoveFromFacet(facetedMethod);
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, collectionMethod.getReturnType());
-
-            // when
-            final FacetFactory.ProcessMethodContext processMethodContext = new FacetFactory.ProcessMethodContext(cls,
-                    null, collectionMethod, mockMethodRemover, facetedMethod);
-            processModify(facetFactory, processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(CollectionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof CollectionDomainEventFacetForCollectionAnnotation);
-            final CollectionDomainEventFacetForCollectionAnnotation domainEventFacetImpl = (CollectionDomainEventFacetForCollectionAnnotation) domainEventFacet;
-            assertThat(domainEventFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersChanged.class));
-
-            // then
-            final Facet addToFacet = facetedMethod.getFacet(CollectionAddToFacet.class);
-            Assert.assertNotNull(addToFacet);
-            Assert.assertTrue(addToFacet instanceof CollectionAddToFacetForDomainEventFromCollectionAnnotation);
-            final CollectionAddToFacetForDomainEventFromCollectionAnnotation addToFacetImpl = (CollectionAddToFacetForDomainEventFromCollectionAnnotation) addToFacet;
-            assertThat(addToFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersChanged.class));
-
-            // then
-            final Facet removeFromFacet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-            Assert.assertNotNull(removeFromFacet);
-            Assert.assertTrue(removeFromFacet instanceof CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation);
-            final CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation removeFromFacetImpl = (CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation) removeFromFacet;
-            assertThat(removeFromFacetImpl.value(), IsisMatchers.classEqualTo(Customer.OrdersChanged.class));
-        }
-
-        // @Test
-        public void withDefaultEvent() {
-
-            class Order {
-            }
-            class Customer {
-                public List<Order> getOrders() {
-                    return null;
-                }
-
-                public void setOrders(final List<Order> orders) {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            collectionMethod = findMethod(Customer.class, "getOrders");
-
-            addGetterFacet(facetedMethod);
-            addAddToFacet(facetedMethod);
-            addRemoveFromFacet(facetedMethod);
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, collectionMethod.getReturnType());
-
-            // when
-            final FacetFactory.ProcessMethodContext processMethodContext = new FacetFactory.ProcessMethodContext(cls,
-                    null, collectionMethod, mockMethodRemover, facetedMethod);
-            processModify(facetFactory, processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(CollectionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof CollectionDomainEventFacetDefault);
-            final CollectionDomainEventFacetDefault domainEventFacetImpl = (CollectionDomainEventFacetDefault) domainEventFacet;
-            assertThat(domainEventFacetImpl.value(), IsisMatchers.classEqualTo(CollectionDomainEvent.Default.class));
-
-            // then
-            final Facet addToFacet = facetedMethod.getFacet(CollectionAddToFacet.class);
-            Assert.assertNotNull(addToFacet);
-            Assert.assertTrue(addToFacet instanceof CollectionAddToFacetForDomainEventFromDefault);
-            final CollectionAddToFacetForDomainEventFromDefault addToFacetImpl = (CollectionAddToFacetForDomainEventFromDefault) addToFacet;
-            assertThat(addToFacetImpl.value(), IsisMatchers.classEqualTo(CollectionDomainEvent.Default.class));
-
-            // then
-            final Facet removeFromFacet = facetedMethod.getFacet(CollectionRemoveFromFacet.class);
-            Assert.assertNotNull(removeFromFacet);
-            Assert.assertTrue(removeFromFacet instanceof CollectionRemoveFromFacetForDomainEventFromDefault);
-            final CollectionRemoveFromFacetForDomainEventFromDefault removeFromFacetImpl = (CollectionRemoveFromFacetForDomainEventFromDefault) removeFromFacet;
-            assertThat(removeFromFacetImpl.value(), IsisMatchers.classEqualTo(CollectionDomainEvent.Default.class));
-        }
-    }
 
     public static class Hidden extends CollectionAnnotationFacetFactoryTest {
 
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 bf0b088..d631635 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
@@ -38,7 +38,6 @@ import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -61,15 +60,14 @@ public class OneToManyAssociationDefaultTest {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    @Mock private ManagedObject mockOwnerAdapter;
-    @Mock private ManagedObject mockAssociatedAdapter;
-    @Mock private AuthenticationContext mockAuthenticationContext;
-    @Mock private SpecificationLoader mockSpecificationLoader;
-    @Mock private ObjectSpecification mockOwnerAdapterSpec;
-    @Mock private MessageService mockMessageService;
-    @Mock private FacetedMethod mockPeer;
-    @Mock private NamedFacet mockNamedFacet;
-    @Mock private CollectionAddToFacet mockCollectionAddToFacet;
+    @Mock ManagedObject mockOwnerAdapter;
+    @Mock ManagedObject mockAssociatedAdapter;
+    @Mock AuthenticationContext mockAuthenticationContext;
+    @Mock SpecificationLoader mockSpecificationLoader;
+    @Mock ObjectSpecification mockOwnerAdapterSpec;
+    @Mock MessageService mockMessageService;
+    @Mock FacetedMethod mockPeer;
+    @Mock NamedFacet mockNamedFacet;
 
     private OneToManyAssociation association;
     private MetaModelContext_forTesting metaModelContext;
@@ -83,23 +81,23 @@ public class OneToManyAssociationDefaultTest {
                 .singleton(mockMessageService)
                 .build();
 
-        allowingPeerToReturnCollectionType();
+//        allowingPeerToReturnCollectionType();
         allowingPeerToReturnIdentifier();
-        allowingSpecLoaderToReturnSpecs();
+//        allowingSpecLoaderToReturnSpecs();
         association = new OneToManyAssociationDefault(mockPeer);
     }
 
-    private void allowingSpecLoaderToReturnSpecs() {
-        context.checking(new Expectations() {
-            {
-                allowing(mockSpecificationLoader).loadSpecification(Order.class);
-                
-                allowing(mockPeer).getMetaModelContext();
-                will(returnValue(metaModelContext));
-                
-            }
-        });
-    }
+//    private void allowingSpecLoaderToReturnSpecs() {
+//        context.checking(new Expectations() {
+//            {
+//                allowing(mockSpecificationLoader).loadSpecification(Order.class);
+//
+//                allowing(mockPeer).getMetaModelContext();
+//                will(returnValue(metaModelContext));
+//
+//            }
+//        });
+//    }
 
     @Test
     public void id() {
@@ -112,61 +110,14 @@ public class OneToManyAssociationDefaultTest {
         assertThat(association.getName(), is(equalTo("My name")));
     }
 
-    @Test
-    public void delegatesToUnderlying() {
-        final ObjectSpecification spec = association.getSpecification();
-        assertNotNull(spec); // looks like an incomplete testcase
-    }
-
-    @Test
-    public void canAddPersistable() {
-        context.checking(new Expectations() {
-            {
-//                oneOf(mockPeer).containsFacet(NotPersistedFacet.class);
-//                will(returnValue(false));
-
-                oneOf(mockOwnerAdapter).getSpecification();
-                will(returnValue(mockOwnerAdapterSpec));
-                
-                oneOf(mockOwnerAdapterSpec).isParented();
-                will(returnValue(false));
-                
-                oneOf(mockOwnerAdapterSpec).isEntity();
-                will(returnValue(false));
-                
-                oneOf(mockOwnerAdapterSpec).isIdentifiable();
-                will(returnValue(true));
-                
-                oneOf(mockAssociatedAdapter).getSpecification();
-                will(returnValue(mockOwnerAdapterSpec));
-
-                oneOf(mockPeer).getFacet(CollectionAddToFacet.class);
-                will(returnValue(mockCollectionAddToFacet));
-
-                oneOf(mockCollectionAddToFacet).add(mockOwnerAdapter, mockAssociatedAdapter, InteractionInitiatedBy.USER);
-            }
-        });
-        association.addElement(mockOwnerAdapter, mockAssociatedAdapter, InteractionInitiatedBy.USER);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void cannotRemoveNull() {
-        association.removeElement(mockOwnerAdapter, null, InteractionInitiatedBy.USER);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void cannotAddNull() {
-        association.addElement(mockOwnerAdapter, null, InteractionInitiatedBy.USER);
-    }
-
-    private void allowingPeerToReturnCollectionType() {
-        context.checking(new Expectations() {
-            {
-                allowing(mockPeer).getType();
-                will(returnValue(COLLECTION_TYPE));
-            }
-        });
-    }
+//    private void allowingPeerToReturnCollectionType() {
+//        context.checking(new Expectations() {
+//            {
+//                allowing(mockPeer).getType();
+//                will(returnValue(COLLECTION_TYPE));
+//            }
+//        });
+//    }
 
     private void allowingPeerToReturnIdentifier() {
         context.checking(new Expectations() {
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index bd1ca0b..523627d 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -69,7 +69,7 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-public class DomainObjectInvocationHandler<T> 
+public class DomainObjectInvocationHandler<T>
 extends DelegatingInvocationHandlerDefault<T> {
 
     private final ProxyContextHandler proxyContextHandler;
@@ -95,7 +95,7 @@ extends DelegatingInvocationHandlerDefault<T> {
      */
     protected Method __isis_executionModes;
 
-    private EntityFacet entityFacet; 
+    private EntityFacet entityFacet;
 
     public DomainObjectInvocationHandler(
             final T domainObject,
@@ -116,7 +116,7 @@ extends DelegatingInvocationHandlerDefault<T> {
             __isis_saveMethod = WrappingObject.class.getMethod("__isis_save", _Constants.emptyClasses);
             __isis_wrappedMethod = WrappingObject.class.getMethod("__isis_wrapped", _Constants.emptyClasses);
             __isis_executionModes = WrappingObject.class.getMethod("__isis_executionModes", _Constants.emptyClasses);
-            
+
 
         } catch (final NoSuchMethodException nsme) {
             throw new IllegalStateException(
@@ -208,12 +208,6 @@ extends DelegatingInvocationHandlerDefault<T> {
             if (intent == Intent.ACCESSOR) {
                 return handleGetterMethodOnCollection(targetAdapter, args, otma, memberName);
             }
-            if (intent == Intent.MODIFY_COLLECTION_ADD) {
-                return handleCollectionAddToMethod(targetAdapter, args, otma);
-            }
-            if (intent == Intent.MODIFY_COLLECTION_REMOVE) {
-                return handleCollectionRemoveFromMethod(targetAdapter, args, otma);
-            }
         }
 
         if (objectMember instanceof ObjectAction) {
@@ -264,7 +258,7 @@ extends DelegatingInvocationHandlerDefault<T> {
     private static ObjectMember determineMixinMember(
             final ManagedObject domainObjectAdapter,
             final ObjectAction objectAction) {
-        
+
         if(domainObjectAdapter == null) {
             return null;
         }
@@ -290,7 +284,7 @@ extends DelegatingInvocationHandlerDefault<T> {
     }
 
     private boolean isEnhancedEntityMethod(final Method method) {
-        return entityFacet!=null 
+        return entityFacet!=null
                 ? entityFacet.isProxyEnhancement(method)
                 : false;
     }
@@ -323,17 +317,17 @@ extends DelegatingInvocationHandlerDefault<T> {
                     targetNoSpec.isValidResult(targetAdapter, getInteractionInitiatedBy());
             notifyListenersAndVetoIfRequired(interactionResult);
         });
-        
-        
+
+
         val spec = targetAdapter.getSpecification();
         if(spec.isEntity()) {
             return runExecutionTask(()->{
                 EntityUtil.persistInCurrentTransaction(targetAdapter);
                 return null;
-            }); 
+            });
         }
         return null;
-        
+
     }
 
     // /////////////////////////////////////////////////////////////////
@@ -352,9 +346,9 @@ extends DelegatingInvocationHandlerDefault<T> {
         });
 
         resolveIfRequired(targetAdapter);
-        
+
         return runExecutionTask(()->{
-        
+
             val interactionInitiatedBy = getInteractionInitiatedBy();
             val currentReferencedAdapter = property.get(targetAdapter, interactionInitiatedBy);
 
@@ -364,9 +358,9 @@ extends DelegatingInvocationHandlerDefault<T> {
                     getDelegate(), property.getIdentifier(), currentReferencedObj);
             notifyListeners(propertyAccessEvent);
             return currentReferencedObj;
-            
+
         });
-        
+
     }
 
 
@@ -377,19 +371,19 @@ extends DelegatingInvocationHandlerDefault<T> {
 
 
     private Object handleSetterMethodOnProperty(
-            final ManagedObject targetAdapter, 
+            final ManagedObject targetAdapter,
             final Object[] args,
             final OneToOneAssociation property) {
-        
+
         val singleArg = singleArgUnderlyingElseNull(args, "setter");
-        
+
         runValidationTask(()->{
             checkVisibility(targetAdapter, property);
             checkUsability(targetAdapter, property);
         });
-        
+
         val argumentAdapter = getObjectManager().adapt(singleArg);
-        
+
         resolveIfRequired(targetAdapter);
 
         runValidationTask(()->{
@@ -398,12 +392,12 @@ extends DelegatingInvocationHandlerDefault<T> {
                     .getInteractionResult();
             notifyListenersAndVetoIfRequired(interactionResult);
         });
-        
+
         return runExecutionTask(()->{
             property.set(targetAdapter, argumentAdapter, getInteractionInitiatedBy());
             return null;
         });
-        
+
     }
 
 
@@ -424,9 +418,9 @@ extends DelegatingInvocationHandlerDefault<T> {
         });
 
         resolveIfRequired(targetAdapter);
-        
+
         return runExecutionTask(()->{
-        
+
             val interactionInitiatedBy = getInteractionInitiatedBy();
             val currentReferencedAdapter = collection.get(targetAdapter, interactionInitiatedBy);
 
@@ -445,12 +439,12 @@ extends DelegatingInvocationHandlerDefault<T> {
                 notifyListeners(collectionAccessEvent);
                 return mapViewObject;
             }
-            
-            val msg = String.format("Collection type '%s' not supported by framework", currentReferencedObj.getClass().getName()); 
+
+            val msg = String.format("Collection type '%s' not supported by framework", currentReferencedObj.getClass().getName());
             throw new IllegalArgumentException(msg);
-            
+
         });
-        
+
     }
 
     private Collection<?> lookupWrappingObject(
@@ -479,81 +473,13 @@ extends DelegatingInvocationHandlerDefault<T> {
         return proxyContextHandler.proxy(mapToLookup, memberName, this, otma);
     }
 
-    // /////////////////////////////////////////////////////////////////
-    // collection - add to
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleCollectionAddToMethod(
-            final ManagedObject targetAdapter,
-            final Object[] args,
-            final OneToManyAssociation otma) {
-
-        val singleArg = singleArgUnderlyingElseThrow(args, "addTo");
-
-        runValidationTask(()->{
-            checkVisibility(targetAdapter, otma);
-            checkUsability(targetAdapter, otma);
-        });
-        
-        resolveIfRequired(targetAdapter);
-        val argumentAdapter = getObjectManager().adapt(singleArg);
-        
-        runValidationTask(()->{
-            val interactionResult = otma.isValidToAdd(targetAdapter, argumentAdapter,
-                    getInteractionInitiatedBy()).getInteractionResult();
-            notifyListenersAndVetoIfRequired(interactionResult);
-        });
-        
-        return runExecutionTask(()->{
-            otma.addElement(targetAdapter, argumentAdapter, getInteractionInitiatedBy());
-            return null;
-        });
-        
-    }
-
-
-    
-    // /////////////////////////////////////////////////////////////////
-    // collection - remove from
-    // /////////////////////////////////////////////////////////////////
-
-
-
-    private Object handleCollectionRemoveFromMethod(
-            final ManagedObject targetAdapter,
-            final Object[] args,
-            final OneToManyAssociation collection) {
-        
-        val singleArg = singleArgUnderlyingElseThrow(args, "removeFrom");
-
-        runValidationTask(()->{
-            checkVisibility(targetAdapter, collection);
-            checkUsability(targetAdapter, collection);
-        });
-
-        resolveIfRequired(targetAdapter);
-        val argumentAdapter = getObjectManager().adapt(singleArg);
-
-        runValidationTask(()->{
-            val interactionResult = collection.isValidToRemove(targetAdapter, argumentAdapter,
-                    getInteractionInitiatedBy()).getInteractionResult();
-            notifyListenersAndVetoIfRequired(interactionResult);
-        });
-        
-        return runExecutionTask(()->{
-            collection.removeElement(targetAdapter, argumentAdapter, getInteractionInitiatedBy());
-            return null;
-        });
-
-        
-    }
 
     // /////////////////////////////////////////////////////////////////
     // action
     // /////////////////////////////////////////////////////////////////
 
     private Object handleActionMethod(
-            final ManagedObject targetAdapter, 
+            final ManagedObject targetAdapter,
             final Object[] args,
             final ObjectAction objectAction) {
 
@@ -565,24 +491,24 @@ extends DelegatingInvocationHandlerDefault<T> {
             checkUsability(targetAdapter, objectAction);
             checkValidity(head, objectAction, argAdapters);
         });
-        
+
         return runExecutionTask(()->{
             val interactionInitiatedBy = getInteractionInitiatedBy();
-            
+
             val returnedAdapter = objectAction.execute(
                     head, argAdapters,
                     interactionInitiatedBy);
             return UnwrapUtil.single(returnedAdapter);
-            
+
         });
-        
+
     }
 
     private void checkValidity(
-            final ActionInteractionHead head, 
-            final ObjectAction objectAction, 
+            final ActionInteractionHead head,
+            final ObjectAction objectAction,
             final Can<ManagedObject> argAdapters) {
-        
+
         val interactionResult = objectAction
                 .isArgumentSetValid(head, argAdapters,getInteractionInitiatedBy())
                 .getInteractionResult();
@@ -593,7 +519,7 @@ extends DelegatingInvocationHandlerDefault<T> {
         val argAdapters = _NullSafe.stream(args)
         .map(getObjectManager()::adapt)
         .collect(Can.toCan());
-        
+
         return argAdapters;
     }
 
@@ -619,7 +545,7 @@ extends DelegatingInvocationHandlerDefault<T> {
     private void checkVisibility(
             final ManagedObject targetObjectAdapter,
             final ObjectMember objectMember) {
-        
+
         val visibleConsent = objectMember.isVisible(targetObjectAdapter, getInteractionInitiatedBy(), where);
         val interactionResult = visibleConsent.getInteractionResult();
         notifyListenersAndVetoIfRequired(interactionResult);
@@ -628,10 +554,10 @@ extends DelegatingInvocationHandlerDefault<T> {
     private void checkUsability(
             final ManagedObject targetObjectAdapter,
             final ObjectMember objectMember) {
-        
+
         val interactionResult = objectMember.isUsable(
                 targetObjectAdapter,
-                getInteractionInitiatedBy(), 
+                getInteractionInitiatedBy(),
                 where)
                 .getInteractionResult();
         notifyListenersAndVetoIfRequired(interactionResult);
@@ -672,15 +598,15 @@ extends DelegatingInvocationHandlerDefault<T> {
     }
 
     // -- HELPER
-    
+
     private boolean shouldEnforceRules() {
         return !getSyncControl().getExecutionModes().contains(ExecutionMode.SKIP_RULE_VALIDATION);
     }
-    
+
     private boolean shouldExecute() {
         return !getSyncControl().getExecutionModes().contains(ExecutionMode.SKIP_EXECUTION);
     }
-    
+
     private void runValidationTask(Runnable task) {
         if(!shouldEnforceRules()) {
             return;
@@ -707,11 +633,11 @@ extends DelegatingInvocationHandlerDefault<T> {
     private Object handleException(Exception ex) {
         val exceptionHandler = getSyncControl().getExceptionHandler()
                 .orElse(null);
-        
+
         if(exceptionHandler==null) {
             log.warn("No ExceptionHandler was setup to handle this Exception", ex);
         }
-        
+
         return exceptionHandler!=null
                 ? exceptionHandler.handle(ex)
                 : null;
@@ -729,7 +655,7 @@ extends DelegatingInvocationHandlerDefault<T> {
         }
         return argumentObj;
     }
-    
+
     private Object singleArgUnderlyingElseNull(Object[] args, String name) {
         if (args.length != 1) {
             throw new IllegalArgumentException(String.format(
@@ -738,14 +664,14 @@ extends DelegatingInvocationHandlerDefault<T> {
         val argumentObj = underlying(args[0]);
         return argumentObj;
     }
-    
+
     private void zeroArgsElseThrow(Object[] args, String name) {
         if (args.length != 0) {
             throw new IllegalArgumentException(String.format(
                     "Invoking '%s' should have no arguments", name));
         }
     }
-    
+
     // -- DEPENDENCIES
 
     private ObjectManager getObjectManager() {
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
index 36b1654..42207b7 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberType.java
@@ -18,14 +18,13 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.isis.applib.util.Enums;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateAddToFacet;
 import org.apache.isis.core.metamodel.facets.collections.validate.CollectionValidateRemoveFromFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
@@ -57,9 +56,8 @@ public enum MemberType {
      * {@link CollectionSemantics#getAddToKey()}
      */
     COLLECTION("collections/", RepresentationType.OBJECT_COLLECTION,
-            _Maps.unmodifiable(
-                    "addToSet", MutatorSpec.of(Rel.ADD_TO, CollectionValidateAddToFacet.class, CollectionAddToFacet.class, RestfulHttpMethod.PUT, BodyArgs.ONE),
-                    "addToList", MutatorSpec.of(Rel.ADD_TO, CollectionValidateAddToFacet.class, CollectionAddToFacet.class, RestfulHttpMethod.POST, BodyArgs.ONE), "removeFrom", MutatorSpec.of(Rel.REMOVE_FROM, CollectionValidateRemoveFromFacet.class, CollectionRemoveFromFacet.class, RestfulHttpMethod.DELETE, BodyArgs.ONE))) {
+            Collections.emptyMap()
+            ) {
         @Override
         public ObjectSpecification specFor(final ObjectMember objectMember) {
             return objectMember.getSpecification();
@@ -67,7 +65,6 @@ public enum MemberType {
     },
     /**
      * {@link #getMutators()} are keyed by
-     * {@link ActionSemantics#getInvokeKey()}
      */
     ACTION("actions/", RepresentationType.OBJECT_ACTION,
             _Maps.unmodifiable(
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
index 5eec342..5b8bdea 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
@@ -119,7 +119,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.BAD_REQUEST, "Could not determine type of domain object to persist (no class with domainType Id of '%s')", domainType);
         }
 
-        final ManagedObject adapter = domainTypeSpec.createObject(); 
+        final ManagedObject adapter = domainTypeSpec.createObject();
 
         final ObjectAdapterUpdateHelper updateHelper = new ObjectAdapterUpdateHelper(resourceContext, adapter);
 
@@ -138,7 +138,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         }
 
         EntityUtil.persistInCurrentTransaction(adapter);
-        
+
         val domainResourceHelper = DomainResourceHelper.ofObjectResource(resourceContext, adapter);
 
         return domainResourceHelper.objectRepresentation();
@@ -158,7 +158,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response object(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId) {
-        
+
         val resourceContext = createResourceContext(
                 RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT);
 
@@ -201,7 +201,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         }
 
         val domainResourceHelper = DomainResourceHelper.ofObjectResource(resourceContext, objectAdapter);
-        
+
         return domainResourceHelper.objectRepresentation();
     }
 
@@ -329,14 +329,14 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             .map(grid->{
 
                 addLinks(resourceContext, domainType, instanceId, grid);
-                
+
                 return Response.status(Response.Status.OK)
                         .entity(serializationStrategy.entity(grid))
                         .type(serializationStrategy.type(RepresentationType.OBJECT_LAYOUT));
             })
             .orElseGet(Responses::ofNotFound)
             .build();
-        
+
     }
 
     private Optional<Grid> layoutAsGrid(
@@ -345,10 +345,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         val objectSpec = getSpecificationLoader().lookupBySpecIdElseLoad(ObjectSpecId.of(domainType));
         val gridFacet = objectSpec.getFacet(GridFacet.class);
-        
+
         if(gridFacet == null) {
             return Optional.empty();
-        } 
+        }
         val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
         val grid = gridFacet.getGrid(objectAdapter);
         return Optional.of(grid);
@@ -425,7 +425,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response propertyDetails(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId) {
-        
+
         val resourceContext = createResourceContext(
                 RepresentationType.OBJECT_PROPERTY, Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE);
 
@@ -447,19 +447,19 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response modifyProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId, final InputStream body) {
-        
+
         val resourceContext = createResourceContext(
                 ResourceDescriptor.generic(Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE));
 
         val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        
+
         PropertyInteraction.start(objectAdapter, propertyId, resourceContext.getWhere())
         .checkVisibility()
         .checkUsability(AccessIntent.MUTATE)
         .modifyProperty(property->{
             val proposedNewValue = new JsonParserHelper(resourceContext, property.getSpecification())
                     .parseAsMapWithSingleValue(Util.asStringUtf8(body));
-            
+
             return proposedNewValue;
         })
         .validateElseThrow(InteractionFailureHandler::onFailure);
@@ -477,12 +477,12 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response clearProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId) {
-        
+
         val resourceContext = createResourceContext(
                 ResourceDescriptor.generic(Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE));
 
         val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        
+
         PropertyInteraction.start(objectAdapter, propertyId, resourceContext.getWhere())
         .checkVisibility()
         .checkUsability(AccessIntent.MUTATE)
@@ -513,14 +513,14 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response accessCollection(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId) {
-        
+
         val resourceContext = createResourceContext(
                 RepresentationType.OBJECT_COLLECTION, Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE);
 
         val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
         val domainResourceHelper = DomainResourceHelper.ofObjectResource(resourceContext, objectAdapter);
 
-        
+
         return domainResourceHelper.collectionDetails(collectionId, ManagedMember.RepresentationMode.READ);
     }
 
@@ -533,35 +533,8 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response addToSet(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId, final InputStream body) {
-        
-        val resourceContext = createResourceContext(
-                ResourceDescriptor.generic(Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE));
-
-        val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        val domainResourceHelper = DomainResourceHelper.ofObjectResource(resourceContext, objectAdapter);
-        final ObjectAdapterAccessHelper accessHelper = ObjectAdapterAccessHelper.of(resourceContext, objectAdapter);
-
-        val collection = accessHelper.getCollectionThatIsVisibleForIntent(
-                collectionId, AccessIntent.MUTATE)
-                .getCollection();
-
-        if (!collection.getCollectionSemantics().isAnySet()) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.BAD_REQUEST, "Collection '%s' does not have set semantics", collectionId);
-        }
-
-        final ObjectSpecification collectionSpec = collection.getSpecification();
-        final String bodyAsString = Util.asStringUtf8(body);
-        final ManagedObject argAdapter = new JsonParserHelper(resourceContext, collectionSpec)
-                .parseAsMapWithSingleValue(bodyAsString);
-
-        final Consent consent = collection.isValidToAdd(objectAdapter, argAdapter, InteractionInitiatedBy.USER);
-        if (consent.isVetoed()) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
-        }
-
-        collection.addElement(objectAdapter, argAdapter, InteractionInitiatedBy.USER);
 
-        return domainResourceHelper.collectionDetails(collectionId, ManagedMember.RepresentationMode.WRITE);
+        throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.METHOD_NOT_ALLOWED, "The framework no longer supports mutable collections.");
     }
 
     @Override
@@ -573,35 +546,8 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response addToList(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId, final InputStream body) {
-        
-        val resourceContext = createResourceContext(
-                ResourceDescriptor.generic(Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE));
-
-        val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        val domainResourceHelper = DomainResourceHelper.ofObjectResource(resourceContext, objectAdapter);
-        final ObjectAdapterAccessHelper accessHelper = ObjectAdapterAccessHelper.of(resourceContext, objectAdapter);
-
-        val collection = accessHelper.getCollectionThatIsVisibleForIntent(
-                collectionId, AccessIntent.MUTATE)
-                .getCollection();
-
-        if (!collection.getCollectionSemantics().isListOrArray()) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.METHOD_NOT_ALLOWED, "Collection '%s' does not have list or array semantics", collectionId);
-        }
-
-        final ObjectSpecification collectionSpec = collection.getSpecification();
-        final String bodyAsString = Util.asStringUtf8(body);
-        final ManagedObject argAdapter = new JsonParserHelper(resourceContext, collectionSpec).parseAsMapWithSingleValue(
-                bodyAsString);
-
-        final Consent consent = collection.isValidToAdd(objectAdapter, argAdapter, InteractionInitiatedBy.USER);
-        if (consent.isVetoed()) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
-        }
 
-        collection.addElement(objectAdapter, argAdapter, InteractionInitiatedBy.USER);
-
-        return domainResourceHelper.collectionDetails(collectionId, ManagedMember.RepresentationMode.WRITE);
+        throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.METHOD_NOT_ALLOWED, "The framework no longer supports mutable collections.");
     }
 
     @Override
@@ -613,30 +559,8 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response removeFromCollection(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId) {
-        
-        val resourceContext = createResourceContext(
-                ResourceDescriptor.generic(Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE));
-
-        val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        val domainResourceHelper = DomainResourceHelper.ofObjectResource(resourceContext, objectAdapter);
-        final ObjectAdapterAccessHelper accessHelper = ObjectAdapterAccessHelper.of(resourceContext, objectAdapter);
-
-        val collection = accessHelper.getCollectionThatIsVisibleForIntent(
-                collectionId, AccessIntent.MUTATE)
-                .getCollection();
 
-        final ObjectSpecification collectionSpec = collection.getSpecification();
-        final ManagedObject argAdapter = new JsonParserHelper(resourceContext, collectionSpec)
-                .parseAsMapWithSingleValue(resourceContext.getUrlUnencodedQueryString());
-
-        final Consent consent = collection.isValidToRemove(objectAdapter, argAdapter, InteractionInitiatedBy.USER);
-        if (consent.isVetoed()) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
-        }
-
-        collection.removeElement(objectAdapter, argAdapter, InteractionInitiatedBy.USER);
-
-        return domainResourceHelper.collectionDetails(collectionId, ManagedMember.RepresentationMode.WRITE);
+        throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.METHOD_NOT_ALLOWED, "The framework no longer supports mutable collections.");
     }
 
     // //////////////////////////////////////////////////////////
@@ -652,7 +576,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_ACTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response actionPrompt(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId) {
-        
+
         val resourceContext = createResourceContext(
                 RepresentationType.OBJECT_ACTION, Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE);
 
@@ -754,7 +678,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             @PathParam("instanceId") final String instanceId,
             @PathParam("actionId") final String actionId,
             final InputStream body) {
-        
+
         val resourceContext = createResourceContext(
                 ResourceDescriptor.of(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE),
                 body);