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 2017/04/27 23:18:36 UTC

[2/2] isis git commit: ISIS-1603: working towards action prompts inline

ISIS-1603: working towards action prompts inline

seemingly mostly there, but need to do the cancel and then some more thorough testing


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

Branch: refs/heads/ISIS-1603
Commit: 977ab2f229f80aa246ca516717c27bc67cd35cbb
Parents: ae298df
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Apr 28 00:18:29 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Apr 28 00:18:29 2017 +0100

----------------------------------------------------------------------
 .../applib/layout/component/component.xsd       |   4 +
 .../isis/applib/annotation/ActionLayout.java    |   6 +
 .../isis/applib/annotation/PromptStyle.java     |   5 +
 .../isis/applib/annotation/PropertyLayout.java  |  10 +-
 .../layout/component/ActionLayoutData.java      |  12 +
 .../layout/component/PropertyLayoutData.java    |  25 +-
 .../layout/ActionLayoutFacetFactory.java        |  14 +-
 .../layout/HiddenFacetForActionLayoutXml.java   |  52 ----
 .../actions/layout/HiddenFacetForActionXml.java |  52 ++++
 ...omptStyleFacetForActionLayoutAnnotation.java |  90 +++++++
 .../layout/PromptStyleFacetForActionXml.java    |  49 ++++
 ...tStyleFacetOnActionFromLayoutProperties.java |  57 +++++
 .../PromptStyleFacetForPropertyLayoutXml.java   |  49 ----
 .../PromptStyleFacetForPropertyXml.java         |  49 ++++
 ...tyleFacetOnPropertyFromLayoutProperties.java |   4 +-
 .../layoutmetadata/ActionLayoutFacetRepr.java   |   3 +-
 .../layoutmetadata/PropertyLayoutFacetRepr.java |   2 +-
 .../grid/GridSystemServiceAbstract.java         |  12 +-
 .../metamodel/spec/feature/ObjectAction.java    |  90 ++++++-
 .../metamodel/spec/feature/ObjectActions.java   |   4 +-
 .../viewer/wicket/model/links/LinkAndLabel.java |  27 +-
 .../viewer/wicket/model/models/ActionModel.java |  49 +++-
 .../wicket/model/models/FormExecutor.java       |   3 -
 .../wicket/model/models/HasFormExecutor.java    |   5 -
 .../viewer/wicket/model/models/ScalarModel.java |  29 ++-
 .../entityactions/AdditionalLinksPanel.java     |   1 -
 .../entityactions/EntityActionLinkFactory.java  |   4 +-
 .../entityactions/EntityActionUtil.java         | 189 --------------
 .../entityactions/LinkAndLabelUtil.java         |  97 ++++++++
 .../actionmenu/serviceactions/CssMenuItem.java  |  10 +-
 .../ServiceActionLinkFactory.java               |   7 +-
 .../ui/components/actions/ActionPanel.java      | 194 +--------------
 .../components/actions/ActionPanelFactory.java  |   3 +-
 .../actions/ActionParametersFormExecutor.java   | 247 +++++++++++++++++++
 .../components/collection/CollectionPanel.java  |  11 +-
 .../entity/fieldset/PropertyGroup.java          |  10 +-
 .../entity/header/EntityHeaderPanel.java        |  10 +-
 .../ui/components/layout/bs3/col/Col.java       |  19 +-
 .../property/PropertyEditFormExecutor.java      |   6 +-
 .../components/scalars/ScalarPanelAbstract.java |  50 ++--
 .../linkandlabel/ActionLinkFactoryAbstract.java | 190 +++++++-------
 41 files changed, 1060 insertions(+), 690 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
index 9d9749b..a83d9dd 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
@@ -37,6 +37,10 @@
     <xs:attribute name="hidden" type="tns:where"/>
     <xs:attribute name="id" type="xs:string" use="required"/>
     <xs:attribute name="namedEscaped" type="xs:boolean"/>
+
+    <!-- 1.15.0-SNAPSHOT -->
+    <xs:attribute name="promptStyle" type="tns:promptStyle"/>
+
     <xs:attribute name="position" type="tns:position"/>
   </xs:complexType>
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index 73982e9..3c91af5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -124,6 +124,12 @@ public @interface ActionLayout {
         PANEL_DROPDOWN
     }
 
+    /**
+     * How this parameters for this action are prompted, either {@link PromptStyle#DIALOG dialog} or {@link PromptStyle#INLINE inline}.
+     */
+    PromptStyle promptStyle() default PromptStyle.AS_CONFIGURED;
+
+
     // //////////////////////////////////////
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
index bcfd188..46f4012 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
@@ -18,9 +18,14 @@
  */
 package org.apache.isis.applib.annotation;
 
+import javax.xml.bind.annotation.XmlType;
+
 /**
  * How prompting for new values (property edit) should be performed
  */
