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 2013/09/05 13:00:14 UTC

[1/2] ISIS-503: can now order contributed members

Updated Branches:
  refs/heads/master 242739ad6 -> c009dec57


http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
deleted file mode 100644
index 37036c0..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionFilters.java
+++ /dev/null
@@ -1,58 +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.spec.feature;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ActionType;
-
-public class ObjectActionFilters {
-    
-    private ObjectActionFilters(){}
-
-    @Deprecated
-    public static final Filter<ObjectAction> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = ObjectAction.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE;
-
-    @Deprecated
-    public static Filter<ObjectAction> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
-        return ObjectAction.Filters.dynamicallyVisible(session, target, where);
-    }
-
-    @Deprecated
-    public static Filter<ObjectAction> withId(final String actionId) {
-        return ObjectAction.Filters.withId(actionId);
-    }
-
-    @Deprecated
-    public static Filter<ObjectAction> withNoValidationRules() {
-        return ObjectAction.Filters.withNoValidationRules();
-    }
-
-    @Deprecated
-    public static Filter<ObjectAction> filterOfType(final ActionType type) {
-        return ObjectAction.Filters.ofType(type);
-    }
-
-    @Deprecated
-    public static Filter<ObjectAction> bulk() {
-        return ObjectAction.Filters.bulk();
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index 322e530..bd32a81 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.spec.feature;
 
+import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -128,4 +129,18 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
     String isValid(ObjectAdapter adapter, Object proposedValue, Localization localization);
  
 
+    
+    public static class Filters {
+        private Filters(){}
+        
+        /**
+         * Filters only parameters that are for objects (ie 1:1 associations)
+         */
+        public static final Filter<ObjectActionParameter> PARAMETER_ASSOCIATIONS = new Filter<ObjectActionParameter>() {
+            @Override
+            public boolean accept(final ObjectActionParameter parameter) {
+                return parameter.getSpecification().isNotCollection();
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
index 284b1b9..8aee39d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
@@ -169,16 +169,12 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
         /**
          * Filters only properties that are visible statically, ie have not been
          * unconditionally hidden at compile time.
-         * 
-         * <p>
-         * Note this list will include
-         * properties marked as hidden once persisted and until persisted, but not
-         * those marked hidden always.
          */
-        public static final Filter<ObjectAssociation> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = new Filter<ObjectAssociation>() {
+        public static final Filter<ObjectAssociation> VISIBLE_AT_LEAST_SOMETIMES = new Filter<ObjectAssociation>() {
             @Override
             public boolean accept(final ObjectAssociation property) {
-                return !property.isAlwaysHidden();
+                final HiddenFacet hiddenFacet = property.getFacet(HiddenFacet.class);
+                return hiddenFacet == null || hiddenFacet.when() != When.ALWAYS || hiddenFacet.where() != Where.ANYWHERE;
             }
         };
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
deleted file mode 100644
index 376fa63..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
+++ /dev/null
@@ -1,69 +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.spec.feature;
-
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-
-public class ObjectAssociationFilters {
-
-    private ObjectAssociationFilters() {
-    }
-
-    @Deprecated
-    public final static Filter<ObjectAssociation> PROPERTIES = ObjectAssociation.Filters.PROPERTIES;
-
-    @Deprecated
-    public final static Filter<ObjectAssociation> REFERENCE_PROPERTIES = ObjectAssociation.Filters.REFERENCE_PROPERTIES;
-    
-    @Deprecated
-    public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE = ObjectAssociation.Filters.WHERE_VISIBLE_IN_COLLECTION_TABLE;
-
-    @Deprecated
-    public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE = ObjectAssociation.Filters.WHERE_VISIBLE_IN_STANDALONE_TABLE;
-
-    @Deprecated
-    public final static Filter<ObjectAssociation> ALL = ObjectAssociation.Filters.ALL;
-
-    @Deprecated
-    public final static Filter<ObjectAssociation> COLLECTIONS = ObjectAssociation.Filters.COLLECTIONS;
-
-    @Deprecated
-    public static final Filter<ObjectAssociation> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE;
-
-    @Deprecated
-    public static final Filter<ObjectAssociation> staticallyVisible(final Where context) {
-        return ObjectAssociation.Filters.staticallyVisible(context);
-    }
-
-    @Deprecated
-    public static Filter<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
-        return ObjectAssociation.Filters.dynamicallyVisible(session, target, where);
-    }
-
-    @Deprecated
-    public static Filter<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
-        return ObjectAssociation.Filters.enabled(session, adapter, where);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
index 5e61774..609ce4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
@@ -59,7 +59,7 @@ public interface ObjectMember extends ObjectFeature {
      * <p>
      * Determined as per the {@link HiddenFacet} being present and 
      * {@link HiddenFacet#when()} returning {@link When#ALWAYS}, and
-     * {@link HiddenFacet#where()} NOT returning {@link When#NOWHERE}.
+     * {@link HiddenFacet#where()} returning {@link When#ANYWHERE}.
      */
     boolean isAlwaysHidden();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectParameterFilters.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectParameterFilters.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectParameterFilters.java
deleted file mode 100644
index 9d69add..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectParameterFilters.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.spec.feature;
-
-import org.apache.isis.applib.filter.Filter;
-
-public class ObjectParameterFilters {
-
-    /**
-     * Filters only parameters that are for objects (ie 1:1 associations)
-     */
-    public static final Filter<ObjectActionParameter> PARAMETER_ASSOCIATIONS = new Filter<ObjectActionParameter>() {
-        @Override
-        public boolean accept(final ObjectActionParameter parameter) {
-            return parameter.getSpecification().isNotCollection();
-        }
-    };
-
-    private ObjectParameterFilters() {
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index 35e49fd..15bcdbd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -532,7 +532,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         final ObjectInstantiator objectInstantiator = getRuntimeContext().getObjectInstantiator();
 
         // create contexts as inputs ...
-        final SpecificationContext specContext = new SpecificationContext(getDeploymentCategory(), authenticationSessionProvider, servicesProvider, objectInstantiator, specificationLookup);
+        final SpecificationContext specContext = new SpecificationContext(getDeploymentCategory(), authenticationSessionProvider, servicesProvider, objectInstantiator, specificationLookup, facetProcessor);
 
         final AdapterManager adapterMap = getRuntimeContext().getAdapterManager();
         final ObjectMemberContext objectMemberContext = new ObjectMemberContext(getDeploymentCategory(), authenticationSessionProvider, specificationLookup, adapterMap, getRuntimeContext().getQuerySubmitter(), collectionTypeRegistry);

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index 0ba8a87..20b026e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -45,6 +45,7 @@ import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessParameterContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.MemberOrderingFacetFactory;
 import org.apache.isis.core.metamodel.facets.MethodFilteringFacetFactory;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactory;
 import org.apache.isis.core.metamodel.facets.MethodRemoverConstants;
@@ -52,7 +53,9 @@ import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFace
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContextAware;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistry;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionContributee;
 
 public class FacetProcessor implements RuntimeContextAware {
 
@@ -96,6 +99,15 @@ public class FacetProcessor implements RuntimeContextAware {
      * If <tt>null</tt>, indicates that the cache hasn't been built.
      */
     private List<MethodFilteringFacetFactory> cachedMethodFilteringFactories;
+    
+    /**
+     * All registered {@link FacetFactory factories} that implement
+     * {@link MemberOrderingFacetFactory}.
+     * 
+     * <p>
+     * If <tt>null</tt>, indicates that the cache hasn't been built.
+     */
+    private List<MemberOrderingFacetFactory> cachedMemberOrderingFactories;
 
     /**
      * All registered {@link FacetFactory factories} that implement
@@ -336,6 +348,16 @@ public class FacetProcessor implements RuntimeContextAware {
         }
     }
 
+    
+    public void processMemberOrder(
+            final Properties metadataProperties, 
+            final ObjectMember facetHolder) {
+        cacheMemberOrderingFacetFactoriesIfRequired();
+        for (final MemberOrderingFacetFactory facetFactory : cachedMemberOrderingFactories) {
+            facetFactory.process(new MemberOrderingFacetFactory.ProcessMemberContext(metadataProperties, facetHolder));
+        }
+    }
+
     /**
      * Attaches all facets applicable to the provided
      * {@link FeatureType#ACTION_PARAMETER parameter}), to the supplied
@@ -364,6 +386,9 @@ public class FacetProcessor implements RuntimeContextAware {
         }
     }
 
+
+    
+    
     private List<FacetFactory> getFactoryListByFeatureType(final FeatureType featureType) {
         cacheByFeatureTypeIfRequired();
         List<FacetFactory> list = factoryListByFeatureType.get(featureType);
@@ -417,6 +442,19 @@ public class FacetProcessor implements RuntimeContextAware {
         }
     }
 
+    private synchronized void cacheMemberOrderingFacetFactoriesIfRequired() {
+        if (cachedMemberOrderingFactories != null) {
+            return;
+        }
+        cachedMemberOrderingFactories = Lists.newArrayList();
+        for (final FacetFactory factory : factories) {
+            if (factory instanceof MemberOrderingFacetFactory) {
+                final MemberOrderingFacetFactory memberOrderingFacetFactory = (MemberOrderingFacetFactory) factory;
+                cachedMemberOrderingFactories.add(memberOrderingFacetFactory);
+            }
+        }
+    }
+    
     private synchronized void cachePropertyOrCollectionIdentifyingFacetFactoriesIfRequired() {
         if (cachedPropertyOrCollectionIdentifyingFactories != null) {
             return;
@@ -475,4 +513,5 @@ public class FacetProcessor implements RuntimeContextAware {
         this.runtimeContext = runtimeContext;
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
index 374dea5..f8eef00 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -16,32 +16,23 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.exceptions.UnknownTypeException;
 import org.apache.isis.core.commons.lang.CastUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
-import org.apache.isis.core.metamodel.consent.InteractionResultSet;
-import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
-import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
-import org.apache.isis.core.metamodel.facets.object.bounded.BoundedFacetUtils;
-import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
 
@@ -51,6 +42,12 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
     private final ObjectActionImpl serviceAction;
     private final int contributeeParam;
     private final ObjectSpecification contributeeType;
+    
+    /**
+     * Hold facets rather than delegate to the contributed action (different types might
+     * use layout metadata to position the contributee in different ways)
+     */
+    private final FacetHolder facetHolder = new FacetHolderImpl();
 
     /**
      * Lazily initialized by {@link #getParameters()} (so don't use directly!)
@@ -72,6 +69,9 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
         this.serviceAction = serviceAction;
         this.contributeeType = contributeeType;
         this.contributeeParam = contributeeParam;
+
+        // copy over facets from contributed to own.
+        FacetUtil.copyFacets(serviceAction.getFacetedMethod(), facetHolder);
     }
 
     @Override
@@ -162,6 +162,56 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
     }
 
     // //////////////////////////////////////
+    // FacetHolder
+    // //////////////////////////////////////
+    
+    @Override
+    public Class<? extends Facet>[] getFacetTypes() {
+        return facetHolder.getFacetTypes();
+    }
+
+    @Override
+    public <T extends Facet> T getFacet(Class<T> cls) {
+        return facetHolder.getFacet(cls);
+    }
+    
+    @Override
+    public boolean containsFacet(Class<? extends Facet> facetType) {
+        return facetHolder.containsFacet(facetType);
+    }
+
+    @Override
+    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
+        return facetHolder.containsDoOpFacet(facetType);
+    }
+
+    @Override
+    public List<Facet> getFacets(Filter<Facet> filter) {
+        return facetHolder.getFacets(filter);
+    }
+
+    @Override
+    public void addFacet(Facet facet) {
+        facetHolder.addFacet(facet);
+    }
+
+    @Override
+    public void addFacet(MultiTypedFacet facet) {
+        facetHolder.addFacet(facet);
+    }
+    
+    @Override
+    public void removeFacet(Facet facet) {
+        facetHolder.removeFacet(facet);
+    }
+
+    @Override
+    public void removeFacet(Class<? extends Facet> facetType) {
+        facetHolder.removeFacet(facetType);
+    }
+
+    
+    // //////////////////////////////////////
 
     static <T> T[] addElementToArray(T[] array, final int n, final T element, final T[] type) {
         List<T> list = Lists.newArrayList(Arrays.asList(array));

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
index 1cbe6a8..3f8847e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import java.util.Collections;
 import java.util.List;
 
 import com.google.common.base.Objects;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 6af5fdb..fb3f078 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -208,7 +208,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     @Override
     public boolean isAlwaysHidden() {
         final HiddenFacet hiddenFacet = getFacet(HiddenFacet.class);
-        return hiddenFacet != null && hiddenFacet.when() == When.ALWAYS && hiddenFacet.where() != Where.NOWHERE;
+        return hiddenFacet != null && hiddenFacet.when() == When.ALWAYS && hiddenFacet.where() == Where.ANYWHERE;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 58ece62..e358801 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -21,19 +21,19 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
+import java.util.Properties;
 
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.NotPersistable;
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.profiles.Localization;
@@ -49,6 +49,7 @@ import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
@@ -88,15 +89,12 @@ import org.apache.isis.core.metamodel.spec.SpecificationContext;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.core.metamodel.specloader.specimpl.objectlist.ObjectSpecificationForFreeStandingList;
 import org.apache.isis.core.progmodel.facets.actions.notcontributed.NotContributedFacet;
 
@@ -129,6 +127,13 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     private final ObjectInstantiator objectInstantiator;
     private final SpecificationLoader specificationLookup;
     
+    private final FacetProcessor facetProcessor;
+    
+    /**
+     * Only populated once {@link #introspectTypeHierarchyAndMembers()} is called.
+     */
+    protected Properties metadataProperties;
+
     protected final ObjectMemberContext objectMemberContext;
 
 
@@ -168,13 +173,14 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     public ObjectSpecificationAbstract(
             final Class<?> introspectedClass, 
-            final String shortName, 
+            final String shortName,
             final SpecificationContext specificationContext, 
             final ObjectMemberContext objectMemberContext) {
 
         this.correspondingClass = introspectedClass;
         this.fullName = introspectedClass.getName();
         this.shortName = shortName;
+        
         this.isAbstract = JavaClassUtils.isAbstract(introspectedClass);
         this.identifier = Identifier.classIdentifier(introspectedClass);
 
@@ -183,6 +189,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         this.servicesProvider = specificationContext.getServicesProvider();
         this.objectInstantiator = specificationContext.getObjectInstantiator();
         this.specificationLookup = specificationContext.getSpecificationLookup();
+        this.facetProcessor = specificationContext.getFacetProcessor();
         
         this.objectMemberContext = objectMemberContext;
     }
@@ -885,7 +892,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         if (specification == this) {
             return;
         }
-        final List<ObjectAssociation> contributeeAssociations = findContributeeAssociations(serviceAdapter);
+        final List<ObjectAssociation> contributeeAssociations = createContributeeAssociations(serviceAdapter);
         contributeeAssociationsToAppendTo.addAll(contributeeAssociations);
     }
 
@@ -893,14 +900,14 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
      * Synthesises {@link ObjectAssociation}s from matching {@link ObjectAction}s of any of the services
      * that accept one parameter
      */
-    private List<ObjectAssociation> findContributeeAssociations(final ObjectAdapter serviceAdapter) {
+    private List<ObjectAssociation> createContributeeAssociations(final ObjectAdapter serviceAdapter) {
         
         final ObjectSpecification specification = serviceAdapter.getSpecification();
         final List<ObjectAction> serviceActions = specification.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters.<ObjectAction>any());
         
         final List<ObjectActionImpl> contributedActions = Lists.newArrayList();
         for (final ObjectAction serviceAction : serviceActions) {
-            if (serviceAction.isAlwaysHidden()) {
+            if (isAlwaysHidden(serviceAction)) {
                 continue;
             }
             final NotContributedFacet notContributed = serviceAction.getFacet(NotContributedFacet.class);
@@ -919,17 +926,23 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             contributedActions.add((ObjectActionImpl) serviceAction);
         }
         
-        return Lists.newArrayList(Iterables.transform(contributedActions, new Function<ObjectActionImpl, ObjectAssociation>(){
+        return Lists.newArrayList(Iterables.transform(contributedActions, createContributeeAssociationFunctor(serviceAdapter)));
+    }
+
+
+    private Function<ObjectActionImpl, ObjectAssociation> createContributeeAssociationFunctor(
+            final ObjectAdapter serviceAdapter) {
+        return new Function<ObjectActionImpl, ObjectAssociation>(){
             @Override
             public ObjectAssociation apply(ObjectActionImpl input) {
                 final ObjectSpecification returnType = input.getReturnType();
-                if(returnType.isNotCollection()) {
-                    return new OneToOneAssociationContributee(serviceAdapter, input, objectMemberContext);
-                } else {
-                    return new OneToManyAssociationContributee(serviceAdapter, input, objectMemberContext);
-                }
+                final ObjectAssociationAbstract association = returnType.isNotCollection() 
+                        ? new OneToOneAssociationContributee(serviceAdapter, input, objectMemberContext) 
+                        : new OneToManyAssociationContributee(serviceAdapter, input, objectMemberContext);
+                facetProcessor.processMemberOrder(metadataProperties, association);
+                return association;
             }
-        }));
+        };
     }
 
 
@@ -967,7 +980,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         final List<ObjectAction> contributeeActions = Lists.newArrayList();
         final List<ObjectAction> serviceActions = specification.getObjectActions(ActionType.ALL, Contributed.INCLUDED, Filters.<ObjectAction>any());
         for (final ObjectAction serviceAction : serviceActions) {
-            if (serviceAction.isAlwaysHidden()) {
+            if (isAlwaysHidden(serviceAction)) {
                 continue;
             }
             final NotContributedFacet notContributed = serviceAction.getFacet(NotContributedFacet.class);
@@ -984,16 +997,19 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if (contributeeParam != -1) {
                 ObjectActionContributee contributeeAction = 
                         new ObjectActionContributee(serviceAdapter, contributedAction, contributeeParam, this, objectMemberContext);
-
+                facetProcessor.processMemberOrder(metadataProperties, contributeeAction);
                 contributeeActions.add(contributeeAction);
             }
         }
-        // only add if there are matching subactions.
-        if (contributeeActions.isEmpty()) {
-            return;
-        }
         contributeeActionsToAppendTo.addAll(contributeeActions);
     }
+    
+    private boolean isAlwaysHidden(final FacetHolder holder) {
+        final HiddenFacet hiddenFacet = holder.getFacet(HiddenFacet.class);
+        return hiddenFacet != null && hiddenFacet.when() == When.ALWAYS && hiddenFacet.where() == Where.ANYWHERE;
+    }
+
+    
 
     /**
      * @param the number of the parameter that matches, or -1 if none.

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
index 0c0534c..3883f8d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
@@ -16,9 +16,16 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Render;
+import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.members.resolve.RenderFacet;
 import org.apache.isis.core.metamodel.facets.members.resolve.RenderFacetAbstract;
 import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacet;
@@ -38,6 +45,12 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
     private final NotPersistedFacet notPersistedFacet;
     private final TypeOfFacet typeOfFacet; 
 
+    /**
+     * Hold facets rather than delegate to the contributed action (different types might
+     * use layout metadata to position the contributee in different ways)
+     */
+    private final FacetHolder facetHolder = new FacetHolderImpl();
+
     private static ObjectSpecification typeOfSpec(final ObjectActionImpl objectAction, ObjectMemberContext objectMemberContext) {
         final TypeOfFacet actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
         return objectMemberContext.getSpecificationLookup().loadSpecification(actionTypeOfFacet.value());
@@ -51,6 +64,13 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
         renderFacet = new RenderFacetAbstract(Render.Type.EAGERLY, this) {};
         notPersistedFacet = new NotPersistedFacetAbstract(this) {};
         typeOfFacet = new TypeOfFacetAbstract(getSpecification().getCorrespondingClass(), this, objectMemberContext.getSpecificationLookup()) {};
+        
+        // copy over facets from contributed to own.
+        FacetUtil.copyFacets(objectAction.getFacetedMethod(), facetHolder);
+        
+        FacetUtil.addFacet(renderFacet);
+        FacetUtil.addFacet(notPersistedFacet);
+        FacetUtil.addFacet(typeOfFacet);
     }
 
     
@@ -59,47 +79,55 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
         return objectAction.execute(serviceAdapter, new ObjectAdapter[]{ownerAdapter});
     }
 
-    @SuppressWarnings("unchecked")
+
+    
+    // //////////////////////////////////////
+    // FacetHolder
+    // //////////////////////////////////////
+    
     @Override
-    public <T extends Facet> T getFacet(Class<T> facetType) {
-        if(facetType == RenderFacet.class) {
-            return (T) renderFacet;
-        }
-        if(facetType == NotPersistedFacet.class) {
-            return (T) notPersistedFacet;
-        }
-        if(facetType == TypeOfFacet.class) {
-            return (T) typeOfFacet;
-        }
-        return super.getFacet(facetType);
+    public Class<? extends Facet>[] getFacetTypes() {
+        return facetHolder.getFacetTypes();
+    }
+
+    @Override
+    public <T extends Facet> T getFacet(Class<T> cls) {
+        return facetHolder.getFacet(cls);
     }
     
     @Override
     public boolean containsFacet(Class<? extends Facet> facetType) {
-        if(facetType == RenderFacet.class) {
-            return true;
-        }
-        if(facetType == NotPersistedFacet.class) {
-            return true;
-        }
-        if(facetType == TypeOfFacet.class) {
-            return true;
-        }
-        return super.containsFacet(facetType);
+        return facetHolder.containsFacet(facetType);
+    }
+
+    @Override
+    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
+        return facetHolder.containsDoOpFacet(facetType);
+    }
+
+    @Override
+    public List<Facet> getFacets(Filter<Facet> filter) {
+        return facetHolder.getFacets(filter);
+    }
+
+    @Override
+    public void addFacet(Facet facet) {
+        facetHolder.addFacet(facet);
+    }
+
+    @Override
+    public void addFacet(MultiTypedFacet facet) {
+        facetHolder.addFacet(facet);
     }
     
     @Override
-    public boolean containsDoOpFacet(Class<? extends Facet> facetType) {
-        if(facetType == RenderFacet.class) {
-            return true;
-        }
-        if(facetType == NotPersistedFacet.class) {
-            return true;
-        }
-        if(facetType == TypeOfFacet.class) {
-            return true;
-        }
-        return super.containsDoOpFacet(facetType);
+    public void removeFacet(Facet facet) {
+        facetHolder.removeFacet(facet);
+    }
+
+    @Override
+    public void removeFacet(Class<? extends Facet> facetType) {
+        facetHolder.removeFacet(facetType);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
index 965df3f..a835a95 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
@@ -16,8 +16,15 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.List;
+
+import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacet;
 import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacetAbstract;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -30,6 +37,12 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
     
     private final NotPersistedFacet notPersistedFacet;
 
+    /**
+     * Hold facets rather than delegate to the contributed action (different types might
+     * use layout metadata to position the contributee in different ways)
+     */
+    private final FacetHolder facetHolder = new FacetHolderImpl();
+
     public OneToOneAssociationContributee(
             final ObjectAdapter serviceAdapter, 
             final ObjectActionImpl objectAction, 
@@ -39,6 +52,10 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         this.objectAction = objectAction;
         
         notPersistedFacet = new NotPersistedFacetAbstract(this) {};
+
+        // copy over facets from contributed to own.
+        FacetUtil.copyFacets(objectAction.getFacetedMethod(), facetHolder);
+        FacetUtil.addFacet(notPersistedFacet);
     }
 
     @Override
@@ -46,30 +63,58 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         return objectAction.execute(serviceAdapter, new ObjectAdapter[]{ownerAdapter});
     }
     
-    @SuppressWarnings("unchecked")
+
+    
+
+
+    
+    // //////////////////////////////////////
+    // FacetHolder
+    // //////////////////////////////////////
+    
+    @Override
+    public Class<? extends Facet>[] getFacetTypes() {
+        return facetHolder.getFacetTypes();
+    }
+
     @Override
     public <T extends Facet> T getFacet(Class<T> cls) {
-        if(cls == NotPersistedFacet.class) {
-            return (T) notPersistedFacet;
-        }
-        return super.getFacet(cls);
+        return facetHolder.getFacet(cls);
     }
 
     @Override
     public boolean containsFacet(Class<? extends Facet> facetType) {
-        if(facetType == NotPersistedFacet.class) {
-            return true;
-        }
-        return super.containsFacet(facetType);
+        return facetHolder.containsFacet(facetType);
+    }
+
+    @Override
+    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
+        return facetHolder.containsDoOpFacet(facetType);
+    }
+
+    @Override
+    public List<Facet> getFacets(Filter<Facet> filter) {
+        return facetHolder.getFacets(filter);
+    }
+
+    @Override
+    public void addFacet(Facet facet) {
+        facetHolder.addFacet(facet);
+    }
+
+    @Override
+    public void addFacet(MultiTypedFacet facet) {
+        facetHolder.addFacet(facet);
     }
     
     @Override
-    public boolean containsDoOpFacet(Class<? extends Facet> facetType) {
-        if(facetType == NotPersistedFacet.class) {
-            return true;
-        }
-        return super.containsDoOpFacet(facetType);
+    public void removeFacet(Facet facet) {
+        facetHolder.removeFacet(facet);
     }
 
+    @Override
+    public void removeFacet(Class<? extends Facet> facetType) {
+        facetHolder.removeFacet(facetType);
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 496f2fc..8322978 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -38,15 +38,12 @@ import org.apache.isis.applib.profiles.Perspective;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
 import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.exceptions.UnknownTypeException;
-import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.commons.lang.NameUtils;
 import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.ImperativeFacetUtils;
@@ -55,12 +52,10 @@ import org.apache.isis.core.metamodel.facets.named.NamedFacetInferred;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackUtils;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
-import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacetInferred;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.layout.DeweyOrderSet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectInstantiationException;
@@ -72,8 +67,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.specimpl.CreateObjectContext;
 import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder;
@@ -107,18 +100,19 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
     private final IntrospectionContext introspectionContext;
     private final CreateObjectContext createObjectContext;
 
-    private FacetedMethodsBuilder facetedMethodsBuilder;
+    private final FacetedMethodsBuilder facetedMethodsBuilder;
 
-    /**
-     * Only populated once {@link #introspectTypeHierarchyAndMembers()} is called.
-     */
-    private Properties metadataProperties;
 
     // //////////////////////////////////////////////////////////////////////
     // Constructor
     // //////////////////////////////////////////////////////////////////////
 
-    public ObjectSpecificationDefault(final Class<?> correspondingClass, final FacetedMethodsBuilderContext facetedMethodsBuilderContext, final IntrospectionContext introspectionContext, final SpecificationContext specContext, final ObjectMemberContext objectMemberContext,
+    public ObjectSpecificationDefault(
+            final Class<?> correspondingClass,
+            final FacetedMethodsBuilderContext facetedMethodsBuilderContext, 
+            final IntrospectionContext introspectionContext, 
+            final SpecificationContext specContext, 
+            final ObjectMemberContext objectMemberContext,
             final CreateObjectContext createObjectContext) {
         super(correspondingClass, determineShortName(correspondingClass), specContext, objectMemberContext);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
index e87f760..e6d7c25 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/objectlist/ObjectSpecificationForFreeStandingList.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl.objectlist;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Properties;
 
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
index 3b2995e..d14a468 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/Dump.java
@@ -173,7 +173,7 @@ public final class Dump {
         }
         debugBuilder.unindent();
 
-        final List<ObjectAssociation> fields2 = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
+        final List<ObjectAssociation> fields2 = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
         debugBuilder.appendln("Static");
         debugBuilder.indent();
         for (int i = 0; i < fields2.size(); i++) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
index 52bafc3..7987ec5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
@@ -22,14 +22,16 @@ package org.apache.isis.core.progmodel.facets.members.order;
 import java.util.Properties;
 
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.MemberOrderingFacetFactory;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.specloader.specimpl.ContributeeMember;
 
-public class MemberOrderFacetFactory extends FacetFactoryAbstract {
+public class MemberOrderFacetFactory extends FacetFactoryAbstract implements MemberOrderingFacetFactory {
 
     public MemberOrderFacetFactory() {
         super(FeatureType.MEMBERS);
@@ -38,18 +40,12 @@ public class MemberOrderFacetFactory extends FacetFactoryAbstract {
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         
-        final FacetedMethod holder = processMethodContext.getFacetHolder();
-        
-        MemberOrderFacet memberOrderFacet = null;
-        final Properties properties = processMethodContext.metadataProperties("memberOrder");
-        if(properties != null) {
-            memberOrderFacet = new MemberOrderFacetProperties(properties, holder);
-        }
+        MemberOrderFacet memberOrderFacet = getMemberOrderFromMetadataPropertiesIfPossible(processMethodContext);
 
         if(memberOrderFacet == null) {
             final MemberOrder annotation = Annotations.getAnnotation(processMethodContext.getMethod(), MemberOrder.class);
             if (annotation != null) {
-                memberOrderFacet = new MemberOrderFacetAnnotation(annotation.name(), annotation.sequence(), holder);
+                memberOrderFacet = new MemberOrderFacetAnnotation(annotation.name(), annotation.sequence(), processMethodContext.getFacetHolder());
             }
         }
 
@@ -57,4 +53,30 @@ public class MemberOrderFacetFactory extends FacetFactoryAbstract {
         FacetUtil.addFacet(memberOrderFacet);
     }
 
+    /**
+     * For ordering of {@link ContributeeMember}s.
+     */
+    @Override
+    public void process(final ProcessMemberContext processMemberContext) {
+        final MemberOrderFacet memberOrderFacet = getMemberOrderFromMetadataPropertiesIfPossible(processMemberContext);
+
+        // no-op if facet is null
+        FacetUtil.addFacet(memberOrderFacet);
+    }
+
+    private static MemberOrderFacet getMemberOrderFromMetadataPropertiesIfPossible(final ProcessContextWithMetadataProperties<? extends FacetHolder> pcwmp) {
+        
+        final FacetHolder holder = pcwmp.getFacetHolder();
+        
+        final MemberOrderFacet memberOrderFacet;
+        final Properties properties = pcwmp.metadataProperties("memberOrder");
+        if(properties != null) {
+            memberOrderFacet = new MemberOrderFacetProperties(properties, holder);
+        } else {
+            memberOrderFacet = null;
+        }
+        return memberOrderFacet;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetProperties.java
index fde9ee8..b525971 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetProperties.java
@@ -22,11 +22,10 @@ package org.apache.isis.core.progmodel.facets.members.order;
 import java.util.Properties;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 
 public class MemberOrderFacetProperties extends MemberOrderFacetAbstract {
 
-    public MemberOrderFacetProperties(Properties properties, FacetedMethod holder) {
+    public MemberOrderFacetProperties(Properties properties, FacetHolder holder) {
         this(name(properties), sequence(properties), holder);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
index e10f81a..daa7fd4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
@@ -38,7 +38,6 @@ import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayo
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor;
@@ -117,7 +116,7 @@ public class MemberGroupLayoutFacetFactory extends FacetFactoryAbstract implemen
             @SuppressWarnings("unchecked")
             private int numCollectionsOf(ObjectSpecification objectSpec) {
                 List<ObjectAssociation> objectCollections = objectSpec.getAssociations(
-                        Contributed.EXCLUDED, Filters.and(ObjectAssociationFilters.staticallyVisible(Where.OBJECT_FORMS), ObjectAssociationFilters.COLLECTIONS));
+                        Contributed.EXCLUDED, Filters.and(ObjectAssociation.Filters.staticallyVisible(Where.OBJECT_FORMS), ObjectAssociation.Filters.COLLECTIONS));
                 return objectCollections.size();
             }
         };

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validprops/ObjectValidPropertiesFacetImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validprops/ObjectValidPropertiesFacetImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validprops/ObjectValidPropertiesFacetImpl.java
index 71c19a1..35d5d3f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validprops/ObjectValidPropertiesFacetImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validprops/ObjectValidPropertiesFacetImpl.java
@@ -25,7 +25,6 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public class ObjectValidPropertiesFacetImpl extends ObjectValidPropertiesFacetAbstract {
@@ -45,7 +44,7 @@ public class ObjectValidPropertiesFacetImpl extends ObjectValidPropertiesFacetAb
     public String invalidReason(final ObjectValidityContext context) {
         final StringBuilder buf = new StringBuilder();
         final ObjectAdapter adapter = context.getTarget();
-        for (final ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES)) {
+        for (final ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES)) {
             // ignore hidden properties
             if (property.isVisible(context.getSession(), adapter, where).isVetoed()) {
                 continue;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationFiltersTest_visibleWhere.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationFiltersTest_visibleWhere.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationFiltersTest_visibleWhere.java
index c8a37fe..03026ab 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationFiltersTest_visibleWhere.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationFiltersTest_visibleWhere.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
@@ -115,7 +114,7 @@ public class ObjectAssociationFiltersTest_visibleWhere {
     
     @Test
     public void test() {
-        final Filter<ObjectAssociation> filter = ObjectAssociationFilters.staticallyVisible(whereContext);
+        final Filter<ObjectAssociation> filter = ObjectAssociation.Filters.staticallyVisible(whereContext);
         assertThat(filter.accept(mockObjectAssociation), is(expectedVisibility));
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFiltersTests.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFiltersTests.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFiltersTests.java
index 8b0ad6e..2587ec3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFiltersTests.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFiltersTests.java
@@ -54,7 +54,7 @@ public class ObjectAssociationFiltersTests {
                 allowing(mockAssociation).isVisible(with(any(AuthenticationSession.class)), with(any(ObjectAdapter.class)), with(equalTo(Where.ANYWHERE)));
             }
         });
-        final Filter<ObjectAssociation> filter = ObjectAssociationFilters.dynamicallyVisible(mockSession, mockTarget, Where.ANYWHERE);
+        final Filter<ObjectAssociation> filter = ObjectAssociation.Filters.dynamicallyVisible(mockSession, mockTarget, Where.ANYWHERE);
         filter.accept(mockAssociation);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
index 8fa3a29..0bee5d1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
@@ -142,7 +142,6 @@ public class ObjectAssociationAbstractTest {
 
     @Test
     public void notPersistedWhenDerived() throws Exception {
-        // TODO: ISIS-5, need to reinstate DerivedFacet
         final NotPersistedFacet mockFacet = mockFacetIgnoring(NotPersistedFacet.class);
         facetedMethod.addFacet(mockFacet);
         assertTrue(objectAssociation.isNotPersisted());

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
index b359387..b4cdf5a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
@@ -60,7 +60,6 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
     @Mock
     private HiddenFacet facet;
 
-
     public static class Customer {
         private String firstName;
 
@@ -143,8 +142,6 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
             {
                 allowing(facet).facetType();
                 will(returnValue(HiddenFacet.class));
-                allowing(facet).when();
-                will(returnValue(When.ALWAYS));
             }
         });
 
@@ -155,8 +152,12 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
     public void alwaysHidden_forHiddenAlwaysEverywhere() throws Exception {
         context.checking(new Expectations() {
             {
+                allowing(facet).when();
+                will(returnValue(When.ALWAYS));
                 allowing(facet).where();
                 will(returnValue(Where.ANYWHERE));
+                allowing(facet).where();
+                will(returnValue(Where.OBJECT_FORMS));
             }
         });
         facetedMethod.addFacet(facet);
@@ -168,20 +169,24 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
     public void alwaysHidden_forHiddenAlwaysObjectForm() throws Exception {
         context.checking(new Expectations() {
             {
+                allowing(facet).when();
+                will(returnValue(When.ALWAYS));
                 allowing(facet).where();
                 will(returnValue(Where.OBJECT_FORMS));
             }
         });
         facetedMethod.addFacet(facet);
-        assertTrue(objectAssociation.isAlwaysHidden());
+        assertFalse(objectAssociation.isAlwaysHidden());
     }
     
     @Test
-    public void alwaysHidden_forHiddenAlwaysNowhere() throws Exception {
+    public void alwaysHidden_forHiddenOncePersistedAnywhere() throws Exception {
         context.checking(new Expectations() {
             {
+                allowing(facet).when();
+                will(returnValue(When.ONCE_PERSISTED));
                 allowing(facet).where();
-                will(returnValue(Where.NOWHERE));
+                will(returnValue(Where.ANYWHERE));
             }
         });
         facetedMethod.addFacet(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 97c1a7a..eb0a53b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -52,7 +52,6 @@ import org.apache.isis.core.metamodel.spec.Persistability;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -160,7 +159,7 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     @SuppressWarnings("unchecked")
     public List<OneToOneAssociation> getProperties(Contributed contributed) {
         @SuppressWarnings("rawtypes")
-        final List list = getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES);
+        final List list = getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES);
         return new ArrayList<OneToOneAssociation>(list);
     }
 
@@ -168,7 +167,7 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
     @SuppressWarnings("unchecked")
     public List<OneToManyAssociation> getCollections(Contributed contributed) {
         @SuppressWarnings("rawtypes")
-        final List list = getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.COLLECTIONS);
+        final List list = getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.COLLECTIONS);
         return new ArrayList<OneToManyAssociation>(list);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index 6d4f3c2..2453eee 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -68,7 +68,6 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.publish.PublishedObjectFacet;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
@@ -858,7 +857,7 @@ public class IsisTransaction implements TransactionScopedComponent {
      */
     public void enlistCreated(ObjectAdapter adapter) {
         enlist(adapter, ChangeKind.CREATE);
-        for (ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES)) {
+        for (ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES)) {
             final AdapterAndProperty aap = AdapterAndProperty.of(adapter, property);
             if(property.isNotPersisted()) {
                 continue;
@@ -881,7 +880,7 @@ public class IsisTransaction implements TransactionScopedComponent {
      */
     public void enlistUpdating(ObjectAdapter adapter) {
         enlist(adapter, ChangeKind.UPDATE);
-        for (ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES)) {
+        for (ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES)) {
             final AdapterAndProperty aap = AdapterAndProperty.of(adapter, property);
             if(property.isNotPersisted()) {
                 continue;
@@ -904,7 +903,7 @@ public class IsisTransaction implements TransactionScopedComponent {
      */
     public void enlistDeleting(ObjectAdapter adapter) {
         enlist(adapter, ChangeKind.DELETE);
-        for (ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES)) {
+        for (ObjectAssociation property : adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES)) {
             final AdapterAndProperty aap = AdapterAndProperty.of(adapter, property);
             if(property.isNotPersisted()) {
                 continue;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index 36db01e..48d6d96 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -458,19 +458,7 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     public Collection<ToDoItem> choices0Remove() {
         return getDependencies();
     }
-
-
-    // //////////////////////////////////////
-    // SimilarItems (derived collection)
-    // //////////////////////////////////////
-
     
-//    @NotPersisted
-//    @Render(Type.EAGERLY)
-//    @CssClass("x-info")
-//    public List<ToDoItem> getSimilarItems() {
-//        return toDoItems.similarTo(this);
-//    }
 
     // //////////////////////////////////////
     // Clone (action)

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
index 576ae44..d6deec6 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
@@ -23,14 +23,17 @@
                 members: {
                     description: {},
                     category: {},
-                    subcategory: {},
+                    subcategory: {
+                        actions: {
+                            updateCategory: {}
+                        }
+                    },
                     complete: {
                         actions: {
                             completed: {},
                             notYetCompleted: {}
                         }
-                    },
-                    rank: {}
+                    }
                 }
             },
             Misc: {
@@ -45,6 +48,12 @@
         memberGroups: {
             Detail: {
                 members: {
+                    priority: {
+                        actions: {
+                            previous: {},
+                            next: {}
+                        }
+                    },
                     dueBy: {},
                     cost: {
                         actions: {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index f0d45d0..ae8ae17 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -18,7 +18,6 @@
  */
 package dom.todo;
 
-import java.util.Arrays;
 import java.util.List;
 
 import com.google.common.base.Function;
@@ -54,9 +53,8 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     // priority (contributed property)
     // //////////////////////////////////////
     
-    @DescribedAs("The relative priority of this item compared to others (using 'due by' date)")
+    @DescribedAs("The relative priority of this item compared to others not yet complete (using 'due by' date)")
     @NotInServiceMenu
-    @MemberOrder(sequence="1")
     @ActionSemantics(Of.SAFE)
     @NotContributed(As.ACTION)
     @Hidden(where=Where.ALL_TABLES)
@@ -65,15 +63,9 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
             return null;
         }
 
-        // sort items ...
-        final List<ToDoItem> sortedNotYetComplete = 
-                ORDERING_DUE_BY
-                .compound(ORDERING_DESCRIPTION)
-                .sortedCopy(toDoItems.notYetComplete());
-        
-        // ... then locate this one
+        // sort items, then locate this one
         int i=1;
-        for (ToDoItem each : sortedNotYetComplete) {
+        for (ToDoItem each : sortedNotYetComplete()) {
             if(each == toDoItem) {
                 return i;
             }
@@ -82,6 +74,13 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
         return null;
     }
 
+
+    private List<ToDoItem> sortedNotYetComplete() {
+        return ORDERING_DUE_BY
+        .compound(ORDERING_DESCRIPTION)
+        .sortedCopy(toDoItems.notYetComplete());
+    }
+
     private static Ordering<ToDoItem> ORDERING_DUE_BY = 
         Ordering.natural().nullsLast().onResultOf(new Function<ToDoItem, LocalDate>(){
             @Override
@@ -97,7 +96,38 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
                 return input.getDescription();
             }
         });
+
+
+    // //////////////////////////////////////
+    // Next, Previous (contributed actions)
+    // //////////////////////////////////////
+
+    @DescribedAs("The next item not yet completed")
+    @NotInServiceMenu
+    @ActionSemantics(Of.SAFE)
+    @NotContributed(As.ASSOCIATION)
+    public ToDoItem next(final ToDoItem item) {
+        final Integer priority = priority(item);
+        int priorityOfNext = priority != null ? priority + 1 : 0;
+        return itemWithPriorityElse(priorityOfNext, item);
+    }
     
+    @DescribedAs("The previous item not yet completed")
+    @NotInServiceMenu
+    @ActionSemantics(Of.SAFE)
+    @NotContributed(As.ASSOCIATION)
+    public ToDoItem previous(final ToDoItem item) {
+        final Integer priority = priority(item);
+        int priorityOfPrevious = priority != null? priority - 1 : 0;
+        return itemWithPriorityElse(priorityOfPrevious, item);
+    }
+
+
+    private ToDoItem itemWithPriorityElse(int idx, final ToDoItem itemElse) {
+        final List<ToDoItem> items = sortedNotYetComplete();
+        return idx>=0 && items.size()>=idx? items.get(idx-1): itemElse;
+    }
+
     
     // //////////////////////////////////////
     // SimilarTo (contributed collection)
@@ -105,7 +135,6 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     
     @NotInServiceMenu
     @ActionSemantics(Of.SAFE)
-    @MemberOrder(sequence="1")
     @NotContributed(As.ACTION)
     public List<ToDoItem> similarTo(final ToDoItem toDoItem) {
         if(false) {
@@ -144,7 +173,6 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     @DescribedAs("Update category and subcategory")
     @NotInServiceMenu
     @ActionSemantics(Of.IDEMPOTENT)
-    @MemberOrder(name="Subcategory", sequence="1")
     public ToDoItem updateCategory(
             final ToDoItem item, 
             final @Named("Category") Category category,


[2/2] git commit: ISIS-503: can now order contributed members

Posted by da...@apache.org.
ISIS-503: can now order contributed members

* FacetProcessor extended to be able to request sorting on an individual object member
  * introduced new MemberOrderingFacetFactory interface to identify the facet factories that do this work
* ObjectSpecDefault/Abstract now call the FacetProcessor whenever the contributed actions/associations are computed
* ObjectActionContributee, OneToOneAssociationContributee and OneToManyAssociationContributee now have their own copy of FacetHolderImpl (initialized with the facets from the underlying contributed action), so that can sort them without side-effects
* fixed bug such that contributed actions that are associated to contributed associations are also suppressed from the header

Also:
* ObjectAction.isAlwaysHidden redefined, only true if never visible anywhere and always

And also:
* renamed ObjectAssociationFilters -> ObjectAssociation.Filters
* renamed ObjectActionFilters -> ObjectAction.Filters
* renamed ObjectActionParameterFilters -> ObjectActionParameter.Filters

And also:
* enhanced ToDoItem to demonstrate this capability
* ToDoItemContributions#next and ToDoItemContributions#previous added


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/c009dec5
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/c009dec5
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/c009dec5

Branch: refs/heads/master
Commit: c009dec571e84de2ea304807d43558ec08212111
Parents: 242739a
Author: Dan Haywood <da...@apache.org>
Authored: Thu Sep 5 11:59:39 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Sep 5 11:59:39 2013 +0100

----------------------------------------------------------------------
 ...toryFromJdoColumnAnnotationFacetFactory.java |  3 +-
 .../combined/FormWithTableSpecification.java    |  3 +-
 .../dnd/combined/SplitViewSpecification.java    |  3 +-
 .../dnd/combined/TwoPartViewSpecification.java  |  3 +-
 .../viewer/dnd/form/ExpandableViewBorder.java   |  3 +-
 .../dnd/table/AbstractTableSpecification.java   |  3 +-
 .../isis/viewer/dnd/table/TableAxisImpl.java    |  3 +-
 .../dnd/tree/ClosedObjectNodeSpecification.java |  3 +-
 .../dnd/tree/OpenObjectNodeSpecification.java   |  3 +-
 .../viewer/dnd/view/action/OptionFactory.java   |  1 -
 .../dnd/view/composite/ObjectFieldBuilder.java  |  3 +-
 .../dnd/view/content/AbstractObjectContent.java |  5 +-
 .../server/resources/DomainResourceHelper.java  |  3 +-
 .../scimpi/dispatcher/edit/EditAction.java      |  3 +-
 .../dispatcher/view/debug/DebugObjectView.java  |  3 +-
 .../view/display/AbstractFormView.java          |  3 +-
 .../view/display/AbstractTableView.java         |  3 +-
 .../dispatcher/view/display/LongFormView.java   |  3 +-
 .../scimpi/dispatcher/view/edit/EditObject.java |  3 +-
 .../scimpi/dispatcher/view/simple/EditLink.java |  3 +-
 .../dispatcher/view/simple/ObjectLink.java      |  3 +-
 .../dispatcher/view/simple/RemoveElement.java   |  3 +-
 .../wicket/model/models/BookmarkTreeNode.java   |  3 +-
 .../additionallinks/EntityActionUtil.java       |  3 +-
 .../CollectionContentsAsAjaxTablePanel.java     |  9 +-
 .../collections/EntityCollectionsPanel.java     |  3 +-
 .../entity/header/EntityHeaderPanel.java        | 10 +--
 .../entity/properties/EntityPropertiesForm.java |  5 +-
 .../widgets/cssmenu/CssMenuBuilder.java         |  4 +-
 .../isis/core/metamodel/facetapi/FacetUtil.java |  8 ++
 .../core/metamodel/facets/FacetFactory.java     | 15 +++-
 .../facets/MemberOrderingFacetFactory.java      | 79 ++++++++++++++++
 .../autocomplete/AutoCompleteFacetAbstract.java |  3 +-
 .../json/LayoutMetadataReaderFromJson.java      |  8 +-
 .../DeveloperUtilitiesServiceDefault.java       |  5 +-
 .../metamodel/spec/SpecificationContext.java    | 15 +++-
 .../metamodel/spec/feature/ObjectAction.java    |  8 +-
 .../spec/feature/ObjectActionFilters.java       | 58 ------------
 .../spec/feature/ObjectActionParameter.java     | 15 ++++
 .../spec/feature/ObjectAssociation.java         | 10 +--
 .../spec/feature/ObjectAssociationFilters.java  | 69 --------------
 .../metamodel/spec/feature/ObjectMember.java    |  2 +-
 .../spec/feature/ObjectParameterFilters.java    | 39 --------
 .../specloader/ObjectReflectorDefault.java      |  2 +-
 .../facetprocessor/FacetProcessor.java          | 39 ++++++++
 .../specimpl/ObjectActionContributee.java       | 80 +++++++++++++----
 .../specloader/specimpl/ObjectActionImpl.java   |  1 -
 .../specimpl/ObjectMemberAbstract.java          |  2 +-
 .../specimpl/ObjectSpecificationAbstract.java   | 64 ++++++++-----
 .../OneToManyAssociationContributee.java        | 94 +++++++++++++-------
 .../OneToOneAssociationContributee.java         | 73 ++++++++++++---
 .../dflt/ObjectSpecificationDefault.java        | 20 ++---
 .../ObjectSpecificationForFreeStandingList.java |  1 +
 .../apache/isis/core/metamodel/util/Dump.java   |  2 +-
 .../members/order/MemberOrderFacetFactory.java  | 42 ++++++---
 .../order/MemberOrderFacetProperties.java       |  3 +-
 .../MemberGroupLayoutFacetFactory.java          |  3 +-
 .../ObjectValidPropertiesFacetImpl.java         |  3 +-
 ...jectAssociationFiltersTest_visibleWhere.java |  3 +-
 .../feature/ObjectAssociationFiltersTests.java  |  2 +-
 .../specimpl/ObjectAssociationAbstractTest.java |  1 -
 ...ectAssociationAbstractTest_alwaysHidden.java | 17 ++--
 .../testspec/ObjectSpecificationStub.java       |  5 +-
 .../system/transaction/IsisTransaction.java     |  7 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 12 ---
 .../src/main/java/dom/todo/ToDoItem.layout.json | 15 +++-
 .../java/dom/todo/ToDoItemContributions.java    | 54 ++++++++---
 67 files changed, 560 insertions(+), 422 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
index ce668ae..d03d51d 100644
--- a/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
+++ b/component/objectstore/jdo/jdo-metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
@@ -36,7 +36,6 @@ import org.apache.isis.core.metamodel.facets.mandatory.MandatoryFacetDefault;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor;
@@ -119,7 +118,7 @@ public class MandatoryFromJdoColumnAnnotationFacetFactory extends FacetFactoryAb
 
             private void validate(ObjectSpecification objectSpec, ValidationFailures validationFailures) {
                 
-                List<ObjectAssociation> associations = objectSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES);
+                List<ObjectAssociation> associations = objectSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES);
                 for (ObjectAssociation association : associations) {
                     
                     

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/FormWithTableSpecification.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/FormWithTableSpecification.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/FormWithTableSpecification.java
index b8a5552..4c10e78 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/FormWithTableSpecification.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/FormWithTableSpecification.java
@@ -27,7 +27,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.form.FormSpecification;
 import org.apache.isis.viewer.dnd.table.InternalTableSpecification;
@@ -77,7 +76,7 @@ public class FormWithTableSpecification extends SplitViewSpecification {
         final ObjectSpecification spec = content.getSpecification();
         final ObjectAdapter target = content.getAdapter();
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, target, where));
+        final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, target, where));
         for (final ObjectAssociation field : fields) {
             if (field.isOneToManyAssociation()) {
                 return Toolkit.getContentFactory().createFieldContent(field, target);

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/SplitViewSpecification.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/SplitViewSpecification.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/SplitViewSpecification.java
index 02fbe5f..66c5a4e 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/SplitViewSpecification.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/SplitViewSpecification.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.view.Axes;
 import org.apache.isis.viewer.dnd.view.Content;
@@ -76,7 +75,7 @@ public abstract class SplitViewSpecification extends CompositeViewSpecification
         final ObjectSpecification spec = content.getSpecification();
         final ObjectAdapter target = content.getAdapter();
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, target, where));
+        final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, target, where));
         final List<ObjectAssociation> selectableFields = new ArrayList<ObjectAssociation>();
         for (final ObjectAssociation field : fields) {
             if (validField(field)) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/TwoPartViewSpecification.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/TwoPartViewSpecification.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/TwoPartViewSpecification.java
index 9c472f0..302451e 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/TwoPartViewSpecification.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/combined/TwoPartViewSpecification.java
@@ -26,7 +26,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.form.FormSpecification;
 import org.apache.isis.viewer.dnd.form.InternalFormSpecification;
@@ -70,7 +69,7 @@ public class TwoPartViewSpecification extends SplitViewSpecification {
         final ObjectSpecification spec = content.getSpecification();
         final ObjectAdapter target = content.getAdapter();
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, target, where));
+        final List<ObjectAssociation> fields = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, target, where));
         for (final ObjectAssociation field : fields) {
             if (validField(field)) {
                 return Toolkit.getContentFactory().createFieldContent(field, target);

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/form/ExpandableViewBorder.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/form/ExpandableViewBorder.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/form/ExpandableViewBorder.java
index 46f911f..ff9a757 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/form/ExpandableViewBorder.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/form/ExpandableViewBorder.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.drawing.Canvas;
@@ -206,7 +205,7 @@ public class ExpandableViewBorder extends AbstractBorder {
     private int canOpenObject(final Content content) {
         final ObjectAdapter object = ((ObjectContent) content).getObject();
         if (object != null) {
-            final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where));
+            final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where));
             for (int i = 0; i < fields.size(); i++) {
                 if (fields.get(i).isOneToManyAssociation()) {
                     return CAN_OPEN;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/AbstractTableSpecification.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/AbstractTableSpecification.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/AbstractTableSpecification.java
index 911904c..427925f 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/AbstractTableSpecification.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/AbstractTableSpecification.java
@@ -24,7 +24,6 @@ import java.util.List;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.viewer.dnd.view.Axes;
 import org.apache.isis.viewer.dnd.view.Content;
 import org.apache.isis.viewer.dnd.view.View;
@@ -80,7 +79,7 @@ public abstract class AbstractTableSpecification extends CompositeViewSpecificat
         } else {
             final CollectionContent collectionContent = (CollectionContent) requirement.getContent();
             final ObjectSpecification elementSpecification = collectionContent.getElementSpecification();
-            final List<ObjectAssociation> fields = elementSpecification.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
+            final List<ObjectAssociation> fields = elementSpecification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
             for (int i = 0; i < fields.size(); i++) {
                 if (fields.get(i).isOneToOneAssociation()) {
                     return true;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/TableAxisImpl.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/TableAxisImpl.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/TableAxisImpl.java
index 91c8666..8df3255 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/TableAxisImpl.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/table/TableAxisImpl.java
@@ -27,7 +27,6 @@ import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.viewer.dnd.view.View;
 import org.apache.isis.viewer.dnd.view.collection.CollectionContent;
@@ -43,7 +42,7 @@ public class TableAxisImpl implements TableAxis {
         // TODO create axis first, then after view built set up the axis
         // details?
         final ObjectSpecification elementSpecification = (content).getElementSpecification();
-        final List<ObjectAssociation> accessibleFields = elementSpecification.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
+        final List<ObjectAssociation> accessibleFields = elementSpecification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
 
         this.columns = tableFields(accessibleFields, content);
         widths = new int[columns.size()];

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/ClosedObjectNodeSpecification.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/ClosedObjectNodeSpecification.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/ClosedObjectNodeSpecification.java
index 31eafae..2363173 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/ClosedObjectNodeSpecification.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/ClosedObjectNodeSpecification.java
@@ -26,7 +26,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.bounded.BoundedFacetUtils;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.view.Axes;
 import org.apache.isis.viewer.dnd.view.Content;
@@ -68,7 +67,7 @@ class ClosedObjectNodeSpecification extends NodeSpecification {
     @Override
     public int canOpen(final Content content) {
         final ObjectAdapter object = ((ObjectContent) content).getObject();
-        final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where));
+        final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where));
         for (int i = 0; i < fields.size(); i++) {
             if (fields.get(i).isOneToManyAssociation()) {
                 return CAN_OPEN;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/OpenObjectNodeSpecification.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/OpenObjectNodeSpecification.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/OpenObjectNodeSpecification.java
index 6d325c1..43e3a71 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/OpenObjectNodeSpecification.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/tree/OpenObjectNodeSpecification.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.view.Axes;
 import org.apache.isis.viewer.dnd.view.Content;
@@ -72,7 +71,7 @@ public class OpenObjectNodeSpecification extends CompositeNodeSpecification {
     public boolean canDisplay(final ViewRequirement requirement) {
         if (requirement.isObject() && requirement.hasReference()) {
             final ObjectAdapter object = requirement.getAdapter();
-            final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where));
+            final List<ObjectAssociation> fields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where));
             for (int i = 0; i < fields.size(); i++) {
                 if (fields.get(i).isOneToManyAssociation()) {
                     return true;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
index 19b45b8..55c9e56 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/OptionFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.viewer.dnd.view.action;
 
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/composite/ObjectFieldBuilder.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/composite/ObjectFieldBuilder.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/composite/ObjectFieldBuilder.java
index 458babb..b8f2d9f 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/composite/ObjectFieldBuilder.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/composite/ObjectFieldBuilder.java
@@ -33,7 +33,6 @@ import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.dnd.view.Axes;
 import org.apache.isis.viewer.dnd.view.Content;
@@ -73,7 +72,7 @@ public class ObjectFieldBuilder extends AbstractViewBuilder {
         LOG.debug("build view " + view + " for " + object);
 
         final ObjectSpecification spec = object.getSpecification();
-        final Filter<ObjectAssociation> filter = ObjectAssociationFilters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where);
+        final Filter<ObjectAssociation> filter = ObjectAssociation.Filters.dynamicallyVisible(IsisContext.getAuthenticationSession(), object, where);
         final List<ObjectAssociation> flds = spec.getAssociations(Contributed.EXCLUDED, filter);
 
         if (view.getSubviews().length == 0) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/content/AbstractObjectContent.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/content/AbstractObjectContent.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/content/AbstractObjectContent.java
index 1b12ac6..6586e08 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/content/AbstractObjectContent.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/content/AbstractObjectContent.java
@@ -38,7 +38,6 @@ import org.apache.isis.core.metamodel.spec.Persistability;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.Persistor;
@@ -168,7 +167,7 @@ public abstract class AbstractObjectContent extends AbstractContent implements O
             // TODO: use Facet for this test instead.
             return new Veto("Can't set field in persistent object with reference to non-persistent object");
         }
-        final List<ObjectAssociation> fields = targetAdapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(IsisContext.getAuthenticationSession(), targetAdapter, where));
+        final List<ObjectAssociation> fields = targetAdapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(IsisContext.getAuthenticationSession(), targetAdapter, where));
         for (final ObjectAssociation fld : fields) {
             if (!fld.isOneToOneAssociation()) {
                 continue;
@@ -216,7 +215,7 @@ public abstract class AbstractObjectContent extends AbstractContent implements O
             return action.execute(target, new ObjectAdapter[] { source });
         }
 
-        final List<ObjectAssociation> associations = target.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(IsisContext.getAuthenticationSession(), target, where));
+        final List<ObjectAssociation> associations = target.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(IsisContext.getAuthenticationSession(), target, where));
 
         for (int i = 0; i < associations.size(); i++) {
             final ObjectAssociation association = associations.get(i);

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index b76261e..4c8a2e4 100644
--- a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -46,7 +46,6 @@ import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -104,7 +103,7 @@ public final class DomainResourceHelper {
 
     static boolean copyOverProperties(final RendererContext resourceContext, final ObjectAdapter objectAdapter, final JsonRepresentation propertiesList) {
         final ObjectSpecification objectSpec = objectAdapter.getSpecification();
-        final List<ObjectAssociation> properties = objectSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES);
+        final List<ObjectAssociation> properties = objectSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES);
         boolean allOk = true;
 
         for (final ObjectAssociation association : properties) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
index 5c999dd..d069ea3 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/edit/EditAction.java
@@ -36,7 +36,6 @@ import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseExce
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.transaction.MessageBroker;
@@ -79,7 +78,7 @@ public class EditAction implements Action {
 
             final ObjectAdapter adapter = context.getMappedObject(objectId);
 
-            final List<ObjectAssociation> fields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, adapter, where));
+            final List<ObjectAssociation> fields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where));
 
             for (final ObjectAssociation objectAssociation : fields) {
                 if (objectAssociation.isVisible(session, adapter, where).isVetoed()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
index 75b82d5..020377d 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/debug/DebugObjectView.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
@@ -60,7 +59,7 @@ public class DebugObjectView extends AbstractObjectProcessor {
         request.appendAsHtmlEncoded("#" + version.sequence() + " - " + version.getUser() + " (" + version.getTime() + ")" );
         request.appendHtml("</div>");
 
-        final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.ALL);
+        final List<ObjectAssociation> fields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.ALL);
 
         int row = 1;
         for (int i = 0; i < fields.size(); i++) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
index 0c4d0f0..e88f89a 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractFormView.java
@@ -27,7 +27,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractObjectProcessor;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
@@ -61,7 +60,7 @@ public abstract class AbstractFormView extends AbstractObjectProcessor {
             request.processUtilCloseTag();
 
             final AuthenticationSession session = IsisContext.getAuthenticationSession(); 
-            List<ObjectAssociation> associations = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, object, Where.OBJECT_FORMS));
+            List<ObjectAssociation> associations = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, Where.OBJECT_FORMS));
             final List<ObjectAssociation> fields = tag.includedFields(associations);
             final LinkedObject[] linkFields = tag.linkedFields(fields);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
index ed87e18..e5a2887 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
@@ -29,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.Persistor;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
@@ -89,7 +88,7 @@ public abstract class AbstractTableView extends AbstractElementProcessor {
             rowClasses = rowClassesList.split("[,|/]");
         }
 
-        final List<ObjectAssociation> allFields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
+        final List<ObjectAssociation> allFields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
         final TableContentWriter rowBuilder = createRowBuilder(request, context, isFieldEditable ? parentObjectId : null, allFields, collection);
         write(request, collection, summary, rowBuilder, tableId, tableClass, rowClasses);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
index 0ea6d5a..5630bcb 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
@@ -25,7 +25,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
 import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableView.SimpleTableBuilder;
@@ -47,7 +46,7 @@ public class LongFormView extends AbstractFormView {
             IsisContext.getPersistenceSession().resolveField(object, field);
             final ObjectAdapter collection = field.get(object);
             final ObjectSpecification elementSpec = collection.getElementSpecification();
-            final List<ObjectAssociation> fields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE);
+            final List<ObjectAssociation> fields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);
             if (noColumnsString.equalsIgnoreCase("all")) {
                 noColumns = fields.size();
             } else {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
index fb35349..90dd604 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
@@ -30,7 +30,6 @@ import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.progmodel.facets.object.choices.enums.EnumFacet;
 import org.apache.isis.core.progmodel.facets.value.booleans.BooleanValueFacet;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -113,7 +112,7 @@ public class EditObject extends AbstractElementProcessor {
         request.processUtilCloseTag();
 
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        List<ObjectAssociation> viewFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, object, where));
+        List<ObjectAssociation> viewFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, where));
         viewFields = containedBlock.includedFields(viewFields);
         final InputField[] formFields = createFields(viewFields);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
index e7e6162..ab43eb6 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/EditLink.java
@@ -29,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
@@ -47,7 +46,7 @@ public class EditLink extends AbstractLink {
     protected boolean valid(final Request request, final ObjectAdapter adapter) {
         final ObjectSpecification specification = adapter.getSpecification();
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        final List<ObjectAssociation> visibleFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, adapter, where));
+        final List<ObjectAssociation> visibleFields = specification.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where));
         final ImmutableFacet facet = specification.getFacet(ImmutableFacet.class);
         final boolean isImmutable = facet != null && facet.when() == When.ALWAYS;
         final boolean isImmutableOncePersisted = facet != null && facet.when() == When.ONCE_PERSISTED && adapter.representsPersistent();

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
index cbd2900..f2726bf 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/ObjectLink.java
@@ -26,7 +26,6 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
@@ -43,7 +42,7 @@ public class ObjectLink extends AbstractLink {
     @Override
     protected boolean valid(final Request request, final ObjectAdapter object) {
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        final List<ObjectAssociation> visibleFields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.dynamicallyVisible(session, object, where));
+        final List<ObjectAssociation> visibleFields = object.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.dynamicallyVisible(session, object, where));
         return visibleFields.size() > 0;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
index d0f7fd5..56ed442 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
@@ -133,7 +132,7 @@ public class RemoveElement extends AbstractElementProcessor {
 
         // TODO check is valid to remove element
         final AuthenticationSession session = IsisContext.getAuthenticationSession();
-        final Filter<ObjectAssociation> filter = ObjectAssociationFilters.dynamicallyVisible(session, adapter, where);
+        final Filter<ObjectAssociation> filter = ObjectAssociation.Filters.dynamicallyVisible(session, adapter, where);
         final List<ObjectAssociation> visibleFields = adapter.getSpecification().getAssociations(Contributed.EXCLUDED, filter);
         if (visibleFields.size() == 0) {
             return false;

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
index fa99d00..a4cda1c 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
@@ -32,7 +32,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
 
@@ -116,7 +115,7 @@ public class BookmarkTreeNode implements Serializable {
             if(candidateBookmarkableModel instanceof EntityModel) {
                 EntityModel entityModel = (EntityModel) candidateBookmarkableModel;
                 final ObjectAdapter candidateAdapter = entityModel.getObject();
-                final List<ObjectAssociation> properties = candidateAdapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.REFERENCE_PROPERTIES);
+                final List<ObjectAssociation> properties = candidateAdapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.REFERENCE_PROPERTIES);
                 for (ObjectAssociation objectAssoc : properties) {
                     final ObjectAdapter possibleParentAdapter = objectAssoc.get(candidateAdapter);
                     if(possibleParentAdapter == null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/EntityActionUtil.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/EntityActionUtil.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/EntityActionUtil.java
index 9c6fe5a..dac7df2 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/EntityActionUtil.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/additionallinks/EntityActionUtil.java
@@ -40,7 +40,6 @@ import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -86,7 +85,7 @@ public final class EntityActionUtil {
     private static Filter<ObjectAction> dynamicallyVisibleFor(final ObjectAdapter adapter) {
         final AuthenticationSessionProvider asa = (AuthenticationSessionProvider) Session.get();
         AuthenticationSession authSession = asa.getAuthenticationSession();
-        return ObjectActionFilters.dynamicallyVisible(authSession, adapter, Where.ANYWHERE);
+        return ObjectAction.Filters.dynamicallyVisible(authSession, adapter, Where.ANYWHERE);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index d808f00..0becb33 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -43,10 +43,7 @@ import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.common.SelectionHandler;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -66,7 +63,7 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
  */
 public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityCollectionModel> {
 
-    private static final Predicate<ObjectAction> BULK = Filters.asPredicate(ObjectActionFilters.bulk());
+    private static final Predicate<ObjectAction> BULK = Filters.asPredicate(ObjectAction.Filters.bulk());
 
     private static final long serialVersionUID = 1L;
 
@@ -198,8 +195,8 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
         
         @SuppressWarnings("unchecked")
         final Filter<ObjectAssociation> filter = Filters.and(
-                ObjectAssociationFilters.PROPERTIES, 
-                ObjectAssociationFilters.staticallyVisible(getModel().isParented()? Where.PARENTED_TABLES: Where.STANDALONE_TABLES),
+                ObjectAssociation.Filters.PROPERTIES, 
+                ObjectAssociation.Filters.staticallyVisible(getModel().isParented()? Where.PARENTED_TABLES: Where.STANDALONE_TABLES),
                 associationDoesNotReferenceParent(parentSpecIfAny));
         final List<? extends ObjectAssociation> propertyList = typeOfSpec.getAssociations(Contributed.INCLUDED, filter);
         for (final ObjectAssociation property : propertyList) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
index 34651ee..d255445 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
@@ -124,7 +123,7 @@ public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
 
     @SuppressWarnings("unchecked")
 	private Filter<ObjectAssociation> visibleCollectionsFilter(final ObjectAdapter adapter) {
-        return Filters.and(ObjectAssociationFilters.COLLECTIONS, ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter, Where.PARENTED_TABLES));
+        return Filters.and(ObjectAssociation.Filters.COLLECTIONS, ObjectAssociation.Filters.dynamicallyVisible(getAuthenticationSession(), adapter, Where.PARENTED_TABLES));
     }
 
     private void requestRepaintPanel(final AjaxRequestTarget target) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
index 5cb0729..9593147 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -36,8 +36,6 @@ import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociations;
 import org.apache.isis.core.runtime.system.DeploymentType;
@@ -135,13 +133,13 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
         final ObjectSpecification adapterSpec = adapter.getSpecification();
         @SuppressWarnings("unchecked")
         final List<ObjectAction> userActions = adapterSpec.getObjectActions(actionType, Contributed.INCLUDED, 
-                Filters.and(memberOrderNameNotCollection(adapterSpec), dynamicallyVisibleFor(adapter)));
+                Filters.and(memberOrderNameNotAssociation(adapterSpec), dynamicallyVisibleFor(adapter)));
         topLevelActions.addAll(userActions);
     }
     
-    private Filter<ObjectAction> memberOrderNameNotCollection(final ObjectSpecification adapterSpec) {
+    private Filter<ObjectAction> memberOrderNameNotAssociation(final ObjectSpecification adapterSpec) {
 
-        final List<ObjectAssociation> associations = adapterSpec.getAssociations(Contributed.EXCLUDED);
+        final List<ObjectAssociation> associations = adapterSpec.getAssociations(Contributed.INCLUDED);
         final List<String> associationNames = Lists.transform(associations, ObjectAssociations.toName());
         final List<String> associationIds = Lists.transform(associations, ObjectAssociations.toId());
 
@@ -161,7 +159,7 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
 
 
     protected Filter<ObjectAction> dynamicallyVisibleFor(final ObjectAdapter adapter) {
-        return ObjectActionFilters.dynamicallyVisible(getAuthenticationSession(), adapter, Where.ANYWHERE);
+        return ObjectAction.Filters.dynamicallyVisible(getAuthenticationSession(), adapter, Where.ANYWHERE);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
index 770b09d..181b11f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
@@ -55,7 +55,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications.MemberGroupLayoutHint;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociations;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.memento.Memento;
@@ -236,7 +235,7 @@ class EntityPropertiesForm extends FormAbstract<ObjectAdapter> {
 
     @SuppressWarnings("unchecked")
     private Filter<ObjectAssociation> visiblePropertyFilter(final ObjectAdapter adapter, Where where) {
-        return Filters.and(ObjectAssociationFilters.PROPERTIES, ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter, where));
+        return Filters.and(ObjectAssociation.Filters.PROPERTIES, ObjectAssociation.Filters.dynamicallyVisible(getAuthenticationSession(), adapter, where));
     }
 
     private void addButtons(MarkupContainer markupContainer) {
@@ -501,7 +500,7 @@ class EntityPropertiesForm extends FormAbstract<ObjectAdapter> {
 
     @SuppressWarnings("unchecked")
     private Filter<ObjectAssociation> enabledAssociationFilter(final ObjectAdapter adapter) {
-        return Filters.and(ObjectAssociationFilters.PROPERTIES, ObjectAssociationFilters.enabled(getAuthenticationSession(), adapter, Where.OBJECT_FORMS));
+        return Filters.and(ObjectAssociation.Filters.PROPERTIES, ObjectAssociation.Filters.enabled(getAuthenticationSession(), adapter, Where.OBJECT_FORMS));
     }
 
     private void toEditMode(final AjaxRequestTarget target) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
index fb41708..7d8f6ba 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuBuilder.java
@@ -28,9 +28,7 @@ import com.google.common.collect.Collections2;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
 import org.apache.isis.core.progmodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.progmodel.facets.actions.notcontributed.NotContributedFacet;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -106,7 +104,7 @@ public class CssMenuBuilder {
     }
 
     private void addMenuItemsForActionsOfType(final CssMenuItem parent, final List<ObjectAction> actions, final ActionType type) {
-        final Collection<ObjectAction> filterActionsOfType = Collections2.filter(actions, Filters.asPredicate(ObjectActionFilters.filterOfType(type)));
+        final Collection<ObjectAction> filterActionsOfType = Collections2.filter(actions, Filters.asPredicate(ObjectAction.Filters.ofType(type)));
         for (final ObjectAction action : filterActionsOfType) {
             addMenuItem(parent, action);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
index e618300..2116a68 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
@@ -150,4 +150,12 @@ public final class FacetUtil {
         return facetByType;
     }
 
+    public static void copyFacets(final FacetHolder source, final FacetHolder target) {
+        List<Facet> facets = source.getFacets(org.apache.isis.applib.filter.Filters.<Facet>any());
+        for (Facet facet : facets) {
+            target.addFacet(facet);
+        }
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index 7048ec6..e7638bb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -30,6 +30,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 
 public interface FacetFactory {
 
@@ -44,6 +46,11 @@ public interface FacetFactory {
             return facetHolder;
         }
     }
+    
+    public interface ProcessContextWithMetadataProperties<T extends FacetHolder> {
+        public Properties metadataProperties(String prefix);
+        public T getFacetHolder();
+    }
 
     /**
      * The {@link FeatureType feature type}s that this facet factory can create
@@ -61,7 +68,7 @@ public interface FacetFactory {
     // process class
     // //////////////////////////////////////
 
-    public static class ProcessClassContext extends AbstractProcessContext<FacetHolder> implements MethodRemover {
+    public static class ProcessClassContext extends AbstractProcessContext<FacetHolder> implements MethodRemover, ProcessContextWithMetadataProperties<FacetHolder> {
         private final Class<?> cls;
         private final MethodRemover methodRemover;
         private final Properties metadataProperties;
@@ -130,7 +137,7 @@ public interface FacetFactory {
     // //////////////////////////////////////
 
 
-    public static class ProcessMethodContext extends AbstractProcessContext<FacetedMethod> implements MethodRemover {
+    public static class ProcessMethodContext extends AbstractProcessContext<FacetedMethod> implements MethodRemover, ProcessContextWithMetadataProperties<FacetedMethod> {
         private final Class<?> cls;
         private final FeatureType featureType;
         private final Properties metadataProperties;
@@ -212,7 +219,9 @@ public interface FacetFactory {
      */
     void process(ProcessMethodContext processMethodContext);
 
-    
+
+
+
     // //////////////////////////////////////
     // process param
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MemberOrderingFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MemberOrderingFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MemberOrderingFacetFactory.java
new file mode 100644
index 0000000..881fc18
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MemberOrderingFacetFactory.java
@@ -0,0 +1,79 @@
+/*
+ *  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;
+
+import java.util.Properties;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.lang.PropertyUtil;
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+
+/**
+ * A {@link FacetFactory} which orders {@link ObjectMember}s (eg, according to
+ * the {@link MemberOrderFacet}).
+ */
+public interface MemberOrderingFacetFactory extends FacetFactory {
+
+    public static class ProcessMemberContext extends AbstractProcessContext<ObjectMember> implements ProcessContextWithMetadataProperties<ObjectMember> {
+        
+        private final Properties metadataProperties;
+
+        public ProcessMemberContext(
+                final Properties metadataProperties, 
+                final ObjectMember facetHolder) {
+            super(facetHolder);
+            this.metadataProperties = metadataProperties;
+        }
+
+        public Properties metadataProperties(String prefix) {
+            
+            if(metadataProperties == null) {
+                return null;
+            }
+            Identifier identifier = getFacetHolder().getIdentifier();
+            final String id = identifier.getMemberName();
+            
+            // bit of a hack; to distinguish between actions and properties that have same identifier
+            // eg getPaidBy() and paidBy()
+            if(getFacetHolder() instanceof ObjectAction) {
+                Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix+"."+id+"()");
+                if (!subsetProperties.isEmpty()) {
+                    return subsetProperties;
+                } 
+            }
+
+            // otherwise, regular processing...
+            Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix+"."+id);
+            if (!subsetProperties.isEmpty()) {
+                return subsetProperties;
+            }
+            
+            return null;
+        }
+    }
+    
+    /**
+     * Sort the member, and return the correctly setup annotation if present.
+     */
+    void process(ProcessMemberContext processMemberContext);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index 83ce224..2b563cc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
 
 public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements AutoCompleteFacet {
 
@@ -97,7 +96,7 @@ public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements
     private void cacheRepositoryAction() {
         try {
             final ObjectSpecification repositorySpec = specificationLoader.loadSpecification(repositoryClass);
-            final List<ObjectAction> objectActions = repositorySpec.getObjectActions(ActionType.USER, Contributed.EXCLUDED, ObjectActionFilters.withId(actionName));
+            final List<ObjectAction> objectActions = repositorySpec.getObjectActions(ActionType.USER, Contributed.EXCLUDED, ObjectAction.Filters.withId(actionName));
 
             repositoryAction = objectActions.size() == 1? objectActions.get(0): null;
         } finally {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index 642fa8a..2ba2e79 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -52,10 +52,8 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications.MemberGroupLayoutHint;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociations;
 
 public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
@@ -310,13 +308,13 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
     private static List<ObjectAssociation> propertiesOf(final ObjectSpecification objSpec) {
         return objSpec.getAssociations(Contributed.EXCLUDED, 
                 Filters.and(ObjectAssociation.Filters.PROPERTIES, 
-                            ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE));
+                            ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES));
     }
     @SuppressWarnings("unchecked")
     private static List<ObjectAssociation> collectionsOf(final ObjectSpecification objSpec) {
         return objSpec.getAssociations(Contributed.EXCLUDED, 
                 Filters.and(ObjectAssociation.Filters.COLLECTIONS, 
-                            ObjectAssociation.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE));
+                            ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES));
     }
     private static List<ObjectAction> actionsOf(final ObjectSpecification objSpec, final Set<String> excludedActionIds) {
         return objSpec.getObjectActions(ActionType.ALL, Contributed.INCLUDED, staticallyVisibleExcluding(excludedActionIds));
@@ -325,7 +323,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
     @SuppressWarnings("unchecked")
     private static Filter<ObjectAction> staticallyVisibleExcluding(final Set<String> excludedActionIds) {
         return Filters.and(
-                ObjectAction.Filters.WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE, 
+                ObjectAction.Filters.VISIBLE_AT_LEAST_SOMETIMES, 
                 new Filter<ObjectAction>(){
                     @Override
                     public boolean accept(ObjectAction t) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/DeveloperUtilitiesServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/DeveloperUtilitiesServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/DeveloperUtilitiesServiceDefault.java
index 328c3dc..1c13ab6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/DeveloperUtilitiesServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/devutils/DeveloperUtilitiesServiceDefault.java
@@ -50,7 +50,6 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpiAware;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -83,7 +82,7 @@ public class DeveloperUtilitiesServiceDefault implements DeveloperUtilitiesServi
             if (exclude(spec)) {
                 continue;
             }
-            final List<ObjectAssociation> properties = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.PROPERTIES);
+            final List<ObjectAssociation> properties = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES);
             for (ObjectAssociation property : properties) {
                 final OneToOneAssociation otoa = (OneToOneAssociation) property;
                 if (exclude(otoa)) {
@@ -91,7 +90,7 @@ public class DeveloperUtilitiesServiceDefault implements DeveloperUtilitiesServi
                 }
                 rows.add(new MetaModelRow(spec, otoa));
             }
-            final List<ObjectAssociation> associations = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociationFilters.COLLECTIONS);
+            final List<ObjectAssociation> associations = spec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.COLLECTIONS);
             for (ObjectAssociation collection : associations) {
                 final OneToManyAssociation otma = (OneToManyAssociation) collection;
                 if (exclude(otma)) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationContext.java
index 7e7cecb..a55b94f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationContext.java
@@ -19,6 +19,7 @@ package org.apache.isis.core.metamodel.spec;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 
 public class SpecificationContext {
 
@@ -27,13 +28,21 @@ public class SpecificationContext {
     private final ServicesProvider servicesProvider;
     private final ObjectInstantiator objectInstantiator;
     private final SpecificationLoader specificationLookup;
+    private final FacetProcessor facetProcessor;
 
-    public SpecificationContext(final DeploymentCategory deploymentCategory, final AuthenticationSessionProvider authenticationSessionProvider, final ServicesProvider servicesProvider, final ObjectInstantiator objectInstantiator, final SpecificationLoader specificationLookup) {
+    public SpecificationContext(
+            final DeploymentCategory deploymentCategory, 
+            final AuthenticationSessionProvider authenticationSessionProvider, 
+            final ServicesProvider servicesProvider, 
+            final ObjectInstantiator objectInstantiator, 
+            final SpecificationLoader specificationLookup,
+            final FacetProcessor facetProcessor) {
         this.deploymentCategory = deploymentCategory;
         this.authenticationSessionProvider = authenticationSessionProvider;
         this.servicesProvider = servicesProvider;
         this.objectInstantiator = objectInstantiator;
         this.specificationLookup = specificationLookup;
+        this.facetProcessor = facetProcessor;
     }
 
     public DeploymentCategory getDeploymentCategory() {
@@ -55,4 +64,8 @@ public class SpecificationContext {
     public SpecificationLoader getSpecificationLookup() {
         return specificationLookup;
     }
+
+    public FacetProcessor getFacetProcessor() {
+        return facetProcessor;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/c009dec5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index f3e2a6b..c3227a3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.spec.feature;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -30,6 +31,8 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetFilters;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.interactions.AccessContext;
 import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
@@ -179,10 +182,11 @@ public interface ObjectAction extends ObjectMember {
         
         private Filters(){}
         
-        public static final Filter<ObjectAction> WHEN_VISIBLE_IRRESPECTIVE_OF_WHERE = new Filter<ObjectAction>() {
+        public static final Filter<ObjectAction> VISIBLE_AT_LEAST_SOMETIMES = new Filter<ObjectAction>() {
             @Override
             public boolean accept(final ObjectAction action) {
-                return !action.isAlwaysHidden();
+                final HiddenFacet hiddenFacet = action.getFacet(HiddenFacet.class);
+                return hiddenFacet == null || hiddenFacet.when() != When.ALWAYS || hiddenFacet.where() != Where.ANYWHERE;
             }
         };