+@XmlType(
+        namespace = "http://isis.apache.org/applib/layout/component"
+)
 public enum PromptStyle {
     /**
      * Edit the property according to the default edit style policy configured in <tt>isis.properties</tt>.

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
index 1594a76..dae0a20 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
@@ -43,11 +43,6 @@ public @interface PropertyLayout {
 
 
     /**
-     * How the properties of this domain object are be edited, either {@link PromptStyle#DIALOG dialog} or {@link PromptStyle#INLINE inline}.
-     */
-    PromptStyle promptStyle() default PromptStyle.AS_CONFIGURED;
-
-    /**
      * Indicates where in the UI the property should <i>not</i>not be visible.
      */
     Where hidden() default Where.NOT_SPECIFIED;
@@ -77,6 +72,11 @@ public @interface PropertyLayout {
     boolean namedEscaped() default true;
 
     /**
+     * How the properties of this domain object are be edited, either {@link PromptStyle#DIALOG dialog} or {@link PromptStyle#INLINE inline}.
+     */
+    PromptStyle promptStyle() default PromptStyle.AS_CONFIGURED;
+
+    /**
      * For date properties (and parameters) only, instructs the viewer that the date should be rendered as one day
      * prior to the actually stored date.
      *

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
index a88229a..b1a19cc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/component/ActionLayoutData.java
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
 
 /**
@@ -207,6 +208,17 @@ public class ActionLayoutData implements Serializable, Owned<ActionLayoutDataOwn
     }
 
 
+    private PromptStyle promptStyle;
+
+    @XmlAttribute(required = false)
+    public PromptStyle getPromptStyle() {
+        return promptStyle;
+    }
+
+    public void setPromptStyle(PromptStyle promptStyle) {
+        this.promptStyle = promptStyle;
+    }
+
 
 
     private ActionLayoutDataOwner owner;

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
index 0485ffd..9388740 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/component/PropertyLayoutData.java
@@ -107,18 +107,6 @@ public class PropertyLayoutData
     }
 
 
-    private PromptStyle promptStyle;
-
-    @XmlAttribute(required = false)
-    public PromptStyle getPromptStyle() {
-        return promptStyle;
-    }
-
-    public void setPromptStyle(PromptStyle promptStyle) {
-        this.promptStyle = promptStyle;
-    }
-
-
     private Where hidden;
 
     @Override
@@ -185,6 +173,19 @@ public class PropertyLayoutData
     }
 
 
+    private PromptStyle promptStyle;
+
+    @XmlAttribute(required = false)
+    public PromptStyle getPromptStyle() {
+        return promptStyle;
+    }
+
+    public void setPromptStyle(PromptStyle promptStyle) {
+        this.promptStyle = promptStyle;
+    }
+
+
+
     private Boolean renderedAsDayBefore;
 
     @XmlAttribute(required = false)

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index 6b2251e..1f71b77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -39,6 +39,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 
@@ -52,8 +53,8 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
     public void process(final ProcessMethodContext processMethodContext) {
 
         final FacetHolder holder = processMethodContext.getFacetHolder();
-
         Properties properties = processMethodContext.metadataProperties("actionLayout");
+
         if(properties == null) {
             // alternate key
             properties = processMethodContext.metadataProperties("layout");
@@ -108,6 +109,16 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         }
         FacetUtil.addFacet(namedFacet);
 
+        // promptStyle
+        PromptStyleFacet promptStyleFacet = PromptStyleFacetOnActionFromLayoutProperties
+                .create(properties, holder);
+        if(promptStyleFacet == null) {
+            promptStyleFacet = PromptStyleFacetForActionLayoutAnnotation
+                    .create(actionLayout, getConfiguration(), holder);
+        }
+
+        FacetUtil.addFacet(promptStyleFacet);
+
 
         // position
         ActionPositionFacet actionPositionFacet = ActionPositionFacetOnActionFromLayoutProperties.create(properties, holder);
@@ -121,7 +132,6 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
 
         // contributing
-
         if (isContributingServiceOrMixinObject(processMethodContext)) {
             NotContributedFacet notContributedFacet = NotContributedFacetForLayoutProperties.create(properties, holder);
             if(notContributedFacet == null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java
deleted file mode 100644
index b4114fb..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionLayoutXml.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.actions.layout;
-
-import org.apache.isis.applib.annotation.When;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.layout.component.ActionLayoutData;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
-
-public class HiddenFacetForActionLayoutXml extends HiddenFacetAbstract {
-
-    public static HiddenFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
-        if (actionLayout == null) {
-            return null;
-        }
-        final Where where = actionLayout.getHidden();
-        return where != null && where != Where.NOT_SPECIFIED  ? new HiddenFacetForActionLayoutXml(where, holder) : null;
-    }
-
-    private HiddenFacetForActionLayoutXml(final Where where, final FacetHolder holder) {
-        super(When.ALWAYS, where, holder);
-    }
-
-    @Override
-    public String hiddenReason(final ObjectAdapter targetAdapter, final Where whereContext) {
-        if(!where().includes(whereContext)) {
-            return null;
-        }
-        return "Hidden on " + where().getFriendlyName();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionXml.java
new file mode 100644
index 0000000..433a859
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/HiddenFacetForActionXml.java
@@ -0,0 +1,52 @@
+/*
+ *  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.actions.layout;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.layout.component.ActionLayoutData;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
+
+public class HiddenFacetForActionXml extends HiddenFacetAbstract {
+
+    public static HiddenFacet create(final ActionLayoutData actionLayout, final FacetHolder holder) {
+        if (actionLayout == null) {
+            return null;
+        }
+        final Where where = actionLayout.getHidden();
+        return where != null && where != Where.NOT_SPECIFIED  ? new HiddenFacetForActionXml(where, holder) : null;
+    }
+
+    private HiddenFacetForActionXml(final Where where, final FacetHolder holder) {
+        super(When.ALWAYS, where, holder);
+    }
+
+    @Override
+    public String hiddenReason(final ObjectAdapter targetAdapter, final Where whereContext) {
+        if(!where().includes(whereContext)) {
+            return null;
+        }
+        return "Hidden on " + where().getFriendlyName();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
new file mode 100644
index 0000000..1361aa0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
@@ -0,0 +1,90 @@
+/*
+ *  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.actions.layout;
+
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleConfiguration;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAsConfigured;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetFallBack;
+
+public class PromptStyleFacetForActionLayoutAnnotation extends PromptStyleFacetAbstract {
+
+    private final PromptStyle promptStyle;
+
+    public PromptStyleFacetForActionLayoutAnnotation(final PromptStyle promptStyle, final FacetHolder holder) {
+        super( holder );
+        this.promptStyle = promptStyle;
+    }
+
+    public static PromptStyleFacet create(
+            final ActionLayout actionLayout,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        PromptStyle promptStyle = actionLayout != null? actionLayout.promptStyle() : null;
+
+        if(promptStyle == null) {
+            if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                // do not replace
+                return null;
+            }
+
+            return new PromptStyleFacetFallBack(holder);
+        } else {
+
+            switch (promptStyle) {
+                case DIALOG:
+                case INLINE:
+                    return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
+
+                case AS_CONFIGURED:
+
+                    // do not replace
+                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                        return null;
+                    }
+
+                    promptStyle = PromptStyleConfiguration.parse(configuration);
+                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
+
+                default:
+
+                    // do not replace
+                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
+                        return null;
+                    }
+
+                    promptStyle = PromptStyleConfiguration.parse(configuration);
+                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
+            }
+        }
+
+    }
+
+    @Override
+    public PromptStyle value() {
+        return promptStyle;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionXml.java
new file mode 100644
index 0000000..7fde483
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionXml.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.layout;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.layout.component.ActionLayoutData;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
+
+public class PromptStyleFacetForActionXml extends PromptStyleFacetAbstract {
+
+    public static PromptStyleFacet create(ActionLayoutData actionLayout, FacetHolder holder) {
+        if(actionLayout == null) {
+            return null;
+        }
+        final PromptStyle promptStyle = actionLayout.getPromptStyle();
+        return promptStyle != null ? new PromptStyleFacetForActionXml(promptStyle, holder) : null;
+    }
+
+    private final PromptStyle promptStyle;
+
+    private PromptStyleFacetForActionXml(PromptStyle promptStyle, FacetHolder holder) {
+        super(holder);
+        this.promptStyle = promptStyle;
+    }
+
+    @Override
+    public PromptStyle value() {
+        return promptStyle;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetOnActionFromLayoutProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetOnActionFromLayoutProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetOnActionFromLayoutProperties.java
new file mode 100644
index 0000000..2b5b5ba
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetOnActionFromLayoutProperties.java
@@ -0,0 +1,57 @@
+/*
+ *  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.actions.layout;
+
+import java.util.Properties;
+
+import com.google.common.base.Strings;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
+
+public class PromptStyleFacetOnActionFromLayoutProperties extends PromptStyleFacetAbstract {
+
+    private final PromptStyle promptStyle;
+
+    public static PromptStyleFacet create(Properties properties, FacetHolder holder) {
+        final PromptStyle promptStyle = promptStyle(properties);
+        return promptStyle != null? new PromptStyleFacetOnActionFromLayoutProperties(promptStyle, holder): null;
+    }
+
+    private PromptStyleFacetOnActionFromLayoutProperties(PromptStyle promptStyle, FacetHolder holder) {
+        super(holder);
+        this.promptStyle = promptStyle;
+    }
+
+    private static PromptStyle promptStyle(Properties properties) {
+        if(properties == null) {
+            return null;
+        }
+        String propertyPromptStyle = Strings.emptyToNull(properties.getProperty("promptStyle"));
+        return PromptStyle.valueOf(propertyPromptStyle);
+    }
+
+    @Override
+    public PromptStyle value() {
+        return promptStyle;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
deleted file mode 100644
index 5df1ffd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutXml.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.properties.propertylayout;
-
-import org.apache.isis.applib.annotation.PromptStyle;
-import org.apache.isis.applib.layout.component.PropertyLayoutData;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
-import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
-
-public class PromptStyleFacetForPropertyLayoutXml extends PromptStyleFacetAbstract {
-
-    public static PromptStyleFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
-        if(propertyLayout == null) {
-            return null;
-        }
-        final PromptStyle promptStyle = propertyLayout.getPromptStyle();
-        return promptStyle != null ? new PromptStyleFacetForPropertyLayoutXml(promptStyle, holder) : null;
-    }
-
-    private final PromptStyle promptStyle;
-
-    private PromptStyleFacetForPropertyLayoutXml(PromptStyle promptStyle, FacetHolder holder) {
-        super(holder);
-        this.promptStyle = promptStyle;
-    }
-
-    @Override
-    public PromptStyle value() {
-        return promptStyle;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyXml.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyXml.java
new file mode 100644
index 0000000..bde7a3d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyXml.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.properties.propertylayout;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.layout.component.PropertyLayoutData;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAbstract;
+
+public class PromptStyleFacetForPropertyXml extends PromptStyleFacetAbstract {
+
+    public static PromptStyleFacet create(PropertyLayoutData propertyLayout, FacetHolder holder) {
+        if(propertyLayout == null) {
+            return null;
+        }
+        final PromptStyle promptStyle = propertyLayout.getPromptStyle();
+        return promptStyle != null ? new PromptStyleFacetForPropertyXml(promptStyle, holder) : null;
+    }
+
+    private final PromptStyle promptStyle;
+
+    private PromptStyleFacetForPropertyXml(PromptStyle promptStyle, FacetHolder holder) {
+        super(holder);
+        this.promptStyle = promptStyle;
+    }
+
+    @Override
+    public PromptStyle value() {
+        return promptStyle;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetOnPropertyFromLayoutProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetOnPropertyFromLayoutProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetOnPropertyFromLayoutProperties.java
index 0f11ff4..3620f5a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetOnPropertyFromLayoutProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetOnPropertyFromLayoutProperties.java
@@ -46,8 +46,8 @@ public class PromptStyleFacetOnPropertyFromLayoutProperties extends PromptStyleF
         if(properties == null) {
             return null;
         }
-        String propertyEditStyle = Strings.emptyToNull(properties.getProperty("promptStyle"));
-        return PromptStyle.valueOf(propertyEditStyle);
+        String propertyPromptStyle = Strings.emptyToNull(properties.getProperty("promptStyle"));
+        return PromptStyle.valueOf(propertyPromptStyle);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
index e8612f8..cb6d134 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
@@ -16,10 +16,10 @@
  */
 package org.apache.isis.core.metamodel.layoutmetadata;
 
-
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Contributed;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
 
 public class ActionLayoutFacetRepr {
@@ -31,6 +31,7 @@ public class ActionLayoutFacetRepr {
     public Where hidden;
     public String named;
     public boolean namedEscaped = true;
+    public PromptStyle promptStyle;
     public ActionLayout.Position position;
     public Contributed contributed;
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/PropertyLayoutFacetRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/PropertyLayoutFacetRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/PropertyLayoutFacetRepr.java
index e96f744..479692d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/PropertyLayoutFacetRepr.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/PropertyLayoutFacetRepr.java
@@ -25,12 +25,12 @@ public class PropertyLayoutFacetRepr {
 
     public String cssClass;
     public String describedAs;
-    public PromptStyle editStyle;
     public Where hidden;
     public LabelPosition labelPosition;
     public int multiLine;
     public String named;
     public boolean namedEscaped = true;
+    public PromptStyle promptStyle;
     public boolean renderedAsDayBefore;
     public int typicalLength;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 2a3db3a..344d1f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -61,8 +61,9 @@ import org.apache.isis.core.metamodel.facets.actions.layout.BookmarkPolicyFacetF
 import org.apache.isis.core.metamodel.facets.actions.layout.CssClassFaFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.CssClassFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.DescribedAsFacetForActionXml;
-import org.apache.isis.core.metamodel.facets.actions.layout.HiddenFacetForActionLayoutXml;
+import org.apache.isis.core.metamodel.facets.actions.layout.HiddenFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.NamedFacetForActionXml;
+import org.apache.isis.core.metamodel.facets.actions.layout.PromptStyleFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
@@ -99,7 +100,7 @@ import org.apache.isis.core.metamodel.facets.properties.propertylayout.HiddenFac
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.LabelAtFacetForPropertyXml;
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.MultiLineFacetForPropertyXml;
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.NamedFacetForPropertyXml;
-import org.apache.isis.core.metamodel.facets.properties.propertylayout.PromptStyleFacetForPropertyLayoutXml;
+import org.apache.isis.core.metamodel.facets.properties.propertylayout.PromptStyleFacetForPropertyXml;
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.RenderedAdjustedFacetForPropertyXml;
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.TypicalLengthFacetForPropertyXml;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -293,8 +294,9 @@ public abstract class GridSystemServiceAbstract<G extends Grid> implements GridS
                 FacetUtil.addOrReplaceFacet(CssClassFacetForActionXml.create(actionLayoutData, objectAction));
                 FacetUtil.addOrReplaceFacet(CssClassFaFacetForActionXml.create(actionLayoutData, objectAction));
                 FacetUtil.addOrReplaceFacet(DescribedAsFacetForActionXml.create(actionLayoutData, objectAction));
-                FacetUtil.addOrReplaceFacet(HiddenFacetForActionLayoutXml.create(actionLayoutData, objectAction));
+                FacetUtil.addOrReplaceFacet(HiddenFacetForActionXml.create(actionLayoutData, objectAction));
                 FacetUtil.addOrReplaceFacet(NamedFacetForActionXml.create(actionLayoutData, objectAction));
+                FacetUtil.addOrReplaceFacet(PromptStyleFacetForActionXml.create(actionLayoutData, objectAction));
             }
 
             @Override
@@ -306,13 +308,13 @@ public abstract class GridSystemServiceAbstract<G extends Grid> implements GridS
 
                 FacetUtil.addOrReplaceFacet(CssClassFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(DescribedAsFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
-                FacetUtil.addOrReplaceFacet(
-                        PromptStyleFacetForPropertyLayoutXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(HiddenFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(LabelAtFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(MultiLineFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(NamedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(
+                        PromptStyleFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
+                FacetUtil.addOrReplaceFacet(
                         RenderedAdjustedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 FacetUtil.addOrReplaceFacet(TypicalLengthFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/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 d5838b1..13f12ec 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
@@ -17,6 +17,8 @@
 
 package org.apache.isis.core.metamodel.spec.feature;
 
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import com.google.common.base.Predicate;
@@ -35,6 +37,7 @@ import org.apache.isis.core.commons.lang.StringFunctions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetFilters;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
@@ -47,6 +50,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.object.wizard.WizardFacet;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
+import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -197,10 +201,12 @@ public interface ObjectAction extends ObjectMember {
 
     //endregion
 
-    //region > Utils
-    public static final class Utils {
+    //region > Util
+    public static final class Util {
 
-        private Utils() {
+        final static MemberOrderFacetComparator memberOrderFacetComparator = new MemberOrderFacetComparator(false);
+
+        private Util() {
         }
 
         public static String nameFor(final ObjectAction objAction) {
@@ -216,15 +222,14 @@ public interface ObjectAction extends ObjectMember {
         }
 
         public static boolean returnsBlobOrClob(final ObjectAction objectAction) {
-            boolean blobOrClob = false;
             final ObjectSpecification returnType = objectAction.getReturnType();
             if (returnType != null) {
                 Class<?> cls = returnType.getCorrespondingClass();
                 if (Blob.class.isAssignableFrom(cls) || Clob.class.isAssignableFrom(cls)) {
-                    blobOrClob = true;
+                    return true;
                 }
             }
-            return blobOrClob;
+            return false;
         }
 
         public static String actionIdentifierFor(final ObjectAction action) {
@@ -260,6 +265,79 @@ public interface ObjectAction extends ObjectMember {
             return cssClassFacet != null ? cssClassFacet.cssClass(objectAdapter) : null;
         }
 
+
+        public static List<ObjectAction> findTopLevel(
+                final ObjectAdapter adapter,
+                final DeploymentCategory deploymentCategory) {
+            final List<ObjectAction> topLevelActions = Lists.newArrayList();
+
+            addTopLevelActions(adapter, ActionType.USER, topLevelActions);
+            if(deploymentCategory.isPrototyping()) {
+                addTopLevelActions(adapter, ActionType.PROTOTYPE, topLevelActions);
+            }
+            return topLevelActions;
+        }
+
+        static void addTopLevelActions(
+                final ObjectAdapter adapter,
+                final ActionType actionType,
+                final List<ObjectAction> topLevelActions) {
+
+            final ObjectSpecification adapterSpec = adapter.getSpecification();
+
+            @SuppressWarnings({ "unchecked", "deprecation" })
+            Filter<ObjectAction> filter = org.apache.isis.applib.filter.Filters.and(
+                    Filters.memberOrderNotAssociationOf(adapterSpec),
+                    Filters.dynamicallyVisible(adapter, InteractionInitiatedBy.USER, Where.ANYWHERE),
+                    Filters.notBulkOnly(),
+                    Filters.excludeWizardActions(adapterSpec));
+
+            final List<ObjectAction> userActions = adapterSpec.getObjectActions(actionType, Contributed.INCLUDED, filter);
+            topLevelActions.addAll(userActions);
+        }
+
+
+        public static List<ObjectAction> findForAssociation(
+                final ObjectAdapter adapter,
+                final ObjectAssociation association, final DeploymentCategory deploymentCategory) {
+            final List<ObjectAction> associatedActions = Lists.newArrayList();
+
+            addActions(adapter, ActionType.USER, association, associatedActions);
+            if(deploymentCategory.isPrototyping()) {
+                addActions(adapter, ActionType.PROTOTYPE, association, associatedActions);
+            }
+
+            Collections.sort(associatedActions, new Comparator<ObjectAction>() {
+
+                @Override
+                public int compare(ObjectAction o1, ObjectAction o2) {
+                    final MemberOrderFacet m1 = o1.getFacet(MemberOrderFacet.class);
+                    final MemberOrderFacet m2 = o2.getFacet(MemberOrderFacet.class);
+                    return memberOrderFacetComparator.compare(m1, m2);
+                }
+            });
+            return associatedActions;
+        }
+
+        static List<ObjectAction> addActions(
+                final ObjectAdapter adapter,
+                final ActionType type,
+                final ObjectAssociation association, final List<ObjectAction> associatedActions) {
+            final ObjectSpecification objectSpecification = adapter.getSpecification();
+
+            @SuppressWarnings({ "unchecked", "deprecation" })
+            Filter<ObjectAction> filter = org.apache.isis.applib.filter.Filters.and(
+                    Filters.memberOrderOf(association),
+                    Filters.dynamicallyVisible(adapter, InteractionInitiatedBy.USER, Where.ANYWHERE),
+                    Filters.notBulkOnly(),
+                    Filters.excludeWizardActions(objectSpecification));
+
+            final List<ObjectAction> userActions = objectSpecification.getObjectActions(type, Contributed.INCLUDED, filter);
+            associatedActions.addAll(userActions);
+            return userActions;
+        }
+
+
     }
 
     //endregion

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
index c167879..0dcf8a1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActions.java
@@ -31,11 +31,11 @@ public final class ObjectActions {
     }
 
     /**
-     * @deprecated - use {@link ObjectAction.Utils#nameFor(ObjectAction)}
+     * @deprecated - use {@link ObjectAction.Util#nameFor(ObjectAction)}
      */
     @Deprecated
     public static String nameFor(final ObjectAction action) {
-        return ObjectAction.Utils.nameFor(action);
+        return ObjectAction.Util.nameFor(action);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index 25f5705..acb49e6 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -20,10 +20,13 @@ package org.apache.isis.viewer.wicket.model.links;
 
 import java.io.Serializable;
 import java.util.List;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+
 import org.apache.wicket.markup.html.link.AbstractLink;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.SemanticsOf;
@@ -48,15 +51,15 @@ public class LinkAndLabel implements Serializable {
             final String disabledReasonIfAny,
             final boolean blobOrClob) {
 
-        final String name = ObjectAction.Utils.nameFor(objectAction);
+        final String name = ObjectAction.Util.nameFor(objectAction);
 
         final boolean explorationOrPrototype = objectAction.isPrototype();
-        final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
-        final String description = ObjectAction.Utils.descriptionOf(objectAction);
-        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction, objectAdapter);
-        final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
-        final CssClassFaPosition cssClassFaPosition = ObjectAction.Utils.cssClassFaPositionFor(objectAction);
-        final ActionLayout.Position actionLayoutPosition = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
+        final String actionIdentifier = ObjectAction.Util.actionIdentifierFor(objectAction);
+        final String description = ObjectAction.Util.descriptionOf(objectAction);
+        final String cssClass = ObjectAction.Util.cssClassFor(objectAction, objectAdapter);
+        final String cssClassFa = ObjectAction.Util.cssClassFaFor(objectAction);
+        final CssClassFaPosition cssClassFaPosition = ObjectAction.Util.cssClassFaPositionFor(objectAction);
+        final ActionLayout.Position actionLayoutPosition = ObjectAction.Util.actionLayoutPositionOf(objectAction);
         final ActionSemantics.Of semantics = objectAction.getSemantics();
 
         return new LinkAndLabel(
@@ -80,9 +83,6 @@ public class LinkAndLabel implements Serializable {
         public boolean isNoParameters() {
             return this == NO_PARAMETERS;
         }
-        public boolean isTakesParameters() {
-            return this == TAKES_PARAMETERS;
-        }
     }
 
     private final AbstractLink link;
@@ -190,4 +190,11 @@ public class LinkAndLabel implements Serializable {
             };
         }
     }
+
+    public static class Util {
+        private Util(){}
+
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 245d31a..1c6e18f 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -60,8 +60,11 @@ import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -89,6 +92,7 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
     private static final String NULL_ARG = "$nullArg$";
     private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("([^=]+)=(.+)");
 
+
     /**
      * Whether we are obtaining arguments (eg in a dialog), or displaying the
      * results
@@ -680,17 +684,6 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
 
     private FormExecutor formExecutor;
 
-    @Override
-    public PromptStyle getPromptStyle() {
-        // for now, at least..
-        return PromptStyle.DIALOG;
-    }
-
-    @Override
-    public ScalarModel.InlinePromptContext getInlinePromptContext() {
-        throw new IllegalStateException("should not be called when getPromptStyle() returns DIALOG");
-    }
-
     /**
      * A hint passed from one Wicket UI component to another.
      *
@@ -706,6 +699,40 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
 
 
     //////////////////////////////////////////////////
+
+    @Override
+    public PromptStyle getPromptStyle() {
+        final PromptStyleFacet facet = getFacet(PromptStyleFacet.class);
+        if(facet == null) {
+            return null;
+        }
+        return facet.value() == PromptStyle.INLINE
+                ? PromptStyle.INLINE
+                : PromptStyle.DIALOG;
+    }
+
+    public <T extends Facet> T getFacet(final Class<T> facetType) {
+        final FacetHolder facetHolder = getActionMemento().getAction(getSpecificationLoader());
+        return facetHolder.getFacet(facetType);
+    }
+
+
+    //////////////////////////////////////////////////
+
+    private ScalarModel.InlinePromptContext inlinePromptContext;
+
+    /**
+     * Further hint, to support inline prompts...
+     */
+    public ScalarModel.InlinePromptContext getInlinePromptContext() {
+        return inlinePromptContext;
+    }
+
+    public void setInlinePromptContext(ScalarModel.InlinePromptContext inlinePromptContext) {
+        this.inlinePromptContext = inlinePromptContext;
+    }
+
+    //////////////////////////////////////////////////
     // Dependencies (from context)
     //////////////////////////////////////////////////
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
index a04c1d1..2f33bbc 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutor.java
@@ -24,8 +24,6 @@ import java.io.Serializable;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 
-import org.apache.isis.applib.annotation.PromptStyle;
-
 /**
  * Passed through the {@link ActionModel} or {@link ScalarModel}, allowing
  * two different Wicket UI components (eg owning <code>ActionPanel</code> and
@@ -40,5 +38,4 @@ import org.apache.isis.applib.annotation.PromptStyle;
 public interface FormExecutor extends Serializable {
 
     boolean executeAndProcessResults(AjaxRequestTarget target, Form<?> feedbackForm);
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
index 7c2c933..128d7f8 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
@@ -24,10 +24,5 @@ import org.apache.isis.applib.annotation.PromptStyle;
 public interface HasFormExecutor {
     PromptStyle getPromptStyle();
 
-    /**
-     * Only applicable if {@link #getPromptStyle()} is {@link PromptStyle#INLINE}.
-     */
-    ScalarModel.InlinePromptContext getInlinePromptContext();
-
     FormExecutor getFormExecutor();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 6958feb..a847c79 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -30,6 +30,7 @@ import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -1036,7 +1037,7 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasFormExe
     private InlinePromptContext inlinePromptContext;
 
     /**
-     * Further hint, to support inline edits...
+     * Further hint, to support inline prompts...
      */
     public InlinePromptContext getInlinePromptContext() {
         return inlinePromptContext;
@@ -1046,24 +1047,40 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasFormExe
         this.inlinePromptContext = inlinePromptContext;
     }
 
+    // //////////////////////////////////////
+
     public static class InlinePromptContext implements Serializable {
 
         private static final long serialVersionUID = 1L;
 
         private final Component scalarIfRegular;
-        private final WebMarkupContainer scalarIfRegularInlineEditForm;
+        private final WebMarkupContainer scalarIfRegularInlinePromptForm;
+        private final MarkupContainer scalarTypeContainer;
 
         public InlinePromptContext(
                 final Component scalarIfRegular,
-                final WebMarkupContainer scalarIfRegularInlineEditForm) {
+                final WebMarkupContainer scalarIfRegularInlinePromptForm,
+                final MarkupContainer scalarTypeContainer) {
             this.scalarIfRegular = scalarIfRegular;
-            this.scalarIfRegularInlineEditForm = scalarIfRegularInlineEditForm;
+            this.scalarIfRegularInlinePromptForm = scalarIfRegularInlinePromptForm;
+            this.scalarTypeContainer = scalarTypeContainer;
         }
 
-        public void onCancel() {
+        public Component getScalarIfRegular() {
+            return scalarIfRegular;
+        }
 
+        public WebMarkupContainer getScalarIfRegularInlinePromptForm() {
+            return scalarIfRegularInlinePromptForm;
+        }
+
+        public void onCancel() {
             scalarIfRegular.setVisible(true);
-            scalarIfRegularInlineEditForm.setVisible(false);
+            scalarIfRegularInlinePromptForm.setVisible(false);
+        }
+
+        public MarkupContainer getScalarTypeContainer() {
+            return scalarTypeContainer;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
index 27c0722..be3e492 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksPanel.java
@@ -124,7 +124,6 @@ public class AdditionalLinksPanel extends PanelAbstract<ListOfLinksModel> {
                     addConfirmationDialogIfAreYouSureSemantics(link, semantics);
                 }
 
-
                 final String cssClass = linkAndLabel.getCssClass();
                 CssClassAppender.appendCssClassTo(link, cssClass);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
index 1da1815..000d4cf 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLinkFactoryAbstract;
 
 public final class EntityActionLinkFactory extends ActionLinkFactoryAbstract {
@@ -39,7 +40,8 @@ public final class EntityActionLinkFactory extends ActionLinkFactoryAbstract {
     @SuppressWarnings("unused")
     private final EntityModel entityModel;
 
-    public EntityActionLinkFactory(final EntityModel entityModel) {
+    public EntityActionLinkFactory(final EntityModel entityModel, final ScalarModel scalarModelForAssociationIfAny) {
+        super(scalarModelForAssociationIfAny);
         this.entityModel = entityModel;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionUtil.java
deleted file mode 100644
index 9b4627f..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionUtil.java
+++ /dev/null
@@ -1,189 +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.viewer.wicket.ui.components.actionmenu.entityactions;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicates;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-
-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.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
-import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
-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.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.runtime.system.DeploymentType;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLinkFactory;
-
-public final class EntityActionUtil {
-
-    private EntityActionUtil(){}
-
-    private final static MemberOrderFacetComparator memberOrderFacetComparator = new MemberOrderFacetComparator(false);
-
-    public static List<LinkAndLabel> getEntityActionLinksForAssociation(
-            final ScalarModel scalarModel,
-            final DeploymentCategory deploymentCategory) {
-        final List<LinkAndLabel> entityActions = Lists.newArrayList();
-
-        if (scalarModel.getKind() != ScalarModel.Kind.PROPERTY) {
-            return entityActions;
-        } else {
-            final ObjectAdapterMemento parentMemento = scalarModel.getParentObjectAdapterMemento();
-            final EntityModel parentEntityModel = new EntityModel(parentMemento);
-            final OneToOneAssociation oneToOneAssociation = scalarModel.getPropertyMemento().getProperty(
-                    scalarModel.getSpecificationLoader());
-
-            final List<ObjectAction> associatedActions = getObjectActionsForAssociation(parentEntityModel, oneToOneAssociation,
-                    deploymentCategory);
-
-            entityActions.addAll(asLinkAndLabelsForAdditionalLinksPanel(parentEntityModel, associatedActions));
-            return entityActions;
-        }
-    }
-
-    public static List<ObjectAction> getObjectActionsForAssociation(
-            final EntityModel entityModel,
-            final ObjectAssociation association,
-            final DeploymentType deploymentType) {
-        return getObjectActionsForAssociation(entityModel, association, deploymentType.getDeploymentCategory());
-    }
-
-    public static List<ObjectAction> getObjectActionsForAssociation(
-            final EntityModel entityModel,
-            final ObjectAssociation association, final DeploymentCategory deploymentCategory) {
-        final List<ObjectAction> associatedActions = Lists.newArrayList();
-
-        addActions(ActionType.USER, entityModel, association, associatedActions);
-        if(deploymentCategory.isPrototyping()) {
-            addActions(ActionType.PROTOTYPE, entityModel, association, associatedActions);
-        }
-
-        Collections.sort(associatedActions, new Comparator<ObjectAction>() {
-
-            @Override
-            public int compare(ObjectAction o1, ObjectAction o2) {
-                final MemberOrderFacet m1 = o1.getFacet(MemberOrderFacet.class);
-                final MemberOrderFacet m2 = o2.getFacet(MemberOrderFacet.class);
-                return memberOrderFacetComparator.compare(m1, m2);
-            }
-        });
-        return associatedActions;
-    }
-
-    /**
-     * Converts an {@link org.apache.isis.viewer.wicket.model.models.EntityModel} and a (subset of its) {@link org.apache.isis.core.metamodel.spec.feature.ObjectAction}s into a
-     * list of {@link org.apache.isis.viewer.wicket.model.links.LinkAndLabel}s intended to be apassed
-     * to the {@link AdditionalLinksPanel}.
-     *
-     * <p>
-     *     The length of the list returned may smaller than the inbound actions; any null links
-     *     (for invisible actions) will be discarded.
-     * </p>
-     */
-    public static List<LinkAndLabel> asLinkAndLabelsForAdditionalLinksPanel(
-            final EntityModel entityModel,
-            final List<ObjectAction> actions) {
-
-        final String linkId = AdditionalLinksPanel.ID_ADDITIONAL_LINK;
-        final ActionLinkFactory linkFactory = new EntityActionLinkFactory(entityModel);
-
-        final ObjectAdapterMemento adapterMemento = entityModel.getObjectAdapterMemento();
-        return FluentIterable.from(actions)
-                .transform(new Function<ObjectAction, LinkAndLabel>() {
-
-                    @Override
-                    public LinkAndLabel apply(ObjectAction objectAction) {
-                        return linkFactory.newLink(linkId, adapterMemento, objectAction);
-                    }
-                })
-                .filter(Predicates.<LinkAndLabel>notNull())
-                .toList();
-    }
-
-    private static List<ObjectAction> addActions(
-            final ActionType type,
-            final EntityModel entityModel,
-            final ObjectAssociation association,
-            final List<ObjectAction> associatedActions) {
-        final ObjectSpecification adapterSpec = entityModel.getTypeOfSpecification();
-        final ObjectAdapter adapter = entityModel.load(ConcurrencyChecking.NO_CHECK);
-
-        final ObjectSpecification objectSpecification = entityModel.getTypeOfSpecification();
-        @SuppressWarnings({ "unchecked", "deprecation" })
-        Filter<ObjectAction> filter = Filters.and(
-                    ObjectAction.Filters.memberOrderOf(association),
-                    ObjectAction.Filters.dynamicallyVisible(adapter, InteractionInitiatedBy.USER, Where.ANYWHERE),
-                    ObjectAction.Filters.notBulkOnly(),
-                    ObjectAction.Filters.excludeWizardActions(objectSpecification));
-
-        final List<ObjectAction> userActions = adapterSpec.getObjectActions(type, Contributed.INCLUDED, filter);
-        associatedActions.addAll(userActions);
-        return userActions;
-    }
-
-
-    public static void addTopLevelActions(
-            final ObjectAdapter adapter,
-            final ActionType actionType,
-            final List<ObjectAction> topLevelActions) {
-
-        final ObjectSpecification adapterSpec = adapter.getSpecification();
-
-        @SuppressWarnings({ "unchecked", "deprecation" })
-        Filter<ObjectAction> filter = Filters.and(
-                ObjectAction.Filters.memberOrderNotAssociationOf(adapterSpec),
-                ObjectAction.Filters.dynamicallyVisible(adapter, InteractionInitiatedBy.USER, Where.ANYWHERE),
-                ObjectAction.Filters.notBulkOnly(),
-                ObjectAction.Filters.excludeWizardActions(adapterSpec));
-
-        final List<ObjectAction> userActions = adapterSpec.getObjectActions(actionType, Contributed.INCLUDED, filter);
-        topLevelActions.addAll(userActions);
-    }
-
-    public static List<ObjectAction> getTopLevelActions(
-            final ObjectAdapter adapter,
-            final DeploymentCategory deploymentCategory) {
-        final List<ObjectAction> topLevelActions = Lists.newArrayList();
-
-        addTopLevelActions(adapter, ActionType.USER, topLevelActions);
-        if(deploymentCategory.isPrototyping()) {
-            addTopLevelActions(adapter, ActionType.PROTOTYPE, topLevelActions);
-        }
-        return topLevelActions;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
new file mode 100644
index 0000000..e983335
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
@@ -0,0 +1,97 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicates;
+import com.google.common.collect.FluentIterable;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLinkFactory;
+
+public final class LinkAndLabelUtil {
+
+    private LinkAndLabelUtil(){}
+
+    public static List<LinkAndLabel> asActionLinksForAssociation(
+            final ScalarModel scalarModelForAssociation,
+            final DeploymentCategory deploymentCategory) {
+
+        if (scalarModelForAssociation.getKind() != ScalarModel.Kind.PROPERTY) {
+            return Collections.emptyList();
+        }
+
+        final ObjectAdapterMemento parentMemento = scalarModelForAssociation.getParentObjectAdapterMemento();
+        final EntityModel parentEntityModel = new EntityModel(parentMemento);
+
+        final ObjectAdapter parentAdapter = parentEntityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+
+        final OneToOneAssociation oneToOneAssociation =
+                scalarModelForAssociation.getPropertyMemento().getProperty(scalarModelForAssociation.getSpecificationLoader());
+
+        final List<ObjectAction> associatedActions =
+                ObjectAction.Util.findForAssociation(parentAdapter, oneToOneAssociation, deploymentCategory);
+
+        return asActionLinksForAdditionalLinksPanel(parentEntityModel, associatedActions,
+                scalarModelForAssociation);
+    }
+
+    /**
+     * Converts an {@link org.apache.isis.viewer.wicket.model.models.EntityModel} and a (subset of its) {@link org.apache.isis.core.metamodel.spec.feature.ObjectAction}s into a
+     * list of {@link org.apache.isis.viewer.wicket.model.links.LinkAndLabel}s intended to be passed
+     * to the {@link AdditionalLinksPanel}.
+     *
+     * <p>
+     *     The length of the list returned may smaller than the inbound actions; any null links
+     *     (for invisible actions) will be discarded.
+     * </p>
+     */
+    public static List<LinkAndLabel> asActionLinksForAdditionalLinksPanel(
+            final EntityModel parentEntityModel,
+            final List<ObjectAction> actions,
+            final ScalarModel scalarModelForAssociationIfAny) {
+
+        final ActionLinkFactory linkFactory = new EntityActionLinkFactory(parentEntityModel, scalarModelForAssociationIfAny);
+        final String linkId = AdditionalLinksPanel.ID_ADDITIONAL_LINK;
+
+        final ObjectAdapterMemento adapterMemento = parentEntityModel.getObjectAdapterMemento();
+        return FluentIterable.from(actions)
+                .transform(new Function<ObjectAction, LinkAndLabel>() {
+
+                    @Override
+                    public LinkAndLabel apply(ObjectAction objectAction) {
+                        return linkFactory.newLink(linkId, adapterMemento, objectAction);
+                    }
+                })
+                .filter(Predicates.<LinkAndLabel>notNull())
+                .toList();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
index 3b7e44e..998c366 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
@@ -345,13 +345,13 @@ class CssMenuItem implements Serializable {
                 .link(link)
                 .describedAs(descriptionIfAny)
                 .enabled(reasonDisabledIfAny)
-                .returnsBlobOrClob(ObjectAction.Utils.returnsBlobOrClob(objectAction))
+                .returnsBlobOrClob(ObjectAction.Util.returnsBlobOrClob(objectAction))
                 .prototyping(objectAction.isPrototype())
                 .requiresSeparator(separator)
-                .withActionIdentifier(ObjectAction.Utils.actionIdentifierFor(objectAction))
-                .withCssClass(ObjectAction.Utils.cssClassFor(objectAction, adapter))
-                .withCssClassFa(ObjectAction.Utils.cssClassFaFor(objectAction))
-                .withCssClassFaPosition(ObjectAction.Utils.cssClassFaPositionFor(objectAction));
+                .withActionIdentifier(ObjectAction.Util.actionIdentifierFor(objectAction))
+                .withCssClass(ObjectAction.Util.cssClassFor(objectAction, adapter))
+                .withCssClassFa(ObjectAction.Util.cssClassFaFor(objectAction))
+                .withCssClassFaPosition(ObjectAction.Util.cssClassFaPositionFor(objectAction));
 
         return builder;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/977ab2f2/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
index 8385137..89657be 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
@@ -36,9 +36,14 @@ class ServiceActionLinkFactory extends ActionLinkFactoryAbstract {
 
     private static final long serialVersionUID = 1L;
 
+    ServiceActionLinkFactory() {
+        super(null);
+    }
+
     @Override
     public LinkAndLabel newLink(
-            final String linkId, final ObjectAdapterMemento adapterMemento,
+            final String linkId,
+            final ObjectAdapterMemento adapterMemento,
             final ObjectAction action) {
         
         ObjectAdapter objectAdapter = adapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK,